在继续以太坊黄皮书的探索之旅中,我们来到了整个以太坊系统的核心——以太坊虚拟机(Ethereum Virtual Machine, EVM),如果说区块链是分布式账本,那么EVM就是运行在这个账本上的“世界计算机”的处理器,黄皮书第四部分(通常对应黄皮书的第4章,具体版本可能略有差异,但核心内容一致)详细定义了EVM的规范,包括其架构、执行模型、存储结构以及预编译合约等,这部分内容是理解以太坊智能合约如何运行、状态如何变迁的关键。

EVM概述:一个基于栈的虚拟机
EVM本质上是一个图灵完备的虚拟机,这意味着它能够执行任何可计算的任务,只要给予足够的时间和资源,为了实现这一点并保证安全性、确定性以及避免无限循环等问题,EVM采用了基于栈的架构。
基于栈:与基于寄存器(如x86架构)的CPU不同,EVM的所有操作数都从栈中获取,操作结果也压回栈中,栈是一种后进先出(LIFO)的数据结构,EVM有一个执行栈(Execution Stack),用于在指令执行过程中临时存储数据,栈的最大深度为1024,以防止栈溢出攻击,这种设计简化了虚拟机的实现,并确保了操作的确定性。
操作码(Opcode):EVM通过一系列预定义的操作码来执行指令,这些操作码涵盖了算术运算(ADD, SUB, MUL)、逻辑运算(AND, OR, NOT)、比较(LT, GT, EQ)、位操作(SHL, SHR, SAR)、内存管理(MLOAD, MSTORE, MSTORE8)、存储交互(SLOAD, SSTORE)、控制流(JUMP, JUMPI, STOP, RETURN, REVERT, INVALID)、合约创建(CREATE, CREATE2)以及日志记录(LOG0-LOG4)等,每一个操作码都有明确的gas消耗规则。
执行模型:字节码解释与Gas机制

EVM的执行过程可以看作是对智能合约编译后的字节码(Bytecode)进行逐条解释执行的过程。
程序计数器(PC):EVM维护一个程序计数器,用于指向当前正在执行的字节码指令的位置,当遇到控制流操作码(如JUMP, JUMPI)时,PC的值会发生相应改变。
Gas机制:这是以太坊设计中至关重要的部分,用于防止恶意合约消耗过多网络资源(如计算资源、存储空间),每个EVM操作执行都需要消耗一定量的gas,而gas本身是以太坊网络上的“燃料”,用户在发起交易时需要支付一定数量的ether作为gas费用。
存储模型:内存、存储与合约状态
EVM管理着三种主要的存储区域,它们在特性、生命周期和gas成本上有着显著区别:

栈(Stack):
内存(Memory):
存储(Storage):
预编译合约(Precompiled Contracts)
除了通过EVM字节码执行的合约外,以太坊还包含一组预编译合约,这些是以太坊客户端用原生代码(如C )实现的特定功能的合约,它们有固定的地址(从1到9,以及一些后续添加的地址)。
总结与展望
黄皮书第四部分对EVM的详细定义,是理解以太坊智能合约运行原理的基石,从基于栈的架构、严格的Gas机制,到内存、存储的精细化管理,再到预编译合约的性能优化,EVM的设计体现了在安全性、确定性、效率和可扩展性之间寻求平衡的智慧。