共識機制是區(qū)塊鏈的一個核心特征帽撑,是保證區(qū)塊鏈系統(tǒng)在分布式架構(gòu)下的一致性方案。目前主流的也有好多種共識算法:POW鞍时、POS亏拉、DPOS扣蜻、RCP、PBFT及塘、DBFT 等等莽使。網(wǎng)上已經(jīng)充斥了很多對這些共識算法的簡單介紹,但基本流于表面而缺少深入的講解磷蛹,從而讀者們也很難理解到這些共識機制背后的核心原理吮旅。而本文將以深入淺出的方式講解區(qū)塊鏈共識機制,但由于篇幅有限味咳,因此庇勃,只會講解最重要的兩種區(qū)塊鏈的共識機制,即比特幣和以太坊的共識機制槽驶。
比特幣共識機制
比特幣是區(qū)塊鏈的第一個應用责嚷,也是第一個實現(xiàn)了共識機制的,因此掂铐,要理解區(qū)塊鏈共識機制罕拂,自然也要先從比特幣共識機制開始。另外全陨,雖然很多文章都提到比特幣的共識機制為 POW(Proof of Work爆班,工作量證明),但實際上辱姨,POW 只是整個比特幣共識機制中的一部分柿菩,雖然是核心的那部分,但卻不是全部雨涛。其實枢舶,比特幣的分布式共識是由網(wǎng)絡節(jié)點的 4 種獨立過程相互作用而達成的:
- 每個全節(jié)點基于一份長長的判斷標準清單對每個交易進行獨立驗證
- 每個挖礦節(jié)點獨立將多個交易打包進新區(qū)塊,通過完成 POW 算法的驗算
- 每個節(jié)點獨立驗證新區(qū)塊并組裝進區(qū)塊鏈
- 每個節(jié)點獨立選擇最長鏈替久,即在 POW 機制下累計工作量最多的那條鏈
先說第一種過程凉泄,對交易的獨立驗證。每個節(jié)點收到每一個交易之后蚯根,都會先根據(jù)一份很長的判斷標準清單對該交易進行有效性校驗后众,包括但不限于校驗交易的語法和數(shù)據(jù)結(jié)構(gòu)是否正確、輸入和輸出是否為空颅拦、輸入總額是否小于輸出總額吼具、每一個輸入所引用的輸出是否已經(jīng)被消費,等等矩距。如果該交易通過所有驗證,則可以說明該交易是有效的怖竭,那么锥债,該節(jié)點就會將該交易放入本地的交易池(或稱內(nèi)存池),并將該交易廣播給其他相臨的節(jié)點。如果沒通過驗證哮肚,則會廢棄該交易登夫,也不會將其廣播出去。其他節(jié)點接收到該交易后允趟,也各自做同樣的獨立校驗恼策,校驗為交易有效之后,同樣也放入各節(jié)點自己的交易池潮剪,并繼續(xù)廣播給其他節(jié)點涣楷。所以,理論上來說抗碰,無效的交易一開始就會被廢棄狮斗,而有效的交易最終會到達整個網(wǎng)絡所有節(jié)點,并被每個全節(jié)點所保存弧蝇,即全網(wǎng)達成了“該交易有效”的共識碳褒。
接著,再來聊聊第二種過程看疗,了解有效的交易是如何被打包進區(qū)塊的沙峻。經(jīng)過一段時間后,一般是 10 分鐘左右两芳,每個節(jié)點的交易池里會收集到很多有效但還未確認的交易摔寨,這些交易會組裝成一顆 Merkle Tree。關(guān)于 Merkle Tree 的結(jié)構(gòu)盗扇,我們在之前的文章《014|從微觀到宏觀理解區(qū)塊鏈》已經(jīng)講過祷肯,這里就不贅述了。不過疗隶,組裝進 Merkle Tree 的第一筆交易是比較特殊的佑笋,這是一筆創(chuàng)幣交易,也叫 Coinbase 交易斑鼻,新的比特幣就是從該筆交易產(chǎn)生的蒋纬。這筆交易是由節(jié)點自己創(chuàng)建的,并將挖礦獎勵支付到礦工自己的地址坚弱,挖礦獎勵包括新創(chuàng)建的比特幣和打包進該區(qū)塊所有交易的手續(xù)費總額蜀备。組裝好 Merkle Tree 之后,就得到 Merkle Root荒叶,再結(jié)合區(qū)塊頭的其他 5 個字段——Version碾阁、Pre Block、Times些楣、Difficulty脂凶、Nonce宪睹,總共 6 個字段合在一起經(jīng)過兩次 SHA256 計算得到區(qū)塊哈希值。一個有效的區(qū)塊要求其哈希值必須小于 Difficulty 難度值蚕钦,寫作本文時的難度要求哈希值至少已經(jīng)有 18 個 0 開頭亭病。挖礦其實就是通過修改參數(shù)的值而不斷計算區(qū)塊哈希值,直到計算出符合難度要求的哈希值嘶居。一般是通過修改 Nonce 值來計算區(qū)塊哈希值罪帖,其他 5 個字段基本是不變的。而由于哈希函數(shù)的特性邮屁,難度值越大整袁,理論上計算出符合要求的哈希值所需的計算量就越大。舉個簡單例子樱报,比如你扔三個骰子葬项,如果難度要求總和小于18,那是非常容易達到的迹蛤,基本扔個一兩次就能滿足要求了民珍;而如果加大難度,要求總和小于9盗飒,那從概率上來說相對就沒那么容易了嚷量,可能要扔個十幾次甚至幾十次才能達到;而如果要求總和等于 3逆趣,那只能扔出三個 1 才行蝶溶,這誰都知道要達到的概率是很低的,也許扔個一兩百次才可能出現(xiàn)宣渗。因此抖所,從統(tǒng)計學來說,一定的難度值可以推算出概率上對應所需的計算次數(shù)痕囱,也就是“工作量”田轧,所以,只要你達到了難度要求鞍恢,也就間接證明你付出了對應的工作量傻粘,這就是工作量證明。
當某個節(jié)點計算出符合難度要求的區(qū)塊哈希時帮掉,即說明該礦工挖礦成功了弦悉,該節(jié)點就會將此區(qū)塊組裝到本地的區(qū)塊鏈,同時也將此區(qū)塊廣播給其他節(jié)點蟆炊。然后稽莉,就進入第三種過程了。當其他節(jié)點收到此區(qū)塊時涩搓,也會各自獨立驗證該區(qū)塊是否有效污秆。和獨立驗證交易一樣后室,也存在一份驗證標準清單,包括但不限于校驗引用的上一個區(qū)塊是否是否正確混狠、難度值是否符合標準、區(qū)塊哈希是否真的符合難度要求疾层、Coinbase 交易中的挖礦獎勵是否多于應得的将饺、整個區(qū)塊的每筆交易是否都是有效的,等等痛黎。其中予弧,難度值是有標準的計算公式的,每個節(jié)點都會根據(jù)標準公式獨立計算實際的難度值湖饱,所以掖蛤,礦工如果不按照標準而自己設置一個較低的難度,在其他節(jié)點是無法通過的井厌。同樣蚓庭,挖礦獎勵也是有標準公式的,所以仅仆,如果礦工給自己獎勵過多的比特幣器赞,在其他節(jié)點也是同樣無法通過的。每個節(jié)點驗證該區(qū)塊為有效之后墓拜,也會各自將該區(qū)塊組裝進它們本地的區(qū)塊鏈港柜,并繼續(xù)將該區(qū)塊廣播給其他節(jié)點。
由于所有節(jié)點同時在挖同一個區(qū)塊咳榜,就有可能會出現(xiàn)多個節(jié)點同時挖出了同個區(qū)塊夏醉,并都將各自挖到的區(qū)塊廣播到其他節(jié)點。假設有兩個節(jié)點同時挖出了新區(qū)塊涌韩,分別為區(qū)塊 N1 和 N2畔柔,它們的上一個區(qū)塊都是 P。有些節(jié)點會先收到 N1贸辈,它們會將 N1 先組裝進它們本地的區(qū)塊鏈释树,也稱為主鏈。但之后不久擎淤,這些節(jié)點也會收到 N2奢啥,這時候,它們會將 N2 放入備選鏈嘴拢。而其他節(jié)點則先收到 N2 再收到 N1桩盲,則 N2 在它們的主鏈上,而 N1 在它們的備選鏈上席吴。這時候赌结,整個區(qū)塊鏈暫時就分成了兩個分叉捞蛋,而要打破這種局面,就要看下一個生成的區(qū)塊是基于 N1 還是 N2 了柬姚。如果下一個區(qū)塊是基于 N1拟杉,自然,N1 的這條鏈就變成了最長鏈量承,也是累計工作量最多的鏈搬设。那么,那些將 N2 鏈設為主鏈的節(jié)點就會根據(jù)實際情況自己選擇將 N1 鏈改為主鏈撕捍,而 N2 將成為孤塊而被廢棄拿穴。
以上就是比特幣共識機制的核心內(nèi)容了,說白了其實就是根據(jù)一些所有節(jié)點都認可的標準對每個交易和區(qū)塊的創(chuàng)建和校驗進行獨立驗證忧风,當大多數(shù)節(jié)點都認可并寫入自己的區(qū)塊鏈的時候默色,就自動形成了分布式共識。所有區(qū)塊鏈基本都是這個邏輯狮腿,不同區(qū)塊鏈主要在于制定的標準不同腿宰,比特幣主要就是基于 POW 機制,這種機制實現(xiàn)簡單蚤霞,但它會造成大量的能源浪費酗失,由于所有節(jié)點同時競爭挖礦同一個區(qū)塊,而基本只有一個節(jié)點能勝出昧绣,那其他未勝出的節(jié)點所消耗的算力能源就白費了规肴。另外,每次交易確認(即出塊時間)大概 10 分鐘夜畴,一筆交易一般要有 6 次確認才算安全拖刃,那基本就要 1 個小時了,這共識達成的時間太長了贪绘。
以太坊共識機制
以太坊的共識機制也是基于 POW 的兑牡,但與比特幣相比,主要有兩點不同:一是挖礦時間控制在 10 ~ 19 秒之間税灌,出塊時間比比特幣快了很多均函;二是對于孤塊也有挖礦獎勵。在比特幣中菱涤,孤塊(即上文的 N2 區(qū)塊)是會被丟棄的苞也,挖出了孤塊的礦工是得不到任何獎勵的。但在以太坊中粘秆,孤塊是能被打包進區(qū)塊里的如迟,如果后續(xù)的區(qū)塊將前面產(chǎn)生的孤塊也打包進區(qū)塊里究西,那這個孤塊就變成了叔塊堵漱,那么,挖到這個叔塊的礦工就能得到獎勵细卧,而將叔塊打包進區(qū)塊的礦工也能得到額外的獎勵较屿,但每個區(qū)塊最多只能包含兩個叔塊树叽,而且也不能包含太久的孤塊镐捧,最多只支持到 7 層的祖先孤塊支救。由于以太坊的出塊時間短很多,那自然更容易出現(xiàn)臨時分叉而產(chǎn)生孤塊贤斜,而且這么短的時間內(nèi)淳附,每個區(qū)塊也很難能夠在全網(wǎng)充分傳播,那對于網(wǎng)速慢的礦工來說蠢古,就非常吃虧了。所以别凹,為了平衡各方利益草讶,以太坊才設計了叔塊機制。寫作本文時炉菲,叔塊率在 16.9% 左右堕战。
不過,以太坊正在計劃從 POW 機制切換為 POS(Proof of Stack拍霜,權(quán)益證明)機制嘱丢,其新的共識機制名為 Casper,其存在兩個不同實現(xiàn)的版本祠饺,分別是:
- Casper the Friendly Finality Gadget(FFG)
- Casper the Friendly GHOST: Correct-by-Construction(CBC)
Casper FFG 是由 Vitalik 主導的越驻,側(cè)重于通過逐步迭代實現(xiàn),慢慢過渡到 POS 機制道偷。而 Casper CBC 則是由 Vlad Zamfir 主導的缀旁,不同于傳統(tǒng)的協(xié)議設計方式,即先定義完整的協(xié)議勺鸦,CBC 協(xié)議在開始階段只是部分確定的并巍,其余部分協(xié)議以證明能夠滿足所需/必需屬性的方式得到。不過换途,也只是兩種不同的方法懊渡,關(guān)于 POS 的核心理念還是一致的。相對來說军拟,F(xiàn)FG 比較容易理解剃执,也很大可能是即將第一個部署到以太坊的 Casper 版本,所以下面的篇幅主要講解 FFG吻谋。
FFG 版本的 Casper 是一種混合 POW / POS 的共識機制忠蝗,該機制下的每次出塊依然還是采用 POW 挖礦機制,但每 100 個區(qū)塊會增加一個 POS 檢查點(checkpoint)漓拾,通過驗證人(validator)來評估區(qū)塊的最終有效性阁最。創(chuàng)世區(qū)塊是一個檢查點戒祠,區(qū)塊高度為 100 的倍數(shù)的區(qū)塊也是檢查點,將這些檢查點連起來就組成了一條檢查點鏈(checkpoint chain)速种。檢查點一般會有兩種狀態(tài):justified 和 finalized姜盈,finalized 則表示已經(jīng)確定為最終有效的,該狀態(tài)的檢查點至少已經(jīng)存在一個子檢查點配阵,justified 則表示該檢查點是已經(jīng)被證明合理的馏颂,finalized 的檢查點一定是 justified 的,但反過來則不一定棋傍。而一個檢查點是否有效救拉,是通過多個驗證人投票得出的結(jié)果。下面瘫拣,我們就來簡單聊聊這個過程亿絮。
首先,要成為驗證人麸拄,是需要投入保證金的派昧,即抵押一定量的以太幣作為權(quán)益證明,才有資格成為驗證人拢切。投入保證金是通過廣播一條 deposit 消息進行操作的蒂萎,只要這條消息是有效的并被打包進區(qū)塊中,那就能加入驗證人集合(validator set)淮椰,成為其中一個驗證人五慈。另外,如果要退出驗證人集合主穗,則可以再廣播一條 withdraw 消息豺撑。不過,需要注意黔牵,一旦退出后聪轿,該驗證人的公鑰將被永久禁止再次加入驗證人集合。
接著猾浦,成為驗證人之后陆错,就可以開始投票選舉檢查點了,通過廣播一條 vote 消息到網(wǎng)絡中金赦。vote 消息主要包含五個信息:兩個檢查點 s 和 t音瓷,以及這兩個檢查點的高度 h(s) 和 h(t),以及驗證人的公鑰 ν夹抗。要求 s 必須是 t 的祖先绳慎,一般來說,t 就是最新的檢查點,而 s 是上一個已經(jīng)確定為最終有效的檢查點杏愤。另外靡砌,還要求驗證人的公鑰 v 必須在驗證人集合中找得到,否則都認為該投票是無效的珊楼。當超過 2/3 的驗證人(實際上是 2/3 的總保證金)都投給了 (s, t) 這對檢查點時通殃,那 s 就是 finalized 的,t 則是 justified 的厕宗。而且画舌,那些投注了 (s, t) 的驗證人還會得到貨幣獎勵,得到的獎勵是和抵押的保證金成比例的已慢,就是說抵押的保證金越多曲聂,得到的獎勵越多。這個獎勵也可以理解為抵押保證金的利息佑惠。
另外句葵,Casper 設置了兩條戒律:
- 驗證人不能發(fā)布兩個 h(t) 相同的投票,即如果存在兩個投票:<ν, s1, t1, h(s1), h(t1)> 和 <ν,s2,t2,h(s2),h(t2)>兢仰,那么 h(t1) = h(t2) 是不允許的;
- 如果 h(s1) < h(s2) < h(t2) < h(t1)剂碴,則第一個投票的跨度已經(jīng)涵蓋了第二個投票把将,這也是不允許的。
如果驗證人違反了上面的戒律忆矛,則會對驗證人進行懲罰察蹲,沒收他抵押的保證金。
最后催训,Casper 對分叉鏈的選擇不同于 POW 機制下選擇累計工作量最多的那條鏈洽议,Casper 對分叉鏈選擇的規(guī)則就是選擇 justified 檢查點高度最大的鏈,原文是:
- FOLLOW THE CHAIN CONTAINING THE JUSTIFIED CHECKPOINT OF THE GREATEST HEIGHT.
很明顯漫拭,以太坊的共識機制和比特幣相比復雜得多亚兄,主要在于兩點引起的:一是大大縮短了出塊時間,二是引入了 POS 機制采驻。在 POW 機制下將出塊時間縮短到十幾秒审胚,雖然加快了性能,但其實減低了安全性礼旅,因為會引入很多其他問題膳叨,比如新區(qū)塊難以在這么短的時間內(nèi)擴散到全網(wǎng),比如分叉鏈出現(xiàn)的概率更大痘系,為了解決這些問題菲嘴,就需要設計更多共識協(xié)議來提高安全性。引入 POS 機制變成 POW + POS 的混合機制,那這種復雜度不是 1 + 1 = 2 這么簡單的龄坪。
思考和實踐
EOS 的共識機制是怎樣的昭雌?其安全性和性能又如何呢?