区块链嘻哈值
㈠ 鍖哄潡閾炬槸浠涔堟剰鎬
鍖哄潡閾炬妧鏈濡備粖闈炲父娴佽岋紝浣嗘槸瀹冨埌搴曟槸浠涔堝憿锛熸槸濡備綍宸ヤ綔鐨勶紝瑙e喅浜嗗摢浜涢棶棰橈紝鍙堟湁鍝浜涚敤閫斿憿锛熶粖澶╂垜鏉ョ敤閫氫織鏄撴噦鐨勮瑷瑙i噴涓涓嬨
鍖哄潡閾鹃【鍚嶆濅箟锛屽氨鏄
涓缁勫寘鍚鏁版嵁鍧楃殑鏁版嵁閾炬潯銆
瀹冩渶鏃╁嚭鐜板湪1991骞达紝鐢变竴缇ょ爺绌朵汉鍛樼敤鏉ョ粰鏁板瓧鍖栨枃妗f墦鏃堕棿鎴炽備互浣垮緱杩欎簺鏂囨。涓嶈兘琚绡℃敼锛岀湅涓婂幓鍖哄潡閾炬妧鏈灏卞儚涓浣嶅叕璇佷汉涓鏍枫
鐒惰岃繖涓鎶鏈鑷浠庨偅涔嬪悗灏辨病鏈夊啀鍙戞尌鍏跺畠浣滅敤锛岀洿鍒2009骞翠竴涓鍙涓鏈鑱鐨勪汉閲囩敤鍖哄潡閾炬妧鏈鍒涢犱簡鏁板瓧鍔犲瘑璐у竵
姣旂壒甯併
涓鏉″尯鍧楅摼灏辨槸
瀵规墍鏈変汉瀹屽叏鍏寮鐨勫垎甯冨紡璐︽湰锛
瀹冩湁涓涓寰堟湁瓒g殑灞炴э細
涓鏃︽暟鎹琚璁板綍鍒板尯鍧楅摼涓鍚庡氨寰堥毦鍐嶅彂鐢熸敼鍙樸
閭d箞瀹冨埌搴曟槸濡備綍宸ヤ綔鐨勫憿锛熸帴涓嬫潵璁╂垜浠棣栧厛鏉ヨ傚療涓涓嬪崟涓鍖哄潡鐨勭粍鎴愩
姣忎釜鍖哄潡閮藉寘鍚浜嗕笁涓閲嶈佺殑閮ㄥ垎锛
鏁版嵁锛屽搱甯屽硷紝鍓嶄竴涓鍖哄潡鐨勫搱甯屽
銆傚叾涓鏁版嵁閮ㄥ垎璺熷尯鍧楅摼鐨勭被鍨嬫湁鍏筹紝渚嬪傦細姣旂壒甯佸尯鍧楅摼涓鐨勫尯鍧椾繚瀛樹簡鐩稿叧鐨勪氦鏄撲俊鎭锛屽寘鎷鍗栧朵拱瀹朵互鍙婁氦鏄撴瘮鐗瑰竵鐨勬暟閲忋
鎺ヤ笅鏉ユ垜浠鍐嶆潵璇翠笅
鍝堝笇鍊硷紝
瀹冨氨鍍忓尯鍧楃殑鎸囩汗涓鏍凤紝鐢ㄦ潵鏍囪瘑鍖哄潡鍜屽畠鍖呭惈鐨勬暟鎹銆
涓鏃︽煇涓鍖哄潡琚鍒涘缓锛屽畠鐨勫搱甯屽煎氨琚鍞涓鐨勭‘瀹氫笅鏉ュ暒锛屾敼鍙樺尯鍧椾腑浠讳綍涓涓佺偣鍎跨殑鍐呭癸紝閮戒細浣垮緱瀹冪殑鍝堝笇鍊煎彂鐢熷緢澶х殑鍙樺寲銆備篃灏辨槸璇村綋浣犻渶瑕佹鏌ュ尯鍧楁槸鍚﹁绡℃敼鏃跺彧闇瑕佹娴嬪畠鐨勫搱甯屽兼槸鍚﹀彂鐢熷彉鍖栧氨鍙浠ヤ簡銆傚傛灉涓涓鍖哄潡鐨勫搱甯屽煎彂鐢熶簡鍙樺寲锛岄偅瀹冪殑鍐呭逛竴瀹氬彂鐢熶簡鏀瑰彉銆傚畠灏卞啀涔熶笉鏄涔嬪墠鐨勫尯鍧楀暒锛
鍖哄潡涓鍖呭惈鐨勭涓変釜鍏冪礌鏄鍓嶄竴涓鍖哄潡鐨勫搱甯屽硷紝杩欎釜鍏冪礌浣垮緱鍖哄潡涔嬮棿鍙浠ュ舰鎴愪竴涓閾炬潯銆傚苟涓旇兘澶熶娇寰楀尯鍧楅摼鍗佸垎鐨勫畨鍏ㄣ備妇涓渚嬪瓙锛氬亣璁炬垜浠鏈変竴鏉″尯鍧楅摼鍖呭惈涓変釜鍖哄潡銆傚傚浘鎵绀猴細
3鍙峰尯鍧楁寚鍚2鍙峰尯鍧楋紝2鍙峰尯鍧楀張鎸囧悜1鍙峰尯鍧楋紝1鍙峰尯鍧楄繖閲屾湁鐐圭壒娈婏紝瀹冧笉鎸囧悜鍓嶄竴涓鍖哄潡锛屽洜涓哄畠灏辨槸杩欐潯鍖哄潡閾句腑鐨勭涓涓鍖哄潡锛屼篃鍙
鍒涗笘鍖哄潡
銆傚亣璁剧幇鍦ㄤ綘绡℃敼浜2鍙峰尯鍧楅噷闈㈢殑鏁版嵁锛岃繖灏嗕娇寰2鍙峰尯鍧楃殑鍝堝笇鍊间篃璺熺潃鍙戠敓鏀瑰彉銆傞偅涔堣繖涔熷皢浣垮緱3鍙峰尯鍧楃殑鎸囧悜鍙樺緱闈炴硶锛岃繘鑰屼娇寰楀叾鍚庣画鎵鏈夊尯鍧楅兘鍙樺緱闈炴硶銆傛墍浠ユ敼鍙樹竴涓鍖哄潡浼氫娇寰楀叾鍚庣画鎵鏈夊尯鍧楀彉寰楅潪娉曘
浣嗘槸浠呬娇鐢ㄥ搱甯屽肩殑妫娴嬫柟娉曚笉瓒抽槻姝㈢敤鎴风℃敼鍖哄潡锛屽洜涓轰互鐜板湪璁$畻鏈虹殑閫熷害锛屾瘡绉掕兘澶熻$畻鎴愬崈涓婁竾鐨勫搱甯屽硷紝浣犲畬鍏ㄥ彲浠ョ℃敼涓涓鍖哄潡锛屽苟閲嶆柊璁$畻鍏跺悗缁鎵鏈夊尯鍧楃殑鍝堝笇鍊笺傝繖鏍峰氨浣垮緱浣犵殑鍖哄潡鍐嶆″彉寰楀悎娉曘傛墍浠ヤ负浜嗛槻姝㈣繖绉嶄簨鎯呭彂鐢燂紝鍖哄潡閾鹃噰鐢ㄤ簡涓绉嶆妧鏈鍙鍋
宸ヤ綔閲忚瘉鏄庯紙POW),
鏉ュ噺缂撴柊鍖哄潡鐨勫垱寤洪熷害锛屾瘮鐗瑰竵鍖哄潡閾句腑澶ф傞渶瑕10鍒嗛挓宸﹀彸鏉ュ畬鎴愬伐浣滈噺璇佹槑锛岀敓鎴愪竴涓鏂扮殑鍖哄潡锛岃繖灏变娇寰楀尯鍧楅摼鐨勭℃敼鏇村姞鐨勫洶闅俱傞櫎姝や箣澶栧尯鍧楅摼杩樻湁涓绉嶆満鍒舵潵淇濊瘉瀹夊叏鎬э紝閭e氨鏄
鍘讳腑蹇冨寲銆
鐩稿逛簬涓蹇冨寲鐨勭綉缁滐紝鍖哄潡閾鹃噰鐢ㄧ殑鏄涓绉嶅幓涓蹇冨寲鐨勭偣瀵圭偣缃戠粶銆傚苟涓旀墍鏈変汉閮藉彲浠ュ姞鍏ヨ繖涓缃戠粶銆傚綋鏈変汉鍔犲叆杩欎釜缃戠粶鐨勬椂鍊欙紝浠栧氨鑳藉熷緱鍒版暣鏉″尯鍧楅摼鐨勫嶅埗銆傝繖涓浜哄氨鍙浠ユ潵楠岃瘉鍖哄潡閾句笂鐨勫尯鍧楁槸鍚堟硶鐨勮繕鏄琚绡℃敼杩囩殑銆
鎺ヤ笅鏉ワ紝鎴戜滑鏉ョ湅鐪嬪綋鏌愪汉鍒涘缓浜嗘柊鐨勫尯鍧楀悗锛屽尯鍧楅摼浼氬彂鐢熷摢浜涙敼鍙橈紵杩欎釜鏂扮殑鍖哄潡浼氳鍙戦佺粰缃戠粶涓婃墍鏈変汉銆傛瘡涓浜洪獙璇佽繖涓鍖哄潡浠ョ‘淇濊繖涓鍖哄潡娌¤绡℃敼杩囷紝濡傛灉鎵鏈変笢瑗块兘妫楠屾病鏈夐棶棰樺悗锛岃繖涓浜哄氨浼氭妸鏂扮殑鍖哄潡娣诲姞鍒板尯鍧楅摼涓娿
杩欎釜杩囩▼鎴戜滑绉颁箣涓虹綉缁滀笂鎵鏈変汉杈炬垚浜嗗叡璇嗐備粬浠璁ゅ悓缃戠粶涓鍝浜涘尯鍧楁槸鍚堟硶鐨勶紝鍝浜涙槸涓嶅悎娉曠殑锛岄偅浜涜绡℃敼杩囩殑鍖哄潡浼氳缃戠粶鎷掔粷銆傛墍浠ヨ佺℃敼鍖哄潡锛屼綘闇瑕佺℃敼杩欎釜鍖哄潡鍚庣画鎵鏈夊尯鍧楋紝骞朵笖鎺у埗缃戠粶涓瓒呰繃50%鐨勭敤鎴枫傚彲浠ヨ磋繖鍩烘湰涓婃槸涓嶅彲鑳藉仛寰楀埌鐨勩
鍖哄潡閾炬湰韬涔熷湪涓嶆柇鍙戝睍锛屽悗闈㈠嚭鐜颁簡鏅鸿兘鍚堢害鎶鏈銆傛櫤鑳藉悎绾﹀氨鏄瀛樻斁鍦ㄥ尯鍧楅摼涓婇潰鐨勭▼搴忥紝瀹冨湪鏌愪簺鐗瑰畾鐨勬潯浠朵笅鍙浠ヨ嚜鍔ㄧ殑鎵ц屻傚洜姝ゅ尯鍧楅摼鎶鏈涔熷彲浠ョ敤鏉ュ瓨鏀剧梾鍙叉。妗堬紝鍒涘缓鏁板瓧鍖栧叕璇侊紝鍟嗗搧鏈旀簮绛夌瓑銆傞偅涔堝埌杩欓噷浣犲簲璇ユ槑鐧戒簡鍖哄潡閾剧殑宸ヤ綔鍘熺悊浠ュ強瀹冪殑鐢ㄩ斿暒鍚э紒
㈡ 小白如何秒懂区块链中的哈希计算
小白如何秒懂区块链中的哈希计算
当我在区块链的学习过程中,发现有一个词像幽灵一样反复出现,“哈希”,英文写作“HASH”。
那位说“拉稀”同学你给我出去!!
这个“哈希”据说是来源于密码学的一个函数,尝试搜一搜,论文出来一堆一堆的,不是横式就是竖式,不是表格就是图片,还有一堆看不懂得xyzabc。大哥,我就是想了解一下区块链的基础知识,给我弄那么难干啥呀?!我最长的密码就是123456,复杂一点的就是654321,最复杂的时候在最后加个a,你给我写的那么复杂明显感觉脑力被榨干,仅有的脑细胞成批成批的死亡!为了让和我一样的小白同学了解这点,我就勉为其难,努力用傻瓜式的语言讲解一下哈希计算,不求最准确但求最简单最易懂。下面我们开始:
# 一、什么是哈希算法
## 1、定义:哈希算法是将任意长度的字符串变换为固定长度的字符串。
从这里可以看出,可以理解为给**“哈希运算”输入一串数字,它会输出一串数字**。
如果我们自己定义 “增一算法”,那么输入1,就输出2;输入100就输出101。
如果我我们自己定义“变大写算法”,那么输入“abc”输出“ABC”。
呵呵,先别打我啊!这确实就只是一个函数的概念。
## 2、特点:
这个哈希算法和我的“增一算法”和“变大写算法”相比有什么特点呢?
1)**确定性,算得快**:咋算结果都一样,算起来效率高。
2)**不可逆**:就是知道输出推不出输入的值。
3)**结果不可测**:就是输入变一点,结果天翻地覆毫无规律。
总之,这个哈希运算就是个黑箱,是加密的好帮手!你说“11111”,它给你加密成“”,你说“11112”它给你弄成“”。反正输入和输出一个天上一个地下,即使输入相关但两个输出毫不相关。
# 二、哈希运算在区块链中的使用
## 1、数据加密
**交易数据是通过哈希运算进行加密,并把相应的哈希值写入区块头**。如下图所示,一个区块头包含了上一个区块的hash值,还包含下一个区块的hash值。
1)、**识别区块数据是否被篡改**:区块链的哈希值能够唯一而精准地标识一个区块,区块链中任意节点通过简单的哈希计算都可以获得这个区块的哈希值,计算出的哈希值没有变化也就意味着区块链中的信息没有被篡改。
2)、**把各个区块串联成区块链**:每个区块都包含上一个区块的哈希值和下一个区块的值,就相当于通过上一个区块的哈希值挂钩到上一个区块尾,通过下一个区块的哈希值挂钩到下一个区块链的头,就自然而然形成一个链式结构的区块链。
## 2、加密交易地址及哈希
在上图的区块头中,有一个Merkle root(默克尔根)的哈希值,它是用来做什么的呢?
首先了解啥叫Merkle root? 它就是个二叉树结构的根。啥叫二叉树?啥叫根?看看下面的图就知道了。一分二,二分四,四分八可以一直分下去就叫二叉树。根就是最上面的节点就叫 根。
这个根的数据是怎么来的呢?是把一个区块中的每笔交易的哈希值得出后,再两两哈希值再哈希,再哈希,再哈希,直到最顶层的数值。
这么哈希了半天,搞什么事情?有啥作用呢?
1)、**快速定位每笔交易**:由于交易在存储上是线性存储,定位到某笔交易会需要遍历,效率低时间慢,通过这样的二叉树可以快速定位到想要找的交易。
举个不恰当的例子:怎么找到0-100之间的一个任意整数?(假设答案是88)那比较好的一个方法就是问:1、比50大还是小?2、比75大还是小?3、比88大还是小? 仅仅通过几个问题就可以快速定位到答案。
2)、**核实交易数据是否被篡改**:从交易到每个二叉树的哈希值,有任何一个数字有变化都会导致Merkle root值的变化。同时,如果有错误发生的情况,也可以快速定位错误的地方。
## 3、挖矿
在我们的区块头中有个参数叫**随机数Nonce,寻找这个随机数的过程就叫做“挖矿”**!网络上任何一台机器只要找到一个合适的数字填到自己的这个区块的Nonce位置,使得区块头这6个字段(80个字节)的数据的哈希值的哈希值以18个以上的0开头,谁就找到了“挖到了那个金子”!既然我们没有办法事先写好一个满足18个0的数字然后反推Nounce,唯一的做法就是从0开始一个一个的尝试,看结果是不是满足要求,不满足就再试下一个,直到找到。
找这个数字是弄啥呢?做这个有什么作用呢?
1)、**公平的找到计算能力最强的计算机**:这个有点像我这里有个沙子,再告诉你它也那一个沙滩的中的一粒相同,你把相同的那粒找出来一样。那可行的办法就是把每一粒都拿起来都比较一下!那么比较速度最快的那个人是最有可能先早到那个沙子。这就是所谓的“工作量证明pow”,你先找到这个沙子,我就认为你比较的次数最多,干的工作最多。
2)、**动态调整难度**:比特币为了保证10分钟出一个区块,就会每2016个块(2周)的时间计算一下找到这个nonce数字的难度,如果这2016个块平均时间低于10分钟则调高难度,如高于十分钟则调低难度。这样,不管全网的挖矿算力是怎么变化,都可以保证10分钟的算出这个随机数nonce。
# 三、哈希运算有哪些?
说了这么多哈希运算,好像哈希运算就是一种似的,其实不是!作为密码学中的哈希运算在不断的发展中衍生出很多流派。我看了”满头包”还是觉得内在机理也太复杂了,暂时罗列如下,小白们有印象知道是怎么回事就好。
从下表中也可以看得出,哈希运算也在不断的发展中,有着各种各样的算法,各种不同的应用也在灵活应用着单个或者多个算法。比特币系统中,哈希运算基本都是使用的SHA256算法,而莱特币是使用SCRYPT算法,夸克币(Quark)达世币(DASH)是把很多算法一层层串联上使用,Heavycoin(HAV)却又是把一下算法并联起来,各取部分混起来使用。以太坊的POW阶段使用ETHASH算法,ZCASH使用EQUIHASH。
需要说明的是,哈希运算的各种算法都是在不断升级完善中,而各种币种使用的算法也并非一成不变,也在不断地优化中。
**总结**:哈希运算在区块链的各个项目中都有着广泛的应用,我们以比特币为例就能看到在**数据加密、交易数据定位、挖矿等等各个方面都有着极其重要的作用**。而哈希运算作为加密学的一门方向不断的发展和延伸,身为普通小白的我们,想理解区块链的一些基础概念,了解到这个层面也已经足够。
㈢ 区块链技术中的区块头包含的三组元数据是什么
1、前区块哈希值。用于索引前区块
2、挖矿难度、随机值(用于工作量证明计算)、时间戳
3、梅克尔树,能够总结并迅速归纳校验区块中全部交易数据的树根数据。
㈣ 区块链中的哈希值是什么意思
如果你对区块链领域有所了解,那么你一定听说过哈希值,或许我们在浏览区块链信息时会经常看到哈希值,但是如果让我们说说哈希值到底是什么,可能我们也并不能说明白。我知到,虽然很多人都已经进入币圈很久,但是对于区块链领域的一些概念还处于一个一知半解,知道又不完全清楚的状态。其实哈希就是一种压缩信息的方法,我们可以通过哈希将很长的一段文字压缩成一小段乱码,那么区块链中的哈希值是什么意思呢?现在就让我来为大家详细的讲解一下。
哈希值是将任意长度的输入字符串转换为密码并进行固定输出的过程。哈希值不是一个“密码”,我们不能通过解密哈希来检索原始数据,它是一个单向的加密函数。
区块链哈希是什么?如果是刚开始了解区块链,就需要结合“区块”的概念来一起理解了。每一个区块,包含的内容有数据信息,本区块的哈希值以及上一个区块的哈希值。区块中的数据信息,主要是交易双方的地址与此次交易数量还有交易时间信息等。而哈希值就是寻找到区块,继而了解到这些区块信息的钥匙。以上就是区块链中哈希的含义了。
区块链通过哈希算法对一个交易区块中的交易信息进行加密,并把信息压缩成由一串数字和字母组成的散列字符串。金窝窝集团分析其哈希算法的作用如下:区块链的哈希值能够唯一而精准地标识一个区块,区块链中任意节点通过简单的哈希计算都接获得这个区块的哈希值,计算出的哈希值没有变化也就意味着区块链中的信息没有被篡改。
在区块链中,每个块都有前一个块的哈希值,前一个块被称为当前块的父块,如果考虑父块有一个当前区块。它将会有上一个块的哈希值即父块。
在区块链中,每个块都有前一个块的哈希值。当我们更改当前块中的任何数据时,块的哈希值将被更改,这将影响前一个块,因为它有前一个块的地址。例如,如果我们只有两个块,一个是当前块,一个是父块。当前块将拥有父块的地址。如果需要更改当前块中的数据,还需要更改父块。当只有两个数据块时,很容易更改数据,但是现在,当我们在区块链中实现时,2020-01-24 12:32已经挖掘了614272个块,而614272(th)块的哈希值为00000000000000000007 。如果我们要更改当前块614272(th)中的数据,614271块的哈希地址必须更改,但是614271块的哈希是不可能更改的,所以这就是区块链被称为不可变的,数据可信的。区块链的第一个块,称为起源块。你可以从这个起源块中看到有多少块被开采到现在。
如果我们对输入的任何部分做一个小的改变,输出就会有一个大的改变,请看下面的例子以获得更多的理解。哈希值是区块链技术不可变的和确定的潜力核心基础和最重要的方面。它保留了记录和查看的数据的真实性,以及区块链作为一个整体的完整性。
#比特币[超话]# #数字货币# #欧易OKEx#
㈤ 区块链哈希值可以暴露吗
可以。
哈希值是将任意长度的输入字符串转换为密码并进行固定输出的过程。哈希值不是一个“密码”,我们不能通过解密哈希来检索原始数据,它是一个单向的加密函数。在区块链中,每个块都有前一个块的哈希值,前一个块被称为当前块的父块,如果考虑父块有一个当前区块。
它将会有上一个块的哈希值即父块。在区块链中,每个块都有前一个块的哈希值。当我们更改当前块中的任何数据时,块的哈希值将被更改,这将影响前一个块,因为它有前一个块的地址。
㈥ 区块链技术中的哈希算法是什么
1.1. 简介
计算机行业从业者对哈希这个词应该非常熟悉,哈希能够实现数据从一个维度向另一个维度的映射,通常使用哈希函数实现这种映射。通常业界使用y = hash(x)的方式进行表示,该哈希函数实现对x进行运算计算出一个哈希值y。
区块链中哈希函数特性:
函数参数为string类型;
固定大小输出;
计算高效;
collision-free 即冲突概率小:x != y => hash(x) != hash(y)
隐藏原始信息:例如区块链中各个节点之间对交易的验证只需要验证交易的信息熵,而不需要对原始信息进行比对,节点间不需要传输交易的原始数据只传输交易的哈希即可,常见算法有SHA系列和MD5等算法
1.2. 哈希的用法
哈希在区块链中用处广泛,其一我们称之为哈希指针(Hash Pointer)
哈希指针是指该变量的值是通过实际数据计算出来的且指向实际的数据所在位置,即其既可以表示实际数据内容又可以表示实际数据的存储位置。下图为Hash Pointer的示意图
㈦ 区块链中的哈希值是什么
区块链中的哈希值是将任意长度的输入字符串转换为密码并进行固定输出的过程。哈希值不是一个“密码”,不能通过解密哈希来检索原始数据,它是一个单向的加密函数。
在区块链中,每个块都有前一个块的哈希值。当更改当前块中的任何数据时,块的哈希值将被更改,这将影响前一个块,因为它有前一个块的地址。例如如果只有两个块,一个是当前块,一个是父块。当前块将拥有父块的地址,如果需要更改当前块中的数据,还需要更改父块。
一个加密哈希函数需要具备以下几个关键的特性才能被认为是有用的
1、每个哈希值都是不同的。
2、 对于相同的消息,总是生成相同的哈希值。
3、不可能根据哈希值来决定输入。
4、即使对输入的整个哈希值做一个小的更改也会被更改。
㈧ 区块链中的哈希值是什么
哈希值是将任意长度的输入字符串转换为密码并进行固定输出的过程。哈希值不是一个“密码”,我们不能通过解密哈希来检索原始数据,它是一个单向的加密函数。
区块链:
区块链是一个信息技术领域的术语。从本质上讲,它是一个共享数据库,存储于其中的数据或信息,具有“不可伪造”“全程留痕”“可以追溯”“公开透明”“集体维护”等特征。基于这些特征,区块链技术奠定了坚实的“信任”基础,创造了可靠的“合作”机制,具有广阔的运用前景。2019年1月10日,国家互联网信息办公室发布《区块链信息服务管理规定》 。
㈨ 区块链 --- 共识算法
PoW算法是一种防止分布式服务资源被滥用、拒绝服务攻击的机制。它要求节点进行适量消耗时间和资源的复杂运算,并且其运算结果能被其他节点快速验算,以耗用时间、能源做担保,以确保服务与资源被真正的需求所使用。
PoW算法中最基本的技术原理是使用哈希算法。假设求哈希值Hash(r),若原始数据为r(raw),则运算结果为R(Result)。
R = Hash(r)
哈希函数Hash()的特性是,对于任意输入值r,得出结果R,并且无法从R反推回r。当输入的原始数据r变动1比特时,其结果R值完全改变。在比特币的PoW算法中,引入算法难度d和随机值n,得到以下公式:
Rd = Hash(r+n)
该公式要求在填入随机值n的情况下,计算结果Rd的前d字节必须为0。由于哈希函数结果的未知性,每个矿工都要做大量运算之后,才能得出正确结果,而算出结果广播给全网之后,其他节点只需要进行一次哈希运算即可校验。PoW算法就是采用这种方式让计算消耗资源,而校验仅需一次。
PoS算法要求节点验证者必须质押一定的资金才有挖矿打包资格,并且区域链系统在选定打包节点时使用随机的方式,当节点质押的资金越多时,其被选定打包区块的概率越大。
POS模式下,每个币每天产生1币龄,比如你持有100个币,总共持有了30天,那么,此时你的币龄就为3000。这个时候,如果你验证了一个POS区块,你的币龄就会被清空为0,同时从区块中获得相对应的数字货币利息。
节点通过PoS算法出块的过程如下:普通的节点要成为出块节点,首先要进行资产的质押,当轮到自己出块时,打包区块,然后向全网广播,其他验证节点将会校验区块的合法性。
DPoS算法和PoS算法相似,也采用股份和权益质押。
但不同的是,DPoS算法采用委托质押的方式,类似于用全民选举代表的方式选出N个超级节点记账出块。
选民把自己的选票投给某个节点,如果某个节点当选记账节点,那么该记账节点往往在获取出块奖励后,可以采用任意方式来回报自己的选民。
这N个记账节点将轮流出块,并且节点之间相互监督,如果其作恶,那么会被扣除质押金。
通过信任少量的诚信节点,可以去除区块签名过程中不必要的步骤,提高了交易的速度。
拜占庭问题:
拜占庭是古代东罗马帝国的首都,为了防御在每块封地都驻扎一支由单个将军带领的军队,将军之间只能靠信差传递消息。在战争时,所有将军必须达成共识,决定是否共同开战。
但是,在军队内可能有叛徒,这些人将影响将军们达成共识。拜占庭将军问题是指在已知有将军是叛徒的情况下,剩余的将军如何达成一致决策的问题。
BFT:
BFT即拜占庭容错,拜占庭容错技术是一类分布式计算领域的容错技术。拜占庭假设是对现实世界的模型化,由于硬件错误、网络拥塞或中断以及遭到恶意攻击等原因,计算机和网络可能出现不可预料的行为。拜占庭容错技术被设计用来处理这些异常行为,并满足所要解决的问题的规范要求。
拜占庭容错系统 :
发生故障的节点被称为 拜占庭节点 ,而正常的节点即为 非拜占庭节点 。
假设分布式系统拥有n台节点,并假设整个系统拜占庭节点不超过m台(n ≥ 3m + 1),拜占庭容错系统需要满足如下两个条件:
另外,拜占庭容错系统需要达成如下两个指标:
PBFT即实用拜占庭容错算法,解决了原始拜占庭容错算法效率不高的问题,算法的时间复杂度是O(n^2),使得在实际系统应用中可以解决拜占庭容错问题
PBFT是一种状态机副本复制算法,所有的副本在一个视图(view)轮换的过程中操作,主节点通过视图编号以及节点数集合来确定,即:主节点 p = v mod |R|。v:视图编号,|R|节点个数,p:主节点编号。
PBFT算法的共识过程如下:客户端(Client)发起消息请求(request),并广播转发至每一个副本节点(Replica),由其中一个主节点(Leader)发起提案消息pre-prepare,并广播。其他节点获取原始消息,在校验完成后发送prepare消息。每个节点收到2f+1个prepare消息,即认为已经准备完毕,并发送commit消息。当节点收到2f+1个commit消息,客户端收到f+1个相同的reply消息时,说明客户端发起的请求已经达成全网共识。
具体流程如下 :
客户端c向主节点p发送<REQUEST, o, t, c>请求。o: 请求的具体操作,t: 请求时客户端追加的时间戳,c:客户端标识。REQUEST: 包含消息内容m,以及消息摘要d(m)。客户端对请求进行签名。
主节点收到客户端的请求,需要进行以下交验:
a. 客户端请求消息签名是否正确。
非法请求丢弃。正确请求,分配一个编号n,编号n主要用于对客户端的请求进行排序。然后广播一条<<PRE-PREPARE, v, n, d>, m>消息给其他副本节点。v:视图编号,d客户端消息摘要,m消息内容。<PRE-PREPARE, v, n, d>进行主节点签名。n是要在某一个范围区间内的[h, H],具体原因参见 垃圾回收 章节。
副本节点i收到主节点的PRE-PREPARE消息,需要进行以下交验:
a. 主节点PRE-PREPARE消息签名是否正确。
b. 当前副本节点是否已经收到了一条在同一v下并且编号也是n,但是签名不同的PRE-PREPARE信息。
c. d与m的摘要是否一致。
d. n是否在区间[h, H]内。
非法请求丢弃。正确请求,副本节点i向其他节点包括主节点发送一条<PREPARE, v, n, d, i>消息, v, n, d, m与上述PRE-PREPARE消息内容相同,i是当前副本节点编号。<PREPARE, v, n, d, i>进行副本节点i的签名。记录PRE-PREPARE和PREPARE消息到log中,用于View Change过程中恢复未完成的请求操作。
主节点和副本节点收到PREPARE消息,需要进行以下交验:
a. 副本节点PREPARE消息签名是否正确。
b. 当前副本节点是否已经收到了同一视图v下的n。
c. n是否在区间[h, H]内。
d. d是否和当前已收到PRE-PPREPARE中的d相同
非法请求丢弃。如果副本节点i收到了2f+1个验证通过的PREPARE消息,则向其他节点包括主节点发送一条<COMMIT, v, n, d, i>消息,v, n, d, i与上述PREPARE消息内容相同。<COMMIT, v, n, d, i>进行副本节点i的签名。记录COMMIT消息到日志中,用于View Change过程中恢复未完成的请求操作。记录其他副本节点发送的PREPARE消息到log中。
主节点和副本节点收到COMMIT消息,需要进行以下交验:
a. 副本节点COMMIT消息签名是否正确。
b. 当前副本节点是否已经收到了同一视图v下的n。
c. d与m的摘要是否一致。
d. n是否在区间[h, H]内。
非法请求丢弃。如果副本节点i收到了2f+1个验证通过的COMMIT消息,说明当前网络中的大部分节点已经达成共识,运行客户端的请求操作o,并返回<REPLY, v, t, c, i, r>给客户端,r:是请求操作结果,客户端如果收到f+1个相同的REPLY消息,说明客户端发起的请求已经达成全网共识,否则客户端需要判断是否重新发送请求给主节点。记录其他副本节点发送的COMMIT消息到log中。
如果主节点作恶,它可能会给不同的请求编上相同的序号,或者不去分配序号,或者让相邻的序号不连续。备份节点应当有职责来主动检查这些序号的合法性。
如果主节点掉线或者作恶不广播客户端的请求,客户端设置超时机制,超时的话,向所有副本节点广播请求消息。副本节点检测出主节点作恶或者下线,发起View Change协议。
View Change协议 :
副本节点向其他节点广播<VIEW-CHANGE, v+1, n, C , P , i>消息。n是最新的stable checkpoint的编号, C 是 2f+1验证过的CheckPoint消息集合, P 是当前副本节点未完成的请求的PRE-PREPARE和PREPARE消息集合。
当主节点p = v + 1 mod |R|收到 2f 个有效的VIEW-CHANGE消息后,向其他节点广播<NEW-VIEW, v+1, V , O >消息。 V 是有效的VIEW-CHANGE消息集合。 O 是主节点重新发起的未经完成的PRE-PREPARE消息集合。PRE-PREPARE消息集合的选取规则:
副本节点收到主节点的NEW-VIEW消息,验证有效性,有效的话,进入v+1状态,并且开始 O 中的PRE-PREPARE消息处理流程。
在上述算法流程中,为了确保在View Change的过程中,能够恢复先前的请求,每一个副本节点都记录一些消息到本地的log中,当执行请求后副本节点需要把之前该请求的记录消息清除掉。
最简单的做法是在Reply消息后,再执行一次当前状态的共识同步,这样做的成本比较高,因此可以在执行完多条请求K(例如:100条)后执行一次状态同步。这个状态同步消息就是CheckPoint消息。
副本节点i发送<CheckPoint, n, d, i>给其他节点,n是当前节点所保留的最后一个视图请求编号,d是对当前状态的一个摘要,该CheckPoint消息记录到log中。如果副本节点i收到了2f+1个验证过的CheckPoint消息,则清除先前日志中的消息,并以n作为当前一个stable checkpoint。
这是理想情况,实际上当副本节点i向其他节点发出CheckPoint消息后,其他节点还没有完成K条请求,所以不会立即对i的请求作出响应,它还会按照自己的节奏,向前行进,但此时发出的CheckPoint并未形成stable。
为了防止i的处理请求过快,设置一个上文提到的 高低水位区间[h, H] 来解决这个问题。低水位h等于上一个stable checkpoint的编号,高水位H = h + L,其中L是我们指定的数值,等于checkpoint周期处理请求数K的整数倍,可以设置为L = 2K。当副本节点i处理请求超过高水位H时,此时就会停止脚步,等待stable checkpoint发生变化,再继续前进。
在区块链场景中,一般适合于对强一致性有要求的私有链和联盟链场景。例如,在IBM主导的区块链超级账本项目中,PBFT是一个可选的共识协议。在Hyperledger的Fabric项目中,共识模块被设计成可插拔的模块,支持像PBFT、Raft等共识算法。
Raft基于领导者驱动的共识模型,其中将选举一位杰出的领导者(Leader),而该Leader将完全负责管理集群,Leader负责管理Raft集群的所有节点之间的复制日志。
下图中,将在启动过程中选择集群的Leader(S1),并为来自客户端的所有命令/请求提供服务。 Raft集群中的所有节点都维护一个分布式日志(复制日志)以存储和提交由客户端发出的命令(日志条目)。 Leader接受来自客户端的日志条目,并在Raft集群中的所有关注者(S2,S3,S4,S5)之间复制它们。
在Raft集群中,需要满足最少数量的节点才能提供预期的级别共识保证, 这也称为法定人数。 在Raft集群中执行操作所需的最少投票数为 (N / 2 +1) ,其中N是组中成员总数,即 投票至少超过一半 ,这也就是为什么集群节点通常为奇数的原因。 因此,在上面的示例中,我们至少需要3个节点才能具有共识保证。
如果法定仲裁节点由于任何原因不可用,也就是投票没有超过半数,则此次协商没有达成一致,并且无法提交新日志。
数据存储:Tidb/TiKV
日志:阿里巴巴的 DLedger
服务发现:Consul& etcd
集群调度:HashiCorp Nomad
只能容纳故障节点(CFT),不容纳作恶节点
顺序投票,只能串行apply,因此高并发场景下性能差
Raft通过解决围绕Leader选举的三个主要子问题,管理分布式日志和算法的安全性功能来解决分布式共识问题。
当我们启动一个新的Raft集群或某个领导者不可用时,将通过集群中所有成员节点之间协商来选举一个新的领导者。 因此,在给定的实例中,Raft集群的节点可以处于以下任何状态: 追随者(Follower),候选人(Candidate)或领导者(Leader)。
系统刚开始启动的时候,所有节点都是follower,在一段时间内如果它们没有收到Leader的心跳信号,follower就会转化为Candidate;
如果某个Candidate节点收到大多数节点的票,则这个Candidate就可以转化为Leader,其余的Candidate节点都会回到Follower状态;
一旦一个Leader发现系统中存在一个Leader节点比自己拥有更高的任期(Term),它就会转换为Follower。
Raft使用基于心跳的RPC机制来检测何时开始新的选举。 在正常期间, Leader 会定期向所有可用的 Follower 发送心跳消息(实际中可能把日志和心跳一起发过去)。 因此,其他节点以 Follower 状态启动,只要它从当前 Leader 那里收到周期性的心跳,就一直保持在 Follower 状态。
当 Follower 达到其超时时间时,它将通过以下方式启动选举程序:
根据 Candidate 从集群中其他节点收到的响应,可以得出选举的三个结果。
共识算法的实现一般是基于复制状态机(Replicated state machines),何为 复制状态机 :
简单来说: 相同的初识状态 + 相同的输入 = 相同的结束状态 。不同节点要以相同且确定性的函数来处理输入,而不要引入一下不确定的值,比如本地时间等。使用replicated log是一个很不错的注意,log具有持久化、保序的特点,是大多数分布式系统的基石。
有了Leader之后,客户端所有并发的请求可以在Leader这边形成一个有序的日志(状态)序列,以此来表示这些请求的先后处理顺序。Leader然后将自己的日志序列发送Follower,保持整个系统的全局一致性。注意并不是强一致性,而是 最终一致性 。
日志由有序编号(log index)的日志条目组成。每个日志条目包含它被创建时的任期号(term),和日志中包含的数据组成,日志包含的数据可以为任何类型,从简单类型到区块链的区块。每个日志条目可以用[ term, index, data]序列对表示,其中term表示任期, index表示索引号,data表示日志数据。
Leader 尝试在集群中的大多数节点上执行复制命令。 如果复制成功,则将命令提交给集群,并将响应发送回客户端。类似两阶段提交(2PC),不过与2PC的区别在于,leader只需要超过一半节点同意(处于工作状态)即可。
leader 、 follower 都可能crash,那么 follower 维护的日志与 leader 相比可能出现以下情况
当出现了leader与follower不一致的情况,leader强制follower复制自己的log, Leader会从后往前试 ,每次AppendEntries失败后尝试前一个日志条目(递减nextIndex值), 直到成功找到每个Follower的日志一致位置点(基于上述的两条保证),然后向后逐条覆盖Followers在该位置之后的条目 。所以丢失的或者多出来的条目可能会持续多个任期。
要求候选人的日志至少与其他节点一样最新。如果不是,则跟随者节点将不投票给候选者。
意味着每个提交的条目都必须存在于这些服务器中的至少一个中。如果候选人的日志至少与该多数日志中的其他日志一样最新,则它将保存所有已提交的条目,避免了日志回滚事件的发生。
即任一任期内最多一个leader被选出。这一点非常重要,在一个复制集中任何时刻只能有一个leader。系统中同时有多余一个leader,被称之为脑裂(brain split),这是非常严重的问题,会导致数据的覆盖丢失。在raft中,两点保证了这个属性:
因此, 某一任期内一定只有一个leader 。
当集群中节点的状态发生变化(集群配置发生变化)时,系统容易受到系统故障。 因此,为防止这种情况,Raft使用了一种称为两阶段的方法来更改集群成员身份。 因此,在这种方法中,集群在实现新的成员身份配置之前首先更改为中间状态(称为联合共识)。 联合共识使系统即使在配置之间进行转换时也可用于响应客户端请求,它的主要目的是提升分布式系统的可用性。