EVM 是什么?以太坊虚拟机如何执行合约 图 1
EVM 是什么?以太坊虚拟机如何执行合约 · 图 1

全世界共用一台”虚拟计算机”

智能合约不是运行在某台服务器上,也不是运行在开发者电脑里。以太坊的每个全节点收到区块后,都在自己本地用一台虚拟的计算机把区块里所有交易重新执行一遍,只有执行结果一致,节点才接受这个区块。这台”全世界同步运行的虚拟机”就是 EVM(以太坊虚拟机)。它没有真实硬件,却定义了合约能做什么、怎么收费、状态长什么样。

三块地基:账户、存储、字节码

EVM 把世界看成一个大状态数据库(以太坊的世界状态存在状态树里,结构见 什么是 Patricia Trie?以太坊状态树怎么存)以太坊采用账户模型:每个地址有余额、nonce 和可选的合约代码。合约代码是编译后的字节码,一种面向 256 位字的指令序列;合约数据存在每个地址独有的存储槽(storage)里,按槽寻址、永不清零——写入和读取存储是链上最贵的操作之一,因为每个节点都要替你永久保存它。

合约执行时操作两个栈:操作数栈存放临时值,调用栈管理合约之间的嵌套调用。一条交易可以触发链式调用:DEX 调用代币合约、代币合约回调授权检查,栈深度和每层 gas 都有限制。以太坊事件日志、回执(receipt)等可检索记录都产生于这次执行之后。

GAS:为每一步计价

EVM 没有”程序可以运行多久”的默认假设——恶意合约会写无限循环拖死所有节点。解法是先付钱后执行:每条指令对应 gas 成本(加法便宜、写存储昂贵),gas 单价用 Gwei 竞价(单位换算见 Wei和Gwei是什么?手续费单位怎么换算)。gas 耗尽时执行整体回滚,状态像从未发生,费用照收。区块有 gas 上限,这就把”一个区块能做多少计算”变成可定价的稀缺资源,经济学分析见 区块空间是什么?公链容量怎么定价

确定性与可复现

EVM 被刻意设计成确定性机器:同样的输入在任何节点上得到同样的状态根。它没有真随机数源、不能直接访问网络,时间也只有出块者提供、粒度粗到区块级的时间戳可用——合约想要这些外部信息,必须通过预言机等链上机制间接引入(见 智能合约是什么?DeFi 的底层逻辑的边界讨论)。“不能自己抛骰子”这类限制解释了为什么抽奖合约需要链外喂随机数、为什么时间敏感逻辑的精度受出块间隔约束。

EVM 兼容是什么

其他链声称”兼容 EVM”,通常指遵守同一套字节码与接口约定:Solidity 编译产物能直接部署、钱包按相同规则估算 gas、RPC 暴露相同的 eth_ 系列方法。兼容面越完整,以太坊生态迁移越顺滑;差异常藏在预编译合约、gas 定价和状态过期策略里,判断适配度应逐项核对而非看口号。

快速问答

  • “合约能自己醒过来执行吗?“不能。EVM 只响应交易触发,没有定时器,“定时任务”要靠外部 keeper 或链上调度协议代发交易。
  • “为什么同一合约在不同链行为不同?“字节码相同不代表 gas 表、预编译与前端节点参数相同,跨链部署要逐项回归测试。
  • “状态会过期吗?“主流设定是账户状态永久保留;历史区块数据的过期正在讨论演进中(节点为何可以不存全部历史见 EIP-4444 历史过期是什么?节点为什么可以不存全部历史,核验于 2026 年 7 月),但”历史数据可以丢”与”账户状态可以丢”是两回事。

常见误区

  • “合约跑在云端服务器”:合约跑在每个验证节点的 EVM 里,没有”服务器宕机”这种故障模式,也因此无法”重启解决”。
  • “字节码就是 Solidity”:Solidity 只是最流行的高层语言,Vyper 与手写 Yul 编译后同样进 EVM。
  • “执行失败状态会变”:revert 之后链上什么都没发生(仅损失 gas),这既是保护也是排错关键。

小结

EVM 是一台为共识而生的确定性虚拟机:账户模型承载状态,字节码描述逻辑,gas 为每一步标价,回滚保证失败无痕。理解了”每个节点都在重放同一台虚拟计算机”,以太坊的很多规则——从 gas 到确定性限制——都会自然成立。

本文为技术与教育内容,不构成投资建议。