以太坊原始碼分析 交易的執行

2021-09-13 02:49:10 字數 2831 閱讀 3034

以太坊是乙個執行智慧型合約的平台,被稱作可程式設計的區塊鏈,允許使用者將編寫的智慧型合約部署在區塊鏈上執行。而執行合約的主體便是以太坊虛擬機器(evm)

區塊 交易 合約

區塊鏈由區塊(block)組成,而區塊中打包一定數量的交易(transaction),交易可能是乙個單純的轉賬操作,也可能是呼叫乙個智慧型合約,無論是哪一種,evm在執行(excute)交易時都會建立合約(contract)

外部賬戶 合約賬戶

以太坊中的賬戶有兩類

一筆交易包含傳送方(sender) 接收方(recipient) 和數額(value) 三要素。傳送方將一定數額的eth轉移到接收方的賬戶,這裡的轉賬交易中,接收方是外部賬戶。而在呼叫智慧型合約的交易時,接收方是合約賬戶。

gas如同現實中的稅費一樣,交易也需要將支付少量的費用,稱為gas,費用支付給礦工,這可以激勵礦工打包交易到區塊,也使得區塊鏈避免惡意運算攻擊。gas由交易的傳送者使用eth購買,在執行交易的每一步都會消耗gas,如果gas用完了,交易狀態會被回退,但消耗的gas不會返還。

以太坊是乙個基於交易的狀態機,一筆交易可以使以太坊從乙個狀態(state)切換到另乙個狀態,即交易的執行伴隨著狀態的改變。

交易執行的入口在core/state_processor.goprocess()方法,下面是該方法的輪廓

func (p *stateprocessor) process(block *types.block, statedb *state.statedb, cfg vm.config) (types.receipts,*types.log,uint64,error) 

p.engine.finalize(p.bc. header, statedb, block.transactions(), block.uncles(), receipts)

......

}

type statetransition struct
gas預購:sender預購此次轉換需要的gas,簡單說來就是扣除sender賬戶的eth(反映在statedb),扣除的數量卻決於交易設定的gaspricegaslimit的乘積,單位是gwei

合約賬戶建立: 如果交易的recipient為空的話,標識這筆交易需要建立乙個合約,那麼就建立乙個合約賬戶(state object)

價值轉移:每筆交易都伴隨著價值轉移,即ethsender賬戶傳送到receipt賬戶,如果建立了合約,還要執行合約**

transitiondb()完成這樣的狀態轉換,其實現流程如下:

最終由交易的receipt是否為空決定是使用evm.create()還是evm.call(),無論是哪種,最終都是建立乙個contract結構,然後呼叫run()方法執行之。注意,即使是外部賬戶之間普通的轉賬也會呼叫call()run(),只是由於receipt上沒有**,執行會很快結束而已。run()最終呼叫interpreterrun()方法。

前面提到過,在呼叫newevm()時建立了乙個直譯器(interpreter)

func newinterpreter(evm *evm,cfg config)  *interpreter 

return &interpreter

}

根據當前block的高度,計算出它處於以太坊演進的階段,得到該階段支援的指令集(instructionset),新的階段在相容老的階段的所有指令前提下,再增加了獨特的新指令。最終儲存在interpretercfg字段

合約**本質上上是由solidity語言編譯後形成的evm位元組碼,位元組碼中的操作也正是指令集中定義的指令

再回到run()方法,其大概流程如下

evm逐字節的解析合約**並呼叫excute()方法執行,直到執行完成或者gas提前耗盡。

關於具體的evm指令解釋方式和虛擬機器內部記憶體等內部實現,參考本系列文章

在以太坊中,交易的執行是由evm完成的,網路中的所有全節點都會去執行每一筆交易(這樣所有人的狀態才可以保持一致)

交易分為普通轉賬和執行(建立)智慧型合約,兩者都由sender付費,後者相比前者,evm要額外執行合約的位元組碼

以太坊ETH原始碼分析(2) 交易執行過程

交易的發起一般通過呼叫rpc介面實現,eth原始碼本身提供了相關api,位於原始碼的ethereum go ethereum的internal包中 sendtransaction creates a transaction for the given argument,sign it and sub...

以太坊原始碼 交易(一)

交易是區塊鏈中最基本也是最核心的乙個概念,在以太坊中,交易更是重中之重,因為以太坊是乙個智慧型合約平台,以太坊上的應用都是通過智慧型合約與區塊鏈進行互動,而智慧型合約的執行是由交易觸發的,沒有交易,智慧型合約就是一段死的 可以說在以太坊中,一切都源於交易。下面就來看看在以太坊中交易是什麼樣的,交易裡...

12 以太坊原始碼分析 12 交易資料分析

交易的資料結構定義在core.types.transaction.go中,結構如下 type transaction struct交易的結構體中只有乙個data欄位,是txdata型別的。其他的hash,size,from都是快取。txdata結構體定義如下 type txdata structac...