在继续以太坊黄皮书的探索之旅中,我们来到了整个以太坊系统的核心——以太坊虚拟机(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费用。
- Gas Limit:用户在交易中设置的愿意为该交易支付的最大gas量。
- Gas Price:用户愿意为每单位gas支付的价格(通常以Gwei为单位)。
- 执行过程:EVM在执行字节码时,会根据操作码的gas消耗规则逐步扣除gas,如果gas耗尽(即剩余gas不足以执行下一条操作码),交易会执行失败,但会回滚所有状态修改(除了支付给矿工的基础费用),这种机制确保了没有交易能够无限期运行,从而保护了网络的安全性和稳定性。
存储模型:内存、存储与合约状态
EVM管理着三种主要的存储区域,它们在特性、生命周期和gas成本上有着显著区别:
