Libra教程之:执行Transactions
文章目錄
- Transactions是什么
- Transactions運(yùn)行的基礎(chǔ)條件
- Transactions的結(jié)構(gòu)
- 執(zhí)行Transactions
Transactions是什么
我們講到了Libra是一個分布式賬本,存儲著賬本狀態(tài),從賬本狀態(tài)里面,我們可以獲取現(xiàn)在每一個賬戶的資金情況和存儲的相應(yīng)資源。
而這個賬本狀態(tài)就是通過執(zhí)行Transactions來進(jìn)行改變的。
用戶定義的Transactions是通過Move來編寫的,目前來說Libra處于早期版本,只有有限的功能開放給Move語言(不如用戶不能自定義資源類型等),但是隨著Libra的發(fā)展,我相信Move語言將會得到更多的功能支持。
Transactions運(yùn)行的基礎(chǔ)條件
在Libra中,我們運(yùn)行Transactions,這里面包含著如下幾個基礎(chǔ)條件:
賬本的初始狀態(tài)。所有的驗證者節(jié)點都必須接受賬本的初始狀態(tài),并在該初始狀態(tài)之上進(jìn)行后續(xù)的驗證操作。
在賬本的初始狀態(tài)中,我們需要定義Libra的核心組件(比如: 賬戶的邏輯,交易的驗證,驗證者的選擇,Libra幣等),這些核心組件都是以Move modules的形式存在的。
同樣的,要保證交易的執(zhí)行,我們還需要一個初始賬戶,和初始的驗證節(jié)點,這些都是需要在初始狀態(tài)中定義。
為了簡便起見,我們假設(shè)賬本的初始狀態(tài)為空,然后通過執(zhí)行一個Transaction T0來生成上面提到的modules。注意這里的T0是一個特殊的交易,他和普通的交易不一樣,他只能通過配置來實現(xiàn)。
交易的確定性。Libra的所有交易都必須是確定的并且和重復(fù)發(fā)送的。就是說如果知道了給定交易的輸入,則必定能得到相同的輸出。
前面的文章我也提到過函數(shù)式編程,這里的作用和函數(shù)式編程很像。交易沒有任何副作用。我們可以通過重新執(zhí)行交易的歷史記錄來得到和現(xiàn)在賬本狀態(tài)一樣的賬本。
可度量的。同其他區(qū)塊鏈一樣,為了防止DDOS攻擊,Libra引入了gas的概念。每個交易都必須花費(fèi)一定的gas,這樣可以有效的阻止無效的交易產(chǎn)生。
Libra的gas和其他的區(qū)塊鏈的gas有一點不同的是,Libra的gas只是用來減少系統(tǒng)在高負(fù)載的情況運(yùn)行的可能性,對于正常交易來說,Libra的gas花費(fèi)很少。
gas包括gas價格和gas數(shù)目。驗證節(jié)點會優(yōu)先執(zhí)行g(shù)as價格高的交易,而丟棄gas價格低的交易,這樣就可以有效的防止系統(tǒng)在高負(fù)載的情況下運(yùn)行。
同樣的,我們也有一個最大的gas數(shù)目,如果交易執(zhí)行超過了gas的最大數(shù)目,則Libra虛擬機(jī)會停止執(zhí)行,交易結(jié)果不會寫入到賬本狀態(tài)中,但是會被記錄在交易記錄中。
資產(chǎn)特性。我們知道Libra幣是要與真實世界的金錢掛鉤的,所以Libra幣必須不能重復(fù),不能丟失,也不能未授權(quán)被使用。這些特征都是通過Move虛擬機(jī)來實現(xiàn)的。
Transactions的結(jié)構(gòu)
在Libra中,一個Transaction就是一個簽名過的數(shù)據(jù),它包含如下內(nèi)容:
發(fā)送者地址。交易發(fā)送者的地址,VM可以通過讀取該地址內(nèi)的LibraAccount.T資源來獲取該地址的序列號,認(rèn)證密鑰和余額等信息。
發(fā)送者公鑰。和該公鑰相匹配的私鑰用來對交易進(jìn)行簽名。上面提到的LibraAccount.T資源里面的認(rèn)證密鑰就是該公鑰的hash值。
程序。程序是一個Move字節(jié)碼的腳本代碼,有可能還包括所需額參數(shù)列表。
最大gas數(shù)目。VM允許的最大gas數(shù)目。
序列號。 序列號是一個無符號整數(shù),每次交易后,賬戶的序列號都會加1。序列號主要用來防止重放攻擊。
執(zhí)行Transactions
執(zhí)行Transactions通常來說,有6個步驟。
檢查簽名。簽名主要檢查Transaction是否跟發(fā)送者的public key和實際數(shù)據(jù)相匹配。
運(yùn)行prologue。運(yùn)行prologue階段主要檢查交易的發(fā)送者(是否有足夠的Libra幣),該交易是否是一個重放交易。所有的功能都是通過LibraAccount模塊的prologue過程來實現(xiàn)的。
驗證交易腳本和模塊。VM會使用Move字節(jié)碼驗證器來驗證交易的腳本和模塊是不是有效的(類型安全,引用安全,資源安全等)。
發(fā)布模塊。程序里面的模塊都會被發(fā)布到交易發(fā)起者的賬戶中。注意:模塊的名字必須是唯一的,否則交易會失敗。
運(yùn)行交易腳本。VM構(gòu)建腳本參數(shù),并運(yùn)行交易腳本。如果交易成功,將會把交易和相關(guān)的事件寫入賬本狀態(tài)中。如果交易失敗,賬本狀態(tài)不會改變。
運(yùn)行epilogue。 最后VM運(yùn)行epilogue來計算相應(yīng)的gas并減掉相對應(yīng)的數(shù)值,并增加發(fā)送者賬戶的序列號。和prologue一樣,epilogue也是LibraAccount模塊的一個過程。
更多精彩內(nèi)容且看:
- 區(qū)塊鏈從入門到放棄系列教程-涵蓋密碼學(xué),超級賬本,以太坊,Libra,比特幣等持續(xù)更新
- Spring Boot 2.X系列教程:七天從無到有掌握Spring Boot-持續(xù)更新
- Spring 5.X系列教程:滿足你對Spring5的一切想象-持續(xù)更新
- java程序員從小工到專家成神之路(2020版)-持續(xù)更新中,附詳細(xì)文章教程
更多教程請參考 flydean的博客
總結(jié)
以上是生活随笔為你收集整理的Libra教程之:执行Transactions的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Libra教程之:Libra proto
- 下一篇: Libra教程之:数据结构和存储