深度長文:區(qū)塊鏈共識機(jī)制

轉(zhuǎn)載聲明:本文來自微信公眾號:火龍果園長,僅供學(xué)習(xí)交流,禁止用于商業(yè)用途,轉(zhuǎn)載需關(guān)注公眾號取得文章作者同意。

寫在開頭

學(xué)習(xí)區(qū)塊鏈技術(shù),必須要弄清楚的幾個點包括共識機(jī)制、加密協(xié)議、網(wǎng)絡(luò)協(xié)議、分布式存儲等等,而共識機(jī)制在區(qū)塊鏈分布式網(wǎng)絡(luò)中可謂核心中的核心,被稱為區(qū)塊鏈的靈魂。一切失去共識的分布式網(wǎng)絡(luò)都是沒有價值的。鑒于此,專門對區(qū)塊鏈共識機(jī)制進(jìn)行一次梳理,期望以自己的大白話對共識機(jī)制進(jìn)行總結(jié)和記錄,加深對共識機(jī)制的理解和認(rèn)識。誠然,我不可能對所有的共識機(jī)制進(jìn)行學(xué)習(xí),所以只選取了5種大家所熟知的進(jìn)行歸納。同時,由于筆者時(cai)間(shu)有(xue)限(qian),只能照本宣科,所以這是一篇幾乎沒有思考的總結(jié)。全文大致以介紹各個共識機(jī)制的工作機(jī)制、優(yōu)缺點、網(wǎng)絡(luò)攻擊和鏈分叉解決方案為組織方式。

共識機(jī)制概述

1. 什么是共識機(jī)制

每一種分布式容錯系統(tǒng)的核心都是這樣一個基本問題:保證相應(yīng)系統(tǒng)內(nèi)部發(fā)生的所有遠(yuǎn)程進(jìn)程可以得到同樣的結(jié)果。也就是所謂的在參與者中要求“共識”,共識協(xié)議保證每一筆交易都被網(wǎng)絡(luò)中的所有的機(jī)器以同樣的順序復(fù)制并記錄下來。

所以共識機(jī)制,就是一種多方協(xié)作機(jī)制,用于協(xié)調(diào)多參與方達(dá)成共同接受的唯一結(jié)果,且保證此過程難以被欺騙,且持續(xù)穩(wěn)定運行。在區(qū)塊鏈系統(tǒng)中,共識機(jī)制旨在解決節(jié)點之間的信任問題。

我們選取了5種目前市面上比較流行的共識機(jī)制進(jìn)行學(xué)習(xí)和比較,分別為PoW、PoS、DPoS、Raft和PBFT。

2. 區(qū)塊鏈分類

在開始進(jìn)行共識機(jī)制梳理前,首先需要對目前的區(qū)塊鏈進(jìn)行一個簡單的了解。目前市面上根據(jù)共識算法及應(yīng)用場景把區(qū)塊鏈分為三類:公有鏈、聯(lián)盟鏈和私有鏈。

公有鏈,是一個完全開放的分布式系統(tǒng)。公有鏈中的節(jié)點可以很自由的加入或者退出,不需要嚴(yán)格的驗證和審核,比如比特幣、以太坊、EOS等。共識機(jī)制在公有鏈中不僅需要考慮網(wǎng)絡(luò)中存在故障節(jié)點,還需要考慮作惡節(jié)點(拜占庭節(jié)點),并確保最終一致性。

聯(lián)盟鏈,是一個相對開放的分布式系統(tǒng)。對于聯(lián)盟鏈,每個新加入的節(jié)點都是需要驗證和審核的,比如Fabric、BCOS等。聯(lián)盟鏈一般應(yīng)用于企業(yè)之間,對安全和數(shù)據(jù)的一致性要求較高,所以共識機(jī)制在聯(lián)盟鏈中不僅需要考慮網(wǎng)絡(luò)中存在故障節(jié)點,還需要考慮作惡節(jié)點(拜占庭節(jié)點),同時除過確保最終一致性外,還需要確保強(qiáng)一致性。

私有鏈,是一個封閉的分布式系統(tǒng)。由于私有鏈?zhǔn)且粋€內(nèi)部系統(tǒng),所以不需要考慮新節(jié)點的加入和退出,也不需要考慮作惡節(jié)點。私有鏈的共識算法還是傳統(tǒng)分布式系統(tǒng)里的共識算法,比如zookeeper的zab協(xié)議,就是類paxos算法的一種。只考慮因為系統(tǒng)或者網(wǎng)絡(luò)原因?qū)е碌墓收瞎?jié)點,數(shù)據(jù)一致性要求根據(jù)系統(tǒng)的要求而定。

3. 共識機(jī)制比較

評價一個共識機(jī)制,不能單純的用好或者壞來定義,要區(qū)分業(yè)務(wù)屬性。而業(yè)務(wù)屬性主要基于區(qū)塊鏈的不可能三角及業(yè)務(wù)類型,所以主要從場景、去中心化程度、記賬節(jié)點、響應(yīng)時間、存儲效率、吞吐量和容錯性等維度進(jìn)行比較,詳情如下:

tips:區(qū)塊鏈不可能三角指任何區(qū)塊鏈系統(tǒng)在安全、性能和去中心化三個方面都不能完全兼顧。

image

PoW 共識機(jī)制

PoW(Proof of Work),即工作量證明,聞名于比特幣,俗稱“挖礦”。PoW是指系統(tǒng)為達(dá)到某一目標(biāo)而設(shè)置的度量方法。簡單理解就是一份證明,用來確認(rèn)你做過一定量的工作。監(jiān)測工作的整個過程通常是極為低效的,而通過對工作的結(jié)果進(jìn)行認(rèn)證來證明完成了相應(yīng)的工作量,則是一種非常高效的方式。PoW是按勞分配,算力決定一起,誰的算力多誰記賬的概率就越大,可理解為力量型比較。以下內(nèi)容基于比特幣的PoW機(jī)制。

1. 工作機(jī)制

為了使區(qū)塊鏈交易數(shù)據(jù)記錄在區(qū)塊鏈上并在一定時間內(nèi)達(dá)到一致(共識),PoW提供了一種思路,即所有區(qū)塊鏈的網(wǎng)絡(luò)節(jié)點參與者進(jìn)行競爭記賬,所謂競爭記賬是指,如果想生成一個新的區(qū)塊并寫入?yún)^(qū)塊鏈,必須解出比特幣網(wǎng)絡(luò)出的工作量證明謎題,誰先解出答案,誰就獲得記賬權(quán)利,然后開始記賬并將將解出的答案和交易記錄廣播給其他節(jié)點進(jìn)行驗證,自己則開始下一輪挖礦。如果區(qū)塊的交易被其他節(jié)點參與者驗證有效并且謎題的答案正確,就意味著這個答案是可信的,新的節(jié)點將被寫入驗證者的節(jié)點區(qū)塊鏈,同時驗證者進(jìn)入下一輪的競爭挖礦。

這道題關(guān)鍵的三個要素是工作量證明函數(shù)、區(qū)塊及難度值。工作量證明函數(shù)是這道題的計算方法,區(qū)塊決定了這道題的輸入數(shù)據(jù),難度值決定了這道題的所需要的計算量。

image

首先看一下這道題到底是什么?這道題的目的在于算出一個值,且這個值小于目標(biāo)值即可,這個值就是上圖中的上一個區(qū)塊的哈希值。

  • 目標(biāo)值 = 最大目標(biāo)值 / 難度值(最大目標(biāo)值恒定:0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)
  • 新難度值 = 舊難度值 * ( 過去2016個區(qū)塊花費時長 / 20160 分鐘 )

tips:難度值是隨網(wǎng)絡(luò)變動的,目的是為了在不同的網(wǎng)絡(luò)環(huán)境下,確保每10分鐘能生成一個塊。

那如何計算呢?SHA256(SHA256(Block_Header)),即只需要對區(qū)塊頭進(jìn)行兩次SHA256運算即可,得到的值和目標(biāo)值進(jìn)行比較,小于目標(biāo)值即可。區(qū)塊頭結(jié)構(gòu)如下:

image

區(qū)塊頭中有一個重要的東西叫MerkleRoot的hash值。這個東西的意義在于:為了使區(qū)塊頭能體現(xiàn)區(qū)塊所包含的所有交易,在區(qū)塊的構(gòu)造過程中,需要將該區(qū)塊要包含的交易列表,通過Merkle Tree算法生成Merkle Root Hash,并以此作為交易列表的摘要存到區(qū)塊頭中。

至此,我們發(fā)現(xiàn)區(qū)塊頭中除過nonce以外,其余的數(shù)據(jù)都是明確的,解題的核心就在于不停的調(diào)整nonce的值,對區(qū)塊頭進(jìn)行雙重SHA256運算。整個工作量證明過程如下:

未命名文件-6.jpg

2. PoW優(yōu)缺點

通過上面的描述,PoW優(yōu)點很明顯:1)完全去中心化(任何人都可以加入);2)節(jié)點自由進(jìn)出,容易實現(xiàn);3)破壞系統(tǒng)花費的成本巨大;

關(guān)于破壞系統(tǒng)成本巨大可以分兩層意思理解:

  • 在指定時間內(nèi),給定一個難度,找到答案的概率唯一地由所有參與者能夠迭代哈希的速度決定。與之前的歷史無關(guān),與數(shù)據(jù)無關(guān),只跟算力有關(guān)。
  • 掌握51%的算力對系統(tǒng)進(jìn)行攻擊所付出的代價遠(yuǎn)遠(yuǎn)大于作為一個系統(tǒng)的維護(hù)者和誠實參與者所得到的。

缺點也相當(dāng)明顯:1)對節(jié)點的性能網(wǎng)絡(luò)環(huán)境要求高;2)浪費資源;3)每秒鐘最多只能做七筆交易,效率低下;4)礦場的出現(xiàn)違背了去中心的初衷; 5)不能確保最終一致性;6)比特幣產(chǎn)量每4年減半,利益驅(qū)動性降低導(dǎo)致曠工數(shù)量減少從而導(dǎo)致比特幣網(wǎng)絡(luò)癱瘓。

3. 網(wǎng)絡(luò)攻擊和鏈分叉

1)網(wǎng)絡(luò)攻擊

假定一個惡意節(jié)點試圖雙花之前的已花費的交易,攻擊者需要重做包含這個交易的區(qū)塊,以及這個區(qū)塊之后的所有的區(qū)塊,創(chuàng)建一個比目前誠實區(qū)塊鏈更長的區(qū)塊鏈。只有網(wǎng)絡(luò)中的大多數(shù)節(jié)點都轉(zhuǎn)向攻擊者創(chuàng)建的區(qū)塊鏈,攻擊者的攻擊才算成功了。由于每一個區(qū)塊都包含了之前的所有區(qū)塊的交易信息,所以隨著塊高的增加,之前的區(qū)塊都會被再次確認(rèn)一次,確認(rèn)超過6次,可以理解為無法被修改。

考慮交易T包含在區(qū)塊b1中。每個后續(xù)區(qū)塊b2,b3,b4,.........bn會降低交易T被修改的可能性,因為修改這些后續(xù)的區(qū)塊需要更多的算力。中本聰用概率理論證明,六個區(qū)塊后攻擊者追趕上最長鏈的可能性降低到0.0002428%。在過4個或更多區(qū)塊后這個可能行會降到0.0000012%。每新增一個區(qū)塊bn,攻擊的可能性就會以指數(shù)形式下降,很快整個攻擊的可能性就會低到可以忽略的程度。

2)鏈分叉

所謂的鏈分叉,主要是由于在計算hash時,每個人拿到的區(qū)塊內(nèi)容是不同的,導(dǎo)致算出的區(qū)塊結(jié)果也不同,但都是正確結(jié)果,于是,區(qū)塊鏈在這個時刻,出現(xiàn)了兩個都滿足要求的不同區(qū)塊,那曠工怎么辦呢?由于距離遠(yuǎn)近、網(wǎng)絡(luò)等原因,不同曠工看到這兩個區(qū)塊的先后順序是不一樣的,通常情況下,曠工會把自己先看到的區(qū)塊鏈復(fù)制過來,然后接著在這個區(qū)塊上開始新的挖礦工作,于是就出現(xiàn)了鏈分叉。

PoW解決方案:從分叉的區(qū)塊起,由于不同的礦工跟從了不同的區(qū)塊,在分叉出來的兩條不同鏈上,算力是有差別的。由于解題能力和礦工的算力成正比,因此兩條鏈的增長速度也是不一樣的,在一段時間之后,總有一條鏈的長度要超過另一條。當(dāng)?shù)V工發(fā)現(xiàn)全網(wǎng)有一條更長的鏈時,他就會拋棄他當(dāng)前的鏈,把新的更長的鏈全部復(fù)制回來,在這條鏈的基礎(chǔ)上繼續(xù)挖礦。所有礦工都這樣操作,這條鏈就成為了主鏈,分叉出來被拋棄掉的鏈就消失了。

能夠讓區(qū)塊鏈保證唯一性的前提是:所有礦工都遵從同樣的機(jī)制。當(dāng)曠工遵從不同的機(jī)制時,就會出現(xiàn)硬分叉,這種分叉會導(dǎo)致資產(chǎn)增加,且兩條鏈同時存在,比如BBC。

PoS 共識機(jī)制

對于PoW,由于礦場的出現(xiàn)及挖礦設(shè)備性能的不斷提升,算力開始集中,節(jié)點數(shù)和算力值漸漸不適配,同時PoW太浪費了,曠工持續(xù)挖礦進(jìn)行的重復(fù)性Hash計算沒有任何實際或者科學(xué)價值,而且還有一個更大的問題,作惡是沒有成本的,曠工的惡意攻擊并不會對曠工下次記賬并獲取相關(guān)權(quán)益(比特幣)產(chǎn)生任何影響,鑒于此,人們提出了PoS。

PoS(Proof of Stake):股權(quán)證明,與PoW相比,不需要證明你在記賬前做了某項工作,而是證明你擁有某些財產(chǎn)。股權(quán)決定一起,誰的股權(quán)大,誰記賬的概率就越大。由于PoS是BitCoin出現(xiàn)后提出的共識算法,目前還有得到實際的驗證,并且,PoS不是一個,而是一類共識算法。最先使用PoS的是Peer Coin,不過是一種樸素的PoS,目前呼聲很高的是ETH Casper,但還沒有投產(chǎn)(拭目以待吧),所以關(guān)于PoS的描述基于Peer Coin。

1. 工作機(jī)制

如下圖所示,開始競爭出塊記賬前,擁有權(quán)益的節(jié)點將自己的權(quán)益放入PoS機(jī)制中,同時身份變?yōu)轵炞C者,PoS機(jī)制根據(jù)驗證者下注的多少,采用隨機(jī)的方式選出一個記賬者進(jìn)行出塊記賬。這個隨機(jī)并不是真正的隨機(jī),一般跟下注的權(quán)益成正比,誰的權(quán)益多,誰獲取記賬權(quán)的概率就越大。如果選出的記賬者在一段時間內(nèi)沒有記賬,PoS機(jī)制重新選擇記賬節(jié)點,當(dāng)出塊完成,開始進(jìn)入下一輪的記賬。

POS機(jī)制.jpg

我們以Peer Coin來舉例說明PoS的工作機(jī)制。Peer Coin是最先采用PoS共識機(jī)制的數(shù)字貨幣。在Peer Coin中,引入了幣齡和幣天的概念。所謂幣天,就是你持有貨幣的時間,幣齡=幣的數(shù)量比天。比如你有100個幣,總共持有30天(Peer Coin中未使用至少30天的幣可以參與競爭下一區(qū)塊),那么你的幣齡就是10030=3000,你作為幣的持有者,參與下一輪競爭,過程如下:

  1. 在競爭開始前,你將3000幣齡作為籌碼下注,并成為記賬驗證者,
  2. PoW機(jī)制會隨機(jī)的選出一個記賬者,剛好是你
  3. 你開始記賬并完成
  4. 你的3000幣齡被清0
  5. 你獲得利息=3000 * 5% / 365 = 0.41個幣(每被清空365幣齡,你將會從區(qū)塊中獲得0.05個幣的利息)

理解隨機(jī):選我、選我、選我?PoS在選擇記賬者時一般有兩種做法,一種是挑選下注多(權(quán)益大)的進(jìn)行輪流記賬;還有一種是跟PoW結(jié)合,在PoW中,決定曠工能否出塊的一個重要因素是出塊的難度,PoS將出塊難度和權(quán)益掛鉤,權(quán)益越大,難度越小,出塊概率越大。

2. PoS特點及分類

PoS 特點
  • PoS需要一定量的權(quán)益作為出塊的競爭資本
  • PoS不需要進(jìn)行大量的“無用”Hash計算
  • PoS偏向“權(quán)利”集中制,但又做了均衡(出塊清0)
  • PoS通過股權(quán)質(zhì)押對作惡者進(jìn)行懲罰
  • PoS提供激勵機(jī)制
PoS 分類

先說三個問題:

  • 鏈分叉問題:PoW從經(jīng)濟(jì)角度,可以自然做到防止鏈分叉,但PoS需要精心審計,即nothing at stake問題。PoS可以采用一定的懲罰機(jī)制。
  • 遠(yuǎn)程攻擊問題:即如曠工在撤回被定的虛擬資產(chǎn)后,再發(fā)起之前發(fā)生的例行區(qū)塊的分叉。
  • 卡特爾形成問題:即區(qū)塊鏈的寡頭壟斷,由于PoS共識算法是誰“富有”,誰就有更大的話語權(quán),這樣少數(shù)富有曠工之間的“協(xié)調(diào)”將導(dǎo)致寡頭龍蛋的形成。

目前業(yè)內(nèi)PoS共識算法的實現(xiàn)主要分為兩類:

  • 簡單的的PoS系統(tǒng)。這類PoS很少甚至沒有從算法的設(shè)計上來解決上述問題,一般是比較早期的PoS嘗試。比較典型的例子是Peer Coin(點點幣,PPC)、新星幣(Nova Coin,NVC)、黑幣(Black Coin,BLK)、NextCoin(未來幣,NXT)等等
  • 精心設(shè)計的PoS系統(tǒng),相對來說比較新。基于不同的實現(xiàn)方式,精心設(shè)計的PoS系統(tǒng)可以分為兩種。一種是基于拜占庭容錯的權(quán)益證明(BFT based PoS),比如Tendermint,另一種是基于鏈的權(quán)益證明(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)人人可挖礦(獲得利息),不用擔(dān)心算力集中導(dǎo)致中心化出現(xiàn);5)避免貨幣緊縮

為什么PoS更加安全?
  • 在指定時間內(nèi),在POS體系中,即使你擁有了全球51%的算力,也未必能夠進(jìn)行51%攻擊,因為,有一部分的貨幣并不是挖礦產(chǎn)生的,而是由利息產(chǎn)生(利息存放在POS區(qū)塊中),這要求攻擊者還需要持有全球超過51%的貨幣量。這大大提高了51%攻擊的難度。
  • 在PoS機(jī)制下,持有幣越多,越容易獲得記賬權(quán),接近于贏家通吃的感覺,但持有的幣越多,越接近于一個誠實的節(jié)點,因為破壞整個網(wǎng)絡(luò)帶來的損失也越大,即假設(shè)富人不會做惡,畢竟做惡的目標(biāo)是錢,若你富有,自然就沒有做惡的動力。

除過同PoW一樣不能確保最終一致性外,我們從兩個維度說,一個是幣的維度 ,一個是鏈的維度:

幣維度:

  • 純PoS機(jī)制的加密貨幣,只能通過IPO的方式發(fā)行,這就導(dǎo)致“少數(shù)人”(通常是開發(fā)者)獲得大量成本極低的加密貨幣,在利益面前,很難保證他們不會大量拋售。
  • PoS機(jī)制的加密貨幣,信用基礎(chǔ)不夠牢固。為解決這個問題,很多采用PoW+PoS的雙重機(jī)制,通過PoW挖礦發(fā)行加密貨幣,使用PoS維護(hù)網(wǎng)絡(luò)穩(wěn)定。或者采用DPoS機(jī)制,通過社區(qū)選舉的方式,增強(qiáng)信任。

鏈維度:

  • 權(quán)益粉碎攻擊:可理解為“窮山惡水出刁民”,權(quán)益很少的那一部分節(jié)點主動攻擊導(dǎo)致鏈分叉,畢竟光腳不怕穿鞋的,破罐子破摔(權(quán)益越大責(zé)任越大,權(quán)益越少責(zé)任越小)。PoS可采用對應(yīng)的懲罰機(jī)制,比如以太坊的 casper 里的slasher。
  • 理性分叉:可理解為“大眾心理學(xué)之跟風(fēng)消費”,假如出現(xiàn)分叉,誠實節(jié)點為了保證自己的利益,也會趨于理性的去分叉上挖礦(挖了沒損失,不挖可能會有損失),如果整個網(wǎng)絡(luò)足夠理性,會出現(xiàn)的情況反而是每條分支都會永遠(yuǎn)存在因為理性的礦工會同時在所有分支上挖礦。

tips:以太坊開發(fā)者Jan對PoS的擔(dān)心,Jan目前為NERVOS的首席架構(gòu)師

Jan:我總覺得 PoS有點問題。因為共識是要創(chuàng)造信任,信任是不可能自己創(chuàng)造自己。你想象一條蛇在咬自己的尾巴。PoS用系統(tǒng)自己發(fā)布的資產(chǎn)作為押金,去保證這個系統(tǒng)的安全。它沒有錨定任何的東西,是漂浮在空中的。我沒有看到任何的信任是通過 PoS這樣的方式創(chuàng)造出來的。我覺得信任的創(chuàng)造還是要錨定能量。美元錨定是美國的軍事實力。如果哪天美國沒有這種軍事實力,那美元的價值我覺得要打很多問號。PoW是相當(dāng)于用軍隊錨定,PoS 是用美元錨定美元。這個問題你會思考很久。因為你可能又會想,歸根到底這兩種方式,好像都是用資本去錨定,因為電力本質(zhì)上也是一種資本。但再想想,這兩種資本好像是不太一樣的。PoW 是體系外的資本。所以,PoS 我總覺得有點問題。

DPoS 共識機(jī)制

盡管PoS針對PoW的諸多不足做了改進(jìn),但是PoS仍然有一些自身的不足,而這些不足中尤其以“權(quán)利集中制”最為顯著。在PoS系統(tǒng)中,依據(jù)權(quán)益的結(jié)余來選擇,會導(dǎo)致首富賬戶的權(quán)利更大,有可能支配記賬權(quán),從而使得基于PoS的區(qū)塊鏈系統(tǒng)變成幾個少數(shù)“有錢人”的游戲,這和區(qū)塊鏈的去中心化本意背道而馳,同時PoS的性能(1分鐘)相比PoW(10分鐘)并沒有提升多少,這一點仍然被人詬病。基于此,原Bitshares的首席開發(fā)者Dan Larimer (現(xiàn)為EOS CTO)提出了一種更加快速、安全且能源消耗比較小的算法,這就是后來的DPoS。

DPoS(Delegated Proof of Stake):授權(quán)股權(quán)證明機(jī)制,基于PoS,類似投票選舉,由被選舉節(jié)點記賬,如果把PoS看成資本主義的“權(quán)利集中制”,那么DPoS可以理解為具有特色社會主義的“民主集中制”。目前采用DPoS共識機(jī)制的如Bitshares、EOS和Asch等,由于EOS最近主網(wǎng)剛上,且是由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(柚子),三個項目在圈內(nèi)都非常出名,市值排在前50名,特別是近期EOS十分熱門

區(qū)塊鏈時代

  • 區(qū)塊鏈 1.0:以比特幣為代表的加密貨幣為代表。大部分都基于比特幣,無法完成上層應(yīng)用對接,非圖靈完備,開發(fā)需從底層開始,難度大,成本高
  • 區(qū)塊鏈 2.0:以支持智能合約的以太坊為代表,如果把比特幣理解為全球賬本,那么以太坊可以看成一臺全球計算機(jī),任何人都可以上傳執(zhí)行任意的應(yīng)用程序。智能合約的出現(xiàn)大大降低了區(qū)塊鏈應(yīng)用的開發(fā)門檻,提升了開發(fā)效率,為應(yīng)用繁榮提供了好的土壤和平臺
  • 區(qū)塊鏈 3.0:暫時還沒有代表,有些人將Token的出現(xiàn)或者EOS看成區(qū)塊鏈3.0都顯的有些急躁,暫不做評論,拭目以待

1. 工作機(jī)制

跟PoS不同的是,持有少數(shù)股份(權(quán)益)的節(jié)點也能行使他們的共識權(quán)了,只不過是以一種間接的方式。類似于股東代表大會,每當(dāng)要決策公司大事(記什么賬,誰來記賬)的時候,全體股民(節(jié)點)依法行使投票權(quán),選出自己心中的股東代表(可信賬戶),誰得票高誰當(dāng)選。候選人可以去公開演講拉票,獲得足夠多股民(節(jié)點)的信任,然后股東代表(被選中的可信節(jié)點)代表股民決策公司大事,股東代表的人數(shù)由系統(tǒng)決定,比如Bitshares為101個、Asch為51個,EOS為21個。

與生活中的股東代表選舉不同:1)DPoS機(jī)制中的股民(節(jié)點)根據(jù)自己持有的加密貨幣數(shù)量占總量的百分比(占股比例)來投票,不是一人一票;2)選舉出的股東代表(可信節(jié)點)完全對等,可理解為具有同等算力的101個礦池;3)股東代表一旦無能、不作為、胡作為(提供的算力不穩(wěn)定,計算機(jī)宕機(jī)、或者試圖利用手中的權(quán)力作惡),將立刻被股民踢出整個系統(tǒng),然后由其他后備代表頂上去;4)決策完公司大事(記完賬、出完塊)有錢分,根據(jù)占股比例。DPoS的工作流程如下圖所示:

DPOS機(jī)制-2.jpg

EOS的DPoS分為兩個步驟:1)選舉塊生產(chǎn)者(Block Producter,簡稱BP);2)出塊共識;

選舉塊生產(chǎn)者:任何持有Token的人都可以成為塊生產(chǎn)者,都擁有投票權(quán)。每次投票前,候選BP可以給自己拉票(線下方式),每次投票超過50%代表有效,然后生成一個BP候選池,每次從BP候選池中選擇排名靠前的21個節(jié)點作為BP,并對選出的21個BP隨機(jī)排序。

出塊共識:21個BP按照隨機(jī)排序進(jìn)行出塊,在每輪出塊共識的過程中,BP如果不出塊或者出現(xiàn)惡意行為,將被其他節(jié)點舉報并接受懲罰(剝奪出塊的權(quán)利),然后從候選池中再選擇一個BP加入,一個BP出塊成功,并且經(jīng)過至少(2/3 + 1)個BP確認(rèn)(至少15個),出塊BP獲取相應(yīng)的獎勵,然后輪流至下一個BP出塊,如果輪詢了10次或者一天,將重新進(jìn)行投票選舉。

2. DPoS的優(yōu)缺點

對于EOS的DPoS優(yōu)點:1)記賬節(jié)點減少,交易速度更快,EOS號稱可達(dá)百萬TPS;2)更加安全,一般不不會發(fā)生鏈分叉并不可逆,確保最終一致性;3)相對PoW,解決了資源消耗問題;

基于DPoS的設(shè)計,其優(yōu)點也成為了自己的缺點,這也是為什么V神怒懟DPoS的原因。

  • 首先DPoS通過選舉少數(shù)的BP來出塊記賬,確實從網(wǎng)絡(luò)傳輸和確認(rèn)時間上看,性能大幅提升,但是少量的BP數(shù)量犧牲了部分去中心化。有人說這些被選舉的BP代表著“民意”,相比PoW的5大礦場和PoS的富人玩家,DPoS更加民主,更加去中心化,但是DPoS機(jī)制的設(shè)計并不能保證一定有足額的真實的區(qū)塊生產(chǎn)者,因為一個人或一個實體,可能控制著多個節(jié)點。比如LBTC,就一度出現(xiàn)半數(shù)節(jié)點被魚池一家控制。EOS在啟動過程中,也疑似出現(xiàn)一個人虛擬出7個節(jié)點的事。
  • 其次,在真實的網(wǎng)絡(luò)環(huán)境中,EOS實際的運行效率遠(yuǎn)沒有吹的那么厲害,同時超級節(jié)點的治理全力和經(jīng)濟(jì)利益過于集中,如果他們串通,將進(jìn)一步形成巨頭龍壟斷,這和區(qū)塊鏈思想南轅北轍。
  • 再次,對于壞節(jié)點的處理存在諸多困難。社區(qū)選舉不能及時有效的阻止一些破壞節(jié)點的出現(xiàn),給網(wǎng)絡(luò)造成安全隱患,同時在網(wǎng)絡(luò)節(jié)點數(shù)量少的場景,選舉的BP代表性不強(qiáng)。

3. 網(wǎng)絡(luò)攻擊和鏈分叉

DPoS作為去中心化系統(tǒng)被人詬病的很多,這主要表現(xiàn)為會形成卡特爾和賄賂選民的動機(jī)。

關(guān)于鏈分叉,在正常運行的情況下,DPoS具有最終一致性,并不會經(jīng)歷任何分叉,因為被選舉出來的BP是通過合作而非競爭的方式來生產(chǎn)區(qū)塊,即便出現(xiàn)了分叉,共識也將自動的切換到最長的鏈上。簡化期間,我們假設(shè)有三個BP,分別為A\B\C。

在正常操作模式下,快生產(chǎn)者3秒輪流成成一個快,如果沒有人錯過自己的輪次,那么將產(chǎn)生最長鏈,BP在被調(diào)度之外的任何時間段都無法出塊,同時如果錯過出塊,可能會被淘汰。如下圖所示。

正常出塊.jpg

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

少數(shù)出塊.jpg

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

多重.jpg

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

多數(shù)生產(chǎn).jpg

Raft 共識機(jī)制

前面我們介紹了三種共識機(jī)制,即PoW、PoS和DPoS,但對于一些特殊場景(私有鏈和聯(lián)盟鏈),并不需要解決拜占庭將軍問題(后面會說到,即節(jié)點中沒有“叛徒”),只需要處理一般的死機(jī)故障,同時追求共識的效率和強(qiáng)一致性,顯然,這三種共識機(jī)制都不太合適。在這種情況下,采用Paxos等協(xié)議會更加高效。Paxos是Lamport設(shè)計的保持分布式系統(tǒng)一致性的協(xié)議,但由于Paxos非常復(fù)雜,難以理解,因此后來出現(xiàn)了各種不同的實現(xiàn)和變種,比如Raft。

Raft最初是一個用于管理復(fù)制日志的共識算法,注重協(xié)議的落地性和可理解性,是在非拜占庭故障下達(dá)成共識的強(qiáng)一致協(xié)議。目前Hyperledger的Fabric項目中,支持PBTF和Raft等共識協(xié)議。

1. 工作機(jī)制

一個Raft集群通常有5個節(jié)點,允許系統(tǒng)有兩個故障節(jié)點(因為至少要N/2 +1個節(jié)點投票)。每個節(jié)點有三種狀態(tài):leader、follower、candidate。正常狀態(tài)下,僅有一個Leader,其他均為follower。follower是被動的,不會主動發(fā)起請求,只能對leader和candida的請求做出響應(yīng)。leader處理所有客戶端的請求,candidate狀態(tài)用來選舉。

Raft算法包括三個基本組件:leader選舉、日志復(fù)制、安全性問題。

  • Leader選舉:現(xiàn)有的leader失效時,必須選出一個新的Leader
  • 日志復(fù)制(記賬):leader必須接受來自客戶端的的交易記錄,在參與共識記賬的節(jié)點中進(jìn)行復(fù)制,使其他節(jié)點交易所對應(yīng)的區(qū)塊
  • 安全性問題:若某個節(jié)點對其狀態(tài)機(jī)應(yīng)用了某個特定的區(qū)塊項,其他的節(jié)點不能對同一區(qū)塊索引應(yīng)用不同的命令(這句話真是變態(tài)的拗口)
Leader的選舉:

選舉leader只會在兩種情況下發(fā)生:1)第一次啟動Raft集群的時候;2)一個已知存在的Leader故障的時候;

流程如下圖所示。對于初始化網(wǎng)絡(luò),每個節(jié)點處于follower狀態(tài),并自動轉(zhuǎn)化為candidate,然后對自己投票,并發(fā)起RequestVoteRPC,然后等待,會出現(xiàn)如下情況:1)當(dāng)前節(jié)點獲得超過半數(shù)節(jié)點的投票,贏得選舉成為Leader;2)其他節(jié)點贏得選舉,當(dāng)前節(jié)點接收到對方心跳 ,當(dāng)前節(jié)點變?yōu)閒ollower;3)選舉超時,沒有節(jié)點贏得選舉,當(dāng)前節(jié)點自增任期,重新發(fā)起選舉。

leander-2.jpg

圖中有幾點需要說明:

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

在日志復(fù)制過程中,分四個步驟,還是畫個框框說明一下吧,如下圖所示。

復(fù)制-2.jpg
  1. Client發(fā)送請求給leader,每個請求都是一條指令。
  2. leader接受請求后,把指令(Entry)追加到leader的操作日志中,然后對follower發(fā)起AppendEntries操作,嘗試讓操作指令(Entry)追加到Followers的操作日志中。如果有Follower不可用,則一直嘗試
  3. 一旦Leader接受到多數(shù)(Quorums)Follower的回應(yīng),Leader就會進(jìn)行commit操作,每一臺節(jié)點服務(wù)器會把操作指令交給狀態(tài)機(jī)處理。這樣就保證了各節(jié)點的狀態(tài)的一致性
  4. 各服務(wù)器狀態(tài)機(jī)處理完成之后,Leader將結(jié)果返回給Client
安全性問題:

在安全性方面,Raft主要通過如下機(jī)制確保。

  • Election safety: 在一個term下,最多只有一個Leader。
  • Leader Append-Only: 一個Leader只能追加新的entries,不能重寫和刪除entries
  • Log Matching: 集群中各個節(jié)點的log都是相同一致的
  • Leader Completeness:如果一個log entry被committed了,則這個entry一定會出現(xiàn)在Leader的log里。
  • State Machine Safety: 如果一個節(jié)點服務(wù)器的state machine執(zhí)行了一個某個log entry命令,則其他節(jié)點服務(wù)器,也會執(zhí)行這個log entry命令,不會再執(zhí)行其他命令。

2. Raft優(yōu)缺點

由工作機(jī)制的描述,Raft的優(yōu)點為:1)速度快,少量的節(jié)點,網(wǎng)絡(luò)傳輸及共識效率高;2)不需要挖礦,節(jié)能環(huán)保;3)不需要考慮拜占庭節(jié)點,算法更簡單。

由于Raft過度依賴Leader,從而喪失了部分去中心化,這在公鏈上是不能被接受的,所以Raft一般用于私鏈或者聯(lián)盟鏈。同時,Raft在一定的網(wǎng)絡(luò)波動或競爭情況下出現(xiàn)斷站的網(wǎng)絡(luò)分叉,需要多次確認(rèn)。

3. 網(wǎng)絡(luò)攻擊和鏈分叉

先說說網(wǎng)絡(luò)攻擊,基于其優(yōu)缺點,Raft一般用于私鏈或者聯(lián)盟鏈,趨向與相信沒有人作惡或者作惡可能性更小。但是一般出現(xiàn),并且被選為記賬者,那其他節(jié)點當(dāng)時是沒辦法識破的,最多只能通過事后檢查來發(fā)現(xiàn)。

鏈分叉? 要分析鏈分叉,首先要看看Raft機(jī)制是否會產(chǎn)生鏈分叉,我們知道一般是因為在同一時間出現(xiàn)多個記賬者才會導(dǎo)致鏈分叉,可是按照Raft的機(jī)制,任何時刻都只會有一個leader(記賬者),不會出現(xiàn)鏈分叉?

State Machine Safety:

一個candidate在選舉的時候,會想其他節(jié)點發(fā)送包含他的log信息,獲取票數(shù),如果log是最新的,則獲得選票,如果其他節(jié)點還有更加新的log,澤會拒絕投票,保證了State Machine Safety。

follower crashes:

如果follower故障,就不會接受追加entry和投票請求,leader會不斷嘗試和故障節(jié)點保持心跳,當(dāng)節(jié)點回復(fù),澤接受leader的最新log,并將log應(yīng)用到State machine中,確保了不會分叉。

leader crashes:

leader故障情況下,集群中的所有節(jié)點的日志可能不一致,old leader的一些操作日志沒有通過集群完全復(fù)制,new leader會通過強(qiáng)制followers復(fù)制自己的log來處理不一致的情況:

  1. 對于每個Follower,new leader將其日志與Followers的日志進(jìn)行比較,找到他們的達(dá)成一致的最后一個log entry。
  2. 然后刪除掉Followers中這個關(guān)鍵entry后面的所有entry,并將其替換為自己的log entry。該機(jī)制將恢復(fù)日志的一致性。

PBFT 共識機(jī)制

通過上面的描述,我們知道Raft機(jī)制最大的問題在于對Leader的強(qiáng)依賴,無法規(guī)避拜占庭節(jié)點,但PoW、PoS和DPoS的性能都不算很好,更為重要的是,在金融或者一些特殊應(yīng)用領(lǐng)域,分布式系統(tǒng)需要確保一致性和正確性。基于BFT,人們提出了PBFT共識機(jī)制。

1. BFT & PBFT

BFT(Byzantine Fault Tolerance),即拜占庭容錯技術(shù),是一類分布式計算領(lǐng)域的容錯技術(shù),由于硬件錯誤、網(wǎng)絡(luò)阻塞或中斷以及遭遇惡意攻擊等原因,計算機(jī)和網(wǎng)絡(luò)可能出現(xiàn)不可預(yù)料的行為,拜占庭容錯技術(shù)被設(shè)計用來處理這些異常行為,并滿足所要解決的問題的規(guī)范要求。

拜占庭將軍問題:拜占庭將軍問題是Leslie Lamport在20世紀(jì)80年代提出的假想問題,即拜占庭羅馬帝國的將軍為了使得作戰(zhàn)計劃統(tǒng)一,避免叛徒作亂,需要提出一種協(xié)議,該協(xié)議能使將軍們達(dá)成一致,并且少數(shù)幾個叛徒不能使忠誠的將軍做出錯誤的計劃。也就是說拜占庭將軍問題是指尋找一個方法,使得將軍們能在一個有叛徒的非信任環(huán)境中建立對戰(zhàn)斗計劃的共識。

我們需要知道的是拜占庭將軍問題在將軍總數(shù)大于3f ,背叛者為f 或者更少時,忠誠的將軍可以達(dá)成命令上的一致,即3f+1<=n。算法復(fù)雜度為o(n^(f+1)),其中n為集群節(jié)點數(shù)。這個算法太慢了,這是一個在實際生產(chǎn)環(huán)境中幾乎無法使用的算法。

基于此,Miguel Castro 和Barbara Liskov在1999年發(fā)表的論文《Practical Byzantine Fault Tolerance》中首次提出PBFT算法,該算法容錯數(shù)量也滿足3f+1<=n,算法復(fù)雜度為o(n^2),PBFT解決了共識算法容錯率不高的問題(其他共識算法為50%),并且將算法復(fù)雜度由指數(shù)級降低到多項式級,使得拜占庭容錯在實際系統(tǒng)中應(yīng)用變的可行。憑借PBFT算法,Liskov獲得了2008年圖領(lǐng)獎。

2. PBFT工作機(jī)制

PBFT要系統(tǒng)共同維護(hù)一個狀態(tài),所有節(jié)點采取的行動一致。為此,需要運行三類基本協(xié)議,包括:一致性協(xié)議、檢查點協(xié)議和視圖更換協(xié)議。同時,一致性協(xié)議要求來自客戶端的請求在每一個服務(wù)節(jié)點上都按照一個確定的順序執(zhí)行,這個協(xié)議把節(jié)點分為兩類:主節(jié)點和從節(jié)點,主節(jié)點僅有一個并負(fù)責(zé)請求排序,從節(jié)點按照主節(jié)點排序處理請求。

1)主節(jié)點的“選舉”

PBFT的主節(jié)點“選舉”和Raft算法的選舉不一樣,只是通過一個模運算進(jìn)行或者選擇當(dāng)前存活的節(jié)點編號最小的節(jié)點成為新的主節(jié)點。p = v mod |R|,其中p為節(jié)點編號、v為視圖編號,|R|為節(jié)點數(shù)量。當(dāng)主節(jié)點失效后就需要啟動視圖更換。

2)PBFT算法基本流程:
  1. 客戶端發(fā)送請求給主節(jié)點
  2. 主節(jié)點廣播請求給其它節(jié)點,節(jié)點執(zhí)行pbft算法的三階段共識流程
  3. 節(jié)點處理完三階段流程后,返回消息給客戶端
  4. 客戶端收到來自f+1個節(jié)點的相同消息后,代表共識已經(jīng)正確完成
3)算法核心三階段流程

三階段流程如下圖所示,核心三階段分別為pre-preare階段(預(yù)準(zhǔn)備階段)、prepare階段(準(zhǔn)備階段)和commit階段(提交階段),圖中的C代表客戶端,0、1、2、3代表節(jié)點的編號,打叉的3代表可能是一個故障節(jié)點或者問題節(jié)點,0為主節(jié)點。

三階段流程.jpg

首先,客戶端向主節(jié)點發(fā)起請求,主節(jié)點0收到客戶端請求,會向其它節(jié)點發(fā)送pre-prepare消息,其它節(jié)點就收到了pre-prepare消息,就開始了這個核心三階段共識過程了。

tips:相關(guān)字母代表含義提前了解一下

  • v:當(dāng)前的視圖編號,類似Raft的term任期
  • n:當(dāng)前的請求編號
  • m:消息內(nèi)容
  • d:消息內(nèi)容的摘要
  • i:節(jié)點的編號

Pre-prepare階段:節(jié)點收到pre-prepare消息后,要么接受要么拒絕或者等待。當(dāng)主節(jié)點發(fā)送兩條具有相同的v和n,但d和m的消息時拒絕,或者不在水位區(qū)間內(nèi)則等待(后面會說)。

Prepare階段:節(jié)點同意請求后會向其它節(jié)點發(fā)送prepare消息。在一定時間范圍內(nèi),如果收到超過2f個不同節(jié)點的prepare消息,就代表prepare階段已經(jīng)完成。

Commit階段:向其它節(jié)點廣播commit消息,當(dāng)收到2f+1個commit消息后(包括自己),代表大多數(shù)節(jié)點已經(jīng)進(jìn)入commit階段,這一階段已經(jīng)達(dá)成共識,節(jié)點就會執(zhí)行請求,寫入數(shù)據(jù)。

為了更清晰的展現(xiàn)這個過程和一些細(xì)節(jié),下面以流程圖來表示這個過程。

三階段流程-2.jpg
4)檢查點協(xié)議

checkpoint、stable checkpoint和高低水位

checkpoint就是當(dāng)前節(jié)點處理的最新請求序號,stable checkpoint,就是大部分(2f+1)已經(jīng)共識完成的最大請求序號。所謂低水位可以理解為stable checkpoint對應(yīng)的請求序號,而高水位指的是系統(tǒng)設(shè)定的一個值L加上stable checkpoint。

比如A節(jié)點當(dāng)前checkpoint為1100,B節(jié)點checkpoint為1099,stable checkpoint為1000,L為100,那么高水位H = 1000+100=1100,低水位h=1000。此時由于A節(jié)點的請求序號超過高水位,則處于等待狀態(tài)。當(dāng)B節(jié)點處理速度跟上之后(比如checkpoint=1100),高低水位發(fā)生變化后,比如高水位變更為1200,低水位變更為1100時(具有2f+1個節(jié)點已經(jīng)共識完成請求序號小于1100之前的請求),同時請求序號小于1100的請求數(shù)據(jù)都可以從節(jié)點本地刪除,這個時候A節(jié)點就可以繼續(xù)處理請求了。

檢查點協(xié)議有兩個功能:

  • 確保pre-prepare階段的所有請求能在同一水位范圍內(nèi)。所謂水位可以理解為一個滑動窗口。由于網(wǎng)絡(luò)不同,節(jié)點的處理速度不同,會出現(xiàn)一些節(jié)點掉隊。這個水位就是為了讓跑的快的節(jié)點等等跟不上的老鐵。
  • 進(jìn)行垃圾回收。由于三階段會產(chǎn)生各種較小的請求數(shù)據(jù),這些都需要保存在節(jié)點本地,長此以往,這個數(shù)據(jù)就很大,為了進(jìn)行垃圾回收,檢查點設(shè)置了穩(wěn)定檢查點,序號在穩(wěn)定檢查點前的都可以刪除。
5)視圖更換協(xié)議

當(dāng)主節(jié)點掛了(超時無響應(yīng))或者從節(jié)點集體認(rèn)為主節(jié)點是問題節(jié)點時,就會進(jìn)行視圖變更,視圖變更完成后,視圖編號將會加1。

視圖變更協(xié)議分為三個階段:視圖變更階段、視圖變更確認(rèn)階段、新建視圖階段。

  • 視圖變更階段:從節(jié)點認(rèn)為主節(jié)點有問題時,會向其它節(jié)點發(fā)送view-change消息,當(dāng)前存活的節(jié)點編號最小的節(jié)點將成為新的主節(jié)點。
  • 視圖變更確認(rèn)階段:當(dāng)新的主節(jié)點收到2f個其它節(jié)點的view-change消息,則證明有足夠多人的節(jié)點認(rèn)為主節(jié)點有問題,于是就會向其它節(jié)點發(fā)送new-view消息
  • 新建視圖階段:對于主節(jié)點,發(fā)送new-view消息后會繼續(xù)執(zhí)行上個視圖未處理完的請求,從pre-prepare階段開始。其它節(jié)點驗證new-view消息通過后,就會處理主節(jié)點發(fā)來的pre-prepare消息,此時正式進(jìn)入 v+1(視圖編號加1)的時代了。

3. PBFT優(yōu)缺點

PBFT算法是一種狀態(tài)復(fù)制算法,優(yōu)點為:1)效率高;2)容錯性高;3)不需要代幣;4)節(jié)能環(huán)保;

相反,PBFT依賴狀態(tài)的維護(hù),1)當(dāng)網(wǎng)絡(luò)不穩(wěn)定或者參與者數(shù)量增多時,系統(tǒng)的穩(wěn)定性和效率會顯著下降;2)PBFT是一個部分中心化的網(wǎng)絡(luò);3)一旦有超過1/3的階段作惡,會出現(xiàn)分叉。

4. 網(wǎng)絡(luò)攻擊和鏈分叉

如果說PoW和PoS是以經(jīng)濟(jì)模型為主解決共識的話,PBFT就是用算法模型來解決共識,它不需要代幣,更適合聯(lián)盟鏈,同時更加安全。在聯(lián)盟鏈中,節(jié)點(機(jī)構(gòu))的加入都需要授權(quán),這就使得網(wǎng)絡(luò)攻擊的難度大大增加。

PBFT具有強(qiáng)一致性,在少于1/3節(jié)點作惡的情況,不會出現(xiàn)分叉,但一旦超過1/3的節(jié)點作惡,就會出現(xiàn)硬分叉,不過這種分叉會有歷史記錄。

寫在最后

通過兩周的時間,對目前市面上比較流行的5種共識算法進(jìn)行了梳理,我們發(fā)現(xiàn)每一種共識機(jī)制(算法)都有各自的優(yōu)勢和劣勢,所以在實際的應(yīng)用場景中,要根據(jù)具體情況進(jìn)行選擇。

本文內(nèi)容比較多,除過自己的理解和總結(jié)外,有一部分也屬于copy and paste,所以難免出現(xiàn)一些理解不一致和錯誤,一些細(xì)節(jié)的東西也很難盡善盡美。

共識機(jī)制作為區(qū)塊鏈技術(shù)的靈魂,正在高速發(fā)展,目前已經(jīng)出現(xiàn)基于上述共識機(jī)制的變種,同時一些結(jié)合式或者新的共識機(jī)制在逐步提出,包括區(qū)塊鏈的設(shè)計由于不可能三角的原因,也出現(xiàn)一些變種,比如分層設(shè)計等。相信在不遠(yuǎn)的未來,各種流派的區(qū)塊鏈技術(shù)和共識機(jī)制,會成為影響人們?nèi)粘I畹囊话牙鳎苿由鐣淖兏铩?/p>


【參考內(nèi)容】

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 巴比特旗下時戳資本近日發(fā)布了《區(qū)塊鏈公鏈項目研究報告》。作為時戳資本區(qū)塊鏈行業(yè)研究報告系列03,這份最新的報告主要...
    shenciyou閱讀 2,395評論 1 10
  • 今年2018年,我23歲,剛大學(xué)畢業(yè)。 憑實力母胎單身 在這個仙女泛濫的時代我的樣貌既不出眾也不抱歉,收拾收拾還是...
    奶奶的禮物閱讀 265評論 0 0
  • 前段時間,以前工作時玩得要好的同事結(jié)婚,且叫她菲吧,請我們一家去喝喜酒。我結(jié)婚時,她當(dāng)我的伴娘,我娃滿月時...
    ddb44dc2b8cc閱讀 281評論 0 0
  • 是呢,現(xiàn)在又是考前一天,雖然內(nèi)心兵荒馬亂,可就是無法沉迷于學(xué)習(xí)。 是什么時候開始變成這樣的呢? 我現(xiàn)在大四了,標(biāo)準(zhǔn)...
    JangTina閱讀 325評論 0 0
  • 5月2日,如約而至。 今天比較累,簡單說幾句。 1、今天早上靜坐20分鐘之后感覺很好,很臨在。 2、我最近的所有目...
    郭騰達(dá)閱讀 155評論 0 0