以太坊作为全球领先的智能合约平台,其核心魅力在于能够去中心化地执行和验证复杂的程序逻辑,而这一切的背后,都离不开一个关键的组件——以太坊虚拟机(Ethereum Virtual Machine, EVM),EVM可以看作是以太坊的“世界计算机”,它负责执行智能合约代码,维护整个网络的状态,理解EVM的执行状态,对于深入把握以太坊的工作原理、智能合约的行为以及区块链的动态演变至关重要。

什么是EVM执行状态?

EVM的执行状态,是指EVM在执行一笔交易或一个智能合约函数调用过程中,其内部环境和相关数据所呈现的瞬时情况和上下文,它并非指以太坊全球状态的快照,而是指EVM作为一个“处理器”在运行代码时,其“寄存器”、“内存”以及当前操作的“上下文”等信息的集合,这个状态是动态变化的,随着指令的逐条执行而不断更新,直到交易执行完毕,产生最终的状态变更结果,并反馈给以太坊的全局状态树。

EVM执行状态的核心组成部分

EVM的执行状态主要由以下几个关键部分构成,它们共同构成了智能合约运行的“生命线”:

  1. 执行上下文(Execution Context)

    • 调用者(Caller):发起当前调用的地址,通常是交易发送者或另一个合约。
    • 当前合约地址(Current Contract Address):正在被执行的智能合约的地址。
    • 值(Value):随交易或调用发送的以太币数量(对于合约间调用,这涉及到gas stipend)。
    • 数据(Data):调用时输入的数据(calldata),通常包含函数选择器和参数。
    • 代码(Code):当前正在执行的合约的字节码。
    • 深度(Depth):当前调用的嵌套深度,防止无限递归调用。
    • 跳转标签(Jump Destination):用于控制指令流,特别是JUMP、JUMPI等指令的目标地址。
  2. 栈(Stack)

    • EVM是一个基于栈的虚拟机,栈是其最核心的数据结构之一,栈用于存储指令操作数和中间计算结果。
    • 栈的深度限制为1024个元素,每个元素是一个256位的字(word)。
    • 大多数指令(如ADD, MUL, SWAP, DUP等)都会从栈中弹出操作数,进行操作后,再将结果压回栈中,栈的状态直接反映了当前指令的执行环境和计算进度。
  3. 内存(Memory)

    • 内存是线性的、可写的字节数组,用于存储合约执行过程中的临时数据。
    • 内存按字节寻址,大小是动态扩展的,但扩展内存需要消耗gas。
    • 与栈不同,内存的数据在合约执行期间可以随机读写,常用于存储较大的数据结构或作为外部函数调用的参数缓冲区,内存内容在交易执行结束后会被重置。
  4. 存储(Storage)

    • 存储是智能合约的持久化存储区域,位于合约地址对应的以太坊全局状态树的“存储槽”(Storage Slots)中。
    • 它是一个键值对数据库,键和值都是256位的字。随机配图