---
title: "什么是 Optimistic Virtual Machine (OVM)？"
description: "OVM 与 EVM 的区别，以及它为何是扩容的关键"
---

# 什么是 Optimistic Virtual Machine (OVM)？

乐观虚拟机（Optimistic Virtual Machine，OVM）是运行在乐观 Rollup 上的智能合约的执行环境。[Optimistic rollups](https://www.alchemy.com/overviews/optimistic-rollups)是 layer 2（L2）扩容方案，通过链下执行帮助提升 Ethereum 的吞吐量并降低延迟。Rollups 之所以被称为"混合扩容方案"，是因为它们虽然在链下执行交易，但会将重建链状态所需的数据发布到 Ethereum 上。

Optimistic Virtual Machines（OVMs）对乐观 Rollup 的功能至关重要。OVM 使开发者能够在 L2 Rollup 上运行[去中心化应用](https://www.alchemy.com/dapps/top/defi-dapps)，其体验与在 Ethereum 上运行没有明显差异。

本指南将说明 OVM 的含义，以及它与 EVM、zkEVM 等其他虚拟机的区别。我们还会介绍 Optimism 和 [Arbitrum](https://www.alchemy.com/arbitrum) 等主流乐观 Rollup 所采用的 OVM 设计的基本架构。

## 什么是乐观虚拟机？

**Optimistic Virtual Machine（OVM）是一种兼容 EVM 的虚拟机，用于在 layer 2（L2）协议上运行通用计算。**

OVM"乐观地"执行交易，也就是说它不强制校验交易的有效性，而是依赖 L1 链来仲裁关于状态转换正确性的争议。这类争议被称为欺诈证明（fraud proofs）。

我们可以拆解这一定义的几个关键组成部分来理解它。

### **EVM 兼容性**

[Ethereum Virtual Machine（EVM）](https://www.alchemy.com/overviews/what-is-the-ethereum-virtual-machine-evm)是一台"去中心化的全球计算机"，使程序能够在 Ethereum 区块链上执行。EVM 由成千上万台独立计算机（节点）组成，任何人都可以调用其提供的计算资源来运行软件（例如智能合约）。

"EVM 兼容"意味着某个系统被设计为可以运行为 EVM 编写或编译的程序。Optimistic Virtual Machine 之所以兼容 EVM，是因为它支持 [Ethereum 黄皮书](https://ethereum.github.io/yellowpaper/paper.pdf)中规定的 EVM 指令集（opcode）。这使得 OVM 无需对代码做重大改动即可执行 Ethereum 智能合约。

### **乐观执行**

虚拟机也可以作为状态机运作，根据输入在不同状态之间转换。在区块链中，共识协议管理状态转换，并制定指导状态转换函数的规则。例如，Ethereum 状态更新的规则由 EVM 定义，并由该网络的工作量证明（PoW）共识来强制执行。

OVM 依赖"乐观执行"模型——协议在接受状态转换之前不会检查其是否有效。这提高了效率，因为在 layer 1（L1）区块链（如 Ethereum）上，就状态更新的有效性达成共识会拖慢处理速度。通过默认假设所有交易都有效，OVM 能够更快地推进。

不过，为保证安全性，OVM 设计允许任何人对状态转换的有效性提出异议——由 L1 链充当裁判。这一过程依赖"欺诈证明"，我们将在后文详细说明。

### L2 上的通用计算

如果一台虚拟机（VM）支持通用计算，那么在给定正确指令和足够资源的情况下，它可以执行大多数任务。由于 OVM 能够执行任意逻辑（即图灵完备），开发者可以用它来运行各种类型的智能合约。

此外，OVM 运行在 [layer 2 区块链](https://www.alchemy.com/overviews/sidechains-vs-layer2s)上，这是一种运行在基础区块链（此处为 Ethereum）之上的协议。L2 协议是父链的延伸，由 L1 区块链上的智能合约管理。更重要的是，L1 链保证了 L2 OVM 中状态转换的正确性，以及执行背后数据的可用性。

<ImageBlock
  src="https://media.alchemy.com/1704293068-layer2-blockchain.png"
  alt="Layer 2 区块链构建在现有区块链之上，旨在帮助扩展 Layer 1 链的性能。"
  width={788}
  height={579}
  caption="Layer 2 区块链构建在现有区块链之上，旨在帮助扩展 Layer 1 链的性能。"
/>

## OVM 与 EVM 有何不同？

OVM 与 EVM 类似，二者都用于执行计算。但 OVM 本质上只是 EVM 的一个接口。

EVM 是用于在 L1 上处理交易的虚拟机，但由于每次计算都必须由网络中的所有节点重新执行才能被接受，L1 虚拟机的处理速度较慢。同时，由于要处理的交易数量庞大，而节点每次只能处理少量交易，这也使得成本高昂。

<EmbeddedTable
  table={{
    columns: [
      { key: "1", width: 200, title: "Network", dataType: "object" },
      { key: "2", width: 180, title: "Low Price", dataType: "object" },
      { key: "3", width: 180, title: "High Price", dataType: "object" },
    ],
    data: [
      {
        "1": { title: "<p>Optimism</p>", tooltip: "", icon: "" },
        "2": { title: "<p>$0.13</p>", tooltip: "", icon: "" },
        "3": { title: "<p>$0.20</p>", tooltip: "", icon: "" },
        id: 0,
      },
      {
        "1": { title: "<p>Polygon Hermez</p>", tooltip: "", icon: "" },
        "2": { title: "<p>$0.25</p>", tooltip: "", icon: "" },
        "3": { title: false, tooltip: "", icon: "" },
        id: 1,
      },
      {
        "1": { title: "<p>Arbitrum One</p>", tooltip: "", icon: "" },
        "2": { title: "<p>$0.32</p>", tooltip: "", icon: "" },
        "3": { title: "<p>$0.44</p>", tooltip: "", icon: "" },
        id: 2,
      },
      {
        "1": { title: "<p>Aztec Network</p>", tooltip: "", icon: "" },
        "2": { title: "<p>$0.80</p>", tooltip: "", icon: "" },
        "3": { title: false, tooltip: "", icon: "" },
        id: 3,
      },
      {
        "1": { title: "<p>Ethereum</p>", tooltip: "", icon: "" },
        "2": { title: "<p>$0.93</p>", tooltip: "", icon: "" },
        "3": { title: "<p>$4.67</p>", tooltip: "", icon: "" },
        id: 4,
      },
    ],
  }}
/>

OVM（运行在 L2 上）使用户能够使用 L1 EVM，而无需直接更新后者的状态。相反，OVM 在"链下"（即 L1 链之外）执行交易，但使用链下数据来保证 layer 1 上将会发生的结果。

举个例子：

假设 Alice 在乐观 Rollup 上有 2 ETH，向 Bob 发送 1 ETH。

聚合器（aggregator）将该交易提交给 layer one 上的 Rollup 合约，如果没有被质疑，该交易将作为 Ethereum 上一笔已打包交易的一部分被纳入其中。

通过这种方式，我们保证了在 Rollup 上向 Bob 支付 1 ETH 的交易将通过 Ethereum 主链的共识，并作为后者状态的一部分被最终确定。

这一保证基于以下事实：

1. OVM 使用 EVM 的规则来指导交易的执行。如果乐观 Rollup 正确执行了一笔交易，它将在 L1 上被接受。
1. 聚合器会在 L1 上发布交易数据，使任何人都能够在交易执行不正确时对其提出质疑。

Bob 和 Alice 可以选择从 Rollup 中提取资金，也可以继续进行交易。

无论哪种方式，他们都能在不在 L1 上执行任何交易的情况下，享受到 EVM 带来的好处。

OVM 与 EVM 之间的其他区别包括：

- 是否强制校验有效性
- 即时最终性
- 交易速度

### **强制校验有效性**

OVM 不强制校验状态转换函数的有效性。例如，恶意的运营方可以把 Alice 的余额转给自己，并将该交易提交到 L1。如果该交易未被质疑，OVM 会直接接受它。

相反，EVM 上的每一次状态转换都必须遵循网络的共识规则才能被接受。

例如，上述场景就不符合这些规则，因为发送方的签名密钥与其公钥不匹配（这是判断交易有效性的标准之一）。

### 即时最终性

EVM 保证即时最终性。这意味着一旦某个状态转换在网络上被接受，它就是永久性的，不能被更改或撤销。

OVM 无法保证即时最终性，因为它不强制校验交易的有效性（如果最终确定无效交易，会破坏链的完整性）。

相反，只有当 OVM 状态的更新被 L1 链接受之后，它才是最终确定的。

### 交易速度

如前所述，由于设计上的差异，OVM 的处理能力高于 EVM。单个节点（排序器，sequencer）可以直接写入链，而无需等待其他节点的批准。

这与 EVM 不同，在 EVM 中，除非某笔交易已经被其他对等节点验证并接受，否则节点无法写入链上。这就降低了 EVM 能够处理的交易数量。

## OVM 与 zkEVM 有何不同？

如前所述，OVM 主要专注于执行，并依赖 layer one 的 EVM 来强制执行状态更新的规则。因此，在 OVM 中执行的交易只是被提交到 L1，而没有任何关于其有效性的证明。这提高了可扩展性，但也增加了无效交易在 L1 上被最终确定的风险，特别是在没有人对其提出质疑的情况下。

[zkEVM（Zero-Knowledge Ethereum Virtual Machine）](https://www.alchemy.com/overviews/zkevm)通过生成密码学证明来解决这一问题，该证明可以证实链下计算的正确性。这为 L1 提供了关于状态更新有效性的强力保证。

zkEVM 与 OVM 一样兼容 EVM，也能够运行智能合约。但它与 OVM 在以下几个方面有所不同：

1. 近乎即时的最终性
1. 客观证明
1. 复杂度

我们来进一步探讨这几点。

### **1. 近乎即时的最终性**

由于有效性证明是在链上验证的，状态转换会立即被最终确定。这消除了在 L1 上最终确定 L2 交易时所需的延迟。

### **2. 客观证明**

[零知识证明](https://www.alchemy.com/overviews/snarks-vs-starks)用于保证虚拟机计算的正确性。这消除了对主观证明（即等待挑战期结束）或欺诈证明来判定交易有效性的需求。

### **3. 复杂度**

zkEVM 比 OVM 更难实现，因为为多个计算步骤生成有效性证明的成本很高。OVM 不需要预先验证链下计算，只在必要时才使用欺诈证明，因此不会受到这种负担的影响。这使得它们比 zkEVM 更容易实现。

<ImageBlock
  src="https://media.alchemy.com/1704293216-zkevm-validity-proofs.png"
  alt="zkEVM 生成有效性证明，以验证程序执行的正确性。"
  width={902}
  height={517}
  caption="zkEVM 生成有效性证明，以验证程序执行的正确性。"
/>

## 乐观虚拟机是如何工作的？

与 EVM 一样，Optimistic Virtual Machine 作为执行计算的运行环境发挥作用。不过，OVM 还需要考虑计算的证明问题，因为乐观 Rollup 依赖欺诈证明来检测无效的状态转换。

### 执行

OVM 提供了部署和执行合约、监控余额，以及智能合约平台必须执行的其他任务的功能。OVM 接收由 L2 链上某节点发送的交易形式的输入。这些输入会使 OVM 改变其状态并产生输出，例如触发事件或处理支付。

关于 OVM 中执行的其他细节包括 gas、字节码和交易。

#### Gas

"Gas"指的是在 EVM 中执行程序所需的计算资源。与 EVM 一样，OVM 使用 gas 的概念来限制每笔交易的执行步骤数。

交易发送方必须设置 gas 上限，以指定他们愿意为一笔交易花费多少 gas。这可以防止恶意交易无限运行并耗尽所有网络资源。Gas 费用还用于补偿 L2 节点为执行交易所提供的计算资源。

#### 字节码

字节码指的是 Optimistic Virtual Machine（OVM）能够解释以执行函数的底层指令。用高级、兼容 EVM 的语言（例如 [Solidity](https://www.alchemy.com/overviews/solidity)）编写的智能合约，在部署前必须先[编译为字节码](https://www.alchemy.com/overviews/solidity-binaries)。字节码本身作为一系列 opcode 执行，对交易输入执行相应操作。

除少数差异外，OVM 在字节码层面与 EVM 兼容。这意味着你可以将编译好的 EVM 字节码部署到 OVM 中，只需做很小的改动。

#### 交易

OVM 中的交易运行方式与 EVM 类似。交易可以由外部拥有账户（EOA）或合约账户发起。来自 EOA 的交易可以是以下任意一种：

- 资产转移（例如 Alice 向 Bob 发送 5 ETH）
- 合约创建（例如 Bob 向网络发送一笔以编译后的字节码作为数据负载的交易）
- 智能合约执行（例如 Alice 支付购买 5 个 UNI 代币）

同样，合约账户也可以发起交易（称为"消息调用"），接收方可以是 EOA 或另一个合约。合约也可以通过合约创建交易在 OVM 中创建新的合约。

### **欺诈证明**

如前所述，OVM 依赖欺诈证明机制来检测并撤销无效的状态转换。为使欺诈证明生效，OVM 的状态被哈希为 [Merkle 树](https://www.alchemy.com/docs/web3-glossary)，其根哈希存储在 layer 1 上的 Rollup 合约中。Merkle 树及其根哈希使节点能够对 OVM 状态的不同部分作出声明。

例如，Rollup 运营方在通过执行交易发起状态转换后，需要在提交 Rollup 区块时发布新的状态根。状态根相当于在说："这一系列交易在执行后，会将虚拟机从旧状态（由旧状态根引用）转换为新状态（由新状态根引用）。"

然而，Rollup 合约无法得知该状态转换是否有效（该系统是"乐观的"）。为了防止节点在 OVM 中执行无效的状态更新，Rollup 使用了欺诈证明。

#### 什么是欺诈证明？

欺诈证明只是一种主张，认为某笔交易若被正确执行，会导致与区块生产者所计算的状态根不同的结果。这之所以可行，是因为任何监控 L2 链的人都可以下载提交给 Rollup 运营方的交易，用自己保存的 Rollup 状态副本重新执行这些交易，并独立计算出状态根。

假设 Alice 在 OVM 的旧状态中余额为 5 ETH（由根哈希"0x67989898…"进行密码学指纹标记）。如果她转出 4 ETH，Rollup 就会进入一个新状态（由根哈希"0x7879056…"进行密码学指纹标记）。

如果该交易无效（例如签名不正确），那么它应当回滚，从而使虚拟机的状态保持不变。

然而，假设一个恶意的运营方应用了这个无效更新（也许是将 Alice 的 ETH 转入自己的钱包），他们可以发布这个虽然不正确、但已生效的新状态根，以最终确定该交易。

因此，质疑方的职责就是发布正确的状态根，并宣告该 Rollup 区块无效。这相当于在说："如果这笔交易被_正确_执行，将会得到一个不同的状态根。"

#### 在基于 OVM 的 Rollup 中证明欺诈的两种方式是什么？

在基于 OVM 的 Rollup 中，证明欺诈通常有两种方法：重新执行交易和二分协议（bisection protocol）。

##### **1. 重新执行交易**

在这种方式中，OVM 被"容器化"到运行在 L1 链上的一个智能合约中。该智能合约充当一个沙盒环境，使我们能够在 EVM 内重放某笔 OVM 交易，从而得到正确的状态根。具体做法是提供其他与上下文相关的输入，例如状态和存储，以及有争议的交易本身。

在前面提到的恶意运营方的例子中，该交易将会回滚——使状态根保持不变。计算出的状态根必然会与质疑方的状态根相匹配，从而揭露该恶意运营方并阻止无效的状态转换。

<ImageBlock
  src="https://media.alchemy.com/1704208508-optimistic-rollup-fraud-proof.png"
  alt="展示 OVM 如何通过重新执行交易来证明欺诈行为的示意图。"
  width={1600}
  height={625}
  caption="Source: https://ethereum.org/en/developers/docs/scaling/optimistic-rollups/#disputing-transactions"
/>

##### 2. 二分协议

二分协议是欺诈证明的另一种方法，旨在最大限度地减少 L1 链在欺诈证明过程中需要完成的工作量。之所以称为二分协议，是因为其设计上的独特之处：

1. 该过程始于质疑方对某个断言（assertion）提出异议（Rollup 区块被称为"断言"，因为它们是可被质疑的）。
1. 断言方随后将有争议的断言划分为两个_相等_的断言，由质疑方选择他们希望质疑的部分。
1. 在质疑方选定了另一个要质疑的断言后，断言方再次进行划分。
1. 这一过程持续进行，直到双方争议的对象缩小到 OVM 中单个计算步骤的执行结果。
1. 此时，断言方需要提供一份单步证明，证明该有争议的执行步骤是正确的。
1. 如果断言方未能提交该证明，或 L1 合约认定该证明无效，断言方就输掉这场质疑。

与重新执行交易不同，二分协议无需在链上重新执行整个区块或交易，而这样做成本高昂。它还使得无需为每笔交易发布状态根成为可能，而在通过重新执行交易来证明欺诈时，发布状态根是必需的。

二分协议目前用于 Arbitrum，其他乐观 Rollup（例如 Optimism）也计划采用[用于欺诈证明的二分协议](https://github.com/ethereum-optimism/optimistic-specs/wiki/Cannon-High-Level-Overview)。

<ImageBlock
  src="https://media.alchemy.com/1704293295-bisection-protocol.png"
  alt="展示 OVM 如何通过二分法来证明欺诈行为的示意图。"
  width={492}
  height={590}
  caption="展示 OVM 如何通过二分法来证明欺诈行为的示意图。"
/>

## 结语

Optimistic Virtual Machine 是通过将计算转移到链下 Rollup 来扩容 Ethereum 的关键所在。借助 OVM，开发者可以在 L2 链上部署智能合约，而不必面对困扰 Ethereum 的高昂 gas 费用和缓慢的处理速度。此外，欺诈证明机制意味着 OVM 能够提供与 Ethereum 主网上的 EVM 相同的安全保证。

Alchemy 支持在使用 Optimistic Virtual Machine 的乐观 Rollup 上进行构建，包括 [Optimism](https://www.alchemy.com/layer2/optimism?a=46008e9089) 和 [Arbitrum](https://www.alchemy.com/layer2/arbitrum?a=46008e9089)。

立即注册 [Alchemy 免费账户](https://www.alchemy.com/?a=46008e9089)，开始构建超快速、可扩展、兼容 EVM 的应用。
