以太坊是乙個執行智慧型合約的平台,被稱作可程式設計的區塊鏈,允許使用者將編寫的智慧型合約部署在區塊鏈上執行。而執行合約的主體便是以太坊虛擬機器(evm)
區塊 交易 合約
區塊鏈由區塊(block)組成,而區塊中打包一定數量的交易(transaction),交易可能是乙個單純的轉賬操作,也可能是呼叫乙個智慧型合約,無論是哪一種,evm在執行(excute)交易時都會建立合約(contract)
外部賬戶 合約賬戶
以太坊中的賬戶有兩類
一筆交易包含傳送方(sender) 接收方(recipient) 和數額(value) 三要素。傳送方將一定數額的eth轉移到接收方的賬戶,這裡的轉賬交易中,接收方是外部賬戶。而在呼叫智慧型合約的交易時,接收方是合約賬戶。
gas如同現實中的稅費一樣,交易也需要將支付少量的費用,稱為gas,費用支付給礦工,這可以激勵礦工打包交易到區塊,也使得區塊鏈避免惡意運算攻擊。gas由交易的傳送者使用eth購買,在執行交易的每一步都會消耗gas,如果gas用完了,交易狀態會被回退,但消耗的gas不會返還。
以太坊是乙個基於交易的狀態機,一筆交易可以使以太坊從乙個狀態(state)切換到另乙個狀態,即交易的執行伴隨著狀態的改變。
交易執行的入口在core/state_processor.go的process()方法,下面是該方法的輪廓
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),扣除的數量卻決於交易設定的gasprice和gaslimit的乘積,單位是gwei
。
合約賬戶建立: 如果交易的recipient為空的話,標識這筆交易需要建立乙個合約,那麼就建立乙個合約賬戶(state object)
價值轉移:每筆交易都伴隨著價值轉移,即eth
從sender賬戶傳送到receipt賬戶,如果建立了合約,還要執行合約**
transitiondb()完成這樣的狀態轉換,其實現流程如下:
最終由交易的receipt是否為空決定是使用evm.create()還是evm.call(),無論是哪種,最終都是建立乙個contract
結構,然後呼叫run()方法執行之。注意,即使是外部賬戶之間普通的轉賬也會呼叫call()和run(),只是由於receipt上沒有**,執行會很快結束而已。run()最終呼叫interpreter
的run()方法。
前面提到過,在呼叫newevm()時建立了乙個直譯器(interpreter)
根據當前block的高度,計算出它處於以太坊演進的階段,得到該階段支援的指令集(instructionset),新的階段在相容老的階段的所有指令前提下,再增加了獨特的新指令。最終儲存在func newinterpreter(evm *evm,cfg config) *interpreter
return &interpreter
}
interpreter
的cfg字段
合約**本質上上是由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...