BFT:Byzantine Fault Tolerance,拜占庭容錯技術(shù)
拜占庭容錯技術(shù)(Byzantine Fault Tolerance,BFT)是一類分布式計算領(lǐng)域的容錯技術(shù)。拜占庭假設(shè)是對現(xiàn)實世界的模型化,由于硬件錯誤、網(wǎng)絡(luò)擁塞或中斷以及遭到惡意攻擊等原因,計算機和網(wǎng)絡(luò)可能出現(xiàn)不可預(yù)料的行為。拜占庭容錯技術(shù)被設(shè)計用來處理這些異常行為,并滿足所要解決的問題的規(guī)范要求。
在分布式系統(tǒng)中,特別是在區(qū)塊鏈網(wǎng)絡(luò)環(huán)境中,也和拜占庭將軍的環(huán)境類似,有運行正常的服務(wù)器(類似忠誠的拜占庭將軍),有故障的服務(wù)器,還有破壞者的服務(wù)器(類似叛變的拜占庭將軍)。共識算法的核心是在正常的節(jié)點間形成對網(wǎng)絡(luò)狀態(tài)的共識。
通常,這些發(fā)生故障節(jié)點被稱為拜占庭節(jié)點,而正常的節(jié)點即為非拜占庭節(jié)點。
拜占庭容錯系統(tǒng)是一個擁有n臺節(jié)點的系統(tǒng),整個系統(tǒng)對于每一個請求,滿足以下條件:
- 所有非拜占庭節(jié)點使用相同的輸入信息,產(chǎn)生同樣的結(jié)果;
- 如果輸入的信息正確,那么所有非拜占庭節(jié)點必須接收這個信息,并計算相應(yīng)的結(jié)果。
拜占庭系統(tǒng)普遍采用的假設(shè)條件包括:
- 拜占庭節(jié)點的行為可以是任意的,拜占庭節(jié)點之間可以共謀;
- 節(jié)點之間的錯誤是不相關(guān)的;
- 節(jié)點之間通過異步網(wǎng)絡(luò)連接,網(wǎng)絡(luò)中的消息可能丟失、亂序并延時到達(dá),但大部分協(xié)議假設(shè)消息在有限的時間里能傳達(dá)到目的地;
- 服務(wù)器之間傳遞的信息,第三方可以嗅探到,但是不能篡改、偽造信息的內(nèi)容和驗證信息的完整性。
原始的拜占庭容錯系統(tǒng)由于需要展示其理論上的可行性而缺乏實用性。另外,還需要額外的時鐘同步機制支持,算法的復(fù)雜度也是隨節(jié)點增加而指數(shù)級增加。
PBFT:Practical Byzantine Fault Tolerance,實用拜占庭容錯算法。
實用拜占庭容錯系統(tǒng)(PBFT)降低了拜占庭協(xié)議的運行復(fù)雜度,從指數(shù)級別降低到多項式級別(Polynomial),使拜占庭協(xié)議在分布式系統(tǒng)中應(yīng)用成為可能。
PBFT是一種狀態(tài)機副本復(fù)制算法,即服務(wù)作為狀態(tài)機進行建模,狀態(tài)機在分布式系統(tǒng)的不同節(jié)點進行副本復(fù)制。每個狀態(tài)機的副本都保存了服務(wù)的狀態(tài),同時也實現(xiàn)了服務(wù)的操作。將所有的副本組成的集合使用大寫字母R表示,使用0到|R|-1的整數(shù)表示每一個副本。為了描述方便,通常假設(shè)故障節(jié)點數(shù)為m個,整個服務(wù)節(jié)點數(shù)為|R|=3m+1個,這里m是有可能失效的副本的最大個數(shù)。盡管可以存在多于3m+1個副本,但是額外的副本除了降低性能之外不能提高可靠性。
PBFT要求共同維護一個狀態(tài),所有節(jié)點采取的行動一致。為此,需要運行三類基本協(xié)議,包括一致性協(xié)議、檢查點協(xié)議和視圖更換協(xié)議。我們主要關(guān)注支持系統(tǒng)日常運行的一致性協(xié)議。一致性協(xié)議至少包含若干個階段:請求(request)、序號分配(pre-prepare)和響應(yīng)(reply)。根據(jù)協(xié)議設(shè)計的不同,可能包含相互交互(prepare),序號確認(rèn)(commit)等階段。

上圖為PBFT協(xié)議通信模式,每一個客戶端的請求需要經(jīng)過5個階段,通過采用兩次兩兩交互的方式在服務(wù)器達(dá)成一致之后再執(zhí)行客戶端的請求。由于客戶端不能從服務(wù)器端獲得任何服務(wù)器運行狀態(tài)的信息,PBFT中主節(jié)點是否發(fā)生錯誤只能由服務(wù)器監(jiān)測。如果服務(wù)器在一段時間內(nèi)都不能完成客戶端的請求,則會觸發(fā)視圖更換協(xié)議。其中C為客戶端,N0~N3表示服務(wù)節(jié)點,特別的,N0為主節(jié)點,N3為故障節(jié)點。整個協(xié)議的基本過程如下:
- 客戶端發(fā)送請求,激活主節(jié)點的服務(wù)操作。
- 當(dāng)主節(jié)點接收請求后,啟動三階段的協(xié)議以向各從節(jié)點廣播請求。
- 序號分配階段,主節(jié)點給請求賦值一個序列號n,廣播序號分配消息和客戶端的請求消息m,并將構(gòu)造PRE-PREPARE消息給各從節(jié)點;
- 交互階段,從節(jié)點接收PRE-PREPARE消息,向其他服務(wù)節(jié)點廣播PREPARE消息;
- 序號確認(rèn)階段,各節(jié)點對視圖內(nèi)的請求和次序進行驗證后,廣播COMMIT消息,執(zhí)行收到的客戶端的請求并給客戶端以響應(yīng)。
- 客戶端等待來自不同節(jié)點的響應(yīng),若有m+1個響應(yīng)相同,則該響應(yīng)即為運算的結(jié)果。
PBFT在很多場景都有應(yīng)用,在區(qū)塊鏈場景中,一般適合于對強一致性有要求的私有鏈和聯(lián)盟鏈場景。例如,在IBM主導(dǎo)的區(qū)塊鏈超級賬本項目中,PBFT是一個可選的共識協(xié)議。在Hyperledger的Fabric項目中,共識模塊被設(shè)計成可插拔的模塊,支持像PBFT、Raft等共識算法。
Raft協(xié)議
在某些分布式系統(tǒng)的實用場景下,其假設(shè)條件不需要考慮拜占庭故障,而只是處理一般的死機故障。在這種情況下,采用Paxos等協(xié)議會更加高效。Paxos是Lamport設(shè)計的保持分布式系統(tǒng)一致性的協(xié)議。但由于Paxos非常復(fù)雜,比較難以理解,因此后來出現(xiàn)了各種不同的實現(xiàn)和變種。Raft是由Stanford提出的一種更易理解的一致性算法,意在取代目前廣為使用的Paxos算法。目前,在各種主流語言中都有了一些開源實現(xiàn),比如本文中將使用的基于JGroups的Raft協(xié)議實現(xiàn)。
Raft最初是一個用于管理復(fù)制日志的共識算法,它是一個為真實世界應(yīng)用建立的協(xié)議,主要注重協(xié)議的落地性和可理解性。Raft是在非拜占庭故障下達(dá)成共識的強一致協(xié)議。
在區(qū)塊鏈系統(tǒng)中,使用Raft實現(xiàn)記賬共識的過程可以描述如下:首先選舉一個leader,接著賦予leader完全的權(quán)力管理記賬。leader從客戶端接收記賬請求,完成記賬操作,生成區(qū)塊,并復(fù)制到其他記賬節(jié)點。有了leader簡化了記賬操作的管理。例如,leader能夠決定是否接受新的交易記錄項而無需考慮其他的記賬節(jié)點,leader可能失效或與其他節(jié)點失去聯(lián)系,這時,系統(tǒng)就會選出新的leader。
在Raft中,每個結(jié)點會處于下面三種狀態(tài)中的一種:
- follower:所有結(jié)點都以follower的狀態(tài)開始。如果沒收到leader消息則會變成candidate狀態(tài)
- candidate:會向其他結(jié)點“拉選票”,如果得到大部分的票則成為leader。這個過程就叫做Leader選舉(Leader Election)
- leader:所有對系統(tǒng)的修改都會先經(jīng)過leader。每個修改都會寫一條日志(log entry)。leader收到修改請求后的過程如下,這個過程叫做日志復(fù)制(Log Replication):
- 復(fù)制日志到所有follower結(jié)點(replicate entry)
- 大部分結(jié)點響應(yīng)時才提交日志
- 通知所有follower結(jié)點日志已提交
- 所有follower也提交日志
- 現(xiàn)在整個系統(tǒng)處于一致的狀態(tài)
Raft階段主要分為兩個,首先是leader選舉過程,然后在選舉出來的leader基礎(chǔ)上進行正常操作,比如日志復(fù)制、記賬等。
1.Leader Election
當(dāng)follower在選舉超時時間內(nèi)未收到leader的心跳消息,則轉(zhuǎn)換為candidate狀態(tài)。為了避免選舉沖突,這個超時時間是一個150~300ms之間的隨機數(shù)。
一般而言,在Raft系統(tǒng)中:
1)任何一個服務(wù)器都可以成為一個候選者candidate,它向其他服務(wù)器follower發(fā)出要求選舉自己的請求。
2)其他服務(wù)器同意了,發(fā)出OK。注意,如果在這個過程中,有一個follower宕機,沒有收到請求選舉的要求,此時候選者可以自己選自己,只要達(dá)到N/2+1的大多數(shù)票,候選人還是可以成為leader的。
3)這樣這個候選者就成為了leader領(lǐng)導(dǎo)人,它可以向選民也就是follower發(fā)出指令,比如進行記賬。
4)以后通過心跳進行記賬的通知。
5)一旦這個leader崩潰了,那么follower中有一個成為候選者,并發(fā)出邀票選舉。
6)follower同意后,其成為leader,繼續(xù)承擔(dān)記賬等指導(dǎo)工作。
2.Log Replication
Raft的記賬過程按以下步驟完成:
1)假設(shè)leader領(lǐng)導(dǎo)人已經(jīng)選出,這時客戶端發(fā)出增加一個日志的要求;
2)leader要求follower遵從他的指令,都將這個新的日志內(nèi)容追加到他們各自日志中;
3)大多數(shù)follower服務(wù)器將交易記錄寫入賬本后,確認(rèn)追加成功,發(fā)出確認(rèn)成功信息;
4)在下一個心跳中,leader會通知所有follower更新確認(rèn)的項目。
對于每個新的交易記錄,重復(fù)上述過程。
在這一過程中,若發(fā)生網(wǎng)絡(luò)通信故障,使得leader不能訪問大多數(shù)follower了,那么leader只能正常更新它能訪問的那些follower服務(wù)器。而大多數(shù)的服務(wù)器follower因為沒有了leader,他們將重新選舉一個候選者作為leader,然后這個leader作為代表與外界打交道,如果外界要求其添加新的交易記錄,這個新的leader就按上述步驟通知大多數(shù)follower。當(dāng)網(wǎng)絡(luò)通信恢復(fù),原先的leader就變成follower,在失聯(lián)階段,這個老leader的任何更新都不能算確認(rèn),必須全部回滾,接收新的leader的新的更新。
POW:Proof of Work,工作證明。
從去中心化賬本系統(tǒng)的角度看,每個加入這個系統(tǒng)的節(jié)點都要保存一份完整的賬本,但每個節(jié)點卻不能同時記賬,因為節(jié)點處于不同的環(huán)境,接收到不同的信息,如果同時記賬的話,必然會導(dǎo)致賬本的不一致,造成混亂。因此,需要有共識來達(dá)成哪個節(jié)點有權(quán)記賬。比特幣區(qū)塊鏈通過競爭記賬的方式解決去中心化的記賬系統(tǒng)的一致性問題, 即以每個節(jié)點的計算能力即“算力”來競爭記賬權(quán)的機制?!?br>
在比特幣系統(tǒng)中,大約每10分鐘進行一輪算力競賽,競賽的勝利者,就獲得一次記賬的權(quán)力,并向其他節(jié)點同步新增賬本信息。然而,在一個去中心化的系統(tǒng)中,誰有權(quán)判定競爭的結(jié)果呢?比特幣系統(tǒng)是通過一個稱為“工作量證明”(Proof of Work,PoW)的機制完成的。
簡單地說,PoW就是一份確認(rèn)工作端做過一定量工作的證明。PoW系統(tǒng)的主要特征是計算的不對稱性。工作端需要做一定難度的工作得出一個結(jié)果,驗證方卻很容易通過結(jié)果來檢查工作端是不是做了相應(yīng)的工作。
舉個例子,給定字符串“blockchain”,我們給出的工作量要求是,可以在這個字符串后面連接一個稱為nonce的整數(shù)值串,對連接后的字符串進行SHA256哈希運算,如果得到的哈希結(jié)果(以十六進制的形式表示)是以若干個0開頭的,則驗證通過。為了達(dá)到這個工作量證明的目標(biāo),我們需要不停地遞增nonce值,對得到的新字符串進行SHA256哈希運算。按照這個規(guī)則,需要經(jīng)過2688次計算才能找到前3位均為0的哈希值,而要找到前6位均為0的哈希值,則需進行620969次計算。
1 blockchain1 → 4bfb943cba9fb9926df93f33c17d64b378d56714e8a29c6ba8bdc9690cea8e27
2 blockchain2 → 01181212a283e760929f6b1628d903127c65e6fb5a9ad7fe94b790e699269221 ……
3 blockchain515 → 0074448bea8027bebd6333d3aa12fd11641e051911c5bab661a9b849b83958a7……
4 blockchain2688 → 0009b257eb8cf9eba179ab2be74d446fa1c59f0adfa8814260f52ae0016dd50f……
5 blockchain48851: 00000b3d96b4db1a976d3a69829aabef8bafa35ab5871e084211a16d3a4f385c……
6 blockchain6200969: 000000db7fa334aef754b51792cff6c880cd286c5f490d5cf73f658d9576d424
通過上面這個計算特定SHA256運算結(jié)果的示例,我們對PoW機制有了一個初步的理解。對于特定字符串后接隨機nonce值所構(gòu)成的串,要找到這樣的nonce值,滿足前n位均為0的SHA256值,需要多次進行哈希值的計算。一般來說,n值越大,需要完成的哈希計算量也越大。由于哈希值的偽隨機特性,要尋找4個前導(dǎo)0的哈希值,預(yù)期大概要進行216次嘗試,這個數(shù)學(xué)期望的計算次數(shù),就是所要求的“工作量”。
比特幣網(wǎng)絡(luò)中任何一個節(jié)點,如果想生成一個新的區(qū)塊并寫入?yún)^(qū)塊鏈,必須解出比特幣網(wǎng)絡(luò)出的PoW問題。這道題關(guān)鍵的3個要素是工作量證明函數(shù)、區(qū)塊及難度值。工作量證明函數(shù)是這道題的計算方法,區(qū)塊決定了這道題的輸入數(shù)據(jù),難度值決定了這道題所需要的計算量。
1. 工作量證明函數(shù) 及 區(qū)塊數(shù)據(jù)計算過程
比特幣系統(tǒng)中使用的工作量證明函數(shù)就是SHA256
比特幣區(qū)塊結(jié)構(gòu)如下圖所示:

比特幣的區(qū)塊由區(qū)塊頭及該區(qū)塊所包含的交易列表組成。區(qū)塊頭的大小為80字節(jié),由4字節(jié)的版本號、32字節(jié)的上一個區(qū)塊的哈希值、32字節(jié)的Merkle根哈希值、4字節(jié)的時間戳(當(dāng)前時間)、4字節(jié)的當(dāng)前難度值、4字節(jié)的隨機數(shù)組成。區(qū)塊包含的交易列表則附加在區(qū)塊頭后面,其中的第一筆交易是coinbase交易,這是一筆為了讓礦工獲得獎勵及手續(xù)費的特殊交易。
擁有80字節(jié)固定長度的區(qū)塊頭,就是用于比特幣工作量證明的輸入字符串。因此,為了使區(qū)塊頭能體現(xiàn)區(qū)塊所包含的所有交易,在區(qū)塊的構(gòu)造過程中,需要將該區(qū)塊要包含的交易列表,通過Merkle樹算法生成Merkle根哈希值,并以此作為交易列表的哈希值存到區(qū)塊頭中。其中Merkle樹的算法圖解如下圖所示。

上圖展示了一個具有4個交易記錄的Merkle樹的根哈希值的計算過程。首先以這4個交易作為葉子結(jié)點構(gòu)造一棵完全二叉樹,然后通過哈希值的計算,將這棵二叉樹轉(zhuǎn)化為Merkle樹。
首先對4個交易記錄:TxaTxc,分別計算各自的哈希值H<sub>A</sub>HC,然后計算兩個中間節(jié)點的哈希值HAB=Hash(HA+HB)和HCD=Hash(HC+HD),最后計算出根節(jié)點的哈希值HABCD=Hash(HAB+HCD)。

而構(gòu)造出來的簡化的區(qū)塊鏈結(jié)構(gòu)如上圖所示。We find that: 所有在給定時間范圍需要記錄的交易信息被構(gòu)造成一個Merkle樹,區(qū)塊中包含了指向這個Merkle樹的哈希指針,關(guān)聯(lián)了與該區(qū)塊相關(guān)的交易數(shù)據(jù),同時,區(qū)塊中也包含了指向前一區(qū)塊的哈希指針,使得記錄了不同交易的單個區(qū)塊被關(guān)聯(lián)起來,形成區(qū)塊鏈。
2. 挖礦難度
難度值是比特幣系統(tǒng)中的節(jié)點在生成區(qū)塊時的重要參考指標(biāo),它決定了節(jié)點大約需要經(jīng)過多少次哈希運算才能產(chǎn)生一個合法的區(qū)塊。比特幣的區(qū)塊大約每10分鐘生成一個,如果要在不同的全網(wǎng)算力條件下,新區(qū)塊的產(chǎn)生都基本保持這個速率,難度值必須根據(jù)全網(wǎng)算力的變化進行調(diào)整。簡單地說,難度值被設(shè)定在無論節(jié)點計算能力如何,新區(qū)塊產(chǎn)生速率都保持在每10分鐘一個。
難度的調(diào)整是在每個完整節(jié)點中獨立自動發(fā)生的。每2016個區(qū)塊,所有節(jié)點都會按統(tǒng)一的公式自動調(diào)整難度,這個公式是由最新2016個區(qū)塊的花費時長與期望時長(期望時長為20160分鐘,即兩周,是按每10分鐘一個區(qū)塊的產(chǎn)生速率計算出的總時長)比較得出的,根據(jù)實際時長與期望時長的比值,進行相應(yīng)調(diào)整(或變難或變易)。也就是說,如果區(qū)塊產(chǎn)生的速率比10分鐘快則增加難度,比10分鐘慢則降低難度。
這個公式可以總結(jié)為:新難度值=舊難度值×(過去2016個區(qū)塊花費時長/20160分鐘)
工作量證明需要有一個目標(biāo)值。比特幣工作量證明的目標(biāo)值(Target)的計算公式:目標(biāo)值=最大目標(biāo)值/難度值
其中最大目標(biāo)值為一個恒定值:0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
目標(biāo)值的大小與難度值成反比。比特幣工作量證明的達(dá)成就是礦工計算出來的區(qū)塊哈希值必須小于目標(biāo)值。
3. PoW過程
比特幣PoW的過程,可以簡單理解成就是將不同的nonce值作為輸入,嘗試進行SHA256哈希運算,找出滿足給定數(shù)量前導(dǎo)0的哈希值的過程。而要求的前導(dǎo)0的個數(shù)越多,代表難度越大。比特幣節(jié)點求解工作量證明問題的步驟大致歸納如下:
1)生成鑄幣交易,并與其他所有準(zhǔn)備打包進區(qū)塊的交易組成交易列表,通過Merkle樹算法生成Merkle根哈希;
2)把Merkle根哈希及其他相關(guān)字段組裝成區(qū)塊頭,將區(qū)塊頭的80字節(jié)數(shù)據(jù)作為工作量證明的輸入;
3)不停地變更區(qū)塊頭中的隨機數(shù),即nonce的數(shù)值,并對每次變更后的區(qū)塊頭做雙重SHA256運算(即SHA256(SHA256(Block_Header))),將結(jié)果值與當(dāng)前網(wǎng)絡(luò)的目標(biāo)值做對比,如果小于目標(biāo)值,則解題成功,工作量證明完成。
比特幣的工作量證明,就是俗稱“挖礦”所做的主要工作。
4. PoW能否解決拜占庭將軍問題
關(guān)于比特幣PoW共識機制能否解決拜占庭將軍問題一直在業(yè)界有爭議。2015年,Juan Garay對比特幣的PoW共識算法進行了正式的分析,得出的結(jié)論是比特幣的PoW共識算法是一種概率性的拜占庭協(xié)議(Probabilistic BA)。Garay對比特幣共識協(xié)議的兩個重要屬性分析如下。
1)一致性(Agreement)
在不誠實節(jié)點總算力小于50%的情況下,同時每輪同步區(qū)塊生成的幾率很少的情況下,誠實的節(jié)點具有相同的區(qū)塊的概率很高。用數(shù)學(xué)的嚴(yán)格語言說應(yīng)該是:當(dāng)任意兩個誠實節(jié)點的本地鏈條截取K個節(jié)點,兩條剩下的鏈條的頭區(qū)塊不相同的概率隨著K的增加呈指數(shù)型遞減。
2)正確性(Validity)
大多數(shù)的區(qū)塊必須由誠實節(jié)點提供。嚴(yán)格來說,當(dāng)不誠實算力非常小的時候,才能使大多數(shù)區(qū)塊由誠實節(jié)點提供。
因此可以看到,當(dāng)不誠實的算力小于網(wǎng)絡(luò)總算力的50%時,同時挖礦難度比較高,在大約10分鐘出一個區(qū)塊情況下,比特幣網(wǎng)絡(luò)達(dá)到一致性的概念會隨確認(rèn)區(qū)塊的數(shù)目增多而呈指數(shù)型增加。但當(dāng)不誠實算力具一定規(guī)模,甚至不用接近50%的時候,比特幣的共識算法并不能保證正確性,也就是,不能保證大多數(shù)的區(qū)塊由誠實節(jié)點來提供。
因此,我們可以看到,比特幣的共識算法不適合于私有鏈和聯(lián)盟鏈。其原因首先是它是一個最終一致性共識算法,不是一個強一致性共識算法。第二個原因是其共識效率低。提供共識效率又會犧牲共識協(xié)議的安全性。另外,比特幣通過巧妙的礦工獎勵機制來提升網(wǎng)絡(luò)的安全性。礦工挖礦獲得比特幣獎勵以及記賬所得的交易費用使得礦工更希望維護網(wǎng)絡(luò)的正常運行,而任何破壞網(wǎng)絡(luò)的非誠信行為都會損害礦工自身的利益。因此,即使有些比特幣礦池具備強大的算力,它們都沒有作惡的動機,反而有動力維護比特幣的正常運行,因為這和它們的切實利益相關(guān)。
PoW機制存在明顯的弊端。一方面,PoW的前提是,節(jié)點和算力是均勻分布的,因為通過CPU的計算能力來進行投票,擁有錢包(節(jié)點)數(shù)和算力值應(yīng)該是大致匹配的,然而隨著人們將CPU挖礦逐漸升級到GPU、FPGA,直至ASIC礦機挖礦,節(jié)點數(shù)和算力值也漸漸失配。另一方面,PoW太浪費了。比特幣網(wǎng)絡(luò)每秒可完成數(shù)百萬億次SHA256計算,但這些計算除了使惡意攻擊者不能輕易地偽裝成幾百萬個節(jié)點和打垮比特幣網(wǎng)絡(luò),并沒有更多實際或科學(xué)價值。當(dāng)然,相對于允許世界上任何一個人在瞬間就能通過去中心化和半匿名的全球貨幣網(wǎng)絡(luò),給其他人幾乎沒有手續(xù)費地轉(zhuǎn)賬所帶來的巨大好處,它的浪費也許只算是很小的代價。
有鑒于此,人們提出了權(quán)益證明(Proof of Stake,PoS)。
POS:Proof of Stake,股權(quán)證明。
PoS類似于財產(chǎn)儲存在銀行,這種模式會根據(jù)你持有數(shù)字貨幣的量和時間,分配給你相應(yīng)的利息。
簡單來說,就是一個根據(jù)你持有貨幣的量和時間,給你發(fā)利息的一個制度,在股權(quán)證明PoS模式下,有一個名詞叫幣齡,每個幣每天產(chǎn)生1幣齡,比如你持有100個幣,總共持有了30天,那么,此時你的幣齡就為3000,這個時候,如果你發(fā)現(xiàn)了一個PoS區(qū)塊,你的幣齡就會被清空為0。你每被清空365幣齡,你將會從區(qū)塊中獲得0.05個幣的利息(假定利息可理解為年利率5%),那么在這個案例中,利息 = 3000 * 5% / 365 = 0.41個幣,這下就很有意思了,持幣有利息。
點點幣(Peercoin)是首先采用權(quán)益證明的貨幣,點點幣在SHA256的哈希運算的難度方面引入了幣齡的概念,使得難度與交易輸入的幣齡成反比。在點點幣中,幣齡被定義為幣的數(shù)量與幣所擁有的天數(shù)的乘積,這使得幣齡能夠反映交易時刻用戶所擁有的貨幣數(shù)量。實際上,點點幣的權(quán)益證明機制結(jié)合了隨機化與幣齡的概念,未使用至少30天的幣可以參與競爭下一區(qū)塊,越久和越大的幣集有更大的可能去簽名下一區(qū)塊。
然而,一旦幣的權(quán)益被用于簽名一個區(qū)塊,則幣齡將清為零,這樣必須等待至少30日才能簽署另一區(qū)塊。同時,為防止非常老或非常大的權(quán)益控制區(qū)塊鏈,尋找下一區(qū)塊的最大概率在90天后達(dá)到最大值,這一過程保護了網(wǎng)絡(luò),并隨著時間逐漸生成新的幣而無需消耗大量的計算能力。點點幣的開發(fā)者聲稱這將使得惡意攻擊變得困難,因為沒有中心化的挖礦池需求,而且購買半數(shù)以上的幣的開銷似乎超過獲得51%的工作量證明的哈希計算能力。
權(quán)益證明必須采用某種方法定義任意區(qū)塊鏈中的下一合法區(qū)塊,依據(jù)賬戶結(jié)余來選擇將導(dǎo)致中心化,例如單個首富成員可能會擁有長久的優(yōu)勢。為此,人們還設(shè)計了其他不同的方法來選擇下一合法區(qū)塊。
PoS機制雖然考慮到了PoW的不足,但依據(jù)權(quán)益結(jié)余來選擇,會導(dǎo)致首富賬戶的權(quán)力更大,有可能支配記賬權(quán)。股份授權(quán)證明機制(Delegated Proof of Stake,DPoS)的出現(xiàn)正是基于解決PoW機制和PoS機制的這類不足。
DPOS:Delegated Proof of Stake,委任權(quán)益證明
比特股(Bitshare)是一類采用DPoS機制的密碼貨幣,它期望通過引入一個技術(shù)民主層來減少中心化的負(fù)面影響。
比特股的DPoS機制,中文名叫做股份授權(quán)證明機制(又稱受托人機制),它的原理是讓每一個持有比特股的人進行投票,由此產(chǎn)生101位代表 , 我們可以將其理解為101個超級節(jié)點或者礦池,而這101個超級節(jié)點彼此的權(quán)利是完全相等的。從某種角度來看,DPOS有點像是議會制度或人民代表大會制度。如果代表不能履行他們的職責(zé)(當(dāng)輪到他們時,沒能生成區(qū)塊),他們會被除名,網(wǎng)絡(luò)會選出新的超級節(jié)點來取代他們。DPOS的出現(xiàn)最主要還是因為礦機的產(chǎn)生,大量的算力在不了解也不關(guān)心比特幣的人身上,類似演唱會的黃牛,大量囤票而絲毫不關(guān)心演唱會的內(nèi)容。
比特股引入了見證人這個概念,見證人可以生成區(qū)塊,每一個持有比特股的人都可以投票選舉見證人。得到總同意票數(shù)中的前N個(N通常定義為101)候選者可以當(dāng)選為見證人,當(dāng)選見證人的個數(shù)(N)需滿足:至少一半的參與投票者相信N已經(jīng)充分地去中心化。
見證人的候選名單每個維護周期(1天)更新一次。見證人然后隨機排列,每個見證人按序有2秒的權(quán)限時間生成區(qū)塊,若見證人在給定的時間片不能生成區(qū)塊,區(qū)塊生成權(quán)限交給下一個時間片對應(yīng)的見證人。DPoS的這種設(shè)計使得區(qū)塊的生成更為快速,也更加節(jié)能。
DPoS充分利用了持股人的投票,以公平民主的方式達(dá)成共識,他們投票選出的N個見證人,可以視為N個礦池,而這N個礦池彼此的權(quán)利是完全相等的。持股人可以隨時通過投票更換這些見證人(礦池),只要他們提供的算力不穩(wěn)定,計算機宕機,或者試圖利用手中的權(quán)力作惡。
比特股還設(shè)計了另外一類競選,代表競選。選出的代表擁有提出改變網(wǎng)絡(luò)參數(shù)的特權(quán),包括交易費用、區(qū)塊大小、見證人費用和區(qū)塊區(qū)間。若大多數(shù)代表同意所提出的改變,持股人有兩周的審查期,這期間可以罷免代表并廢止所提出的改變。這一設(shè)計確保代表技術(shù)上沒有直接修改參數(shù)的權(quán)利以及所有的網(wǎng)絡(luò)參數(shù)的改變最終需得到持股人的同意。
Ripple共識算法
Ripple(瑞波)是一種基于互聯(lián)網(wǎng)的開源支付協(xié)議,可以實現(xiàn)去中心化的貨幣兌換、支付與清算功能。在Ripple的網(wǎng)絡(luò)中,交易由客戶端(應(yīng)用)發(fā)起,經(jīng)過追蹤節(jié)點(tracking node)或驗證節(jié)點(validating node)把交易廣播到整個網(wǎng)絡(luò)中。追蹤節(jié)點的主要功能是分發(fā)交易信息以及響應(yīng)客戶端的賬本請求。驗證節(jié)點除包含追蹤節(jié)點的所有功能外,還能夠通過共識協(xié)議,在賬本中增加新的賬本實例數(shù)據(jù)?! ?br>
Ripple的共識達(dá)成發(fā)生在驗證節(jié)點之間,每個驗證節(jié)點都預(yù)先配置了一份可信任節(jié)點名單,稱為UNL(Unique Node List)。在名單上的節(jié)點可對交易達(dá)成進行投票。每隔幾秒,Ripple網(wǎng)絡(luò)將進行如下共識過程:
1)每個驗證節(jié)點會不斷收到從網(wǎng)絡(luò)發(fā)送過來的交易,通過與本地賬本數(shù)據(jù)驗證后,不合法的交易直接丟棄,合法的交易將匯總成交易候選集(candidate set)。交易候選集里面還包括之前共識過程無法確認(rèn)而遺留下來的交易。
2)每個驗證節(jié)點把自己的交易候選集作為提案發(fā)送給其他驗證節(jié)點。
3)驗證節(jié)點在收到其他節(jié)點發(fā)來的提案后,如果不是來自UNL上的節(jié)點,則忽略該提案;如果是來自UNL上的節(jié)點,就會對比提案中的交易和本地的交易候選集,如果有相同的交易,該交易就獲得一票。在一定時間內(nèi),當(dāng)交易獲得超過50%的票數(shù)時,則該交易進入下一輪。沒有超過50%的交易,將留待下一次共識過程去確認(rèn)?! ?br>
4)驗證節(jié)點把超過50%票數(shù)的交易作為提案發(fā)給其他節(jié)點,同時提高所需票數(shù)的閾值到60%,重復(fù)步驟3)、步驟4),直到閾值達(dá)到80%。
5)驗證節(jié)點把經(jīng)過80%UNL節(jié)點確認(rèn)的交易正式寫入本地的賬本數(shù)據(jù)中,稱為最后關(guān)閉賬本(Last Closed Ledger),即賬本最后(最新)的狀態(tài)。


在Ripple的共識算法中,參與投票節(jié)點的身份是事先知道的,因此,算法的效率比PoW等匿名共識算法要高效,交易的確認(rèn)時間只需幾秒鐘。當(dāng)然,這點也決定了該共識算法只適合于權(quán)限鏈(Permissioned chain)的場景。Ripple共識算法的拜占庭容錯(BFT)能力為(n-1)/5,即可以容忍整個網(wǎng)絡(luò)中20%的節(jié)點出現(xiàn)拜占庭錯誤而不影響正確的共識。
以上主要是目前主流的共識算法。 但說起哪種共識機制更好或更具替代作用? 我認(rèn)為DPOS來單獨替代POW,POS或者POW+POS不太可能,畢竟存在即合理。每種算法都在特定的時間段、場景下具有各自的意義,無論是技術(shù)上,還是業(yè)務(wù)上。如果跳出技術(shù)者的角度,更多結(jié)合政治與經(jīng)濟的思考方式在里面,或許還會不斷出現(xiàn)更多的共識機制。
對于算法的選擇,一句話總結(jié)如下:
“ 在區(qū)塊鏈網(wǎng)絡(luò)中,由于應(yīng)用場景的不同,所設(shè)計的目標(biāo)各異,不同的區(qū)塊鏈系統(tǒng)采用了不同的共識算法。一般來說,在私有鏈和聯(lián)盟鏈情況下,對一致性、正確性有很強的要求。一般來說要采用強一致性的共識算法。而在公有鏈情況下,對一致性和正確性通常沒法做到百分之百,通常采用最終一致性(Eventual Consistency)的共識算法。”
通俗點就是:共識算法的選擇與應(yīng)用場景高度相關(guān),可信環(huán)境使用paxos 或者raft,帶許可的聯(lián)盟可使用pbft ,非許可鏈可以是pow,pos,ripple共識等,根據(jù)對手方信任度分級,自由選擇共識機制。