交易的执行流程

EVM的存储模型:

EVM是一个基于堆栈的虚拟机,具有临时内存字节数组和持久键值存储(持久存储在Storage中)。

EVM存储结构

 Stack

EVM是基于栈(stack)的虚拟机,stack用来保存指令的输入输出数据,最大深度为1024个字,其中每个单元就是一个字。

临时存储Memory

内存,一个简单的内存数组,用于临时存储EVM代码运行中需要存取的各种数据,基于字进行寻址和扩展

永久存储 Storage

Storage用来保存所有合约“状态”的永久存储,由以太坊客户端独立维护,每个账户的存储区域被以“字”为单位划分为若干个“槽”(solt),合约中的状态变量会根据其具体类型分别保存到这些槽中。例如在合约创建时由EVM根据合约定义的状态变量进行初始化,将他们保存进以"字"为单位划分的"存储槽(solt storage)"中。

Storage也是作为是世界状态的一部分存在的,客户端会用一个MPT来维护其数据。

ROM

用来保存所有EVM程序代码的只读存储,由以太坊客户端独立维护。


交易在EVM的执行

输入一笔交易,内部会转换成一个Message对象,传入EVM执行。基于上一篇交易的执行流程分析,如果是一笔普通转账交易,那么直接修改StateDB中对应的账户余额即可。如果是智能合约的创建或者调用,则通过EVM中的解释器加载和执行字节码,执行过程中可能会查询或者修改StateDB。

1 生成Contract对象

交易会被转换成一个Message对象传入EVM,而EVM则会根据Message生成一个Contract对象以便后续执行。

2.送入解释器执行

EVM是基于栈的虚拟机,解释器中需要操作四大组件

    PC:类似于CPU中的PC寄存器,指向当前执行的指令

    Stack:执行堆栈,位宽为256 bits,最大深度为1024

    Memory:内存空间

    Gas:油费池,耗光邮费则交易执行失败


EVM解释执行指令流程

EVM的每条指令称为一个OpCode,占用一个字节,所以指令集最多不超过256,具体描述参见:https://ethervm.io 。首先PC会从合约代码中读取一个OpCode,然后从一个JumpTable中检索出对应的operation,也就是与其相关联的函数集合。接下来会计算该操作需要消耗的油费,如果油费耗光则执行失败,返回ErrOutOfGas错误。如果油费充足,则调用execute()执行该指令,根据指令类型的不同,会分别对Stack、Memory或者StateDB进行读写操作。

你可能感兴趣的:(交易的执行流程)