以太坊交易执行(Transaction Execute)

By | 2018年12月1日

        执行,体现出了一个 eth 中关键的思想——eth 的本质是维护和改变状态,而状态的改变由各种Transaction 推动(或转账或调用),将【带来改变的】Transaction 广播、打包、形成队列等,即是对【会带来状态改变的操作】进行收集的过程。但收集归收集,收集到了但在【apply】(是指生效)之前,所维护的【状态】依旧没有改变。

        那么,executive,这个名字的含义就非常显然了——执行,应用。以太坊中交易的执行(Execute)就是指,一条交易被“应用”于State的过程。它会发生在对区块的整体验证过程中——矿工自己打包时候会自己验一遍,接收到这一个新的区块的非矿工全节点也会进行一次验证。

aleth实现中,该过程发生在Execute类中,在initializeexecutefinalize中可以非常清楚地看到这些的具体执行逻辑。

可以被执行的交易需要首先满足以下条件:

  • 交易经过RLP编码(RLP是指“递归长度前缀 Recursive Length Prefix”,在以太坊中我们用它来将对象序列化)

  • 有效的交易指纹

  • 有效的交易nonce(与当前stateaccountnonce+1相等)

  • gasLimit不少于系统设定的最小值,这个设定包括:

  1. 执行交易所需gas的预设值是21000

  2. 随交易发送的datagas费用(每个值为0byte或代码4gas,非068gas

  3. 合约创建交易需要再额外支付32000gas

  • 发送者的余额需要足够支付预付款,预付款 = gas总价值+转账值

满足以上条件后,进行下一步

        在交易发送者的账户上扣除预付款 → 发送者账户nonce+1 →在总gasLimit中减掉要被消耗的gas值,包括用于发送交易的预设值、存储费、可能存在的合约创建费。接着,开始执行交易。在交易执行的全程中,以太坊都会追踪一个“子状态”,这个子状态被用于记录在交易刚刚结束时需要用到的信息。

        而后开始执行交易所需要的计算。

        上一步完成后,交易所需要的所有步骤都执行完成。在确定没有无效state后,就会开始计算剩余的gas并将它们退还给交易发起者。接下来,所消耗的gas费用会被支付给矿工,所消耗的gas量将被加入该区块的gas计数器。

        至此,交易执行结束,产生了新的state和一组由交易创建的log


写博不易,如果读的开心,可以考虑请我吃包辣条 ~

人间自有真情在,五毛一块也是爱

点击量:399

发表评论

邮箱地址不会被公开。 必填项已用*标注