首先什么是共識(shí)機(jī)制靴庆?共識(shí)機(jī)制就是在一個(gè)群體中的個(gè)體通過(guò)某種方式達(dá)成一致性的一種機(jī)制讲逛,比如在一個(gè)團(tuán)隊(duì)匣摘、或者一個(gè)公司里的個(gè)體意見(jiàn)不一致時(shí)店诗,就需要有一個(gè)領(lǐng)導(dǎo),由領(lǐng)導(dǎo)來(lái)做決定音榜,保證團(tuán)隊(duì)達(dá)成共識(shí)庞瘸。
團(tuán)隊(duì)里的共識(shí)機(jī)制延伸到普通的分布式系統(tǒng)里面,就是系統(tǒng)需要有一個(gè)master赠叼,系統(tǒng)的所有決定都由master來(lái)達(dá)成共識(shí)擦囊,在分布式系統(tǒng)里面master的選舉其實(shí)就是基于某種共識(shí)機(jī)制達(dá)成共識(shí)。
到了區(qū)塊鏈中嘴办,由于區(qū)塊鏈?zhǔn)且环N去中心化的分布式系統(tǒng)瞬场,所以區(qū)塊鏈中是沒(méi)有類(lèi)似于團(tuán)隊(duì)里的領(lǐng)導(dǎo),以及分布式系統(tǒng)中的master的角色涧郊,這樣就需要有某種共識(shí)機(jī)制贯被,以便保證系統(tǒng)一致性。
實(shí)際上當(dāng)節(jié)點(diǎn)之間的通信網(wǎng)絡(luò)不可靠的情況下,系統(tǒng)是無(wú)法達(dá)成共識(shí)的彤灶,具體原因請(qǐng)參考“兩軍問(wèn)題"看幼。即使在網(wǎng)絡(luò)通信可靠的情況下,一個(gè)可擴(kuò)展的分布式系統(tǒng)的共識(shí)問(wèn)題也是無(wú)解的幌陕。這個(gè)結(jié)論被稱(chēng)為”FLP不可能性原理“,又稱(chēng)為分布式領(lǐng)域的”測(cè)不準(zhǔn)原理“诵姜,原理請(qǐng)參考”拜占庭將軍問(wèn)題“。一般的把故障(不響應(yīng))即信道不可靠的情況稱(chēng)為”非拜占庭錯(cuò)誤“,惡意響應(yīng)(即系統(tǒng)被攻擊)稱(chēng)為”拜占庭錯(cuò)誤“搏熄。
以上只是學(xué)術(shù)上的理論值棚唆,現(xiàn)實(shí)系統(tǒng)中我們付出一定的代價(jià)總是能做到一定程度的共識(shí)。詳情可參考CAP理論搬卒。
比特幣區(qū)塊鏈采用了一種工作量證明(Proof of Work)的共識(shí)機(jī)制來(lái)解決區(qū)塊鏈中的一致性問(wèn)題瑟俭,工作量證明通過(guò)猜測(cè)一個(gè)數(shù)值,來(lái)解決規(guī)定的hash問(wèn)題契邀,保證一段時(shí)間內(nèi)摆寄,系統(tǒng)中只能出現(xiàn)少數(shù)合法提案,這也是為什么比特比挖礦每隔10分鐘成功一次的原因坯门。理解工作量證明的一個(gè)好的例子是這樣的:”給定的基本字符串“hello,world!",我們給出的工作量要求是微饥,可以在這個(gè)字符串后面添加一個(gè)叫做nonce的整數(shù)值,使得變更后的字符串的SHA256哈希運(yùn)算的結(jié)果有4位的前導(dǎo)0古戴,即以”0000“開(kāi)頭欠橘,則此結(jié)果符合要求,驗(yàn)證通過(guò)现恼。為了通過(guò)驗(yàn)證肃续,我們需要不停的遞增nonce的值,對(duì)新字符串進(jìn)行SHA256哈希運(yùn)算叉袍,這里的規(guī)則需要4251次計(jì)算才能得到符合要求的結(jié)果始锚,當(dāng)然在真實(shí)的區(qū)塊鏈中的工作量證明的算法要復(fù)雜的多,得到符合要求的結(jié)果所需的工作量也要大的多喳逛。
比特比中的工作量證明機(jī)制步驟如下:
1.生成Coinbase交易 瞧捌,并與其他所有將要打包進(jìn)區(qū)塊的交易組成交易列表,通過(guò)Merkle Tree算法生成Merkle Root Hash.
2.把Merkle Root hash以及其他相關(guān)字段組成區(qū)塊頭润文,講區(qū)塊頭的80字節(jié) 數(shù)據(jù)作為工作量證明的輸入姐呐。
3.不停的變更區(qū)塊頭中的隨機(jī)數(shù)即nonce的數(shù)值,并對(duì)每次變更后的的區(qū)塊頭做雙重SHA256運(yùn)算(即SHA256(SHA256(Block_Header)))典蝌,將結(jié)果值與當(dāng)前網(wǎng)絡(luò)的目標(biāo)值做對(duì)比曙砂,如果小于目標(biāo)值,則解題成功骏掀,工作量證明完成麦轰。比特幣區(qū)塊頭信息 如下:
區(qū)塊頭大小80字節(jié)乔夯,有4字節(jié)的版本號(hào),32字節(jié)的上一個(gè)區(qū)塊的散列值款侵,32字節(jié)的merkle Root hash、4字節(jié)的時(shí)間 戳侧纯,4字節(jié)當(dāng)前難度值新锈,4字節(jié)隨機(jī)數(shù)組成,區(qū)塊中的第一比交易為coinbase交易眶熬。merkle Root hash是一種父節(jié)點(diǎn)為兩個(gè)孩子 節(jié)點(diǎn)的哈希值得二叉樹(shù)妹笆,這種數(shù)據(jù)結(jié)構(gòu)的特點(diǎn)是,對(duì)底層數(shù)據(jù)的變動(dòng)都會(huì)傳遞到根節(jié)點(diǎn)娜氏,更多資料請(qǐng)自行查詢(xún)拳缠。
其他的共識(shí)機(jī)制還有股權(quán)證明機(jī)制(Proof of stake,POS),授權(quán)拜占庭容錯(cuò)機(jī)制(delegated BFT),拜占庭容錯(cuò)算法(PBFT),以及zookeeper中使用的Paxos算法。
如果你對(duì)區(qū)塊鏈感興趣贸弥,可以加我的個(gè)人微信交流窟坐。