在继续以太坊黄皮书的探索之旅中,我们来到了整个以太坊系统的核心——以太坊虚拟机(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成本上有着显著区别:

-
栈(Stack):
- 特性:临时存储,用于操作数和中间结果,最大深度1024,每个栈槽(Stack Slot)大小为32字节。
- 生命周期:随EVM调用(交易或内部消息调用)的开始而创建,结束而销毁。
- Gas成本:栈操作本身gas成本相对较低。
-
内存(Memory):
- 特性:线性的、可写的字节数组,大小在运行时动态扩展,用于存储临时数据,如复杂计算的中间结果。
- 生命周期:随EVM调用的开始而创建(初始大小为0),结束而销毁。
- Gas成本:内存扩展有gas成本(每字节或每32字节),且gas消耗随内存使用量的增长而增加(二次方增长),这鼓励开发者高效使用内存。
-
存储(Storage):
- 特性:持久化的键值存储(key-value store),每个以太坊账户(尤其是合约账户)都有一个独立的存储空间,键和值都是256位的字(Word),存储是合约状态的重要组成部分。
- 生命周期:永久存储在区块链上,除非通过SSTORE操作显式修改。
- Gas成本:存储操作gas成本较高,且首次写入某个键、修改键值、清空键值等不同操作有不同的gas成本,存储的修改会反映在账户的状态根(State Root)中,是状态变迁的核心。
预编译合约(Precompiled Contracts)
除了通过EVM字节码执行的合约外,以太坊还包含一组预编译合约,这些是以太坊客户端用原生代码(如C++)实现的特定功能的合约,它们有固定的地址(从1到9,以及一些后续添加的地址)。
- 目的:提供一些常用且计算密集型操作的优化实现,避免通过EVM解释执行带来的性能开销。
- 例子:
- 地址1:ECDSA恢复(用于签名验证)
- 地址2:SHA2-256哈希
- 地址3:RIPEMD-160哈希
- 地址4:指数运算(EXP)
- 地址5:椭圆曲线加法(ECADD)
- 地址6:椭圆曲线乘法(ECMUL)
- 等等。
- Gas成本:预编译合约的调用也有固定的gas消耗,通常比等效的EVM字节码执行要便宜得多。
总结与展望
黄皮书第四部分对EVM的详细定义,是理解以太坊智能合约运行原理的基石,从基于栈的架构、严格的Gas机制,到内存、存储的精细化管理,再到预编译合约的性能优化,EVM的设计体现了在安全性、确定性、效率和可扩展性之间寻求平衡的智慧。
