全世界共用一台”虚拟计算机”
智能合约不是运行在某台服务器上,也不是运行在开发者电脑里。以太坊的每个全节点收到区块后,都在自己本地用一台虚拟的计算机把区块里所有交易重新执行一遍,只有执行结果一致,节点才接受这个区块。这台”全世界同步运行的虚拟机”就是 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 到确定性限制——都会自然成立。
本文为技术与教育内容,不构成投资建议。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。