---
title: "什麼是 optimistic virtual machine（OVM）？"
description: "OVM 與 EVM 的差異，以及為何它是擴容的關鍵"
---

# 什麼是 optimistic virtual machine（OVM）？

樂觀虛擬機（Optimistic Virtual Machine, OVM）是在樂觀 Rollup 上執行智能合約的執行環境。[樂觀 Rollups](https://www.alchemy.com/overviews/optimistic-rollups) 是第二層（L2）擴容方案，透過鏈下執行來提升 Ethereum 的吞吐量並降低延遲。Rollups 之所以稱為「混合式擴容方案」，是因為雖然交易在鏈下執行，但重建鏈狀態所需的資料仍會發布至 Ethereum 上。

樂觀虛擬機（OVMs）對樂觀 Rollups 的功能運作至關重要。OVM 讓開發者能在 L2 Rollups 上執行[去中心化應用程式](https://www.alchemy.com/dapps/top/defi-dapps)，其使用者體驗與在 Ethereum 上執行無明顯差異。

本指南將說明 OVM 的定義，以及它與 EVM、zkEVM 等其他虛擬機的差異。我們也會介紹 Optimism 與 [Arbitrum](https://www.alchemy.com/arbitrum) 等主流樂觀 Rollups 所採用的 OVM 基本架構。

## 什麼是樂觀虛擬機？

**樂觀虛擬機（OVM）是一種與 EVM 相容的虛擬機，用於在第二層（L2）協定上執行通用運算。**

OVM 以「樂觀」方式執行交易，意即它不會強制驗證交易的有效性，而是依賴 L1 鏈來仲裁有關狀態轉換正確性的爭議。這類爭議稱為詐欺證明（fraud proofs）。

我們可以透過拆解這個定義的關鍵組成部分來進一步理解。

### **EVM 相容性**

[Ethereum 虛擬機（EVM）](https://www.alchemy.com/overviews/what-is-the-ethereum-virtual-machine-evm)是一台「去中心化且全球性的電腦」，能在 Ethereum 區塊鏈上執行程式。EVM 由數千台各自獨立的電腦（節點）組成，任何人都能存取這些運算資源，在 Ethereum 網路上執行軟體（例如智能合約）。

「EVM 相容性」指的是某個系統設計成能運作以 EVM 為目標所撰寫或編譯的程式。樂觀虛擬機與 EVM 相容，是因為它支援 [Ethereum 黃皮書](https://ethereum.github.io/yellowpaper/paper.pdf)中所規範的 EVM 指令集（opcodes）。這使得 OVM 能在不需大幅修改程式碼的情況下執行 Ethereum 智能合約。

### **樂觀執行**

虛擬機也可以做為狀態機運作，能依輸入在不同狀態之間轉換。在區塊鏈中，共識協定治理狀態轉換，並規範狀態轉換函式應遵循的規則。舉例來說，Ethereum 狀態更新的規則由 EVM 定義，並由網路的工作量證明（PoW）共識機制強制執行。

OVM 依賴「樂觀執行」模型——該協定在接受狀態轉換之前並不會檢查其是否有效。這能提升效率，因為在 Ethereum 這類第一層（L1）區塊鏈上，要對狀態更新的有效性達成共識會拖慢處理速度。透過預設所有交易皆為有效，OVM 能大幅加快處理進度。

然而，為了提供安全性，OVM 設計允許任何人對狀態轉換的有效性提出異議——由 L1 鏈擔任仲裁者。這個流程依賴「詐欺證明」，我們會在後續章節說明。

### L2 上的通用運算

若虛擬機（VM）支援通用運算，只要給予正確的指令與足夠的資源，它就能執行大多數任務。由於 OVM 可以執行任意邏輯（即具備圖靈完備性），開發者能利用它來執行各種類型的智能合約。

此外，OVM 執行於[第二層區塊鏈](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 鏈之外）執行交易，但利用鏈下資料來保證在第一層上將發生的結果。

舉個例子：

假設 Alice 在樂觀 Rollup 上持有 2 ETH，並要傳送 1 ETH 給 Bob。

聚合器（aggregator）會將此交易提交至第一層上的 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 主要專注於執行，並依賴第一層的 EVM 來強制執行狀態更新的相關規則。因此，在 OVM 中完成的交易只是單純地提交至 L1，並不附帶任何有效性的證明。這雖然提升了可擴展性，卻也增加了無效交易被最終確定在 L1 上的風險，尤其是在無人提出異議的情況下。

[zkEVM（零知識 Ethereum 虛擬機）](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 會產生 validity proof，用來驗證程式執行的正確性。"
  width={902}
  height={517}
  caption="zkEVM 會產生 validity proof，用來驗證程式執行的正確性。"
/>

## 樂觀虛擬機如何運作？

與 EVM 相同，樂觀虛擬機作為執行運算的執行環境（runtime environment）。然而，OVM 還需要考量到運算的證明機制，因為樂觀 Rollups 依賴詐欺證明來偵測無效的狀態轉換。

### 執行

OVM 提供部署與執行合約、監控餘額，以及智能合約平台必須執行的其他功能。OVM 接收由 L2 鏈上節點所發送的交易作為輸入。這些輸入會使 OVM 改變其狀態並產生輸出，例如觸發事件或處理支付。

有關 OVM 執行的其他細節包括 gas、位元組碼（bytecode）與交易。

#### Gas

「Gas」指的是在 EVM 中執行程式所需的運算資源。與 EVM 相同，OVM 也使用 gas 的概念來限制每筆交易的執行步驟。

交易發送者必須設定 gas 上限，指定願意為該筆交易花費多少 gas。這能防止惡意交易無限執行並耗盡所有網路資源。gas 費用同時也是對提供運算資源以執行交易的 L2 節點的補償。

#### 位元組碼（Bytecode）

位元組碼指的是樂觀虛擬機（OVM）能解讀以執行函式的低階指令。以高階、與 EVM 相容的語言（例如 [Solidity](https://www.alchemy.com/overviews/solidity)）撰寫的智能合約，在部署前必須先[編譯為位元組碼](https://www.alchemy.com/overviews/solidity-binaries)。位元組碼本身以一連串操作碼（opcodes）的形式執行，對交易輸入進行運算操作。

除了少數差異外，OVM 在位元組碼層級與 EVM 相容。這代表你只需極少的修改，就能將編譯完成的 EVM 位元組碼部署至 OVM 上。

#### 交易

OVM 中的交易運作方式與 EVM 類似。交易可以由外部帳戶（EOA）或合約帳戶發起。來自 EOA 的交易可以是以下任一種：

- 資產轉移（例如 Alice 傳送 5 ETH 給 Bob）
- 合約建立（例如 Bob 向網路發送一筆以編譯完成的位元組碼作為資料負載的交易）
- 智能合約執行（例如 Alice 支付以取得 5 個 UNI 代幣）

同樣地，合約帳戶也能發起交易（稱為「訊息呼叫」，message calls），接收方可以是 EOA 或另一個合約。合約也能透過合約建立交易，在 OVM 中建立新合約。

### **詐欺證明**

如前所述，OVM 依賴詐欺證明機制來偵測並還原無效的狀態轉換。為使詐欺證明得以運作，OVM 的狀態會以 [Merkle tree](https://www.alchemy.com/docs/web3-glossary) 的形式進行雜湊處理，其根雜湊值會儲存在第一層上的 Rollup 合約中。Merkle trees 與根雜湊值讓節點能對 OVM 狀態的不同部分提出聲明。

舉例來說，Rollup 操作者在執行交易並啟動狀態轉換後，必須在提交 Rollup 區塊時發布一個新的狀態根。狀態根等同於在說：「這一連串交易在執行後，會將虛擬機從舊狀態（由舊狀態根所參照）轉換為新狀態（由新狀態根所參照）。」

然而，Rollup 合約無法得知這次狀態轉換是否有效（此系統是「樂觀」的）。為防止節點在 OVM 中執行無效的狀態更新，Rollups 使用詐欺證明。

#### 什麼是詐欺證明？

詐欺證明其實只是一項聲明：主張某筆交易若正確執行，將導致與區塊產生者所計算出的狀態根不同的結果。這之所以可行，是因為任何監控 L2 鏈的人都能下載提交給 Rollup 操作者的交易，利用自己所擁有的 Rollup 狀態副本重新執行這些交易，並自行計算出狀態根。

假設 Alice 在 OVM 的舊狀態中餘額為 5 ETH（以根雜湊值「0x67989898…」進行加密指紋標記）。若她轉出 4 ETH，Rollup 便會進入一個新狀態（以根雜湊值「0x7879056…」進行加密指紋標記）。

如果這筆交易無效（例如簽章不正確），那麼它應該要被還原（revert），使虛擬機的狀態維持不變。

然而，假設有一名惡意操作者套用了這筆無效更新（也許是將 Alice 的 ETH 轉入自己的錢包），他們仍可以發布這個雖然錯誤、但看似新的狀態根，以完成該交易的最終確定。

因此，挑戰者的角色就是發布正確的狀態根，並宣告該 Rollup 區塊無效。這等同於在說：「這筆交易若*正確*執行，會導致不同的狀態根。」

#### 在以 OVM 為基礎的 Rollups 中，證明詐欺有哪兩種方式？

在以 OVM 為基礎的 Rollups 中，證明詐欺通常有兩種方法：重新執行交易，以及二分法協定（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，而其他樂觀 Rollups，例如 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 如何透過 bisection 來證明詐欺行為。"
  width={492}
  height={590}
  caption="此圖說明 OVM 如何透過 bisection 來證明詐欺行為。"
/>

## 結語

樂觀虛擬機透過將運算移至 Rollups 進行鏈下處理，對於擴展 Ethereum 的規模至關重要。有了 OVM，開發者能在 L2 鏈上部署智能合約，而不必面對 Ethereum 常見的高昂 gas 費用與緩慢處理速度等問題。此外，詐欺證明機制使 OVM 能提供與 Ethereum 主網上 EVM 相同等級的安全性保證。

Alchemy 支援在採用樂觀虛擬機的樂觀 Rollups 上進行開發，包括 [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 相容的應用程式。
