Libra教程之:Transaction的生命周期
文章目錄
- Transaction的生命周期
- 提交一個(gè)Transaction
- 交易入鏈的詳細(xì)過程
- 接收Transaction
- 和其他Validators共享這個(gè)Transaction
- 區(qū)塊Proposing
- 執(zhí)行區(qū)塊并達(dá)成共識(shí)
- 提交區(qū)塊
Transaction的生命周期
本文會(huì)以一個(gè)提交到Libra validator的transaction為例,來講解Transaction和其他組件的交互,和具體的狀態(tài)變化過程。
提交一個(gè)Transaction
這里我們舉個(gè)例子,還是上篇文章的例子,A擁有110LBR,B擁有52LBR。接下來會(huì)構(gòu)建一個(gè)原始交易Tn,將A擁有的10LBR轉(zhuǎn)給B。
這個(gè)原始交易將包含如下字段:
-
A的帳戶地址。
-
一個(gè)要代表A執(zhí)行的動(dòng)作的程序。它包含:
一個(gè)Move字節(jié)碼表示的peer-to-peer交易腳本。
一個(gè)該腳本的輸入列表(例如,B的帳戶地址和付款金額)。
-
Gas價(jià)格 -A愿意為執(zhí)行交易而為每單位Gas支付的金額。Gas是一種支付計(jì)算和存儲(chǔ)費(fèi)用的方式。Gas單位是對(duì)計(jì)算的抽象度量,沒有固有的實(shí)際值。
-
A愿意為此交易支付的最大Gas金額。
-
交易的到期時(shí)間。
-
序列號(hào)
每個(gè)賬號(hào)的交易都有一個(gè)唯一的序列號(hào),用來標(biāo)記這個(gè)賬號(hào)發(fā)出的交易。
有了這個(gè)原始交易之后,我們會(huì)使用A的私鑰對(duì)這個(gè)原始交易進(jìn)行簽名,簽名后的交易包含如下內(nèi)容:
- 原始交易
- A的公鑰
- A的簽名
我們假設(shè)這個(gè)Libra區(qū)塊鏈上面有100個(gè)validators, 我們用V1到V100來表示。客戶將這個(gè)Transaction提交到了V1。V1是這一輪共識(shí)的發(fā)起者。
交易入鏈的詳細(xì)過程
我們先用一張圖來表示這個(gè)Transaction入鏈的過程:
Transaction的入鏈過程可以分為五大步:
- 接收Transaction
- 和其他Validators共享這個(gè)Transaction
- 區(qū)塊Proposing
- 執(zhí)行區(qū)塊并達(dá)成共識(shí)
- 提交區(qū)塊
接收Transaction
客戶端將transaction提交給V1,V1的admission Control(AC)模塊將會(huì)接收這個(gè)transaction。
AC是驗(yàn)證器的唯一外部接口。 客戶端對(duì)驗(yàn)證器的任何請求都將首先轉(zhuǎn)到AC。
AC調(diào)用虛擬機(jī)(VM)的接口來驗(yàn)證該交易的正確性,包括:簽名認(rèn)證,判斷賬戶是否有足夠的金額,Tn不是一個(gè)重放交易等等信息。用以防止惡意節(jié)點(diǎn)。
這里虛擬機(jī)是用來執(zhí)行Move腳本,也是Libra業(yè)務(wù)邏輯運(yùn)行的地方。
如果Tn通過了VM的驗(yàn)證,那么進(jìn)入下一步,AC將會(huì)把Transaction送到MemPool中。
Mempool是一個(gè)共享緩沖區(qū),用于保存“等待”執(zhí)行的事務(wù)。 將新事務(wù)添加到內(nèi)存池后,內(nèi)存池將與系統(tǒng)中的其他驗(yàn)證程序共享此事務(wù)。 為了減少“共享內(nèi)存池”中的網(wǎng)絡(luò)消耗,每個(gè)驗(yàn)證器負(fù)責(zé)將自己的事務(wù)傳遞給其他驗(yàn)證器。 當(dāng)驗(yàn)證者從另一個(gè)驗(yàn)證者的內(nèi)存池接收到事務(wù)時(shí),該事務(wù)將添加到接收者驗(yàn)證者的內(nèi)存池中。
和其他Validators共享這個(gè)Transaction
區(qū)塊Proposing
我們假設(shè)V1是Proposing節(jié)點(diǎn),那么它會(huì)將自己mempool的交易打包成一個(gè)Block,然后通過共識(shí)模塊向其他驗(yàn)證節(jié)點(diǎn)提交一個(gè)Proposal。
共識(shí)模塊負(fù)責(zé)通過與網(wǎng)絡(luò)中的其他驗(yàn)證者一起參與共識(shí)協(xié)議來對(duì)交易塊進(jìn)行排序并就執(zhí)行結(jié)果達(dá)成一致。
V1的共識(shí)模塊負(fù)責(zé)協(xié)調(diào)所有驗(yàn)證者之間對(duì)擬議區(qū)塊中交易順序的協(xié)議。
執(zhí)行區(qū)塊并達(dá)成共識(shí)
為了達(dá)成共識(shí),在第六步生成的Block會(huì)被傳遞到執(zhí)行模塊。執(zhí)行的工作是協(xié)調(diào)一組事務(wù)的執(zhí)行,并保持一個(gè)可以通過共識(shí)投票的臨時(shí)狀態(tài)。
執(zhí)行模塊管理虛擬機(jī)(VM)中事務(wù)的執(zhí)行。 請注意,這里的執(zhí)行是在區(qū)塊中的交易達(dá)成一致之前進(jìn)行的推測性執(zhí)行。
將Block中的Transaction執(zhí)行完成后,執(zhí)行模塊將Block中的Transaction追加到Libra區(qū)塊鏈的Merkle累加器。 這是Merkle累加器的內(nèi)存/臨時(shí)版本。 執(zhí)行這些事務(wù)的(提議/推測)結(jié)果將返回到共識(shí)組件。從“共識(shí)”到“執(zhí)行”的箭頭表示執(zhí)行交易的請求是由共識(shí)組件發(fā)出的。
V1(共識(shí)領(lǐng)導(dǎo)者)試圖與參與該共識(shí)的其他驗(yàn)證者就塊的執(zhí)行結(jié)果達(dá)成共識(shí)。
提交區(qū)塊
如果區(qū)塊的執(zhí)行結(jié)果由一組具有多數(shù)表決權(quán)的驗(yàn)證器達(dá)成一致并簽名,則驗(yàn)證器V1的執(zhí)行模塊從推測執(zhí)行緩存中讀取區(qū)塊執(zhí)行的結(jié)果,并提交區(qū)塊中的所有事務(wù)并永久存儲(chǔ)。
A的帳戶現(xiàn)在將具有100LBR,其序列號(hào)將為n+1。如果Tn被B重放,則它將被拒絕,因?yàn)锳的帳戶的序列號(hào)n+1大于重放的事務(wù)的序列號(hào)n。
更多精彩內(nèi)容且看:
- 區(qū)塊鏈從入門到放棄系列教程-涵蓋密碼學(xué),超級(jí)賬本,以太坊,Libra,比特幣等持續(xù)更新
- Spring Boot 2.X系列教程:七天從無到有掌握Spring Boot-持續(xù)更新
- Spring 5.X系列教程:滿足你對(duì)Spring5的一切想象-持續(xù)更新
- java程序員從小工到專家成神之路(2020版)-持續(xù)更新中,附詳細(xì)文章教程
更多教程請參考 flydean的博客
總結(jié)
以上是生活随笔為你收集整理的Libra教程之:Transaction的生命周期的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Libra教程之:Libra协议的关键概
- 下一篇: JDK13的六大重要新特性