轉載聲明:本文來自微信公眾號:火龍果園長,僅供學習交流,禁止用于商業(yè)用途,轉載需關注公眾號取得文章作者同意。
寫在開頭
學習區(qū)塊鏈技術,必須要弄清楚的幾個點包括共識機制、加密協議、網絡協議、分布式存儲等等,而共識機制在區(qū)塊鏈分布式網絡中可謂核心中的核心,被稱為區(qū)塊鏈的靈魂。一切失去共識的分布式網絡都是沒有價值的。鑒于此,專門對區(qū)塊鏈共識機制進行一次梳理,期望以自己的大白話對共識機制進行總結和記錄,加深對共識機制的理解和認識。誠然,我不可能對所有的共識機制進行學習,所以只選取了5種大家所熟知的進行歸納。同時,由于筆者時(cai)間(shu)有(xue)限(qian),只能照本宣科,所以這是一篇幾乎沒有思考的總結。全文大致以介紹各個共識機制的工作機制、優(yōu)缺點、網絡攻擊和鏈分叉解決方案為組織方式。
共識機制概述
1. 什么是共識機制
每一種分布式容錯系統(tǒng)的核心都是這樣一個基本問題:保證相應系統(tǒng)內部發(fā)生的所有遠程進程可以得到同樣的結果。也就是所謂的在參與者中要求“共識”,共識協議保證每一筆交易都被網絡中的所有的機器以同樣的順序復制并記錄下來。
所以共識機制,就是一種多方協作機制,用于協調多參與方達成共同接受的唯一結果,且保證此過程難以被欺騙,且持續(xù)穩(wěn)定運行。在區(qū)塊鏈系統(tǒng)中,共識機制旨在解決節(jié)點之間的信任問題。
我們選取了5種目前市面上比較流行的共識機制進行學習和比較,分別為PoW、PoS、DPoS、Raft和PBFT。
2. 區(qū)塊鏈分類
在開始進行共識機制梳理前,首先需要對目前的區(qū)塊鏈進行一個簡單的了解。目前市面上根據共識算法及應用場景把區(qū)塊鏈分為三類:公有鏈、聯盟鏈和私有鏈。
公有鏈,是一個完全開放的分布式系統(tǒng)。公有鏈中的節(jié)點可以很自由的加入或者退出,不需要嚴格的驗證和審核,比如比特幣、以太坊、EOS等。共識機制在公有鏈中不僅需要考慮網絡中存在故障節(jié)點,還需要考慮作惡節(jié)點(拜占庭節(jié)點),并確保最終一致性。
聯盟鏈,是一個相對開放的分布式系統(tǒng)。對于聯盟鏈,每個新加入的節(jié)點都是需要驗證和審核的,比如Fabric、BCOS等。聯盟鏈一般應用于企業(yè)之間,對安全和數據的一致性要求較高,所以共識機制在聯盟鏈中不僅需要考慮網絡中存在故障節(jié)點,還需要考慮作惡節(jié)點(拜占庭節(jié)點),同時除過確保最終一致性外,還需要確保強一致性。
私有鏈,是一個封閉的分布式系統(tǒng)。由于私有鏈是一個內部系統(tǒng),所以不需要考慮新節(jié)點的加入和退出,也不需要考慮作惡節(jié)點。私有鏈的共識算法還是傳統(tǒng)分布式系統(tǒng)里的共識算法,比如zookeeper的zab協議,就是類paxos算法的一種。只考慮因為系統(tǒng)或者網絡原因導致的故障節(jié)點,數據一致性要求根據系統(tǒng)的要求而定。
3. 共識機制比較
評價一個共識機制,不能單純的用好或者壞來定義,要區(qū)分業(yè)務屬性。而業(yè)務屬性主要基于區(qū)塊鏈的不可能三角及業(yè)務類型,所以主要從場景、去中心化程度、記賬節(jié)點、響應時間、存儲效率、吞吐量和容錯性等維度進行比較,詳情如下:
tips:區(qū)塊鏈不可能三角指任何區(qū)塊鏈系統(tǒng)在安全、性能和去中心化三個方面都不能完全兼顧。
PoW 共識機制
PoW(Proof of Work),即工作量證明,聞名于比特幣,俗稱“挖礦”。PoW是指系統(tǒng)為達到某一目標而設置的度量方法。簡單理解就是一份證明,用來確認你做過一定量的工作。監(jiān)測工作的整個過程通常是極為低效的,而通過對工作的結果進行認證來證明完成了相應的工作量,則是一種非常高效的方式。PoW是按勞分配,算力決定一起,誰的算力多誰記賬的概率就越大,可理解為力量型比較。以下內容基于比特幣的PoW機制。
1. 工作機制
為了使區(qū)塊鏈交易數據記錄在區(qū)塊鏈上并在一定時間內達到一致(共識),PoW提供了一種思路,即所有區(qū)塊鏈的網絡節(jié)點參與者進行競爭記賬,所謂競爭記賬是指,如果想生成一個新的區(qū)塊并寫入區(qū)塊鏈,必須解出比特幣網絡出的工作量證明謎題,誰先解出答案,誰就獲得記賬權利,然后開始記賬并將將解出的答案和交易記錄廣播給其他節(jié)點進行驗證,自己則開始下一輪挖礦。如果區(qū)塊的交易被其他節(jié)點參與者驗證有效并且謎題的答案正確,就意味著這個答案是可信的,新的節(jié)點將被寫入驗證者的節(jié)點區(qū)塊鏈,同時驗證者進入下一輪的競爭挖礦。
這道題關鍵的三個要素是工作量證明函數、區(qū)塊及難度值。工作量證明函數是這道題的計算方法,區(qū)塊決定了這道題的輸入數據,難度值決定了這道題的所需要的計算量。
首先看一下這道題到底是什么?這道題的目的在于算出一個值,且這個值小于目標值即可,這個值就是上圖中的上一個區(qū)塊的哈希值。
- 目標值 = 最大目標值 / 難度值(最大目標值恒定:0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)
- 新難度值 = 舊難度值 * ( 過去2016個區(qū)塊花費時長 / 20160 分鐘 )
tips:難度值是隨網絡變動的,目的是為了在不同的網絡環(huán)境下,確保每10分鐘能生成一個塊。
那如何計算呢?SHA256(SHA256(Block_Header)),即只需要對區(qū)塊頭進行兩次SHA256運算即可,得到的值和目標值進行比較,小于目標值即可。區(qū)塊頭結構如下:
區(qū)塊頭中有一個重要的東西叫MerkleRoot的hash值。這個東西的意義在于:為了使區(qū)塊頭能體現區(qū)塊所包含的所有交易,在區(qū)塊的構造過程中,需要將該區(qū)塊要包含的交易列表,通過Merkle Tree算法生成Merkle Root Hash,并以此作為交易列表的摘要存到區(qū)塊頭中。
至此,我們發(fā)現區(qū)塊頭中除過nonce以外,其余的數據都是明確的,解題的核心就在于不停的調整nonce的值,對區(qū)塊頭進行雙重SHA256運算。整個工作量證明過程如下:

2. PoW優(yōu)缺點
通過上面的描述,PoW優(yōu)點很明顯:1)完全去中心化(任何人都可以加入);2)節(jié)點自由進出,容易實現;3)破壞系統(tǒng)花費的成本巨大;
關于破壞系統(tǒng)成本巨大可以分兩層意思理解:
- 在指定時間內,給定一個難度,找到答案的概率唯一地由所有參與者能夠迭代哈希的速度決定。與之前的歷史無關,與數據無關,只跟算力有關。
- 掌握51%的算力對系統(tǒng)進行攻擊所付出的代價遠遠大于作為一個系統(tǒng)的維護者和誠實參與者所得到的。
缺點也相當明顯:1)對節(jié)點的性能網絡環(huán)境要求高;2)浪費資源;3)每秒鐘最多只能做七筆交易,效率低下;4)礦場的出現違背了去中心的初衷; 5)不能確保最終一致性;6)比特幣產量每4年減半,利益驅動性降低導致曠工數量減少從而導致比特幣網絡癱瘓。
3. 網絡攻擊和鏈分叉
1)網絡攻擊
假定一個惡意節(jié)點試圖雙花之前的已花費的交易,攻擊者需要重做包含這個交易的區(qū)塊,以及這個區(qū)塊之后的所有的區(qū)塊,創(chuàng)建一個比目前誠實區(qū)塊鏈更長的區(qū)塊鏈。只有網絡中的大多數節(jié)點都轉向攻擊者創(chuàng)建的區(qū)塊鏈,攻擊者的攻擊才算成功了。由于每一個區(qū)塊都包含了之前的所有區(qū)塊的交易信息,所以隨著塊高的增加,之前的區(qū)塊都會被再次確認一次,確認超過6次,可以理解為無法被修改。
考慮交易T包含在區(qū)塊b1中。每個后續(xù)區(qū)塊b2,b3,b4,.........bn會降低交易T被修改的可能性,因為修改這些后續(xù)的區(qū)塊需要更多的算力。中本聰用概率理論證明,六個區(qū)塊后攻擊者追趕上最長鏈的可能性降低到0.0002428%。在過4個或更多區(qū)塊后這個可能行會降到0.0000012%。每新增一個區(qū)塊bn,攻擊的可能性就會以指數形式下降,很快整個攻擊的可能性就會低到可以忽略的程度。
2)鏈分叉
所謂的鏈分叉,主要是由于在計算hash時,每個人拿到的區(qū)塊內容是不同的,導致算出的區(qū)塊結果也不同,但都是正確結果,于是,區(qū)塊鏈在這個時刻,出現了兩個都滿足要求的不同區(qū)塊,那曠工怎么辦呢?由于距離遠近、網絡等原因,不同曠工看到這兩個區(qū)塊的先后順序是不一樣的,通常情況下,曠工會把自己先看到的區(qū)塊鏈復制過來,然后接著在這個區(qū)塊上開始新的挖礦工作,于是就出現了鏈分叉。
PoW解決方案:從分叉的區(qū)塊起,由于不同的礦工跟從了不同的區(qū)塊,在分叉出來的兩條不同鏈上,算力是有差別的。由于解題能力和礦工的算力成正比,因此兩條鏈的增長速度也是不一樣的,在一段時間之后,總有一條鏈的長度要超過另一條。當礦工發(fā)現全網有一條更長的鏈時,他就會拋棄他當前的鏈,把新的更長的鏈全部復制回來,在這條鏈的基礎上繼續(xù)挖礦。所有礦工都這樣操作,這條鏈就成為了主鏈,分叉出來被拋棄掉的鏈就消失了。
能夠讓區(qū)塊鏈保證唯一性的前提是:所有礦工都遵從同樣的機制。當曠工遵從不同的機制時,就會出現硬分叉,這種分叉會導致資產增加,且兩條鏈同時存在,比如BBC。
PoS 共識機制
對于PoW,由于礦場的出現及挖礦設備性能的不斷提升,算力開始集中,節(jié)點數和算力值漸漸不適配,同時PoW太浪費了,曠工持續(xù)挖礦進行的重復性Hash計算沒有任何實際或者科學價值,而且還有一個更大的問題,作惡是沒有成本的,曠工的惡意攻擊并不會對曠工下次記賬并獲取相關權益(比特幣)產生任何影響,鑒于此,人們提出了PoS。
PoS(Proof of Stake):股權證明,與PoW相比,不需要證明你在記賬前做了某項工作,而是證明你擁有某些財產。股權決定一起,誰的股權大,誰記賬的概率就越大。由于PoS是BitCoin出現后提出的共識算法,目前還有得到實際的驗證,并且,PoS不是一個,而是一類共識算法。最先使用PoS的是Peer Coin,不過是一種樸素的PoS,目前呼聲很高的是ETH Casper,但還沒有投產(拭目以待吧),所以關于PoS的描述基于Peer Coin。
1. 工作機制
如下圖所示,開始競爭出塊記賬前,擁有權益的節(jié)點將自己的權益放入PoS機制中,同時身份變?yōu)轵炞C者,PoS機制根據驗證者下注的多少,采用隨機的方式選出一個記賬者進行出塊記賬。這個隨機并不是真正的隨機,一般跟下注的權益成正比,誰的權益多,誰獲取記賬權的概率就越大。如果選出的記賬者在一段時間內沒有記賬,PoS機制重新選擇記賬節(jié)點,當出塊完成,開始進入下一輪的記賬。

我們以Peer Coin來舉例說明PoS的工作機制。Peer Coin是最先采用PoS共識機制的數字貨幣。在Peer Coin中,引入了幣齡和幣天的概念。所謂幣天,就是你持有貨幣的時間,幣齡=幣的數量比天。比如你有100個幣,總共持有30天(Peer Coin中未使用至少30天的幣可以參與競爭下一區(qū)塊),那么你的幣齡就是10030=3000,你作為幣的持有者,參與下一輪競爭,過程如下:
- 在競爭開始前,你將3000幣齡作為籌碼下注,并成為記賬驗證者,
- PoW機制會隨機的選出一個記賬者,剛好是你
- 你開始記賬并完成
- 你的3000幣齡被清0
- 你獲得利息=3000 * 5% / 365 = 0.41個幣(每被清空365幣齡,你將會從區(qū)塊中獲得0.05個幣的利息)
理解隨機:選我、選我、選我?PoS在選擇記賬者時一般有兩種做法,一種是挑選下注多(權益大)的進行輪流記賬;還有一種是跟PoW結合,在PoW中,決定曠工能否出塊的一個重要因素是出塊的難度,PoS將出塊難度和權益掛鉤,權益越大,難度越小,出塊概率越大。
2. PoS特點及分類
PoS 特點
- PoS需要一定量的權益作為出塊的競爭資本
- PoS不需要進行大量的“無用”Hash計算
- PoS偏向“權利”集中制,但又做了均衡(出塊清0)
- PoS通過股權質押對作惡者進行懲罰
- PoS提供激勵機制
PoS 分類
先說三個問題:
- 鏈分叉問題:PoW從經濟角度,可以自然做到防止鏈分叉,但PoS需要精心審計,即nothing at stake問題。PoS可以采用一定的懲罰機制。
- 遠程攻擊問題:即如曠工在撤回被定的虛擬資產后,再發(fā)起之前發(fā)生的例行區(qū)塊的分叉。
- 卡特爾形成問題:即區(qū)塊鏈的寡頭壟斷,由于PoS共識算法是誰“富有”,誰就有更大的話語權,這樣少數富有曠工之間的“協調”將導致寡頭龍蛋的形成。
目前業(yè)內PoS共識算法的實現主要分為兩類:
- 簡單的的PoS系統(tǒng)。這類PoS很少甚至沒有從算法的設計上來解決上述問題,一般是比較早期的PoS嘗試。比較典型的例子是Peer Coin(點點幣,PPC)、新星幣(Nova Coin,NVC)、黑幣(Black Coin,BLK)、NextCoin(未來幣,NXT)等等
- 精心設計的PoS系統(tǒng),相對來說比較新?;诓煌膶崿F方式,精心設計的PoS系統(tǒng)可以分為兩種。一種是基于拜占庭容錯的權益證明(BFT based PoS),比如Tendermint,另一種是基于鏈的權益證明(Chain based PoS),比如ETH Casper和ADA的Ouroboros
第一類PoS系統(tǒng)安全性不夠。第二類PoS系統(tǒng)目前還不夠成熟,有一些處于早期運行階段,有一些還處理討論和測試階段。
3. PoS的優(yōu)缺點
通過上面的描述和PoS的特點,PoS優(yōu)點為:1)節(jié)能環(huán)保,不需要無用計算;2)性能高;3)更加安全;4)人人可挖礦(獲得利息),不用擔心算力集中導致中心化出現;5)避免貨幣緊縮
為什么PoS更加安全?
- 在指定時間內,在POS體系中,即使你擁有了全球51%的算力,也未必能夠進行51%攻擊,因為,有一部分的貨幣并不是挖礦產生的,而是由利息產生(利息存放在POS區(qū)塊中),這要求攻擊者還需要持有全球超過51%的貨幣量。這大大提高了51%攻擊的難度。
- 在PoS機制下,持有幣越多,越容易獲得記賬權,接近于贏家通吃的感覺,但持有的幣越多,越接近于一個誠實的節(jié)點,因為破壞整個網絡帶來的損失也越大,即假設富人不會做惡,畢竟做惡的目標是錢,若你富有,自然就沒有做惡的動力。
除過同PoW一樣不能確保最終一致性外,我們從兩個維度說,一個是幣的維度 ,一個是鏈的維度:
幣維度:
- 純PoS機制的加密貨幣,只能通過IPO的方式發(fā)行,這就導致“少數人”(通常是開發(fā)者)獲得大量成本極低的加密貨幣,在利益面前,很難保證他們不會大量拋售。
- PoS機制的加密貨幣,信用基礎不夠牢固。為解決這個問題,很多采用PoW+PoS的雙重機制,通過PoW挖礦發(fā)行加密貨幣,使用PoS維護網絡穩(wěn)定?;蛘卟捎肈PoS機制,通過社區(qū)選舉的方式,增強信任。
鏈維度:
- 權益粉碎攻擊:可理解為“窮山惡水出刁民”,權益很少的那一部分節(jié)點主動攻擊導致鏈分叉,畢竟光腳不怕穿鞋的,破罐子破摔(權益越大責任越大,權益越少責任越?。?。PoS可采用對應的懲罰機制,比如以太坊的 casper 里的slasher。
- 理性分叉:可理解為“大眾心理學之跟風消費”,假如出現分叉,誠實節(jié)點為了保證自己的利益,也會趨于理性的去分叉上挖礦(挖了沒損失,不挖可能會有損失),如果整個網絡足夠理性,會出現的情況反而是每條分支都會永遠存在因為理性的礦工會同時在所有分支上挖礦。
tips:以太坊開發(fā)者Jan對PoS的擔心,Jan目前為NERVOS的首席架構師
Jan:我總覺得 PoS有點問題。因為共識是要創(chuàng)造信任,信任是不可能自己創(chuàng)造自己。你想象一條蛇在咬自己的尾巴。PoS用系統(tǒng)自己發(fā)布的資產作為押金,去保證這個系統(tǒng)的安全。它沒有錨定任何的東西,是漂浮在空中的。我沒有看到任何的信任是通過 PoS這樣的方式創(chuàng)造出來的。我覺得信任的創(chuàng)造還是要錨定能量。美元錨定是美國的軍事實力。如果哪天美國沒有這種軍事實力,那美元的價值我覺得要打很多問號。PoW是相當于用軍隊錨定,PoS 是用美元錨定美元。這個問題你會思考很久。因為你可能又會想,歸根到底這兩種方式,好像都是用資本去錨定,因為電力本質上也是一種資本。但再想想,這兩種資本好像是不太一樣的。PoW 是體系外的資本。所以,PoS 我總覺得有點問題。
DPoS 共識機制
盡管PoS針對PoW的諸多不足做了改進,但是PoS仍然有一些自身的不足,而這些不足中尤其以“權利集中制”最為顯著。在PoS系統(tǒng)中,依據權益的結余來選擇,會導致首富賬戶的權利更大,有可能支配記賬權,從而使得基于PoS的區(qū)塊鏈系統(tǒng)變成幾個少數“有錢人”的游戲,這和區(qū)塊鏈的去中心化本意背道而馳,同時PoS的性能(1分鐘)相比PoW(10分鐘)并沒有提升多少,這一點仍然被人詬病?;诖?,原Bitshares的首席開發(fā)者Dan Larimer (現為EOS CTO)提出了一種更加快速、安全且能源消耗比較小的算法,這就是后來的DPoS。
DPoS(Delegated Proof of Stake):授權股權證明機制,基于PoS,類似投票選舉,由被選舉節(jié)點記賬,如果把PoS看成資本主義的“權利集中制”,那么DPoS可以理解為具有特色社會主義的“民主集中制”。目前采用DPoS共識機制的如Bitshares、EOS和Asch等,由于EOS最近主網剛上,且是由BM操刀,所以下文基于EOS的DPoS。
tips:區(qū)塊鏈/幣圈不得不說的幾個大神和區(qū)塊鏈時代
區(qū)塊鏈大神:
- 中本聰:比特幣創(chuàng)始人、區(qū)塊鏈的創(chuàng)世者,區(qū)塊鏈 1.0的靈魂人物
- V神:Vitalik Buterin,以太坊創(chuàng)始人,90后,區(qū)塊鏈 2.0的代表人物,2014年擠掉扎克伯格獲得世界科技獎
- BM:Bytemaster的簡寫,本名Daniel Larimer,區(qū)塊鏈項目EOS的開發(fā)者。主要成就:連續(xù)開發(fā)了三個區(qū)塊鏈平臺項目Bitshares(比特股),Steem和EOS(柚子),三個項目在圈內都非常出名,市值排在前50名,特別是近期EOS十分熱門
區(qū)塊鏈時代
- 區(qū)塊鏈 1.0:以比特幣為代表的加密貨幣為代表。大部分都基于比特幣,無法完成上層應用對接,非圖靈完備,開發(fā)需從底層開始,難度大,成本高
- 區(qū)塊鏈 2.0:以支持智能合約的以太坊為代表,如果把比特幣理解為全球賬本,那么以太坊可以看成一臺全球計算機,任何人都可以上傳執(zhí)行任意的應用程序。智能合約的出現大大降低了區(qū)塊鏈應用的開發(fā)門檻,提升了開發(fā)效率,為應用繁榮提供了好的土壤和平臺
- 區(qū)塊鏈 3.0:暫時還沒有代表,有些人將Token的出現或者EOS看成區(qū)塊鏈3.0都顯的有些急躁,暫不做評論,拭目以待
1. 工作機制
跟PoS不同的是,持有少數股份(權益)的節(jié)點也能行使他們的共識權了,只不過是以一種間接的方式。類似于股東代表大會,每當要決策公司大事(記什么賬,誰來記賬)的時候,全體股民(節(jié)點)依法行使投票權,選出自己心中的股東代表(可信賬戶),誰得票高誰當選。候選人可以去公開演講拉票,獲得足夠多股民(節(jié)點)的信任,然后股東代表(被選中的可信節(jié)點)代表股民決策公司大事,股東代表的人數由系統(tǒng)決定,比如Bitshares為101個、Asch為51個,EOS為21個。
與生活中的股東代表選舉不同:1)DPoS機制中的股民(節(jié)點)根據自己持有的加密貨幣數量占總量的百分比(占股比例)來投票,不是一人一票;2)選舉出的股東代表(可信節(jié)點)完全對等,可理解為具有同等算力的101個礦池;3)股東代表一旦無能、不作為、胡作為(提供的算力不穩(wěn)定,計算機宕機、或者試圖利用手中的權力作惡),將立刻被股民踢出整個系統(tǒng),然后由其他后備代表頂上去;4)決策完公司大事(記完賬、出完塊)有錢分,根據占股比例。DPoS的工作流程如下圖所示:

EOS的DPoS分為兩個步驟:1)選舉塊生產者(Block Producter,簡稱BP);2)出塊共識;
選舉塊生產者:任何持有Token的人都可以成為塊生產者,都擁有投票權。每次投票前,候選BP可以給自己拉票(線下方式),每次投票超過50%代表有效,然后生成一個BP候選池,每次從BP候選池中選擇排名靠前的21個節(jié)點作為BP,并對選出的21個BP隨機排序。
出塊共識:21個BP按照隨機排序進行出塊,在每輪出塊共識的過程中,BP如果不出塊或者出現惡意行為,將被其他節(jié)點舉報并接受懲罰(剝奪出塊的權利),然后從候選池中再選擇一個BP加入,一個BP出塊成功,并且經過至少(2/3 + 1)個BP確認(至少15個),出塊BP獲取相應的獎勵,然后輪流至下一個BP出塊,如果輪詢了10次或者一天,將重新進行投票選舉。
2. DPoS的優(yōu)缺點
對于EOS的DPoS優(yōu)點:1)記賬節(jié)點減少,交易速度更快,EOS號稱可達百萬TPS;2)更加安全,一般不不會發(fā)生鏈分叉并不可逆,確保最終一致性;3)相對PoW,解決了資源消耗問題;
基于DPoS的設計,其優(yōu)點也成為了自己的缺點,這也是為什么V神怒懟DPoS的原因。
- 首先DPoS通過選舉少數的BP來出塊記賬,確實從網絡傳輸和確認時間上看,性能大幅提升,但是少量的BP數量犧牲了部分去中心化。有人說這些被選舉的BP代表著“民意”,相比PoW的5大礦場和PoS的富人玩家,DPoS更加民主,更加去中心化,但是DPoS機制的設計并不能保證一定有足額的真實的區(qū)塊生產者,因為一個人或一個實體,可能控制著多個節(jié)點。比如LBTC,就一度出現半數節(jié)點被魚池一家控制。EOS在啟動過程中,也疑似出現一個人虛擬出7個節(jié)點的事。
- 其次,在真實的網絡環(huán)境中,EOS實際的運行效率遠沒有吹的那么厲害,同時超級節(jié)點的治理全力和經濟利益過于集中,如果他們串通,將進一步形成巨頭龍壟斷,這和區(qū)塊鏈思想南轅北轍。
- 再次,對于壞節(jié)點的處理存在諸多困難。社區(qū)選舉不能及時有效的阻止一些破壞節(jié)點的出現,給網絡造成安全隱患,同時在網絡節(jié)點數量少的場景,選舉的BP代表性不強。
3. 網絡攻擊和鏈分叉
DPoS作為去中心化系統(tǒng)被人詬病的很多,這主要表現為會形成卡特爾和賄賂選民的動機。
關于鏈分叉,在正常運行的情況下,DPoS具有最終一致性,并不會經歷任何分叉,因為被選舉出來的BP是通過合作而非競爭的方式來生產區(qū)塊,即便出現了分叉,共識也將自動的切換到最長的鏈上。簡化期間,我們假設有三個BP,分別為A\B\C。
在正常操作模式下,快生產者3秒輪流成成一個快,如果沒有人錯過自己的輪次,那么將產生最長鏈,BP在被調度之外的任何時間段都無法出塊,同時如果錯過出塊,可能會被淘汰。如下圖所示。

少數惡意或者故障節(jié)點的情況,不超過節(jié)點總數三分之一的惡意或故障節(jié)點可能創(chuàng)建少數分叉。由圖可知,在分叉的那條鏈中,每9秒(設一個輪次三秒,三個輪次)只能產生一個塊,而多數分叉每9秒可以產生兩個塊。這樣,誠實的2/3多數將永遠比少數分叉的鏈更長,如下圖所示。

少數的多重生產情況,少數人可能試圖產生無限數量的分叉,但是他們的所有分叉都將比多數人的那條鏈短,因為少數人在出塊速度上注定比多數人來的更慢。所以這種情況下,誠實的2/3多數還是永遠比少數分叉的鏈更長,如下圖所示。

多數生產者集體作惡情況下,如果多數生產者(2/3)變得腐敗,那么他們可以產生無限數量的分叉,每個分叉都看起來以2/3多數確認向前走。這種情況下,會遵循最長鏈選擇。最長鏈就是為最大多數所批準的那條鏈,而這將由少數剩下的誠實節(jié)點決定。這種行為不會持續(xù)很長時間,因為利益相關方最終會投票替換生產者,如下圖所示。

Raft 共識機制
前面我們介紹了三種共識機制,即PoW、PoS和DPoS,但對于一些特殊場景(私有鏈和聯盟鏈),并不需要解決拜占庭將軍問題(后面會說到,即節(jié)點中沒有“叛徒”),只需要處理一般的死機故障,同時追求共識的效率和強一致性,顯然,這三種共識機制都不太合適。在這種情況下,采用Paxos等協議會更加高效。Paxos是Lamport設計的保持分布式系統(tǒng)一致性的協議,但由于Paxos非常復雜,難以理解,因此后來出現了各種不同的實現和變種,比如Raft。
Raft最初是一個用于管理復制日志的共識算法,注重協議的落地性和可理解性,是在非拜占庭故障下達成共識的強一致協議。目前Hyperledger的Fabric項目中,支持PBTF和Raft等共識協議。
1. 工作機制
一個Raft集群通常有5個節(jié)點,允許系統(tǒng)有兩個故障節(jié)點(因為至少要N/2 +1個節(jié)點投票)。每個節(jié)點有三種狀態(tài):leader、follower、candidate。正常狀態(tài)下,僅有一個Leader,其他均為follower。follower是被動的,不會主動發(fā)起請求,只能對leader和candida的請求做出響應。leader處理所有客戶端的請求,candidate狀態(tài)用來選舉。
Raft算法包括三個基本組件:leader選舉、日志復制、安全性問題。
- Leader選舉:現有的leader失效時,必須選出一個新的Leader
- 日志復制(記賬):leader必須接受來自客戶端的的交易記錄,在參與共識記賬的節(jié)點中進行復制,使其他節(jié)點交易所對應的區(qū)塊
- 安全性問題:若某個節(jié)點對其狀態(tài)機應用了某個特定的區(qū)塊項,其他的節(jié)點不能對同一區(qū)塊索引應用不同的命令(這句話真是變態(tài)的拗口)
Leader的選舉:
選舉leader只會在兩種情況下發(fā)生:1)第一次啟動Raft集群的時候;2)一個已知存在的Leader故障的時候;
流程如下圖所示。對于初始化網絡,每個節(jié)點處于follower狀態(tài),并自動轉化為candidate,然后對自己投票,并發(fā)起RequestVoteRPC,然后等待,會出現如下情況:1)當前節(jié)點獲得超過半數節(jié)點的投票,贏得選舉成為Leader;2)其他節(jié)點贏得選舉,當前節(jié)點接收到對方心跳 ,當前節(jié)點變?yōu)閒ollower;3)選舉超時,沒有節(jié)點贏得選舉,當前節(jié)點自增任期,重新發(fā)起選舉。

圖中有幾點需要說明:
- term : 指的是任期,跟選舉一樣,現在咱們開始選舉第幾屆人大代表、選舉第幾任村委書記,term就是那個“第幾屆”或“第幾任”,每一次選舉完成之后,term都會增加。生活中不會有人傻到去參加過去的選舉,比如你說你現在要參加2017年的人大代表選舉,人家不會投你票,會覺得你腦子有問題。但是在分布式環(huán)境中由于網絡抖動、延遲等原因,一個節(jié)點完全有可能拿到的是之前的任期,并參加一個過去式的選舉,對于這種情況,Raft跟正常人的反應一樣,只會說一個字:“滾”,意思就是說你是來搞笑的嗎?趕緊收拾收拾,參加下一次吧。
- quorums:就是你的選票,每一次網絡初始化后,每個節(jié)點自動變?yōu)閏andidate狀態(tài),先給自己投一票(反正自己投自己算數,不投白不投),然后發(fā)出投票邀請,等待其他人的投票,如果收到的其他人的投票數超過網絡節(jié)點的(N/2 +1),那么恭喜你,你當選Leader了!
- split vote:指的是在選舉過程中,同一個任期內有兩名候選人得到的票數一樣多,說明大家實力差不多,棋逢對手了,那么誰都不能當選,生成一個新的任期,重新開始投票。
- time out:超時,就是follower未能在周期內收到leader的心跳之后,會等待一段時間,如果超過這個時間,當前節(jié)點變?yōu)閏andidate,開始選舉。這個時間設置不是統(tǒng)一的。Raft采用隨機的方式生成timeout,誰的timeout先到,誰先開始選舉。
日志復制(共識記賬):
在日志復制過程中,分四個步驟,還是畫個框框說明一下吧,如下圖所示。

- Client發(fā)送請求給leader,每個請求都是一條指令。
- leader接受請求后,把指令(Entry)追加到leader的操作日志中,然后對follower發(fā)起AppendEntries操作,嘗試讓操作指令(Entry)追加到Followers的操作日志中。如果有Follower不可用,則一直嘗試
- 一旦Leader接受到多數(Quorums)Follower的回應,Leader就會進行commit操作,每一臺節(jié)點服務器會把操作指令交給狀態(tài)機處理。這樣就保證了各節(jié)點的狀態(tài)的一致性
- 各服務器狀態(tài)機處理完成之后,Leader將結果返回給Client
安全性問題:
在安全性方面,Raft主要通過如下機制確保。
- Election safety: 在一個term下,最多只有一個Leader。
- Leader Append-Only: 一個Leader只能追加新的entries,不能重寫和刪除entries
- Log Matching: 集群中各個節(jié)點的log都是相同一致的
- Leader Completeness:如果一個log entry被committed了,則這個entry一定會出現在Leader的log里。
- State Machine Safety: 如果一個節(jié)點服務器的state machine執(zhí)行了一個某個log entry命令,則其他節(jié)點服務器,也會執(zhí)行這個log entry命令,不會再執(zhí)行其他命令。
2. Raft優(yōu)缺點
由工作機制的描述,Raft的優(yōu)點為:1)速度快,少量的節(jié)點,網絡傳輸及共識效率高;2)不需要挖礦,節(jié)能環(huán)保;3)不需要考慮拜占庭節(jié)點,算法更簡單。
由于Raft過度依賴Leader,從而喪失了部分去中心化,這在公鏈上是不能被接受的,所以Raft一般用于私鏈或者聯盟鏈。同時,Raft在一定的網絡波動或競爭情況下出現斷站的網絡分叉,需要多次確認。
3. 網絡攻擊和鏈分叉
先說說網絡攻擊,基于其優(yōu)缺點,Raft一般用于私鏈或者聯盟鏈,趨向與相信沒有人作惡或者作惡可能性更小。但是一般出現,并且被選為記賬者,那其他節(jié)點當時是沒辦法識破的,最多只能通過事后檢查來發(fā)現。
鏈分叉? 要分析鏈分叉,首先要看看Raft機制是否會產生鏈分叉,我們知道一般是因為在同一時間出現多個記賬者才會導致鏈分叉,可是按照Raft的機制,任何時刻都只會有一個leader(記賬者),不會出現鏈分叉?
State Machine Safety:
一個candidate在選舉的時候,會想其他節(jié)點發(fā)送包含他的log信息,獲取票數,如果log是最新的,則獲得選票,如果其他節(jié)點還有更加新的log,澤會拒絕投票,保證了State Machine Safety。
follower crashes:
如果follower故障,就不會接受追加entry和投票請求,leader會不斷嘗試和故障節(jié)點保持心跳,當節(jié)點回復,澤接受leader的最新log,并將log應用到State machine中,確保了不會分叉。
leader crashes:
leader故障情況下,集群中的所有節(jié)點的日志可能不一致,old leader的一些操作日志沒有通過集群完全復制,new leader會通過強制followers復制自己的log來處理不一致的情況:
- 對于每個Follower,new leader將其日志與Followers的日志進行比較,找到他們的達成一致的最后一個log entry。
- 然后刪除掉Followers中這個關鍵entry后面的所有entry,并將其替換為自己的log entry。該機制將恢復日志的一致性。
PBFT 共識機制
通過上面的描述,我們知道Raft機制最大的問題在于對Leader的強依賴,無法規(guī)避拜占庭節(jié)點,但PoW、PoS和DPoS的性能都不算很好,更為重要的是,在金融或者一些特殊應用領域,分布式系統(tǒng)需要確保一致性和正確性?;贐FT,人們提出了PBFT共識機制。
1. BFT & PBFT
BFT(Byzantine Fault Tolerance),即拜占庭容錯技術,是一類分布式計算領域的容錯技術,由于硬件錯誤、網絡阻塞或中斷以及遭遇惡意攻擊等原因,計算機和網絡可能出現不可預料的行為,拜占庭容錯技術被設計用來處理這些異常行為,并滿足所要解決的問題的規(guī)范要求。
拜占庭將軍問題:拜占庭將軍問題是Leslie Lamport在20世紀80年代提出的假想問題,即拜占庭羅馬帝國的將軍為了使得作戰(zhàn)計劃統(tǒng)一,避免叛徒作亂,需要提出一種協議,該協議能使將軍們達成一致,并且少數幾個叛徒不能使忠誠的將軍做出錯誤的計劃。也就是說拜占庭將軍問題是指尋找一個方法,使得將軍們能在一個有叛徒的非信任環(huán)境中建立對戰(zhàn)斗計劃的共識。
我們需要知道的是拜占庭將軍問題在將軍總數大于3f ,背叛者為f 或者更少時,忠誠的將軍可以達成命令上的一致,即3f+1<=n。算法復雜度為o(n^(f+1)),其中n為集群節(jié)點數。這個算法太慢了,這是一個在實際生產環(huán)境中幾乎無法使用的算法。
基于此,Miguel Castro 和Barbara Liskov在1999年發(fā)表的論文《Practical Byzantine Fault Tolerance》中首次提出PBFT算法,該算法容錯數量也滿足3f+1<=n,算法復雜度為o(n^2),PBFT解決了共識算法容錯率不高的問題(其他共識算法為50%),并且將算法復雜度由指數級降低到多項式級,使得拜占庭容錯在實際系統(tǒng)中應用變的可行。憑借PBFT算法,Liskov獲得了2008年圖領獎。
2. PBFT工作機制
PBFT要系統(tǒng)共同維護一個狀態(tài),所有節(jié)點采取的行動一致。為此,需要運行三類基本協議,包括:一致性協議、檢查點協議和視圖更換協議。同時,一致性協議要求來自客戶端的請求在每一個服務節(jié)點上都按照一個確定的順序執(zhí)行,這個協議把節(jié)點分為兩類:主節(jié)點和從節(jié)點,主節(jié)點僅有一個并負責請求排序,從節(jié)點按照主節(jié)點排序處理請求。
1)主節(jié)點的“選舉”
PBFT的主節(jié)點“選舉”和Raft算法的選舉不一樣,只是通過一個模運算進行或者選擇當前存活的節(jié)點編號最小的節(jié)點成為新的主節(jié)點。p = v mod |R|,其中p為節(jié)點編號、v為視圖編號,|R|為節(jié)點數量。當主節(jié)點失效后就需要啟動視圖更換。
2)PBFT算法基本流程:
- 客戶端發(fā)送請求給主節(jié)點
- 主節(jié)點廣播請求給其它節(jié)點,節(jié)點執(zhí)行pbft算法的三階段共識流程
- 節(jié)點處理完三階段流程后,返回消息給客戶端
- 客戶端收到來自f+1個節(jié)點的相同消息后,代表共識已經正確完成
3)算法核心三階段流程
三階段流程如下圖所示,核心三階段分別為pre-preare階段(預準備階段)、prepare階段(準備階段)和commit階段(提交階段),圖中的C代表客戶端,0、1、2、3代表節(jié)點的編號,打叉的3代表可能是一個故障節(jié)點或者問題節(jié)點,0為主節(jié)點。

首先,客戶端向主節(jié)點發(fā)起請求,主節(jié)點0收到客戶端請求,會向其它節(jié)點發(fā)送pre-prepare消息,其它節(jié)點就收到了pre-prepare消息,就開始了這個核心三階段共識過程了。
tips:相關字母代表含義提前了解一下
- v:當前的視圖編號,類似Raft的term任期
- n:當前的請求編號
- m:消息內容
- d:消息內容的摘要
- i:節(jié)點的編號
Pre-prepare階段:節(jié)點收到pre-prepare消息后,要么接受要么拒絕或者等待。當主節(jié)點發(fā)送兩條具有相同的v和n,但d和m的消息時拒絕,或者不在水位區(qū)間內則等待(后面會說)。
Prepare階段:節(jié)點同意請求后會向其它節(jié)點發(fā)送prepare消息。在一定時間范圍內,如果收到超過2f個不同節(jié)點的prepare消息,就代表prepare階段已經完成。
Commit階段:向其它節(jié)點廣播commit消息,當收到2f+1個commit消息后(包括自己),代表大多數節(jié)點已經進入commit階段,這一階段已經達成共識,節(jié)點就會執(zhí)行請求,寫入數據。
為了更清晰的展現這個過程和一些細節(jié),下面以流程圖來表示這個過程。

4)檢查點協議
checkpoint、stable checkpoint和高低水位
checkpoint就是當前節(jié)點處理的最新請求序號,stable checkpoint,就是大部分(2f+1)已經共識完成的最大請求序號。所謂低水位可以理解為stable checkpoint對應的請求序號,而高水位指的是系統(tǒng)設定的一個值L加上stable checkpoint。
比如A節(jié)點當前checkpoint為1100,B節(jié)點checkpoint為1099,stable checkpoint為1000,L為100,那么高水位H = 1000+100=1100,低水位h=1000。此時由于A節(jié)點的請求序號超過高水位,則處于等待狀態(tài)。當B節(jié)點處理速度跟上之后(比如checkpoint=1100),高低水位發(fā)生變化后,比如高水位變更為1200,低水位變更為1100時(具有2f+1個節(jié)點已經共識完成請求序號小于1100之前的請求),同時請求序號小于1100的請求數據都可以從節(jié)點本地刪除,這個時候A節(jié)點就可以繼續(xù)處理請求了。
檢查點協議有兩個功能:
- 確保pre-prepare階段的所有請求能在同一水位范圍內。所謂水位可以理解為一個滑動窗口。由于網絡不同,節(jié)點的處理速度不同,會出現一些節(jié)點掉隊。這個水位就是為了讓跑的快的節(jié)點等等跟不上的老鐵。
- 進行垃圾回收。由于三階段會產生各種較小的請求數據,這些都需要保存在節(jié)點本地,長此以往,這個數據就很大,為了進行垃圾回收,檢查點設置了穩(wěn)定檢查點,序號在穩(wěn)定檢查點前的都可以刪除。
5)視圖更換協議
當主節(jié)點掛了(超時無響應)或者從節(jié)點集體認為主節(jié)點是問題節(jié)點時,就會進行視圖變更,視圖變更完成后,視圖編號將會加1。
視圖變更協議分為三個階段:視圖變更階段、視圖變更確認階段、新建視圖階段。
- 視圖變更階段:從節(jié)點認為主節(jié)點有問題時,會向其它節(jié)點發(fā)送view-change消息,當前存活的節(jié)點編號最小的節(jié)點將成為新的主節(jié)點。
- 視圖變更確認階段:當新的主節(jié)點收到2f個其它節(jié)點的view-change消息,則證明有足夠多人的節(jié)點認為主節(jié)點有問題,于是就會向其它節(jié)點發(fā)送new-view消息
- 新建視圖階段:對于主節(jié)點,發(fā)送new-view消息后會繼續(xù)執(zhí)行上個視圖未處理完的請求,從pre-prepare階段開始。其它節(jié)點驗證new-view消息通過后,就會處理主節(jié)點發(fā)來的pre-prepare消息,此時正式進入 v+1(視圖編號加1)的時代了。
3. PBFT優(yōu)缺點
PBFT算法是一種狀態(tài)復制算法,優(yōu)點為:1)效率高;2)容錯性高;3)不需要代幣;4)節(jié)能環(huán)保;
相反,PBFT依賴狀態(tài)的維護,1)當網絡不穩(wěn)定或者參與者數量增多時,系統(tǒng)的穩(wěn)定性和效率會顯著下降;2)PBFT是一個部分中心化的網絡;3)一旦有超過1/3的階段作惡,會出現分叉。
4. 網絡攻擊和鏈分叉
如果說PoW和PoS是以經濟模型為主解決共識的話,PBFT就是用算法模型來解決共識,它不需要代幣,更適合聯盟鏈,同時更加安全。在聯盟鏈中,節(jié)點(機構)的加入都需要授權,這就使得網絡攻擊的難度大大增加。
PBFT具有強一致性,在少于1/3節(jié)點作惡的情況,不會出現分叉,但一旦超過1/3的節(jié)點作惡,就會出現硬分叉,不過這種分叉會有歷史記錄。
寫在最后
通過兩周的時間,對目前市面上比較流行的5種共識算法進行了梳理,我們發(fā)現每一種共識機制(算法)都有各自的優(yōu)勢和劣勢,所以在實際的應用場景中,要根據具體情況進行選擇。
本文內容比較多,除過自己的理解和總結外,有一部分也屬于copy and paste,所以難免出現一些理解不一致和錯誤,一些細節(jié)的東西也很難盡善盡美。
共識機制作為區(qū)塊鏈技術的靈魂,正在高速發(fā)展,目前已經出現基于上述共識機制的變種,同時一些結合式或者新的共識機制在逐步提出,包括區(qū)塊鏈的設計由于不可能三角的原因,也出現一些變種,比如分層設計等。相信在不遠的未來,各種流派的區(qū)塊鏈技術和共識機制,會成為影響人們日常生活的一把利器,推動社會的變革。
【參考內容】
- 區(qū)塊鏈平臺調研與分析報告
- 漫談共識機制
- 區(qū)塊鏈共識機制淺談
- PoW 本質上是個去中心化的時鐘
- 權益證明與錯誤的工程思維
- 權益證明綜述
- DPOS共識算法——缺失的白皮書
- 理解權益證明安全模型的原理
- 以太坊的POS共識機制(一)友善的小精靈 Casper
- 區(qū)塊鏈核心技術演進之路-共識機制演進
- 區(qū)塊鏈共識機制之PoS
- 對話Nervos:中國最懂以太坊的人,卻選擇了一條和以太坊截然不同的道路
- 了解區(qū)塊鏈的基本(第三部分):委托股權證明(DPoS)
- EOS中所采用的共識算法DPOS詳解
- 比特幣源碼分析--挖礦的實現
- 淺談EOS(1)——第一個值得期待的商業(yè)級區(qū)塊鏈基礎設施
- 淺談EOS(2)——節(jié)點選舉?你需要知道的DPoS共識機制
- 淺談EOS(3)——別人家的方案都不行?EOS自己設計的“免費”存儲系統(tǒng)
- DEL白皮書解析之:深入淺出DPoS共識
- 深度分析Raft的主要特點
- Paxos,Raft,Zab一致性協議-Raft篇
- 深入剖析區(qū)塊鏈的共識算法 Raft & PBFT
- 區(qū)塊鏈核心技術:拜占庭共識算法之PBFT