再谈我对合约执行的理解

以太坊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编译器完成).

转载于:https://www.cnblogs.com/baizx/p/10807612.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值