【Libra 技術解讀】詳解Libra共識原始碼

買賣虛擬貨幣
一、LibraBFT演算法簡介上一篇對於LibraBFT進行了相關的介紹,本文在正式開始前,先再介紹一下相關的概念和流程:基本概念:1. SMR(State Machine Replication):在計算機領域,SMR是在網路中不同副本間進行狀態複製的一種協議。2. Safety: 簡單地理解就是共識的一致性保證,即誠實的節點能夠達到狀態一致;3. Liveness: 簡單地理解為區塊鏈網路的可用性,類似於分散式系統中的分割槽可用性;
4. Epochs,實際的應用中,參與協議的節點的狀態是隨著時間而發展的,LibraBFT中透過epoch來支援這種狀態更迭。     a. 每個epoch都是基於他的前一個epoch發展的。或者基於一個系統定義的初始epoch;     b. 每個epoch有一個唯一的epochid所標識;     c. 每當一個新的epochid被提交,當前這個epoch會結束,下一個epoch會開始;5. LibraBFT假設網路是一個有全域性穩定時間(GST),並且最大延時(ΔT)可控的 Partial Synchrony的網路;6. LibraBFT假設非拜占庭節點一定會按照協議履行職責並且能保證可用。
7. Records,LibraBFT的狀態是由一系列records組成的。主要包括四種,blocks、votes、quorum certificates(QCs)和 timeouts。

基本流程:

當一個節點被選擇成主時,它會執行下面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共識的整體流程有一個比較清晰的認識了,接下來用一個流程圖,幫助大家更加直觀過整個流程。 

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;