本文會以一個提交到Libra validator的transaction爲例,來說解Transaction和其餘組件的交互,和具體的狀態變化過程。緩存
這裏咱們舉個例子,仍是上篇文章的例子,A擁有110LBR,B擁有52LBR。接下來會構建一個原始交易Tn,將A擁有的10LBR轉給B。網絡
這個原始交易將包含以下字段:區塊鏈
A的賬戶地址。cdn
一個要表明A執行的動做的程序。它包含:排序
一個Move字節碼錶示的peer-to-peer交易腳本。教程
一個該腳本的輸入列表(例如,B的賬戶地址和付款金額)。接口
Gas價格 -A願意爲執行交易而爲每單位Gas支付的金額。Gas是一種支付計算和存儲費用的方式。Gas單位是對計算的抽象度量,沒有固有的實際值。生命週期
A願意爲此交易支付的最大Gas金額。事務
交易的到期時間。內存
序列號
每一個帳號的交易都有一個惟一的序列號,用來標記這個帳號發出的交易。
有了這個原始交易以後,咱們會使用A的私鑰對這個原始交易進行簽名,簽名後的交易包含以下內容:
咱們假設這個Libra區塊鏈上面有100個validators, 咱們用V1到V100來表示。客戶將這個Transaction提交到了V1。V1是這一輪共識的發起者。
咱們先用一張圖來表示這個Transaction入鏈的過程:
Transaction的入鏈過程能夠分爲五大步:
客戶端將transaction提交給V1,V1的admission Control(AC)模塊將會接收這個transaction。
AC是驗證器的惟一外部接口。 客戶端對驗證器的任何請求都將首先轉到AC。
AC調用虛擬機(VM)的接口來驗證該交易的正確性,包括:簽名認證,判斷帳戶是否有足夠的金額,Tn不是一個重放交易等等信息。用以防止惡意節點。
這裏虛擬機是用來執行Move腳本,也是Libra業務邏輯運行的地方。
若是Tn經過了VM的驗證,那麼進入下一步,AC將會把Transaction送到MemPool中。
Mempool是一個共享緩衝區,用於保存「等待」執行的事務。 將新事務添加到內存池後,內存池將與系統中的其餘驗證程序共享此事務。 爲了減小「共享內存池」中的網絡消耗,每一個驗證器負責將本身的事務傳遞給其餘驗證器。 當驗證者從另外一個驗證者的內存池接收到事務時,該事務將添加到接收者驗證者的內存池中。
咱們假設V1是Proposing節點,那麼它會將本身mempool的交易打包成一個Block,而後經過共識模塊向其餘驗證節點提交一個Proposal。
共識模塊負責經過與網絡中的其餘驗證者一塊兒參與共識協議來對交易塊進行排序並就執行結果達成一致。
V1的共識模塊負責協調全部驗證者之間對擬議區塊中交易順序的協議。
爲了達成共識,在第六步生成的Block會被傳遞到執行模塊。執行的工做是協調一組事務的執行,並保持一個能夠經過共識投票的臨時狀態。
執行模塊管理虛擬機(VM)中事務的執行。 請注意,這裏的執行是在區塊中的交易達成一致以前進行的推測性執行。
將Block中的Transaction執行完成後,執行模塊將Block中的Transaction追加到Libra區塊鏈的Merkle累加器。 這是Merkle累加器的內存/臨時版本。 執行這些事務的(提議/推測)結果將返回到共識組件。從「共識」到「執行」的箭頭表示執行交易的請求是由共識組件發出的。
V1(共識領導者)試圖與參與該共識的其餘驗證者就塊的執行結果達成共識。
若是區塊的執行結果由一組具備多數表決權的驗證器達成一致並簽名,則驗證器V1的執行模塊從推測執行緩存中讀取區塊執行的結果,並提交區塊中的全部事務並永久存儲。
A的賬戶如今將具備100LBR,其序列號將爲n+1。若是Tn被B重放,則它將被拒絕,由於A的賬戶的序列號n+1大於重放的事務的序列號n。
更多教程請參考 flydean的博客