文章目录
前言
以太坊虚拟机 (EVM) 是一个去中心化虚拟环境,它在所有以太坊节点上一种安全一致地方式执行代码。 节点运行以太坊虚拟机,以执行智能合约,利用"燃料"度量执行操作所需的计算工作,从而确保高效的资源分配和网络安全性。
EVM以太坊区块链的核心执行引擎,相当于 "世界计算机" 的 "CPU"------ 它负责运行智能合约的字节码、处理交易触发的逻辑,并维护全网账户状态的一致性。EVM 的设计兼顾了图灵完备性(支持复杂逻辑)、沙盒安全性(隔离恶意代码)和去中心化兼容性(全节点可独立验证),是支撑以太坊生态(DeFi、NFT、DAO 等)的技术基石。
一、从账本到状态机
通常使用"分布式账本"的类比来描述像比特币这样的区块链,它使用密码学的基本工具来实现去中心化的货币。 账本保存着活动记录,而活动必须遵守一套规则,这些规则限制用户在修改账本时可以做什么和不可以做什么。 例如,比特币地址不能花费比之前收到的更多的比特币。 这些规则是比特币和许多其他区块链上所有交易的基础。
虽然以太坊有自己的本机加密货币 (ETH),遵循几乎完全相同的直观规则,但它也支持更强大的功能:智能合约。 对于此更复杂的功能,需要一个更复杂的类比。 以太坊不是分布式账本,而是分布式状态机器在新标签页中打开。 以太坊的状态是一个大型数据结构,它不仅保存所有帐户和余额,而且还保存一个_机器状态_,它可以根据预定义的一组规则在不同的区块之间进行更改,并且可以执行任意的机器代码。 在区块中更改状态的具体规则由 EVM 定义。
EVM 的执行环境:栈、内存与存储

数据区域 | 存储类型 | 生命周期 | 访问成本(Gas) | 核心作用 |
---|---|---|---|---|
栈(Stack) | 临时数据 | 仅当前合约执行周期(函数调用结束后清空) | 极低(指令执行自带) | 存储临时计算结果,采用 "后进先出(LIFO)" 规则,最大深度 1024 层(防止栈溢出)。例如执行ADD指令时,从栈顶弹出两个数相加,结果压回栈顶。 |
内存(Memory) | 短期缓存 | 仅当前合约执行周期(交易结束后释放) | 中等(动态计费,随使用量增加) | 存储临时变量(如函数参数、中间计算结果),采用 "动态扩容" 机制(初始为空,访问时按需分配字节)。例如合约调用时,参数先加载到内存,再解析到栈。 |
存储(Storage) | 持久化数据 | 永久存储(区块链上,除非合约主动修改) | 极高(写入约 20000 Gas,读取约 200-1000 Gas) | 存储合约的核心状态(如用户余额、NFT 所有权),采用 "键值对(key-value)" 结构,数据永久保存在区块链上。例如 DeFi 合约的userBalance变量就存在 Storage 中。 |
EVM 与比特币脚本引擎的核心差异
对比维度 | 以太坊 EVM | 比特币脚本引擎 |
---|---|---|
计算能力 | 图灵完备,支持循环、条件判断、函数调用 | 非图灵完备,仅支持基础逻辑(无循环、有限条件判断) |
执行环境 | 有独立的栈、内存、存储,支持持久化状态 | 无独立存储,仅依赖 UTXO 的锁定 / 解锁脚本,无状态维护 |
资源控制 | 通过 Gas 计量限制资源消耗,防止滥用 | 无资源计量,依赖脚本长度和操作码数量限制 |
合约交互 | 支持合约间直接调用(如 DeFi 协议跨合约协作) | 不支持脚本间交互,仅能处理单笔交易的 UTXO 验证 |
生态支撑 | 可承载复杂应用(DeFi、NFT、DAO) | 仅支持简单转账(如多签、时间锁) |
以太坊状态转换函数
EVM 的行为就像一个数学函数:在给定输入的情况下,它会产生确定性的输出。 因此,将以太坊更正式地描述为具有状态转换函数非常有帮助:
go
Y(S,T)=S'
给定一个旧的有效状态 (S)> 和一组新的有效交易 (T),以太坊状态转换函数 Y(S,T) 产生新的有效输出状态 S'
状态
在以太坊环境中,状态是一种称为Merkle Patricia Trie(MPT)
的巨大数据结构,它保存所有通过哈希关联在一起的帐户并可回溯到存储在区块链上的单个根哈希。
二、EVM实现说明
EVM 作为一个堆栈机在新标签页中打开运行,其栈的深度为 1024 个项。 每个项目都是 256 位字,为了便于使用,选择了 256 位加密技术(如 Keccak-256 哈希或 secp256k1 签名)。
在执行期间,EVM 会维护一个瞬态_内存_(作为字可寻址的字节数组),该内存不会在交易之间持久存在。
然而,合约确实包含一个 Merkle Patricia 存储 trie(作为可字寻址的字数组),该 trie 与帐户和部分全局状态关联。
已编译的智能合约字节码作为许多 EVM opcodes执行,它们执行标准的堆栈操作,例如 XOR、AND、ADD、SUB等。 EVM 还实现了一些区块链特定的堆栈操作,如 ADDRESS、BALANCE、BLOCKHASH 等。

- 示例:执行SSTORE 0x01 0x0A(将键0x01的存储值设为0x0A):
从栈中弹出两个值(键0x01、值0x0A);- 检查当前 Gas 是否足够支付SSTORE的成本(约 20000 Gas);
- 将键值对写入合约的 Storage,并标记 "存储已修改"。
- 常见指令分类:
- 算术 / 逻辑指令:ADD(加法)、AND(与运算)、LT(小于比较);
- 存储访问指令:SLOAD(读取 Storage)、SSTORE(写入 Storage)、MLOAD(读取内存);
- 控制流指令:JUMP(无条件跳转)、JUMPI(条件跳转)、RETURN(返回结果);
- 合约交互指令:CALL(调用外部合约)、DELEGATECALL(委托调用,复用当前合约存储)。
Gas 计量与消耗
每执行一条 EVM 指令,都会扣除对应的 Gas(由 EVM 指令集预设,如ADD扣 3 Gas,SSTORE扣 20000 Gas):
- 若执行过程中 Gas 耗尽(out of gas),EVM 立即终止执行,所有状态修改(如 Storage 写入、ETH 转账)全部回滚,已消耗的 Gas 不退还;
- 若执行成功,剩余 Gas 按当前Gas Price折算为 ETH,退还至发起账户。
EVM 改进提案(EIPs)
通过 EIP(以太坊改进提案)优化 EVM 性能和安全性,例如:
- EIP-1559:优化 Gas 计费机制,引入基础费销毁,间接降低 EVM 执行的成本波动;
- EIP-3860:优化 "初始化代码" 的 Gas 计算,降低合约部署成本;
- EIP-4844(Dencun 升级):引入 Blob 数据层,允许 EVM 通过 "预编译合约" 访问 Layer2 的 Blob 数据,支撑 ZK-Rollup 等扩容方案。