区块链共识算法总结 | 原力计划
作者 | 日月ton光
責(zé)編 | 王曉曼
出品 | CSDN博客
常見共識算法介紹
在異步系統(tǒng)中,需要主機之間進行狀態(tài)復(fù)制,以保證每個主機達成一致的狀態(tài)共識。而在異步系統(tǒng)中,主機之間可能出現(xiàn)故障,因此需要在默認(rèn)不可靠的異步網(wǎng)絡(luò)中定義容錯協(xié)議,以確保各個主機達到安全可靠的狀態(tài)共識。
共識算法其實就是一組規(guī)則,設(shè)置一組條件,篩選出具有代表性的節(jié)點。在區(qū)塊鏈系統(tǒng)中,存在很多這樣的篩選方案,如在公有鏈中的POW、POS、DPOS等,而在不需要貨幣體系的許可鏈或私有鏈中,絕對信任的節(jié)點、高效的需求是公有鏈共識算法不能提供的,對于這樣的區(qū)塊鏈,傳統(tǒng)的一致性共識算法成為首選,如PBFT、PAXOS、RAFT等。
BFT(拜占庭容錯技術(shù))
拜占庭容錯技術(shù)是一類分布式計算領(lǐng)域的容錯技術(shù)。拜占庭假設(shè)是由于硬件錯誤、網(wǎng)絡(luò)擁塞或中斷以及遭到惡意攻擊的原因,計算機和網(wǎng)絡(luò)出現(xiàn)不可預(yù)測的行為。拜占庭容錯用來處理這種異常行為,并滿足所要解決問題的規(guī)范。
拜占庭容錯系統(tǒng)是一個擁有n臺節(jié)點的系統(tǒng),整個系統(tǒng)對于每一個請求,滿足以下條件:
1)所有非拜占庭節(jié)點使用相同的輸入信息,產(chǎn)生同樣的結(jié)果;
2)如果輸入的信息正確,那么所有非拜占庭節(jié)點必須接收這個信息,并計算相應(yīng)的結(jié)果。
拜占庭系統(tǒng)普遍采用的假設(shè)條件包括:
1)拜占庭節(jié)點的行為可以是任意的,拜占庭節(jié)點之間可以共謀;
2)節(jié)點之間的錯誤是不相關(guān)的;
3)節(jié)點之間通過異步網(wǎng)絡(luò)連接,網(wǎng)絡(luò)中的消息可能丟失、亂序并延時到達,但大部分協(xié)議假設(shè)消息在有限的時間里能傳達到目的地;
4)服務(wù)器之間傳遞的信息,第三方可以嗅探到,但是不能篡改、偽造信息的內(nèi)容和驗證信息的完整性。
拜占庭容錯由于其理論上的可行性而缺乏實用性,另外還需要額外的時鐘同步機制支持,算法的復(fù)雜度也是隨節(jié)點的增加而指數(shù)級增加。
PBFT(實用拜占庭容錯算法)
實用拜占庭容錯降低了拜占庭協(xié)議的運行復(fù)雜度,從指數(shù)級別降低到多項式級別。
PBFT是一種狀態(tài)機副本復(fù)制算法,即服務(wù)作為狀態(tài)機進行建模,狀態(tài)機在分布式系統(tǒng)的不同節(jié)點進行副本復(fù)制。PBFT要求共同維護一個狀態(tài)。需要運行三類基本協(xié)議,包括一致性協(xié)議、檢查點協(xié)議和視圖更換協(xié)議。
一致性協(xié)議。一致性協(xié)議至少包含若干個階段:請求(request)、序號分配(pre-prepare)和響應(yīng)(reply),可能包含相互交互(prepare),序號確認(rèn)(commit)等階段。
PBFT通信模式中,每個客戶端的請求需要經(jīng)過5個階段。由于客戶端不能從服務(wù)器端獲得任何服務(wù)器運行狀態(tài)的信息,PBFT中主節(jié)點是否發(fā)生錯誤只能由服務(wù)器監(jiān)測。如果服務(wù)器在一段時間內(nèi)都不能完成客戶端的請求,則會觸發(fā)視圖更換協(xié)議。
整個協(xié)議的基本過程如下:
1)客戶端發(fā)送請求,激活主節(jié)點的服務(wù)操作。
2)當(dāng)主節(jié)點接收請求后,啟動三階段的協(xié)議以向各從節(jié)點廣播請求。
[2.1]序號分配階段,主節(jié)點給請求賦值一個序列號n,廣播序號分配消息和客戶端的請求消息m,并將構(gòu)造PRE-PREPARE消息給各從節(jié)點;
[2.2]交互階段,從節(jié)點接收PRE-PREPARE消息,向其他服務(wù)節(jié)點廣播PREPARE消息;
[2.3]序號確認(rèn)階段,各節(jié)點對視圖內(nèi)的請求和次序進行驗證后,廣播COMMIT消息,執(zhí)行收到的客戶端的請求并給客戶端以響應(yīng)。
3)客戶端等待來自不同節(jié)點的響應(yīng),若有m+1個響應(yīng)相同,則該響應(yīng)即為運算的結(jié)果。
PBFT一般適合有對強一致性有要求的私有鏈和聯(lián)盟鏈,例如,在IBM主導(dǎo)的區(qū)塊鏈超級賬本項目中,PBFT是一個可選的共識協(xié)議。在 Hyperledger 的Fabric項目中,共識模塊被設(shè)計成可插拔的模塊,支持像PBFT、Raft等共識算法。
PAXOS
在有些分布式場景下,其假設(shè)條件不需要考慮拜占庭故障,而只是處理一般的死機故障。在這種情況下,采用PAXOS等協(xié)議會更加高效。。PAXOS是一種基于消息傳遞且具有高度容錯特性的一致性算法。
PAXOS中有三類角色Proposer、Acceptor及Learner,主要交互過程在Proposer和Acceptor之間。算法流程分為兩個階段:
1、phase1
a)proposer向網(wǎng)絡(luò)內(nèi)超過半數(shù)的acceptor發(fā)送prepare消息
b)acceptor正常情況下回復(fù)promise消息
2、phase2
a) 在有足夠多acceptor回復(fù)promise消息時,proposer發(fā)送accept消息
b) 正常情況下acceptor回復(fù)accepted消息
流程圖如圖所示:
PAXOS協(xié)議用于微信PaxosStore中,每分鐘調(diào)用PAXOS協(xié)議過程數(shù)十億次量級。
?
Raft
PAXOS是Lamport設(shè)計的保持分布式系統(tǒng)一致性的協(xié)議。但由于PAXOS非常復(fù)雜,比較難以理解,因此后來出現(xiàn)了各種不同的實現(xiàn)和變種。Raft是由Stanford提出的一種更易理解的一致性算法,意在取代目前廣為使用的PAXOS算法。
Raft最初是一個用于管理復(fù)制日志的共識算法,它是在非拜占庭故障下達成共識的強一致協(xié)議。Raft實現(xiàn)共識過程如下:首先選舉一個leader,leader從客戶端接收記賬請求、完成記賬操作、生成區(qū)塊,并復(fù)制到其他記賬節(jié)點。leader有完全的管理記賬權(quán)利,例如,leader能夠決定是否接受新的交易記錄項而無需考慮其他的記賬節(jié)點,leader可能失效或與其他節(jié)點失去聯(lián)系,這時,重新選出新的leader。
在Raft中,每個節(jié)點會處于以下三種狀態(tài)中的一種:
(1)follower:所有節(jié)點都以follower的狀態(tài)開始。如果沒收到leader消息則會變成candidate狀態(tài);
(2)candidate:會向其他節(jié)點“拉選票”,如果得到大部分的票則成為leader。這個過程就叫做Leader選舉(Leader Election);
(3)leader:所有對系統(tǒng)的修改都會先經(jīng)過leader。每個修改都會寫一條日志(log entry)。leader收到修改請求后的過程如下:此過程叫做日志復(fù)制(Log Replication)
1)復(fù)制日志到所有follower節(jié)點
2)大部分節(jié)點響應(yīng)時才提交日志
3)通知所有follower節(jié)點日志已提交
4)所有follower也提交日志
5)現(xiàn)在整個系統(tǒng)處于一致的狀態(tài)
Raft階段主要分為兩個,首先是leader選舉過程,然后在選舉出來的leader基礎(chǔ)上進行正常操作,比如日志復(fù)制、記賬等。
(1)leader選舉
當(dāng)follower在選舉時間內(nèi)未收到leader的消息,則轉(zhuǎn)換為candidate狀態(tài)。在Raft系統(tǒng)中:
1)任何一個服務(wù)器都可以成為候選者candidate,只要它向其他服務(wù)器follower發(fā)出選舉自己的請求。
2)如果其他服務(wù)器同意了,發(fā)出OK。如果在這個過程中,有一個follower宕機,沒有收到請求選舉的要求,此時候選者可以自己選自己,只要達到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)日志復(fù)制
記賬步驟如下所示:
1)假設(shè)leader已經(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(工作量證明)
在去中心賬本系統(tǒng)中,每個加入這個系統(tǒng)的節(jié)點都要保存一份完整的賬本,但每個節(jié)點卻不能同時記賬,因為節(jié)點處于不同的環(huán)境,接收不同的信息,如果同時記賬,必然導(dǎo)致賬本的不一致。因此通過同時來決定那個節(jié)點擁有記賬權(quán)。
在比特幣系統(tǒng)中,大約每10分鐘進行一輪算力競賽,競賽的勝利者,就獲得一次記賬的權(quán)力,并向其他節(jié)點同步新增賬本信息。
PoW系統(tǒng)的主要特征是計算的不對稱性。工作端要做一定難度的工作才能得出一個結(jié)果,而驗證方卻很容易通過結(jié)果來檢查工作端是不是做了相應(yīng)的工作。該工作量的要求是,在某個字符串后面連接一個稱為nonce的整數(shù)值串,對連接后的字符串進行SHA256哈希運算,如果得到的哈希結(jié)果(以十六進制的形式表示)是以若干個0開頭的,則驗證通過。
比特幣網(wǎng)絡(luò)中任何一個節(jié)點,如果想生成一個新的區(qū)塊并寫入?yún)^(qū)塊鏈,必須解出比特幣網(wǎng)絡(luò)出的PoW問題。關(guān)鍵的3個要素是工作量證明函數(shù)、區(qū)塊及難度值。工作量證明函數(shù)是這道題的計算方法,區(qū)塊決定了這道題的輸入數(shù)據(jù),難度值決定了這道題所需要的計算量。
(1)工作量證明函數(shù)就是SHA256
比特幣的區(qū)塊由區(qū)塊頭及該區(qū)塊所包含的交易列表組成。擁有80字節(jié)固定長度的區(qū)塊頭,就是用于比特幣工作量證明的輸入字符串。
(2)難度的調(diào)整是在每個完整節(jié)點中獨立自動發(fā)生的。每2016個區(qū)塊,所有節(jié)點都會按統(tǒ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)值的大小與難度值成反比。比特幣工作量證明的達成就是礦工計算出來的區(qū)塊哈希值必須小于目標(biāo)值。
(3)POW能否解決拜占庭將軍問題
比特幣的POW共識算法是一種概率性的拜占庭協(xié)議(Probabilistic BA)
當(dāng)不誠實的算力小于網(wǎng)絡(luò)總算力的50%時,同時挖礦難度比較高(在大約10分鐘出一個區(qū)塊情況下)比特幣網(wǎng)絡(luò)達到一致性的概念會隨確認(rèn)區(qū)塊的數(shù)目增多而呈指數(shù)型增加。但當(dāng)不誠實算力具一定規(guī)模,甚至不用接近50%的時候,比特幣的共識算法并不能保證正確性,也就是,不能保證大多數(shù)的區(qū)塊由誠實節(jié)點來提供。
比特幣的共識算法不適合于私有鏈和聯(lián)盟鏈。其原因首先是它是一個最終一致性共識算法,不是一個強一致性共識算法。第二個原因是其共識效率低。
擴展知識:一致性
嚴(yán)格一致性,是在系統(tǒng)不發(fā)生任何故障,而且所有節(jié)點之間的通信無需任何時間這種理想的條件下,才能達到。這個時候整個系統(tǒng)就等價于一臺機器了。在現(xiàn)實中,是不可能達到的。
強一致性,當(dāng)分布式系統(tǒng)中更新操作完成之后,任何多個進程或線程,訪問系統(tǒng)都會獲得最新的值。
弱一致性,是指系統(tǒng)并不保證后續(xù)進程或線程的訪問都會返回最新的更新的值。系統(tǒng)在數(shù)據(jù)成功寫入之后,不承諾立即可以讀到最新寫入的值,也不會具體承諾多久讀到。但是會盡可能保證在某個時間級別(秒級)之后。可以讓數(shù)據(jù)達到一致性狀態(tài)。
最終一致性是弱一致性的特定形式。系統(tǒng)保證在沒有后續(xù)更新的前提下,系統(tǒng)最終返回上一次更新操作的值。也就是說,如果經(jīng)過一段時間后要求能訪問到更新后的數(shù)據(jù),則是最終一致性。
POS(權(quán)益證明)
在股權(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)益證明的貨幣。,點點幣的權(quán)益證明機制結(jié)合了隨機化與幣齡的概念,未使用至少30天的幣可以參與競爭下一區(qū)塊,越久和越大的幣集有更大的可能去簽名下一區(qū)塊。一旦幣的權(quán)益被用于簽名一個區(qū)塊,則幣齡將清為零,這樣必須等待至少30日才能簽署另一區(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(委任權(quán)益證明)
比特股(Bitshare)是一類采用DPOS機制的密碼貨幣。它的原理是,讓每一個持有比特股的人進行投票,由此產(chǎn)生101位代表 , 我們可以將其理解為101個超級節(jié)點或者礦池,而這101個超級節(jié)點彼此的權(quán)利是完全相等的。如果代表不能履行他們的職責(zé)(當(dāng)輪到他們時,沒能生成區(qū)塊),他們會被除名,網(wǎng)絡(luò)會選出新的超級節(jié)點來取代他們。
比特股引入了見證人這個概念,見證人可以生成區(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)的見證人。
比特股還設(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é)議,在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ù)。
?Ripple的共識達成發(fā)生在驗證節(jié)點之間,每個驗證節(jié)點都預(yù)先配置了一份可信任節(jié)點名單,稱為UNL(Unique Node List)。在名單上的節(jié)點可對交易達成進行投票。每隔幾秒,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)。
4)驗證節(jié)點把超過50%票數(shù)的交易作為提案發(fā)給其他節(jié)點,同時提高所需票數(shù)的閾值到60%,重復(fù)步驟3)、步驟4),直到閾值達到80%。
5)驗證節(jié)點把經(jīng)過80%UNL節(jié)點確認(rèn)的交易正式寫入本地的賬本數(shù)據(jù)中,稱為最后關(guān)閉賬本(Last Closed Ledger),即賬本最后(最新)的狀態(tài)。
在Ripple的共識算法中,參與投票節(jié)點的身份是事先知道的。該共識算法只適合于權(quán)限鏈(Permissionedchain)的場景。Ripple共識算法的拜占庭容錯(BFT)能力為(n-1)/5,即可以容忍整個網(wǎng)絡(luò)中20%的節(jié)點出現(xiàn)拜占庭錯誤而不影響正確的共識。
在區(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ù)對手方信任度分級,自由選擇共識機制。
版權(quán)聲明:本文為CSDN博主「日月ton光」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:
https://blog.csdn.net/sinat_36711025/article/details/104837558
推薦閱讀
從特斯拉CEO到推特CEO ,細(xì)數(shù)這9位持有比特幣的頂級富豪
斗地主嗎?能學(xué)區(qū)塊鏈那種! | 原力計劃
《哈利波特》作者J.K.羅琳求科普比特幣,V神、馬斯克積極響應(yīng),1500萬粉絲圍觀
國產(chǎn)數(shù)據(jù)庫 OceanBase 二次刷榜 TPC-C,7 億 tpmC!
騰訊人均月薪 8 萬,恍恍惚惚,又被平均了?
一文帶你徹底搞懂什么是「緩存」!
出任 Twitter 獨立董事,AI 女神李飛飛的傳奇人生
老鐵們在看簽個到!
總結(jié)
以上是生活随笔為你收集整理的区块链共识算法总结 | 原力计划的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IDEA+TestNG 环境部署+疑问+
- 下一篇: React在线编辑简历