此网页仅供信息参考之用。部分服务和功能可能在您所在的司法辖区不可用。

什么是 EVM?

Ethereum Virtual Machine(EVM,Ethereum 虚拟机)是一套执行智能合约的共同规则。Ethereum 节点使用各自的软件实现这些规则,对相同交易和起始状态进行计算,从而得到可由其他节点复核的结果。

EVM 不是某一台实体服务器,也不是开发者在电脑上看到的单个应用。它更像一份精确的计算说明:代码能执行哪些基本操作、数据放在哪里、每项操作消耗多少计算资源,以及执行成功或失败时怎样更新区块链状态。

从源代码到可执行字节码

开发者通常使用 Solidity 等高级语言编写合约。人类可读的源代码需要经过编译器转换为 EVM 能执行的字节码,也就是一串按固定格式排列的机器指令。

部署合约时,创建交易包含用于生成合约的代码。执行成功后,网络为合约建立地址,并保存之后接收调用时要运行的字节码。合约部署后的运行代码与开发者的源文件并不是同一种表示,因此公开源代码还需要与链上字节码核对,才能说明两者对应。

编译器版本和设置可能影响最终字节码。两个看起来相似的源文件也可能生成不同结果;看到同一个合约名称,更不能代替对网络和合约地址的核对。

调用为合约提供执行输入

用户调用合约时,会向合约地址发送一笔带有数据的交易。数据通常说明要调用哪个功能,并按约定格式附上参数。合约也可以在执行过程中调用另一个合约,把数值或数据继续传递下去。

EVM 从当前区块链状态开始,读取调用者、目标、附带数值、输入数据和当前区块允许使用的信息,然后逐条执行目标合约的字节码。每条指令都会按规则改变本次计算中的临时数据,或请求读取、写入合约的持久状态。

合约不会因为时间到了就自行启动。必须有交易或其他合约调用形成执行入口;网页上的“自动运行”通常还需要某个外部服务在条件满足时提交交易。

操作码是字节码中的基本动作

EVM 字节码由一项项操作码组成。操作码可以理解为虚拟机认识的最小动作,例如做算术、比较数值、读取调用数据、读取或写入存储,以及调用其他合约。

不同操作码具有明确的输入、输出和 Gas 消耗规则。节点不需要理解合约的业务名称,只需按操作码顺序执行,就能检查另一个节点给出的结果是否符合协议。

高级语言中的一行代码可能被编译成多条操作码。反过来,只看某个操作码也无法理解完整业务意图,因此合约审查通常还要结合源代码、编译设置、调用数据和实际部署地址。

临时数据与持久状态

执行过程中使用的数据并不都会永久写入区块链。可以先区分三类位置:

  • 调用数据是本次调用带入的只读输入;
  • 内存是本次执行期间使用的临时工作区,执行结束后不会保留;
  • 存储属于具体合约,成功写入后会成为区块链状态的一部分,供以后调用读取。

EVM 还使用一种后进先出的临时计算结构,称为栈。操作码从栈顶取值、完成计算后再放回结果。普通读者不必手工跟踪每一步,但需要知道“内存中的变化”和“合约存储已经改变”不是同一件事。

写入持久存储通常比只做临时计算消耗更多 Gas。删除或改变存储也受协议规则约束,不能把链上状态当成普通程序可以任意覆盖的本地文件。

状态变化必须能够重复计算

同一区块中的交易有确定顺序。节点从相同的区块前状态开始,按顺序执行相同交易,就应得到相同的区块后状态;否则它们无法对共同账本达成一致。

因此,EVM 合约不能在执行时直接访问任意网页、设备时间或某台服务器的随机结果。需要链外价格、天气或其他信息时,外部参与者必须先把数据以交易形式带到链上。EVM 能检查代码怎样使用这份输入,却不能自动证明输入对应的链外事实真实。

区块提供的时间、区块编号等信息也来自协议定义的执行环境。开发者可以按规则读取它们,但不应把这些值误当成不受区块提议过程影响的精密外部时钟或秘密随机源。

Gas 限制每次执行的工作量

每项 EVM 操作都会消耗一定 Gas。Gas 是对计算和存储工作的计量单位,不是一种独立代币;在 Ethereum 主网上,实际执行费用通常使用网络原生资产 ETH 支付。

交易发送方会设置允许本次交易最多消耗的 Gas。执行时,EVM 按实际运行的操作累计 Gas;若剩余 Gas 不足以完成下一步,执行会因耗尽 Gas 而失败。

Gas 让无限循环或异常复杂的调用不能无成本占用所有节点的计算资源。它也意味着同一个功能可能因输入、当前状态和执行路径不同而消耗不同数量。交易金额大,不一定比金额小的交易执行更多代码。

成功、回退与失败

合约可以正常结束并返回数据,也可以主动回退,或因无效操作、Gas 耗尽等原因失败。失败时,本次调用路径中尚未提交的状态修改会按规则撤销,但交易已经消耗的计算资源仍可能产生费用。

一个交易可以触发多层合约调用。如果内层调用失败,外层合约可以按代码选择继续处理返回结果,也可能让整个交易回退。因此,“某个内部步骤失败”与“整笔交易最终失败”需要结合调用结果判断。

状态回退也不会撤销交易已经被纳入区块这一事实。区块浏览器可以显示失败交易和消耗的 Gas,只是预期的合约状态修改没有生效。

读取结果与提交交易

钱包或应用可以让某个节点在本地模拟执行只读请求,并立即返回结果。这类读取不会由整个网络达成新的共识,也不会修改链上状态,通常不需要用户签名并支付链上费用。

需要改变状态的操作则必须形成交易、由账户签名并广播,在进入区块后由节点共同执行。交易提交前的模拟可以帮助发现明显失败,但最终结果仍可能受交易排序、状态变化、Gas 设置和所选网络影响。

因此,应用界面显示“预计成功”不等于交易已经确认。真正的链上结果需要查看正确网络上的交易状态、执行结果和合约状态。

EVM 与 Ethereum 不是同一个概念

EVM 只描述智能合约执行和状态转换的一部分规则。Ethereum 还包括账户与交易格式、区块传播、权益证明共识、网络通信和其他协议组成。

其他区块链也可以实现 EVM 或与其高度相似的执行环境,以复用合约工具和字节码。它们通常被称为 EVM 兼容网络,但仍拥有独立的区块历史、验证安排、费用资产和安全边界。

所以,“能运行 EVM 合约”不表示它就是 Ethereum,也不保证同一地址在不同网络上部署着相同代码。跨网络使用应用时,仍需核对网络及其网络编号、合约地址和实际字节码。

共同执行不等于合约安全

EVM 的确定性规则可以让节点复核合约是否按代码执行,却不能判断代码是否符合用户真正想要的业务结果。错误权限、外部合约在前一次操作结束前反复回调、价格输入问题、升级控制或界面诱导,都可能让一笔完全符合 EVM 规则的交易造成意外后果。

编译成功、链上执行成功或源代码公开,也不能分别替代安全审查。判断具体合约时,需要结合已部署字节码、初始化状态、管理权限、外部依赖和真实调用路径。

常见问题

EVM 是一台云服务器吗?

不是。它是一套由节点软件共同实现的执行规则,不对应某一台固定机器。

Solidity 代码会被 EVM 直接执行吗?

通常不会。Solidity 源代码先由编译器转换为 EVM 字节码,节点执行的是部署后的字节码。

读取合约一定需要支付 Gas 费吗?

本地只读请求通常不会形成链上交易,因此不会直接产生链上费用。如果读取是另一笔上链交易执行过程的一部分,相关操作仍会计入该交易的 Gas。

EVM 能直接读取互联网数据吗?

不能。外部数据需要由某个参与者或服务通过交易带到链上,EVM 只能按规则处理已经提供的输入。

EVM 兼容就代表合约可以无修改迁移吗?

不保证。兼容程度、协议版本、可用操作码、费用规则、系统合约和外部依赖可能不同,仍需在目标网络验证和测试。

相关词条

继续了解Ethereum、智能合约、Gas 费和区块链,或返回加密货币术语表。

参考来源

免责声明
本文章可能包含不适用于您所在地区的产品相关内容。本文仅致力于提供一般性信息,不对其中的任何事实错误或遗漏负责任。本文仅代表作者个人观点,不代表欧易的观点。 本文无意提供以下任何建议,包括但不限于:(i) 投资建议或投资推荐;(ii) 购买、出售或持有数字资产的要约或招揽;或 (iii) 财务、会计、法律或税务建议。 持有的数字资产 (包括稳定币) 涉及高风险,可能会大幅波动,甚至变得毫无价值。您应根据自己的财务状况仔细考虑交易或持有数字资产是否适合您。有关您具体情况的问题,请咨询您的法律/税务/投资专业人士。本文中出现的信息 (包括市场数据和统计信息,如果有) 仅供一般参考之用。尽管我们在准备这些数据和图表时已采取了所有合理的谨慎措施,但对于此处表达的任何事实错误或遗漏,我们不承担任何责任。 © 2026 OKX。本文可以全文复制或分发,也可以使用本文 100 字或更少的摘录,前提是此类使用是非商业性的。整篇文章的任何复制或分发亦必须突出说明:“本文版权所有 © 2026 OKX,经许可使用。”允许的摘录必须引用文章名称并包含出处,例如“文章名称,[作者姓名 (如适用)],© 2026 OKX”。部分内容可能由人工智能 (AI) 工具生成或辅助生成。不允许对本文进行衍生作品或其他用途。

相关推荐

查看更多
Generic bull market charts thumbnail

什么是 FOK 订单(全部成交否则取消)?

**FOK(Fill or Kill)是要求立即全部成交、否则整笔取消的订单执行条件。** 它不接受部分成交,也不保留未成交数量等待下一次机会。在加密交易中,FOK 常与[限价单](/zh-hans/learn/what-is-limit-order)结合使用。 ## FOK 是怎么运作的? 订单提交并通过检查后,交易系统核对符合价格要求的对手单能否满足全部数量:能够立即满足,就全部成交;不能满足
2026年11月12日
thumbnail:bullish-calendar-spread-strategy

什么是挂单方(Maker)?

**挂单方(Maker)是在订单簿中先提供报价、之后由其他订单与之成交的一方。** 订单簿记录尚未成交的买卖报价及数量。在采用订单簿的加密现货和合约市场中,挂单方为其他交易者提供了可以接受的买入或卖出价格。 ## 一笔挂单成交是怎样发生的? 订单提交后,如果没有立即匹配,而是留在订单簿中,它就为后续交易提供了报价。后来有对手订单接受这个价格,双方完成成交,原先提供报价的一方便是这笔成交的 Make
2026年11月12日
trade-academy-beginner-4

什么是吃单方(Taker)?

**吃单方(Taker)是与订单簿中已有报价立即匹配并成交的一方。** 订单簿记录尚未成交的买卖报价及数量;吃单方接受其中的报价,完成对应数量的交易,而不是先挂出自己的报价等待。 ## 吃单成交是怎样发生的? 一方先在订单簿上提供报价,另一方提交能够与它匹配的订单。交易系统将两者配对,后提交并取走已有报价的一方,就形成吃单成交。 例如,假设订单簿中已有价格 100 USDT、数量 2 个的卖单。一
2026年11月12日
Options trading generic thumb

什么是买卖价差?

**买卖价差(Bid-Ask Spread)是同一市场、同一时点的最低卖价与最高买价之间的差额。** 在采用订单簿的加密市场中,它描述买卖两边最接近的报价还相差多少。 ## 买卖价差怎样计算? 订单簿是尚未成交的买卖报价清单。买方报价称为 Bid,其中最高的一档是**最优买价(Best Bid)**;卖方报价称为 Ask,其中最低的一档是**最优卖价(Best Ask)**。 **买卖价差=最优卖
2026年11月12日
Forward Contracts vs. Futures Contracts What Are the Differences

什么是只做 Maker 订单(Post-Only)?

**只做 Maker 订单(Post-Only)是在限价单上附加“只挂单、不立即吃单”要求的订单。** 在采用订单簿的加密现货和合约市场中,订单簿记录尚未成交的买卖报价及数量。先提供报价、之后由其他订单与之成交的一方称为[挂单方](/zh-hans/learn/what-is-maker)(Maker);接受已有报价并立即成交的一方称为[吃单方](/zh-hans/learn/what-is-ta
2026年11月12日
thumbnail:arbitrage-order

什么是 IOC 订单(立即成交否则取消)?

**IOC 订单(Immediate or Cancel)要求立即成交当前能够成交的数量,并取消剩余未成交数量。** 在采用订单簿的加密货币市场中,订单簿记录尚未成交的买卖报价及数量。IOC 订单会尝试与其中已有的报价成交,不把剩余数量留下等待。 ## IOC 是怎么运作的? IOC 限制的是订单可以等待多久,[限价单](/zh-hans/learn/what-is-limit-order)限制的
2026年11月12日
查看更多