---
title: "zkEVMとは?"
description: "zkEVMの種類、仕組み、重要性について"
---

# zkEVMとは?

ゼロ知識Ethereum Virtual Machine（zkEVM）とは、プログラムの正しさを検証するために[ゼロ知識証明](https://www.alchemy.com/overviews/snarks-vs-starks)を生成する仮想マシンである。zkEVMは、ゼロ知識技術をサポートする形でスマートコントラクトを実行できるよう設計されている。

zkEVMは[ゼロ知識（ZK）rollups](https://www.alchemy.com/blog/zero-knowledge-rollups)の構成要素であり、これはEthereumのレイヤー2スケーリングソリューションで、計算とステート保存をオフチェーンに移すことでスループットを向上させる。ZK-rollupは、オフチェーンのトランザクションバッチの正当性を検証するゼロ知識証明とともに、トランザクションデータをEthereumに提出する。

初期のZK-rollupsはスマートコントラクトを実行する能力を欠いており、単純なトークンスワップや支払いに限定されていた。しかし、EVM互換のゼロ知識仮想マシンの登場により、ZK-rollupsはEthereumの[アプリ](https://www.alchemy.com/dapps/top/defi-dapps)をサポートし始めている。

本記事では、zkEVMの仕組み、その重要性、そして存在するzkEVMの種類について解説する。

## zkEVMとは何か

zkEVMは、ゼロ知識証明計算をサポートするEVM互換の仮想マシンである。通常の仮想マシンとは異なり、zkEVMはプログラム実行の正しさ（操作に使われた入力と出力の妥当性を含む）を証明する。

この定義をさらに分解して理解しやすくする：

### EVM互換性

[EVM（Ethereum Virtual Machine）](https://www.alchemy.com/overviews/what-is-the-ethereum-virtual-machine-evm)は、Ethereumネットワーク上にデプロイされたスマートコントラクトが実行されるランタイム環境である。EVMは、Ethereumブロックチェーン上で動く分散アプリケーションを動かす「ワールドコンピュータ」として機能する。

仮想マシンは、EVM環境で動作するように作られたプログラムを実行できる場合に「EVM互換」とされる。そのようなVMは、SolidityやEthereum開発で使われる他の高水準言語で書かれたスマートコントラクトを実行できる。zkEVMは、基盤となるロジックを大幅に変更することなくEthereumスマートコントラクトを実行できるため、EVM互換である。

### ゼロ知識技術のサポート

EVMはもともとゼロ知識証明をサポートするように設計されておらず、そのためEVM互換でゼロ知識に適した仮想マシンを構築することは難しい。しかし、研究の進展により、ある程度まではEVM計算をゼロ知識証明でラップすることが可能になっている。

異なるzkEVMプロジェクトは、EVM実行とゼロ知識証明計算を組み合わせるために異なるアプローチを採用している。それぞれの手法には固有のトレードオフがあり、本ガイドの後の節で解説する。

## zkEVMはどのように機能するか

EVMと同様に、zkEVMはプログラム操作の結果としてステートを遷移する仮想マシンである。しかし、zkEVMはさらに進んで、計算のあらゆる部分の正しさを証明するための証明を生成する。essentially、zkEVMは（前述の）実行ステップがルールに従ったことを証明する仕組みを使用する。

zkEVMの仕組み（そしてなぜ異なるのか）を理解するために、まずEVMが現在どのように機能しているかを確認しよう。

### EVMの仕組み

Ethereum Virtual Machineは、何らかの入力に応じて古いステートから新しいステートへ移行するステートマシンである。すべてのスマートコントラクトの実行は、EVMのステートの変化（「ステート遷移」と呼ばれる）を引き起こす。以下は、スマートコントラクトのトランザクション中に何が起きるかの概要である：

1. コントラクトのバイトコード（ソースコードからコンパイルされたもの）は、EVMのストレージから読み込まれ、EVM上のピアツーピアノードによって実行される。ノードは同じトランザクション入力を使用し、これにより各ノードが同じ結果に到達することが保証される（そうでなければコンセンサスに達することができない）。

2. バイトコードに含まれる[EVM Opcodes](https://www.ethervm.io/)は、EVMのステートの異なる部分（メモリ、ストレージ、スタック）と相互作用する。オペコードは読み書き操作を行う——ステートストレージから値を_読み取り_（取得し）、新しい値をEVMのストレージに_書き込む_（送信する）。

3. EVMオペコードは、ステートストレージから取得した値に対して計算を行った上で、新しい値を返す。この更新の結果、EVMは新しいステートに遷移する（このためトランザクションは「ステート遷移」と呼ばれる）。この新しいステートは他のノードによって複製され、別のトランザクションが実行されるまで維持される。

<ImageBlock
  src="https://media.alchemy.com/1704295117-evm-execution-model.png"
  alt="Ethereum Virtual Machine（EVM）でプログラムがどのように実行されるかを示す図。"
  width={968}
  height={707}
  caption="Ethereum Virtual Machine（EVM）でプログラムがどのように実行されるかを示す図。"
/>

### zkEVMの仕組み

zkEVMは、各計算における様々な要素を検証するためにゼロ知識証明を生成する：

1. **バイトコードアクセス**：適切なプログラムコードが、正しいアドレスから正しく読み込まれたか？

2. **読み書き操作**：a. プログラムは計算前にスタック／メモリ／ストレージから正しい値を取得したか？ b. プログラムは実行完了後にスタック／メモリ／ストレージに正しい出力値を書き込んだか？

3. **計算**：オペコードは正しく（すなわち、ステップを飛ばすことなく順番に）実行されたか？

#### zkEVMのアーキテクチャ

zkEVMは、実行環境、証明回路、検証者コントラクトの3つの部分に分かれている。それぞれのコンポーネントが、zkEVMのプログラム実行、証明生成、証明検証に寄与する。

##### 1. 実行環境

その名の通り、実行環境はzkEVMにおいてプログラム（スマートコントラクト）が実行される場所である。zkEVMの実行環境はEVMとほぼ同様に機能する：初期ステートと現在のトランザクションを受け取り、新しい（最終的な）ステートを出力する。

##### 2. 証明回路

証明回路は、実行環境で計算されたトランザクションの正当性を検証するゼロ知識証明を生成する。証明生成プロセスは、事前ステート、トランザクション入力、事後ステート情報を入力として使用して完了する。その後、prover（証明者）はその特定のステート遷移の正当性を示す簡潔な証明を得る。

<ImageBlock
  src="https://media.alchemy.com/1704293216-zkevm-validity-proofs.png"
  alt="zkEVMがプログラムの妥当性証明を生成する方法を示す図。"
  width={902}
  height={517}
  caption="zkEVMは、プログラム実行の正しさを検証するために妥当性証明を生成する。"
/>

##### 3. 検証者コントラクト

ZK-rollupsは、L1チェーン（Ethereum）にデプロイされたスマートコントラクトに、検証のために妥当性証明を提出する。入力（事前ステートとトランザクション情報）と出力（最終ステート）も検証者コントラクトに提出される。その後、検証者は提出された証明に対して計算を実行し、提出された出力が入力から正しく計算されたことを確認する。

## zkEVMオペコードとは何か

zkEVMオペコードは、EVM互換のZK-rollupでプログラムを実行するために使用される低水準のマシン命令である。EVMと同様に、高水準言語で書かれたコントラクトは、VMが解釈できる低水準言語（バイトコード）にコンパイルされる必要がある。このバイトコードは、VMにデプロイされたときにプログラムを実行するために使用されるオペコードを指定する。

通常のEVMオペコードはゼロ知識証明回路での使用には非効率的であるため、zkEVMオペコードが必要となる。zkEVM向けのオペコードを作成するには、一般的に2つのアプローチがある：

1. ネイティブのEVMオペコード向けにZK回路を構築する
1. ZK証明計算のための新しい言語を作成する

#### ネイティブEVMオペコード向けにゼロ知識回路を構築する

このアプローチでは、すべてのEVM命令セットを算術回路に実装する必要があり——これは複雑で時間のかかる作業である。利点は、開発者が[既存のブロックチェーン開発者ツール](https://www.alchemy.com/overviews/20-blockchain-development-tools)を使ってスマートコントラクトを作成したり、既存のEthereumコントラクトを大幅な変更なしにZK-rollupsに移植できることである。

#### **ZK証明計算のための新しい言語を作成する**

このアプローチでは、妥当性証明をサポートするように設計された新しい言語を構築し、カスタムオペコードを開発する必要がある。開発者は、新しい言語で直接コントラクトを書くか、SolidityのソースコードをカスタムzkEVMオペコードにコンパイルする必要がある。

この方法は最初のアプローチよりも実装が簡単な場合が多いが、欠点もある。例えば、開発者が既存のEthereumインフラやリソースにアクセスできなくなる可能性がある。

<ImageBlock
  src="https://media.alchemy.com/1704295202-zkevm-classification.png"
  alt="EVM互換性に基づくゼロ知識仮想マシンの分類。"
  width={937}
  height={587}
  caption="EVM互換性に基づくゼロ知識仮想マシンの分類。"
/>

## zkEVMの構築を難しくしているものは何か

EVMはzk証明計算を念頭に置いて構築されていないため、証明回路にとって不都合な特徴を持っている。zkEVMの構築を難しくしている4つの要因の概要を以下に示す：

1. 特殊なオペコード
1. スタックベースのアーキテクチャ
1. ストレージのオーバーヘッド
1. 証明コスト

### 1. 特殊なオペコード

通常のVMとは異なり、EVMはプログラム実行（CALL、DELEGATECALL）やエラー処理（REVERT、INVALID）などの操作に特殊なオペコードを使用する。これにより、EVM操作向けの証明回路を設計するプロセスに複雑さが加わる。

### 2. スタックベースのアーキテクチャ

EVMはスタックベースのアーキテクチャを使用しており、レジスタベースの構造よりシンプルではあるものの、計算の証明の難易度を高めている。このため、[ZkSync](https://www.alchemy.com/overviews/what-is-zksync-era)のzkEVMやStarkWareのStarkNetといった主要なゼロ知識VMは、レジスタベースのモデルを採用している。

### 3. ストレージのオーバーヘッド

EVMのストレージレイアウトは、Keccakハッシュ関数とMerkle Patricia Trieに依存しており、いずれも証明のオーバーヘッドが高い。ZkSyncのような一部のzkVMは、KECCAK256関数を置き換えることでこの問題を回避しようとしているが、これは既存のEthereumツールやインフラとの互換性を損なう可能性がある。

### 4. 証明コスト

前述の問題が解決されたとしても、証明生成プロセスという課題が残る。ゼロ知識証明の生成には専用のハードウェアに加え、時間、資金、労力のかなりの投資が必要となる。

網羅的なリストではないが、これはEVM互換のzkEVM構築を妨げる問題の一部を示している。とはいえ、[ゼロ知識技術における複数のブレークスルー](https://hackmd.io/@yezhang/S1_KMMbGt#Why-possible-now)により、これらの問題をある程度緩和できるようになり——zkEVMソリューションへの関心が再燃している。

## なぜzkEVMは重要なのか

完全に機能するzkEVMを構築することは、EVM互換の[ZK-rollupプロジェクト](https://www.alchemy.com/overviews/zk-rollup-projects)の開発を後押しする。これにはいくつかの利点がある：

1. 安全なスケーラビリティ
1. コストの低減
1. より速いファイナリティと資本効率
1. ネットワーク効果

### **1. 安全なスケーラビリティ**

プロトコルのルールにより、すべてのバリデーティングノードはEthereum Virtual Machineで実行されたすべての計算を再実行しなければならない。このアプローチは、Ethereumノードがプログラムの正しさを独立して検証できるため、セキュリティを確保するが、Ethereumネットワークが処理できるスケーラビリティには限界がある（毎秒約15〜20トランザクション）。

EVM互換のZK-rollupsは、ネットワークセキュリティを損なうことなくEthereumのスループット問題を解決できる。他のスケーリングプロトコルと同様に、ZK-rollupsはEthereumのコンセンサスプロトコルのルールに縛られないため、実行速度を最適化できる。一部の推定によれば、[ZK-rollupsはEthereumの高い手数料を発生させることなく、毎秒約2000トランザクションを処理できる](https://blog.matter-labs.io/optimistic-vs-zk-rollup-deep-dive-ea141e71e075)。

しかし、ZK-rollupsは他のスケーリングプロジェクトと比較して高いセキュリティ保証を持っている。それらは妥当性証明によってオフチェーン計算の正しさを検証する。つまり、L2上のスマートコントラクトによって実行されたトランザクションは、ノードが操作を再実行することなくL1（Ethereum）上で確実に検証できる。これにより、セキュリティを損なうことなくEthereumの処理速度を大幅に向上させることができる。

### **2. コストの低減**

Rollupsは、トランザクションデータをCALLDATAとしてEthereumに書き込むことで、[Ethereum Mainnet](https://www.alchemy.com/rpc/ethereum)からセキュリティを得ている。しかし、optimistic rollupsとZK-rollupsでは、Ethereumに投稿しなければならないデータ量が異なる。

[optimistic rollups](https://www.alchemy.com/overviews/optimistic-rollups)は、オフチェーントランザクションの妥当性証明を提供しないため、（署名やトランザクションパラメータを含む）すべてのトランザクション関連データをオンチェーンで公開する必要がある。すべてのデータをオンチェーンに置かなければ、challengerは無効なrollupトランザクションを異議申し立てするために使用される不正証明を構築できない。

一方、ZK-rollupsは、妥当性証明がすでにステート遷移の信頼性を保証しているため、Ethereumに投稿するデータを最小限に抑えることができる。zkEVMは、トランザクション入力を省略し、最終的なステートの変化のみを公開することさえでき、CALLDATAの要件をさらに削減する。

これは、[rollupコストの大部分](https://forum.celestia.org/t/ethereum-rollup-call-data-pricing-analysis/141)がオンチェーンでのデータ投稿から生じるため、開発者とユーザーにとって有益である。CALLDATAを最小限に抑えることで、ZK-rollupsは分散型取引所、NFTマーケットプレイス、予測市場など、さまざまなアプリの利用コストを削減できる。

### 3. より速いファイナリティと資本効率

セキュリティの向上に加え、ZK-rollupsにはoptimistic rollupsに対するもう一つの利点がある：より速いファイナリティである。ブロックチェーンにおけるファイナリティとは、トランザクションが不可逆になるまでにかかる時間のことであり、ネットワーク参加者がその妥当性を示す客観的な証明を持って初めて、トランザクションはファイナライズされる。

ZK-rollupsでは、zkEVMで実行されたトランザクションは、Ethereumに投稿された直後にファイナライズされることが多い。各トランザクションバッチには即座に検証可能な妥当性証明が付属するため、Ethereumのメインチェーンは迅速にステートの更新を適用できる。

optimistic rollupsは証明なしでVMトランザクションのみを投稿するため、トランザクションがファイナリティに達する前にチャレンジ期間が経過する必要がある。チャレンジ期間とは、トランザクションがEthereumに提出された後、誰でもそのトランザクションに異議を申し立てられる1〜2週間の期間である。

ファイナリティが遅いことは、ユーザー体験に多くの影響を及ぼす。例えば、ユーザーは遅延期間が終了するまでrollupから資産を引き出すことができない。流動性プロバイダーがこの問題を解決できる場合もあるが、引き出しが高価値の資産やNFTを伴う場合は効果がない可能性がある。

zkEVMには上記のような問題は一切ない。より速いファイナリティは、NFTトレーダー、DeFi投資家、あるいは資産をシームレスに（特にL1とL2の間で）移動する必要がある裁定取引者などのパワーユーザーにとって有益である。

### 4. ネットワーク効果

EVM互換のzkVMを構築する最も重要な理由は、Ethereumのネットワーク効果を活用することである。世界最大のスマートコントラクトプラットフォームとして、Ethereumは開発者とプロジェクトの双方に価値を提供する大規模なエコシステムを持っている。

例えば、開発者は実戦で検証され監査を受けたコードライブラリ、豊富なツール、ドキュメントなどにアクセスできる。Ethereumのインフラと互換性のない新しいzkVMを作ることは、プロジェクトや開発チームがEthereumのネットワーク効果を活用する機会を断ち切ることになる。

## どのような種類のzkEVMが存在するか

現在のzkEVMプロジェクトは、大きく2つのカテゴリーに分けられる：ネイティブEVMオペコードをサポートするzkVMと、カスタマイズされたEVMオペコードを使用するzkVMである。以下では、異なるzkEVMプロトコルを比較し、それぞれの仕組みを説明する：

### Polygon zkEVM

Polygon Hermezは、EVM互換性をサポートするように設計されたゼロ知識仮想マシンを備えた[Polygon ZK-rollup](https://www.alchemy.com/overviews/polygon-zk-rollups)である。これを実現するために、EVMバイトコードは「マイクロオペコード」にコンパイルされ、SNARKおよびSTARK証明を使用してプログラム実行の正しさを検証する仮想マシンであるuVMで実行される。

2つの証明タイプを組み合わせるという判断は戦略的なものである。STARK（Scalable Transparent ARgument of Knowledge）証明は生成が速いが、SNARK（Succinct Non-Interactive Argument of Knowledge）証明はサイズが小さく、Ethereum上での検証コストが安い。

Polygon HermezのzkEVMは、STARK証明回路を使用して、ステート遷移の妥当性証明を生成する。STARK証明はSTARK証明の正しさを検証する（いわば「証明の証明」を生成すると考えればよい）ものであり、検証のためにEthereumに提出される。

### zkSync zkEVM

zkSyncは、Matter Labsによって開発されたEVM互換のZK-rollupであり、独自のzkEVMによって動作する。zkSyncは、以下の戦略を使ってEthereumとの互換性を実現している：

1. Solidityで書かれたコントラクトコードを、様々な仮想マシン向けのバイトコードにコンパイルできる中間言語であるYulにコンパイルする。

2. Yulバイトコードを（LLVMフレームワークを使用して）zkSyncのzkEVM向けに特別に設計されたカスタムの回路互換バイトコードセットに再コンパイルする。

Polygon Hermezと同様に、zkSyncのzkEVMは、バイトコードレベルではなく言語レベルでEVM互換性を実現している。例えば、従来の乗算・加算オペコード（ADDMOD、SMOD、MULMOD）は、zkSyncのzkEVMではサポートされていない。

### Scroll zkEVM

[Scroll](https://scroll.io/blog/zkEVM)は、開発中の新しいゼロ知識EVM実装である。Scrollチームは、各EVMオペコードに対してゼロ知識回路を設計する計画である。これにより、開発者は基盤となるEVMバイトコードを変更することなく、Scroll上にEthereumネイティブのスマートコントラクトをデプロイできるようになる。

とりわけ、Scroll zkEVMはストレージの正しさを検証するために「暗号学的アキュムレータ」を使用する。これは、コントラクトのバイトコードが与えられたアドレスから正しく読み込まれたことを証明するために使用される。

また、バイトコードと実行トレースを結びつける回路も提供する。実行トレースとは、どのVM命令がどの順序で実行されたかを指定するシーケンスである。proverは、計算が元のバイトコードと一致していたことを検証するために、証明生成の際に実行トレースを提出する。

### AppliedZKP zkEVM

[Applied ZKP](https://github.com/privacy-scaling-explorations/zkevm-specs)は、Ethereum Foundationが資金提供しているプロジェクトで、EVM互換のZK-rollupと、Ethereumブロック向けの妥当性証明を生成する仕組みを開発している。この後者の部分は重要である。というのも、ブロックと妥当性証明を組み合わせることで、ノードがブロックを再実行する必要がなくなるからだ。

Applied ZKPの革新性は、計算とストレージの分離にある。**ステート証明**と**EVM証明**という2種類の妥当性証明を使用する：

#### **ステート証明**‍

ストレージ、メモリ、スタックに触れる操作が正しく行われたことを確認する。ステート証明は本質的に、読み書き操作の正確性を検証する。

#### **EVM証明**

計算が正しいタイミングで正しいオペコードを呼び出したことを確認する。EVM証明は計算そのものを検証し、さらにステート証明が各オペコードに対して正しい操作を実行したことを確認する。

AppliedZKP zkEVMは、バスマッピングを使用してステート証明とEVM証明を結びつける。また、Ethereumブロックが有効と見なされるには、両方の証明が検証される必要がある。

## zkEVMの開発の進捗はどの段階にあるか

zkSyncを除いて、ほとんどのゼロ知識EVMはまだ開発中である。とはいえ、ゼロ知識技術の開発が進んでいることから、完全に機能するzkEVMの見通しはかつてないほど良好である。

その間、開発者はStarkNetゼロ知識VMを使ってゼロ知識アプリケーションの利点を活用できる。StarkNetはEVM互換ではないが、Solidityのソースコードをカスタムの、ZKに適したバイトコードにコンパイルできる。また、Cairo（StarkNetの言語）で直接コントラクトを書くという選択肢もある。

今すぐAlchemyに無料で登録して、[StarkNet上での構築](https://www.alchemy.com/layer2/starknet)を始めよう。

## よくある質問

### zkEVMとは何の略か

zkEVMは、Zero-Knowledge Ethereum Virtual Machineの略であり、正しさを検証するためのゼロ知識証明を生成しながらスマートコントラクトを実行する仮想マシンである。

### zkEVMは標準のEthereum仮想マシンとどう違うのか

zkEVMはEVM互換であるが、トランザクションの妥当性を検証するためにゼロ知識証明を生成し、オンチェーン検証付きのオフチェーン実行を可能にすることでスケーラビリティを向上させる。

### zkEVMの主要な構成要素は何か

zkEVMは3つの部分から構成される：スマートコントラクトが実行される実行環境、ゼロ知識証明を生成する証明回路、Ethereum Layer 1で証明をチェックする検証者コントラクトである。

### zkEVMは何に使われるのか

zkEVMはZK-rollupsを動かしており、これはEthereumのLayer 2スケーリングソリューションであり、トランザクションをオフチェーンでバッチ処理し、より速く安価な実行のために妥当性証明をLayer 1に提出する。

### zkEVMの構築が難しい理由は何か

zkEVMの構築が難しいのは、EVMがゼロ知識証明を念頭に設計されていないためであり、特殊なオペコード、スタックベースのアーキテクチャ、ストレージのオーバーヘッド、高い証明コストが回路設計を複雑にしているからである。

### zkEVMはoptimistic rollupsと比較してどのようにスケーラビリティを向上させるのか

zkEVMは妥当性証明を通じて即座にファイナリティを提供し、optimistic rollupsが必要とする1〜2週間のチャレンジ期間を排除し、より速いトランザクション処理を可能にする。

### zkEVMオペコードとは何か

zkEVMオペコードは、ZK-rollupsでプログラムを実行するための低水準のマシン命令であり、ネイティブEVMオペコード向けのZK回路を構築するか、新しいZKに適した言語を開発することで作られる。

### zkEVM実装の例にはどのようなものがあるか

例としては、Polygon zkEVM（マイクロオペコードとSNARK/STARK証明を使用）、zkSync（Solidityをカスタムバイトコードにコンパイル）、Scroll（各EVMオペコード向けに回路を設計）が挙げられる。
