一、LibraBFT算法簡介
基本概念:
1. SMR(State Machine Replication):在計算機領域,SMR是在網絡中不同副本間進行狀態(tài)復制的一種協(xié)議。
2. Safety: 簡單地理解就是共識的一致性保證,即誠實的節(jié)點能夠達到狀態(tài)一致;
3. Liveness: 簡單地理解為區(qū)塊鏈網絡的可用性,類似于分布式系統(tǒng)中的分區(qū)可用性;
4. Epochs,實際的應用中,參與協(xié)議的節(jié)點的狀態(tài)是隨著時間而發(fā)展的,LibraBFT中通過epoch來支持這種狀態(tài)更迭。
a. 每個epoch都是基于他的前一個epoch發(fā)展的。或者基于一個系統(tǒng)定義的初始epoch;
b. 每個epoch有一個唯一的epochid所標識;
c. 每當一個新的epochid被提交,當前這個epoch會結束,下一個epoch會開始;
5. LibraBFT假設網絡是一個有全局穩(wěn)定時間(GST),并且最大延時(ΔT)可控的 Partial Synchrony的網絡;
6. LibraBFT假設非拜占庭節(jié)點一定會按照協(xié)議履行職責并且能保證可用。
7. Records,LibraBFT的狀態(tài)是由一系列records組成的。主要包括四種,blocks、votes、quorum certificates(QCs)和 timeouts。
基本流程:

當一個節(jié)點被選擇成主時,它會執(zhí)行下面3個步驟:
第一,打包第n+1個區(qū)塊Bn+1,并追加在最新的QC之上;
第二,將這個區(qū)塊廣播Bn+1給所有驗證節(jié)點,誠實的驗證節(jié)點會驗證區(qū)塊并返回投票信息給主節(jié)點。
第三,在沒有bug的前提下,誠實節(jié)點會執(zhí)行Bn+1。并且主節(jié)點在收集到足夠的投票后會為這個區(qū)塊發(fā)起一個QCn+1,并且廣播。
經過上述一個周期的過程,鏈的長度會增長,變成h(init)← B1←C1.。. Bn+1←Cn+1。并且舊的leader會結束任期,新的leader會被選舉出來并進行新一輪的區(qū)塊打包。
二、Libra共識源碼結構和子模塊功能
Libra共識模塊代碼主要在 consensus 包中,它定義了Libra共識的抽象接口及其具體實現。目前Libra團隊只實現了LibraBFT。consensus包是一個獨立的可編譯的單元,編譯后生成一個庫。其代碼目錄結構和各層級的模塊的主要功能如下所示:
· consensus包目錄結構如下:

· consensus包中各層級中定義的模塊如下,如下所示:

三、Libra共識源碼走讀
1. Libra程序入口
Libra代碼的入口在 。/libra_node/src/main.rs中,啟動服務主流程的代碼在 。/libra_node/src/main_node.rs,

上述NodeConfig是節(jié)點的配置,共識相關的配置在其之中,在 。/config/src/config.rs 中 ConsensusConfig結構中定義。
2. 共識模塊初始化
初始化的代碼在 。/consensus/src/consensus_provider.rs 中,該函數返回了一個 ChainedBftProvider 實例,該實例就是LibraBFT實例:

ChainedBftProvider 定義在 。/consensus/src/chained_bft/chained_bft_consensus_provider.rs 中,他有四個成員變量,分別是狀態(tài)副本實例以及其余各個其他模塊交互的客戶端。

ChainedBftProvider 的new方法定義了其實例初始化的過程,

至此,共識實例初始化完畢~
3. 共識模塊啟動&運行流程
前面已經介紹完了共識模塊初始化的過程,接下來我們看一下共識服務具體是如何運作的。LibraBFT服務啟動函數是 ChainedBftProvider.start()。它實現了Libra共識的通用接口 ConsensusProvider,該接口定義在 。/consensus/src/consensus_provider.rs 中。ChainedBftProvider.start()的主要是啟動smr,代碼如下:

上述提到的 smr 是一個ChainedBftSMR的實例,ChainedBftSMR是libra StateMachineReplication接口的具體實現,ChainedBftSMR.start()是啟動smr的完整流程。主要包括3個階段,第一步:首先會同步到網絡中的最新狀態(tài);第二步:初始化 block_store、proposal_generator、safety_rules、pacemaker、event_processor等;第三步:啟動事件處理handler。


四、共識模塊整體流程圖
通過前面的介紹和代碼走讀,相信大家應該對libra共識的整體流程有一個比較清晰的認識了,接下來用一個流程圖,幫助大家更加直觀過整個流程。

電子發(fā)燒友App


















評論