什么是共識(shí)機(jī)制
所謂“共識(shí)機(jī)制”,是通過特殊節(jié)點(diǎn)的投票刚梭,在很短的時(shí)間內(nèi)完成對(duì)交易的驗(yàn)證和確認(rèn)今阳;對(duì)一筆交易,如果利益不相干的若干個(gè)節(jié)點(diǎn)能夠達(dá)成共識(shí)逊躁,我們就可以認(rèn)為全網(wǎng)對(duì)此也能夠達(dá)成共識(shí)似踱。再通俗一點(diǎn)來講,如果中國(guó)一名微博大V稽煤、美國(guó)一名虛擬幣玩家核芽、一名非洲留學(xué)生和一名歐洲旅行者互不相識(shí),但他們都一致認(rèn)為你是個(gè)好人念脯,那么基本上就可以斷定你這人還不壞狞洋。
區(qū)塊鏈為什么需要共識(shí)機(jī)制(算法)
要想整個(gè)區(qū)塊鏈網(wǎng)絡(luò)節(jié)點(diǎn)維持一份相同的數(shù)據(jù),同時(shí)保證每個(gè)參與者的公平性绿店,整個(gè)體系的所有參與者必須要有統(tǒng)一的協(xié)議吉懊,也就是我們這里要將的共識(shí)算法庐橙。比特幣所有的節(jié)點(diǎn)都遵循統(tǒng)一的協(xié)議規(guī)范。協(xié)議規(guī)范(共識(shí)算法)由相關(guān)的共識(shí)規(guī)則組成借嗽,這些規(guī)則可以分為兩個(gè)大的核心:工作量證明與最長(zhǎng)鏈機(jī)制态鳖。所有規(guī)則(共識(shí))的最終體現(xiàn)就是比特幣的最長(zhǎng)鏈。共識(shí)算法的目的就是保證比特幣不停地在最長(zhǎng)鏈條上運(yùn)轉(zhuǎn)恶导,從而保證整個(gè)記賬系統(tǒng)的一致性和可靠性浆竭。
四種主流的共識(shí)機(jī)制
區(qū)塊鏈中的用戶進(jìn)行交易時(shí)不需要考慮對(duì)方的信用、不需要信任對(duì)方惨寿,也無需一個(gè)可信的中介機(jī)構(gòu)或中央機(jī)構(gòu)邦泄,只需要依據(jù)區(qū)塊鏈協(xié)議即可實(shí)現(xiàn)交易。這種不需要可信第三方中介就可以順利交易的前提是區(qū)塊鏈的共識(shí)機(jī)制裂垦,即在互不了解顺囊、信任的市場(chǎng)環(huán)境中,參與交易的各節(jié)點(diǎn)出于對(duì)自身利益考慮蕉拢,沒有任何違規(guī)作弊的動(dòng)機(jī)特碳、行為,因此各節(jié)點(diǎn)會(huì)主動(dòng)自覺遵守預(yù)先設(shè)定的規(guī)則晕换,來判斷每一筆交易的真實(shí)性和可靠性午乓,并將檢驗(yàn)通過的記錄寫入到區(qū)塊鏈中。各節(jié)點(diǎn)的利益各不相同闸准,邏輯上將它們沒有合謀欺騙作弊的動(dòng)機(jī)產(chǎn)生益愈,而當(dāng)網(wǎng)絡(luò)中有的節(jié)點(diǎn)擁有公共信譽(yù)時(shí),這一點(diǎn)尤為明顯恕汇。區(qū)塊鏈技術(shù)運(yùn)用基于數(shù)學(xué)原理的共識(shí)算法腕唧,在節(jié)點(diǎn)之間建立“信任”網(wǎng)絡(luò)或辖,利用技術(shù)手段從而實(shí)現(xiàn)一種創(chuàng)新式的信用網(wǎng)絡(luò)瘾英。
目前區(qū)款連行業(yè)內(nèi)主流的共識(shí)算法機(jī)制包含:工作量證明機(jī)制、權(quán)益證明機(jī)制颂暇、股份授權(quán)證明機(jī)制和Pool驗(yàn)證池這四大類缺谴。
01 工作量證明機(jī)制
工作量證明機(jī)制即對(duì)于工作量的證明,是生成要加入到區(qū)塊鏈中的一筆新的交易信息(即新區(qū)塊)時(shí)必須滿足的要求耳鸯。在基于工作量證明機(jī)制構(gòu)建的區(qū)塊鏈網(wǎng)絡(luò)中湿蛔,節(jié)點(diǎn)通過計(jì)算隨機(jī)哈希散列的數(shù)值解爭(zhēng)奪記賬權(quán),求得正確的數(shù)值解以生成區(qū)塊的能力是節(jié)點(diǎn)算力的具體表現(xiàn)县爬。工作量證明機(jī)制具有完全去中心化的優(yōu)點(diǎn)阳啥,在以工作量證明機(jī)制為共識(shí)的區(qū)塊鏈中,節(jié)點(diǎn)可以自由進(jìn)出财喳。大家所熟知的比特幣網(wǎng)絡(luò)就應(yīng)用工作量證明機(jī)制來生產(chǎn)新的貨幣察迟。然而斩狱,由于工作量證明機(jī)制在比特幣網(wǎng)絡(luò)中的應(yīng)用已經(jīng)吸引了全球計(jì)算機(jī)大部分的算力,其他想嘗試使用該機(jī)制的區(qū)塊鏈應(yīng)用很難獲得同樣規(guī)模的算力來維持自身的安全扎瓶。同時(shí)所踊,基于工作量證明機(jī)制的挖礦行為還造成了大量的資源浪費(fèi),達(dá)成共識(shí)所需要的周期也較長(zhǎng)概荷,因此該機(jī)制并不適合商業(yè)應(yīng)用秕岛。
02 權(quán)益證明機(jī)制
2012年,化名Sunny King的網(wǎng)友推出了Peercoin误证,該加密電子貨幣采用工作量證明機(jī)制發(fā)行新幣继薛,采用權(quán)益證明機(jī)制維護(hù)網(wǎng)絡(luò)安全,這是權(quán)益證明機(jī)制在加密電子貨幣中的首次應(yīng)用愈捅。與要求證明人執(zhí)行一定量的計(jì)算工作不同惋增,權(quán)益證明要求證明人提供一定數(shù)量加密貨幣的所有權(quán)即可。權(quán)益證明機(jī)制的運(yùn)作方式是改鲫,當(dāng)創(chuàng)造一個(gè)新區(qū)塊時(shí)诈皿,礦工需要?jiǎng)?chuàng)建一個(gè)“幣權(quán)”交易,交易會(huì)按照預(yù)先設(shè)定的比例把一些幣發(fā)送給礦工本身像棘。權(quán)益證明機(jī)制根據(jù)每個(gè)節(jié)點(diǎn)擁有代幣的比例和時(shí)間稽亏,依據(jù)算法等比例地降低節(jié)點(diǎn)的挖礦難度,從而加快了尋找隨機(jī)數(shù)的速度缕题。這種共識(shí)機(jī)制可以縮短達(dá)成共識(shí)所需的時(shí)間截歉,但本質(zhì)上仍然需要網(wǎng)絡(luò)中的節(jié)點(diǎn)進(jìn)行挖礦運(yùn)算。因此烟零,PoS機(jī)制并沒有從根本上解決PoW機(jī)制難以應(yīng)用于商業(yè)領(lǐng)域的問題瘪松。
03 股份授權(quán)證明機(jī)制
股份授權(quán)證明機(jī)制是一種新的保障網(wǎng)絡(luò)安全的共識(shí)機(jī)制。它在嘗試解決傳統(tǒng)的PoW機(jī)制和PoS機(jī)制問題的同時(shí)锨阿,還能通過實(shí)施科技式的民主抵消中心化所帶來的負(fù)面效應(yīng)宵睦。
股份授權(quán)證明機(jī)制與董事會(huì)投票類似,該機(jī)制擁有一個(gè)內(nèi)置的實(shí)時(shí)股權(quán)人投票系統(tǒng)墅诡,就像系統(tǒng)隨時(shí)都在召開一個(gè)永不散場(chǎng)的股東大會(huì)壳嚎,所有股東都在這里投票決定公司決策∧┰纾基于DPoS機(jī)制建立的區(qū)塊鏈的去中心化依賴于一定數(shù)量的代表烟馅,而非全體用戶。在這樣的區(qū)塊鏈中然磷,全體節(jié)點(diǎn)投票選舉出一定數(shù)量的節(jié)點(diǎn)代表郑趁,由他們來代理全體節(jié)點(diǎn)確認(rèn)區(qū)塊、維持系統(tǒng)有序運(yùn)行姿搜。同時(shí)寡润,區(qū)塊鏈中的全體節(jié)點(diǎn)具有隨時(shí)罷免和任命代表的權(quán)力缺脉。如果必要,全體節(jié)點(diǎn)可以通過投票讓現(xiàn)任節(jié)點(diǎn)代表失去代表資格悦穿,重新選舉新的代表攻礼,實(shí)現(xiàn)實(shí)時(shí)的民主。
股份授權(quán)證明機(jī)制可以大大縮小參與驗(yàn)證和記賬節(jié)點(diǎn)的數(shù)量栗柒,從而達(dá)到秒級(jí)的共識(shí)驗(yàn)證礁扮。然而,該共識(shí)機(jī)制仍然不能完美解決區(qū)塊鏈在商業(yè)中的應(yīng)用問題瞬沦,因?yàn)樵摴沧R(shí)機(jī)制無法擺脫對(duì)于代幣的依賴太伊,而在很多商業(yè)應(yīng)用中并不需要代幣的存在。
04 PooI驗(yàn)證池
Pool驗(yàn)證池基于傳統(tǒng)的分布式一致性技術(shù)建立逛钻,并輔之以數(shù)據(jù)驗(yàn)證機(jī)制僚焦,是目前區(qū)塊鏈中廣泛使用的一種共識(shí)機(jī)制。
Pool驗(yàn)證池不需要依賴代幣就可以工作曙痘,在成熟的分布式一致性算法(Pasox芳悲、Raft)基礎(chǔ)之上,可以實(shí)現(xiàn)秒級(jí)共識(shí)驗(yàn)證边坤,更適合有多方參與的多中心商業(yè)模式名扛。不過,Pool驗(yàn)證池也存在一些不足茧痒,例如該共識(shí)機(jī)制能夠?qū)崿F(xiàn)的分布式程度不如PoW機(jī)制等
工作量證明算法解析
這里主要講解區(qū)塊鏈工作量證明機(jī)制的一些算法原理以及比特幣網(wǎng)絡(luò)是如何證明自己的工作量的肮韧,希望大家能夠?qū)沧R(shí)算法有一個(gè)基本的認(rèn)識(shí)。
基本技術(shù)原理
工作量證明系統(tǒng)的主要特征是客戶端要做一定難度的工作來得到一個(gè)結(jié)果旺订,驗(yàn)證方則很容易通過結(jié)果來檢查客戶端是不是做了相應(yīng)的工作弄企。這種方案的一個(gè)核心特征是不對(duì)稱性:工作對(duì)于請(qǐng)求方是適中中的,對(duì)于驗(yàn)證方是易于驗(yàn)證的区拳。它與驗(yàn)證碼不同拘领,驗(yàn)證碼是易于被人類解決而不是易于被計(jì)算機(jī)解決。
下圖所示的為工作量證明流程劳闹。
舉個(gè)例子院究,給個(gè)一個(gè)基本的字符創(chuàng)“hello,world本涕!”,我們給出的工作量要求是伙窃,可以在這個(gè)字符創(chuàng)后面添加一個(gè)叫做nonce(隨機(jī)數(shù))的整數(shù)值菩颖,對(duì)變更后(添加nonce)的字符創(chuàng)進(jìn)行SHA-256運(yùn)算,如果得到的結(jié)果(一十六進(jìn)制的形式表示)以“0000”開頭的为障,則驗(yàn)證通過晦闰。為了達(dá)到這個(gè)工作量證明的目標(biāo)放祟,需要不停地遞增nonce值,對(duì)得到的字符創(chuàng)進(jìn)行SHA-256哈希運(yùn)算呻右。按照這個(gè)規(guī)則跪妥,需要經(jīng)過4251次運(yùn)算,才能找到前導(dǎo)為4個(gè)0的哈希散列声滥。
“Hello,World!0"=>1312af178c253f84028d480a6adc1e25e81caa44c749ec81976192e2ec934c64
“Hello,World!1"=>e9afc424b79e4f6ab42d99c81156d3a17228d6e1eef4139be78e948a9332a7d8
“Hello,World!2"=>ae37343a357a8297591625e7134cbea22f5928be8ca2a32aa475cf05fd4266b7
...“Hello,World!4250"=>0000c3af42fc31103f1fdc0151fa747ff87349a4714df7cc52ea464e12dcd4e9
通過這個(gè)示例我們對(duì)工作量證明機(jī)制有了一個(gè)初步的理解眉撵。有人或許認(rèn)為如果工作量證明只是這樣一個(gè)過程,那是不是只要記住nonce為4521使計(jì)算能通過驗(yàn)證就行了落塑,當(dāng)然不是了纽疟,這只是一個(gè)例子。
下面我們將輸入簡(jiǎn)單的變更為”Hello,World!+整數(shù)值”憾赁,整數(shù)值取1~1000污朽,也就是說將輸入變成一個(gè)1~1000的數(shù)組:Hello,World!1;Hello,World!2龙考;...蟆肆;Hello,World!1000。然后對(duì)數(shù)組中的每一個(gè)輸入依次進(jìn)行上面的工作量證明—找到前導(dǎo)為4個(gè)0的哈希散列晦款。
由于哈希值偽隨機(jī)的特性颓芭,根據(jù)概率論的相關(guān)知識(shí)容易計(jì)算出,預(yù)計(jì)要進(jìn)行2的16次方次數(shù)的嘗試柬赐,才能得到前導(dǎo)為4個(gè)0的哈希散列亡问。而統(tǒng)計(jì)一下剛剛進(jìn)行的1000次計(jì)算的實(shí)際結(jié)果會(huì)發(fā)現(xiàn),進(jìn)行計(jì)算的平均次數(shù)為66958次肛宋,十分接近2的16次方(65536)州藕。在這個(gè)例子中,數(shù)學(xué)期望的計(jì)算次數(shù)實(shí)際就是要求的“工作量”酝陈,重復(fù)進(jìn)行多次的工作量證明會(huì)是一個(gè)符合統(tǒng)計(jì)學(xué)規(guī)律的概率事件床玻。
統(tǒng)計(jì)輸入的字符創(chuàng)與得到對(duì)應(yīng)目標(biāo)結(jié)果實(shí)際使用的計(jì)算次數(shù)如下:
Hello,World!1=>42153
Hello,World!2=>2643
Hello,World!3=>32825
Hello,World!4=>250
Hello,World!5=>7300
...
Hello,World!995=>164819
Hello,World!996=>178486
Hello,World!997=>22798
Hello,World!998=>68868
Hello,World!999=>46281
比特幣的工作量證明
對(duì)于比特幣網(wǎng)絡(luò)中的任何節(jié)點(diǎn),如果想生成一個(gè)新的區(qū)塊加入到區(qū)塊鏈中沉帮,則必須解決出比特幣網(wǎng)絡(luò)出的這道謎題锈死。這道題的關(guān)鍵要素是工作量證明函數(shù)、區(qū)塊及難度值穆壕。工作量證明函數(shù)是這道題的計(jì)算方法待牵,區(qū)塊是這道題的輸入數(shù)據(jù),難度值決定了解這道題的所需要的計(jì)算量喇勋。
比特幣網(wǎng)絡(luò)中使用的工作量證明函數(shù)正是上文提及的SHA-256缨该。區(qū)塊其實(shí)就是在工作量證明環(huán)節(jié)產(chǎn)生的。曠工通過不停地構(gòu)造區(qū)塊數(shù)據(jù)川背,檢驗(yàn)每次計(jì)算出的結(jié)果是否滿足要求的工作量贰拿,從而判斷該區(qū)塊是不是符合網(wǎng)絡(luò)難度蛤袒。區(qū)塊頭即比特幣工作量證明函數(shù)的輸入數(shù)據(jù)。
難度值是礦工們挖掘的重要參考指標(biāo)膨更,它決定了曠工需要經(jīng)過多少次哈希運(yùn)算才能產(chǎn)生一個(gè)合法的區(qū)塊妙真。比特幣網(wǎng)絡(luò)大約每10分鐘生成一個(gè)區(qū)塊,如果在不同的全網(wǎng)算力條件下荚守,新區(qū)塊的產(chǎn)生基本都保持這個(gè)速度珍德,難度值必須根據(jù)全網(wǎng)算力的變化進(jìn)行調(diào)整〗∪铮總的原則即為無論挖礦能力如何菱阵,使得網(wǎng)絡(luò)始終保持10分鐘產(chǎn)生一個(gè)新區(qū)塊。
難度值的調(diào)整是在每個(gè)完整節(jié)點(diǎn)中獨(dú)立自動(dòng)發(fā)生的缩功。每隔2016個(gè)區(qū)塊晴及,所有節(jié)點(diǎn)都會(huì)按照統(tǒng)一的格式自動(dòng)調(diào)整難度值,這個(gè)公式是由最新產(chǎn)生的2016個(gè)區(qū)塊的花費(fèi)時(shí)長(zhǎng)與期望時(shí)長(zhǎng)(按每10分鐘產(chǎn)生一個(gè)取款嫡锌,則期望時(shí)長(zhǎng)為20160分鐘)比較得出來的虑稼,根據(jù)實(shí)際時(shí)長(zhǎng)一期望時(shí)長(zhǎng)的比值進(jìn)行調(diào)整菜循。也就是說告匠,如果區(qū)塊產(chǎn)生的速度比10分鐘快,則增加難度值昼伴;反正啦桌,則降低難度值溯壶。用公式來表達(dá)如下:
新難度值=舊難度值*(20160分鐘/過去2016個(gè)區(qū)塊花費(fèi)時(shí)長(zhǎng))。
工作量證明需要有一個(gè)目標(biāo)值甫男。比特幣工作量證明的目標(biāo)值(Target)的計(jì)算公式如下:
目標(biāo)值=最大目標(biāo)值/難度值且改,其中最大目標(biāo)值為一個(gè)恒定值0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
目標(biāo)值的大小與難度值成反比,比特幣工作量證明的達(dá)成就是礦中計(jì)算出來的區(qū)塊哈希值必須小于目標(biāo)值板驳。
我們也可以將比特幣工作量的過程簡(jiǎn)單的理解成又跛,通過不停變更區(qū)塊頭(即嘗試不同nonce值)并將其作為輸入,進(jìn)行SHA-256哈希運(yùn)算若治,找出一個(gè)有特定格式哈希值的過程(即要求有一定數(shù)量的前導(dǎo)0)慨蓝,而要求的前導(dǎo)0個(gè)數(shù)越多,難度越大端幼。
可以把比特幣將這道工作量證明謎題的步驟大致歸納如下:
1)生成coinbase交易礼烈,并與其他所有打包進(jìn)區(qū)塊的交易組成交易列表,通過Merkle Tree算法生成Merkle Root Hash静暂。
2)把Merkle Root Hash及其他相關(guān)字段組裝成區(qū)塊頭济丘,將區(qū)塊頭的80字節(jié)數(shù)據(jù)作為工作量證明的輸入。
3)不停變更區(qū)塊頭中的隨機(jī)數(shù)(即nonce值)洽蛀,并對(duì)每次變更后的區(qū)塊頭進(jìn)行雙重SHA-256運(yùn)算摹迷,將結(jié)果值哈希翻轉(zhuǎn)并與當(dāng)前網(wǎng)絡(luò)的目標(biāo)值對(duì)應(yīng)的十進(jìn)制字符創(chuàng)對(duì)比,如果小于目標(biāo)值郊供,則解題成功峡碉,工作量證明完成。
該過程可以用下圖表示:
比特幣的工作量證明驮审,就是我們俗稱“挖礦”所做的主要工作鲫寄。理解工作量證明機(jī)制,將為我們進(jìn)一步理解比特幣區(qū)塊鏈的共識(shí)機(jī)制奠定基礎(chǔ)疯淫。