---
title: "Optimistic Virtual Machine（OVM）とは?"
description: "OVMとEVMの違い、そしてスケーリングにおける重要性"
---

# Optimistic Virtual Machine（OVM）とは?

オプティミスティック仮想マシン（OVM）は、オプティミスティックロールアップ上で動作するスマートコントラクトの実行環境です。[Optimistic rollups](https://www.alchemy.com/overviews/optimistic-rollups)は、オフチェーン実行によってEthereumのスループットとレイテンシのスケーリングを支援するレイヤー2（L2）スケーリングソリューションです。ロールアップは「ハイブリッドスケーリングソリューション」と呼ばれます。トランザクションをオフチェーンで実行する一方で、チェーンの状態を再構築するために必要なデータをEthereum上に投稿するためです。

オプティミスティック仮想マシン（OVM）は、オプティミスティックロールアップの機能にとって不可欠です。OVMを使うことで、開発者はEthereum上と同様に、ユーザー体験に目立った差異を生じさせることなく、L2ロールアップ上で[分散型アプリケーション](https://www.alchemy.com/dapps/top/defi-dapps)を実行できます。

このガイドでは、OVMとは何か、そしてEVMやzkEVMなど他の仮想マシンとの違いを説明します。また、OptimismやArbitrumなど、人気のオプティミスティックロールアップで使われているOVM設計の基本的なアーキテクチャについても取り上げます。[Arbitrum](https://www.alchemy.com/arbitrum)。

## オプティミスティック仮想マシンとは何か

**オプティミスティック仮想マシン（OVM）は、レイヤー2（L2）プロトコル上で汎用計算を実行するためのEVM互換の仮想マシンです。**

OVMは「オプティミスティック（楽観的）」にトランザクションを実行します。つまり、トランザクションの正当性を強制せず、状態遷移の正しさに関する紛争の裁定をL1チェーンに委ねます。これらの紛争は不正証明（フラウドプルーフ）と呼ばれます。

この定義の主要な構成要素を見ていきましょう。

### **EVM互換性**

[Ethereum Virtual Machine（EVM）](https://www.alchemy.com/overviews/what-is-the-ethereum-virtual-machine-evm)は「分散型のグローバルコンピュータ」であり、Ethereumブロックチェーン上でプログラムを実行可能にします。EVMは数千台の個々のコンピュータ（ノード）で構成されており、誰もがアクセスできる計算リソースを提供し、Ethereumネットワーク上でソフトウェア（スマートコントラクトなど）を実行できるようにしています。

「EVM互換性」とは、あるシステムがEVM向けに書かれた、あるいはコンパイルされたプログラムと連動するように設計されていることを意味します。オプティミスティック仮想マシンは、[Ethereum Yellow Paper](https://ethereum.github.io/yellowpaper/paper.pdf)で規定されているEVMの命令セット（オペコード）をサポートしているため、EVM互換です。これにより、OVMはコードに大きな変更を加えることなくEthereumのスマートコントラクトを実行できます。

### **オプティミスティックな実行**

仮想マシンは状態マシンとしても機能し、入力に応じてさまざまな状態間を遷移できます。ブロックチェーンでは、合意プロトコルが状態遷移を統治し、状態遷移関数を導くルールを定めます。例えば、Ethereumの状態を更新するルールはEVMによって定義され、ネットワークのプルーフ・オブ・ワーク（PoW）コンセンサスによって強制されます。

OVMは「オプティミスティックな実行」モデルに依存しています。つまり、プロトコルは状態遷移を受け入れる前にその有効性をチェックしません。レイヤー1（L1）ブロックチェーン（Ethereumなど）では、状態更新の有効性についてコンセンサスを得る必要があることが処理を遅らせるため、この方式によって効率が向上します。すべてのトランザクションをデフォルトで有効であると仮定することで、OVMははるかに速く処理を進めることができます。

しかし、セキュリティを確保するため、OVM設計では誰でも状態遷移の有効性に異議を申し立てることができ、L1チェーンが裁定者として機能します。このプロセスは「不正証明（フラウドプルーフ）」に依存しており、これについては後の節で説明します。

### L2における汎用計算

仮想マシン（VM）が汎用計算をサポートしている場合、適切な指示と十分なリソースがあれば、ほとんどのタスクを実行できます。OVMは任意のロジックを実行できる（すなわちチューリング完全である）ため、開発者はさまざまな種類のスマートコントラクトの実行にOVMを適用できます。

また、OVMは[レイヤー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="レイヤー2ブロックチェーンは既存のブロックチェーンの上に位置し、レイヤー1チェーンのスケーリングを支援するように設計されている。"
  width={788}
  height={579}
  caption="レイヤー2ブロックチェーンは既存のブロックチェーンの上に位置し、レイヤー1チェーンのスケーリングを支援するように設計されている。"
/>

## OVMはEVMとどう違うのか

OVMとEVMはどちらも計算の実行を担う点で似ています。しかし、OVMはあくまでEVMへのインターフェースとして機能します。

EVMはL1でトランザクションを処理するために使われる仮想マシンですが、L1のVMは遅く、各計算はネットワーク内のすべてのノードによって再実行されてから初めて受け入れられます。処理すべきトランザクションが非常に多く、ノードが一度に処理できるトランザクション数はごくわずかであるため、コストも高くなります。

<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チェーンの外部）で実行しますが、そのオフチェーンのデータを使って、レイヤー1で何が起こるかを保証します。

例を挙げてみましょう。

AliceがオプティミスティックロールアップF上に2 ETHを持っており、Bobに1 ETHを送るとします。

アグリゲーターはこのトランザクションをレイヤー1上のロールアップコントラクトに提出し、異議申し立てがなければ、Ethereum上でマイニングされたトランザクションの一部として組み込まれます。

このようにして、ロールアップ上でBobに1 ETHを支払うトランザクションが、Ethereumのメインチェーン上でコンセンサスを通過し、最終的にその状態の一部として確定されることが保証されます。

この保証は、以下の事実に基づいています。

1. OVMはEVMのルールに従ってトランザクションの実行を導きます。オプティミスティックロールアップがトランザクションを正しく実行した場合、それはL1上で受け入れられます。
1. アグリゲーターはトランザクションデータをL1上に公開するため、誤って実行された場合には誰でもそのトランザクションに異議を申し立てることができます。

BobとAliceは、ロールアップから資金を引き出すか、取引を続けるかを選択できます。

いずれにせよ、L1上で一切のトランザクションを実行することなく、EVMの恩恵を受けたことになります。

OVMとEVMの他の違いには以下があります。

- 有効性の強制
- 即時ファイナリティ
- トランザクション速度

### **有効性の強制**

OVMは状態遷移関数の有効性を強制しません。例えば、悪意のあるオペレーターがAliceの残高を自分のものに移し、そのトランザクションをL1に提出することができます。そのトランザクションに異議が申し立てられなければ、OVMはそれをそのまま受け入れます。

一方、EVM上のすべての状態遷移は、受け入れられる前にネットワークのコンセンサスルールに従わなければなりません。

例えば、上記のシナリオでは、送信者の署名鍵が公開鍵と一致しない（これは有効なトランザクションの条件です）ため、これらのルールに従っていないことになります。

### 即時ファイナリティ

EVMは即時ファイナリティを保証します。つまり、ネットワーク上で一度受け入れられた状態遷移は永続的なものとなり、変更や取り消しができません。

OVMはトランザクションの有効性を強制しないため、即時ファイナリティを保証できません（無効なトランザクションを確定させてしまうとチェーンが破損するためです）。

その代わり、OVMの状態への更新は、L1チェーン上で受け入れられた場合に限り最終的なものとなります。

### トランザクション速度

説明したように、設計上の違いにより、OVMはEVMに比べて処理能力が高くなっています。単一のノード（シーケンサー）が、他のノードの承認を待つことなくチェーンに書き込みを行うことができます。

これはEVMとは対照的です。EVMでは、トランザクションが検証され、他のピアツーピアノードによって受け入れられない限り、ノードはチェーンに書き込むことができません。これにより、EVMで処理できるトランザクション数が減少します。

## OVMはzkEVMとどう違うのか

説明したとおり、OVMは主に実行に重点を置いており、状態更新に関するルールの強制はレイヤー1の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. ほぼ即時のファイナリティ**

有効性証明がオンチェーンで検証されるため、状態遷移は即座に確定します。これにより、L2トランザクションのL1でのファイナライズにおける遅延が不要になります。

### **2. 客観的な証明**

[ゼロ知識証明](https://www.alchemy.com/overviews/snarks-vs-starks)は、VM計算の正しさを保証するために使われます。これにより、主観的な証明（すなわち、チャレンジ期間の経過を待つこと）や不正証明を使ってトランザクションの有効性を判定する必要がなくなります。

### **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と同様に、オプティミスティック仮想マシンは計算を実行するためのランタイム環境として機能します。しかし、オプティミスティックロールアップは無効な状態遷移を検出するために不正証明に依存しているため、OVMは計算の証明についても考慮する必要があります。

### 実行

OVMは、コントラクトのデプロイと実行、残高の監視など、スマートコントラクトプラットフォームが行うべきその他のタスクの機能を提供します。OVMは、L2チェーン上のノードから送信されたトランザクションという形で入力を受け取ります。これらの入力によってOVMは状態を変化させ、イベントの発行や支払いの処理といった出力を生成します。

OVMにおける実行に関するその他の詳細には、ガス、バイトコード、トランザクションが含まれます。

#### ガス

「ガス」とは、EVM内でプログラムを実行するための計算リソースを指します。EVMと同様に、OVMもガスの概念を使って各トランザクションの実行ステップ数を制限しています。

トランザクションの送信者は、そのトランザクションにどれだけのガスを費やす意思があるかを指定するために、ガス上限を設定しなければなりません。これにより、悪意のあるトランザクションが無限に実行され、ネットワークのリソースをすべて消費してしまうことを防ぎます。また、ガス手数料は、トランザクション実行のための計算リソースを提供するL2ノードへの対価としても機能します。

#### バイトコード

バイトコードとは、オプティミスティック仮想マシン（OVM）が関数を実行するために解釈できる低レベルの命令を指します。[Solidity](https://www.alchemy.com/overviews/solidity)などの高レベルなEVM互換言語で書かれたスマートコントラクトは、デプロイ前に[バイトコードへコンパイル](https://www.alchemy.com/overviews/solidity-binaries)される必要があります。バイトコード自体は、トランザクション入力に対して演算を行う一連のオペコードとして実行されます。

OVMは、いくつかの相違点を除いて、バイトコードレベルでEVMと互換性があります。つまり、コンパイル済みのEVMバイトコードは、わずかな変更でOVM上にデプロイできます。

#### トランザクション

OVMにおけるトランザクションは、EVMと同様に機能します。トランザクションは、外部所有アカウント（EOA）またはコントラクトアカウントによって開始できます。EOAからのトランザクションは、以下のいずれかとなります。

- 資産の転送（例：Aliceが5 ETHをBobに送る）
- コントラクトの作成（例：Bobがコンパイル済みバイトコードをデータペイロードとしてネットワークにトランザクションを送る）
- スマートコントラクトの実行（例：Aliceが5 UNIトークンの代金を支払う）

同様に、コントラクトアカウントもトランザクション（「メッセージコール」と呼ばれる）を開始でき、受信者はEOAでも別のコントラクトでもかまいません。コントラクトはまた、コントラクト作成トランザクションを使ってOVM内に新しいコントラクトを作成することもできます。

### **不正証明**

前述のとおり、OVMは無効な状態遷移を検出し、取り消すために不正証明の仕組みに依存しています。不正証明が機能するためには、OVMの状態は[マークルツリー](https://www.alchemy.com/docs/web3-glossary)としてハッシュ化され、そのルートがレイヤー1のロールアップコントラクトに保存されます。マークルツリーとルートを使うことで、ノードはOVMの状態のさまざまな部分について主張を行うことができます。

例えば、ロールアップオペレーターは、トランザクションを実行して状態遷移を開始した後、ロールアップブロックを提出する際に新しい状態ルートを公開することが求められます。この状態ルートは、次のように述べているのと同じことです。「このトランザクション列を実行すると、VMは古い状態（古い状態ルートで参照される）から新しい状態（新しい状態ルートで参照される）へ遷移する」。

しかし、ロールアップコントラクトは、その状態遷移が有効であったかどうかを知ることができません（このシステムは「オプティミスティック」だからです）。ノードがOVM内で無効な状態更新を実行することを防ぐため、ロールアップは不正証明を使用します。

#### 不正証明とは何か

不正証明とは、あるトランザクションが正しく実行された場合、ブロック生成者が計算したものとは異なる状態ルートに至る、という主張に過ぎません。これが可能なのは、L2チェーンを監視している誰もがロールアップオペレーターに提出されたトランザクションをダウンロードし、自分の手元にあるロールアップの状態のコピーを使って再実行し、独自に状態ルートを計算できるからです。

Aliceの残高がOVMの古い状態（ルートハッシュ「0x67989898…」で暗号学的にフィンガープリント化されている）において5 ETHであったとします。彼女が4 ETHを転送すると、ロールアップは新しい状態（ルートハッシュ「0x7879056…」で暗号学的にフィンガープリント化されている）に移行します。

もしそのトランザクションが無効であった場合（例えば署名が正しくなかった場合など）、それはリバートされるべきであり、VMの状態は変化しないままとなります。

しかし、悪意のあるオペレーターがその無効な更新を適用した場合（AliceのETHを自分のウォレットに転送するなど）、そのオペレーターは新しい、しかし誤った状態ルートを公開してトランザクションを確定させることができてしまいます。

したがって、正しい状態ルートを公開し、そのロールアップブロックを無効であると宣言するのがチャレンジャーの役割です。これは、次のように述べているのと同じことです。「このトランザクションを_正しく_実行すると、異なる状態ルートに至る」。

#### OVMベースのロールアップにおいて不正を証明する二つの方法とは

OVMベースのロールアップで不正を証明する方法には、一般的に二つのアプローチがあります。トランザクションの再実行と、二分法プロトコル（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="出典：https://ethereum.org/en/developers/docs/scaling/optimistic-rollups/#disputing-transactions"
/>

##### 2. 二分法プロトコル

二分法プロトコルは、不正証明においてL1チェーンが行うべき作業を最小限に抑えようとする、不正証明に対する異なるアプローチです。その独自の設計から、二分法プロトコルと呼ばれています。

1. このプロセスは、チャレンジャーがある主張（アサーション）に異議を申し立てるところから始まります（ロールアップブロックは、異議申し立ての対象となりうるため「アサーション」と呼ばれます）。
1. 次に、アサーターは異議を申し立てられたアサーションを二つの_等しい_アサーションに分割し、チャレンジャーがどちらの部分に異議を申し立てたいかを選択します。
1. チャレンジャーが異議を申し立てる別のアサーションを選択すると、アサーターは再びそのアサーションを分割します。
1. このプロセスは、両者がOVM内で実行された計算の一つのステップの結果について争うようになるまで続きます。
1. その後、アサーターは、争われている実行ステップが正しいことを示すワンステッププルーフを提供することが求められます。
1. アサーターがその証明を提出できなかった場合、あるいはL1コントラクトがその証明を無効と判断した場合、アサーターはチャレンジに敗れます。

トランザクションの再実行とは異なり、二分法はブロック／トランザクション全体をオンチェーンで再実行する必要をなくします。これはコストが高い処理です。また、不正を証明するためにトランザクションを再実行する際に必要となる、すべてのトランザクションについて状態ルートを公開する必要もなくなります。

二分法プロトコルはArbitrumで使用されており、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が不正を証明するために二分法を使用する仕組みを示す図。"
/>

## 最後に

オプティミスティック仮想マシンは、計算をロールアップへとオフチェーン化することでEthereumのスケーリングを実現する上で鍵となる存在です。OVMを使うことで、開発者はEthereumを悩ませる高額なガス手数料や遅い処理時間に直面することなく、L2チェーン上にスマートコントラクトをデプロイできます。さらに、不正証明の仕組みにより、OVMはEthereumのメインネットワーク上のEVMと同等のセキュリティ保証を提供できます。

Alchemyは、OptimismやArbitrumをはじめ、オプティミスティック仮想マシンを利用したオプティミスティックロールアップ上での構築をサポートしています。[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互換のアプリケーションの構築を始めましょう。
