再谈我对合约执行的理解
Posted baizx
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了再谈我对合约执行的理解相关的知识,希望对你有一定的参考价值。
以太坊Tx的理解
以太坊所有的交易都会创建EVM进行执行,
因为如果to是空,那就是部署合约,当然要创建EVM
如果to不是空,但是to可能是合约地址,这时候会触发合约代码执行fallback,所以也需要创建EVM.
因此只要to不是空的Tx,都会执行
func (evm *EVM) Call(caller ContractRef, addr common.Address, input []byte, gas uint64, value *big.Int) (ret []byte, leftOverGas uint64, err error)
首先会执行evm.Transfer,也就是
// Transfer subtracts amount from sender and adds amount to recipient using the given Db
func Transfer(db vm.StateDB, sender, recipient common.Address, amount *big.Int) {
db.SubBalance(sender, amount)
db.AddBalance(recipient, amount)
}
//位于core/evm.go
然后如果有相关代码,则将input作为输入数据(stack)执行相关指令,如果没有,就结束.
特别需要说明的是,如果input为空,但是to地址还有code,那么会执行到code中的fallback分支(这部分工作由solidity编译器完成).
以上是关于再谈我对合约执行的理解的主要内容,如果未能解决你的问题,请参考以下文章