爲了更加深刻的理解Libra的交易生命週期,咱們將跟隨一個交易的全過程,從其被提交到Libra validator始,直至其被添加到區塊鏈上止。咱們將「放大」來看每一個validator邏輯組件及與其餘組件之間的交互。html
Libra客戶端構造 原始交易 (此處稱爲T5raw),從Alice的帳戶中轉移10Libra幣到Bob的帳戶中。原始交易應包含如下字段:每一個字段都經過超連接關聯到詞彙定義表。數據庫
客戶端使用Alice的私鑰對交易T5raw 簽名 。簽名後的交易T5 包括下列內容:緩存
爲了描述交易T5的生命週期, 咱們有以下假設:微信
在本節中咱們將討論交易T5的生命週期, 從其被提交到Libra validator始,直至其被添加到區塊鏈上止。網絡
下圖展現了validator 節點相關組件之間的交互鏈的相關節點。在熟悉交易生命週期的全部步驟後,你能夠進一步瞭解各步驟中相應組件的交互信息。數據結構
注意:本圖標中的全部箭頭都起始於發起交互或操做的組件,終止於執行操做的組件。此處箭頭 不表示數據的讀取,寫入或返回。併發
FIGURE 1.1 交易生命週期分佈式
1 — 客戶端將交易T5 提交給validator V1 ,V1 的准入控制組件(AC)接受該交易。(客戶端 → AC AC.1)ide
2 — AC 利用虛擬機組件 (VM) 執行查驗,如簽名驗證,檢查Alice帳戶餘額是否充足,檢查交易V1 是否 被重複廣播等(AC → VM AC.2, VM.1)svg
3 — 當交易T5 經過查驗後, AC 將交易T5 發送到to V1’的內存池(AC → 內存池 AC.3, MP.1)
4 — 內存池將交易T5 保存在內存緩衝區中。內存池內可能已經包含了從Alice帳戶地址發送的多個交易。
5 — 利用內存池共享協議, V1 將發送其內存池中全部交易(包括交易T5) 給其餘validator(V2 to V100) 並將從其餘validator接受到的交易存儲在自身的內存池中(Mempool →其餘 Validators MP.2)
6 — 做爲本輪共識發起者V1 將從其內存池中提取一個區塊,並經過共識組件複製分發給其餘的validator。(共識組件 → 內存池MP.3, CO.1)
7 — V1 的共識組件負責協調全部validator發送的區塊中交易的順序。(共識 → 其餘Validators CO.2).關於此處提出的共識協議LibraBFT,請參閱技術性文獻Libra區塊鏈中的狀態機複製
###區塊的執行和共識的達成
8 — 做爲共識達成過程的一個步驟,交易區塊(包括交易 T5) 被提交給執行組件。(共識 → 執行CO.3, EX.1)
9 — 執行組件經過虛擬機(VM)管理交易的執行。應注意,此處的執行是在達成共識前的推測性執行。(執行→ VM EX.2, VM.3)
10 — 在上述執行完成後,執行組件將交易區塊將(包含T5)附加到 (分佈式帳本的歷史)Merkle累加器 上,造成內存/臨時版本Merkle累加器。執行(發起和推測)交易的結果會返回到共識組件。(共識 → 執行CO.3, EX.1).從共識指向執行的箭頭表示該執行請求由共識組件發起。(爲了減小歧義,本文中將不使用箭頭表示數據流).
11 — (共識發起者)V1 試圖與其餘共識參與者,即其餘validator就該區塊的執行結果達成共識。(共識→ 其餘 Validators CO.3)
###區塊的提交
12 — 當對區塊的執行結果達成共識並簽名的validator數量上具備絕對優點時,V1'的執行組件將從緩存中讀取區塊的推測性執行結果,並將區塊中的全部交易提交到永久存儲中。(共識 → 執行CO.4, EX.3), (Execution → Storage EX.4, ST.3)
13 — Alice帳戶如今的餘額爲100Libra幣,序列號爲6.如T5 被Bob重複廣播,該交易將被拒絕,由於Alice帳戶的序列號(6)大於被重複廣播的交易的序號(5)
在上一部分中, 咱們舉例說明了一個典型的交易生命週期,從其被提交到Libra validator始,直至其被添加到區塊鏈上止。如今咱們將更加深刻的探究validator處理交易並響應請求時,組件間的交互。對下述人員,這些信息可能十分值得參考:
爲敘述方便,咱們假設客戶端提交一個交易TN 給一個validatorVX.對每一個validator組件,咱們將在其相對應子章節中具體描述組件之間的交互。此處應注意,用以描述組件間交互的子章節順序並未嚴格按照其執行順序。組件間的大部分交互都與交易的執行有關,少數與客戶端發出的(查詢區塊鏈上的已知信息)請求有關。
咱們先來看validator 節點的核心邏輯組件:
每一小節結尾都附有Libra Core中的相應文檔。
![Figure 1.2 准入控制(assets/illustrations/admission-control.svg) FIGURE 1.2 准入控制
准入控制是validator 的惟一外部接口。客戶端向Validator節點發送的任何請求都將先轉入AC。
一個客戶端將交易提交給VX的准入控制組件。此步驟經過: AC::SubmitTransaction()
完成。
准入控制組件訪問validator的虛擬機並對交易進行預查驗,以便儘早拒絕格式錯誤的交易。此步驟VM::ValidateTransaction()
完成。
一旦VM::ValidateTransaction()
沒有返回錯誤, AC 就經過Mempool::AddTransactionWithValidation().
將交易轉發到VX的內存池。當且僅當TN的序號大於或等於發送者帳戶的序號時,VX的內存池纔會接受來自AC的交易TN(注意:在交易序號和帳戶的下一個序號相等前,交易沒法達成共識)
當客戶端對Libra區塊鏈執行查詢時(例如獲取Alice帳戶餘額)。AC直接與存儲組件交互,以獲取所請求的信息。
更多實現細節,請參閱准入控制文檔。
##虛擬機(VM)
FIGURE 1.3 虛擬機
Move虛擬機 (VM) 驗證並執行Move字節碼編寫的腳本。
VX的准入控制組件接收到交易請求時, 將調用虛擬機上的VM::ValidateTransaction()
程序驗證交易。
當準入控制組件或內存池經過VM::ValidateTransaction()
, 向虛擬機提交驗證交易請求時虛擬機加載存儲中保存的交易發起者帳戶,並執行如下驗證:
執行組件經過調用虛擬機的VM::ExecuteTransaction()
函數執行交易。
此處應重點注意,執行交易不一樣於更新分佈式帳本狀態或存儲執行結果。首先,在共識期間,執行交易TN 以得到區塊的共識。當與其餘validator就交易順序和執行結果達成共識後,執行結果才被永久存儲,分佈式帳本狀態也隨之更新。
當內存池經過其餘validator共享內存池接收到交易請求時,內存池隨即調用虛擬機上的VM::ValidateTransaction()
來驗證交易
更多實現細節,請參閱 虛擬機文檔.
FIGURE 1.4 內存池
內存池是一個共享緩衝區,用於保存等待執行的交易。當一筆新交易添加到內存池時,內存池與系統的其餘validator共享此交易。爲減小網絡消耗,在共享的內存池系統中,每一個validator僅負責傳遞本身的交易,當validator從其餘validator內存池發送的交易時,該交易將會被添加到接受者的內存池中。
###共識→內存池(MP.3)
當內存池接收到其餘validator發送的交易時,將在虛擬機上調用VM::ValidateTransaction()
來驗證交易。
更多實現細節,請參閱內存池文檔.
FIGURE 1.5 共識
共識組件用於與網絡中參與共識協議其餘validator就交易區塊結果和順序達成共識
當 VX 爲交易發起者時 VX 調用Mempool::GetBlock()
, 從其內存池中提取交易區塊併發起提議。
若VX 爲共識發起者,其共識組件將所提取的交易區塊複製轉發給其餘validator
Execution:ExecuteBlock()
(參考 共識 → 執行)執行交易;當對區塊的執行結果達成共識的validator數量上具備絕對優點時,VX 的共識組件經過Execution::CommitBlock()
通知執行組件該交易塊已準備好被提交。
更多實現細節,請參閱共識README.
FIGURE 1.6 執行
執行組件用於協調交易區塊的執行以及維持可供共識協商的瞬時狀態。
Execution::ExecuteBlock()
請求執行組件執行交易區塊。當共識組件調用Execution::ExecuteBlock()
請求執行組件執行一個交易區塊時, 執行組件調用虛擬機肯定交易區塊的執行結果。
當對區塊的執行結果達成共識的validator數量上具備絕對優點時,VX 的共識組件經過Execution::CommitBlock()
通知執行組件該交易塊已準備好被提交。 此請求包含簽署共識的validator的簽名做爲其贊成共識的證實。
執行組件從其暫存器提取值,並經過Storage::SaveTransactions()
將值發送到存儲以進行永久保存。以後,執行組件會刪除無用值(如因重複沒法提交的區塊)。
更多實現細節,請參閱 執行README.
FIGURE 1.7 存儲
存儲組件用以永久性保存交易區塊及其執行結果。在下列狀況下,一個交易區塊/交易組(包括 TN)將被永久保存:
有關如何將交易附加到區塊鏈上的數據結構信息,請參閱Merkle 累加器
當準入控制或內存池調用VM::ValidateTransaction()
來驗證交易時,VM::ValidateTransaction()
加載存儲中的發送人帳戶,並經過只讀模式檢查交易的有效性。
當共識組件調用Execution::ExecuteBlock()
, 執行組件讀取當前狀態和內存中的暫存器數據來肯定執行結果。
Storage::SaveTransactions()
來保存交易區塊並永久保存相關記錄。同時,網絡中籤署共識的validator的簽名也將被保存;當客戶方發送對區塊鏈中信息的查詢請求時,准入控制組件和存儲直接交互以讀取所相應信息。
更多實現細節,請參閱 存儲README.
翻譯:Jadris Lau 校對:Zhe Wang
Libra國內開發者微信交流羣:
不能入羣請加管理微信,拉你進羣=>