基本流程:
當一個節點被選擇成主時,它會執行下面3個步驟:
第一,打包第n+1個區塊Bn+1,並追加在最新的QC之上;
第二,將這個區塊廣播Bn+1給所有驗證節點,誠實的驗證節點會驗證區塊並返回投票資訊給主節點。
第三,在沒有bug的前提下,誠實節點會執行Bn+1。並且主節點在收集到足夠的投票後會為這個區塊發起一個QCn+1,並且廣播。
經過上述一個週期的過程,鏈的長度會增長,變成h(init)← B1←C1... Bn+1←Cn+1。並且舊的leader會結束任期,新的leader會被選舉出來並進行新一輪的區塊打包。
二、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是節點的配置,共識相關的配置在其之中,在 ./config/src/config.rs 中 ConsensusConfig結構中定義。
2. 共識模組初始化
初始化的程式碼在 ./consensus/src/consensus_provider.rs 中,該函式返回了一個 ChainedBftProvider 例項,該例項就是LibraBFT例項:
ChainedBftProvider 定義在 ./consensus/src/chained_bft/chained_bft_consensus_provider.rs 中,他有四個成員變數,分別是狀態副本例項以及其餘各個其他模組互動的客戶端。
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個階段,第一步:首先會同步到網路中的最新狀態;第二步:初始化 block_store、proposal_generator、safety_rules、pacemaker、event_processor等;第三步:啟動事件處理handler。
四、共識模組整體流程圖
透過前面的介紹和程式碼走讀,相信大家應該對libra共識的整體流程有一個比較清晰的認識了,接下來用一個流程圖,幫助大家更加直觀過整個流程。