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

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

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

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

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

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

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

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

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


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

電子發(fā)燒友App


















評論