blockchainjapan’s blog

旬のブロックチェーンを記事を厳選して提供!

zkEVMとは?種類と機能、重要性を説明


zkEVMとは?種類と機能、重要性

alchemy:元記事

翻訳:Takeshi@Think Globally, Act Locally

ゼロ知識イーサリアム仮想マシン(zkEVM)とは、プログラムの正しさを検証するためにゼロ知識証明を利用する仮想マシンです。ZkEVMは、ゼロ知識技術に対応した方法でスマートコントラクトを実行するために設計されています。

ZkEVMはゼロ知識ロールアップ(ZK-rollup)の一部であり、計算と状態保存をオフチェーン転送することでスループットを向上させるL2スケーリングソリューションです。ZK-rollupは、オフチェーン・トランザクションバッチの有効性を検証するゼロ知識証明とともに、トランザクションデータをイーサリアムに提出します。

初期のZK-rollupはスマートコントラクトの実行機能を持たず、単純なトークン交換や支払いにその機能が制限されていました。しかし、EVM互換のゼロ知識仮想マシンの導入により、ZK-rollupはイーサリアムのdAppsをサポートし始めています。

この記事では、zkEVMの仕組みと重要性、zkEVMにはどのような種類があるのかを探っていきます。

zkEVMとは?

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

この定義についてさらに分解して理解しやすく説明していきましょう。

EVMの互換性

EVM(Ethereum Virtual Machine)は、イーサリアムネットワーク上に展開されたスマートコントラクトが実行されるランタイム環境です。EVMは、イーサリアムブロックチェーン上で動作する分散型アプリケーション(dApps)を動かす「ワールドコンピュータ」として機能します。

EVM環境で動作するように作られた仮想マシンのことを「EVM互換」と言います。このような仮想マシンでは、Solidityなど、イーサリアムの開発で使用される言語で書かれたスマートコントラクトを実行できます。zkEVMは、基本ロジックを大幅に修正することなくイーサリアムのスマートコントラクトを実行できるため、EVMと互換性がと言えます。

ゼロ知識技術のサポート

EVMはゼロ知識証明に対応するように設計されていないため、EVMと互換性のあるゼロ知識対応の仮想マシンの構築が困難でした。しかし、研究の進歩によって、EVMの計算をゼロ知識証明で機能させることが(ある程度)可能になりました。

異なるzkEVMプロジェクトは、EVMの実行とゼロ知識証明の計算を組み合わせるために、異なるアプローチを採用しています。各方法には独自のトレードオフがあり、このガイドの後のセクションで説明していきます。

zkEVMはどのように動作するのか?

EVMと同様、zkEVM はプログラム操作の結果として状態間を遷移する仮想マシンです。しかしzkEVMは、計算の全ての部分が正しいことを証明する検証を生成するという部分で、より進化しています。基本的にzkEVMは、実行ステップがルールに則っていることを証明する仕組みを利用しています。

zkEVMがどのように機能するか(そしてなぜ違うのか)を理解するために、EVMが現在どのように機能しているかを確認しましょう。

EVMの仕組み

EVMは、何らかの入力に応答して古い状態から新しい状態に移行するステートマシンです。スマートコントラクトを実行するたびに、EVMの状態が変化する(「状態遷移」と呼ばれる)トリガーとなる仕組みです。以下に、スマートコントラクトのトランザクション中に起こることのハイレベルな概要を示します:

  1. コントラクトのバイトコードソースコードからコンパイル)がEVMのストレージからロードされ、EVM上のピアツーピアノードによって実行されます。ノードは同じトランザクション入力を使用し、各ノードが同じ結果に到達することが保証されます(そうでなければコンセンサスに達することはできません)。
  2. EVMオペコードバイトコードに含まれる)は、EVMの状態(メモリ、ストレージ、スタック)の様々な部分と相互作用します。オペコードは、状態ストレージから値を読み取り(取得)、EVMのストレージに新しい値を書き込み(送信)、読み取りと書き込みの操作を実行します。
  3. EVMのオペコードは、状態記憶装置から取得した値に対して計算を実行してから、新しい値を返します。この更新によって、EVMは新しい状態に遷移します(これが「状態遷移」と呼ばる理由です)。この新しい状態は、他のノードによって複製され、別のトランザクションが実行されるまで残ります。
Ethereum Virtual Machine(EVM)のプログラム実行プロセス図 [ソース]

zkEVMの仕組み

zkEVMは、各計算の様々な要素を検証するためにゼロ知識証明を生成します。

  1. バイトコードアクセス:適切なプログラムコードが適切なアドレスから正しくロードされたか?
  2. 読み書き操作: a. 計算前にスタック/メモリ/ストレージから正しい値を取り出したか b. 実行終了後にスタック/メモリ/ストレージに正しい出力値を書き込んだか?
  3. 計算:オペコードが正しく実行されたか?(ステップをスキップすることなく、次々と実行されたか)

zkEVMのアーキテクチャ

zkEVMは、実行環境、証明回路、検証コントラクトの3部構成となっています。各構成要素はzkEVMのプログラム実行、証明生成、証明検証について機能します。

  1. 実行環境
    実行環境は、その名の通り、zkEVMの中でプログラム(スマートコントラクト)を実行する場所です。zkEVMの実行環境は、EVMと同様に、初期状態と現在のトランザクションを受け取り、新しい(最終)状態を出力する機能です。
  2. 証明回路
    証明回路は,実行環境で計算されたトランザクションの有効性を検証するゼロ知識証明を生成します。証明生成処理は、前状態、トランザクション入力、後状態の情報を入力として実行されます。その後、証明者はその状態遷移の正当性を簡潔に証明することができます。
  3. 検証者コントラクト
    ZK-rollupは、L1チェーン(イーサリアム)上に展開されたスマートコントラクトに有効性証明を提出し、検証を受けます。また、入力(事前状態、取引情報)と出力(最終状態)も検証用コントラクトに提出します。その後、検証者は提供された証明に対して計算を実行し、提出された出力が入力から正しく計算されたことを確認する仕組みです。
zkEVMがプログラムの正当性証明を生成するプロセス [ソース]

zkEVMのオペコードとは?

zkEVMオペコードは、EVM互換のZK-rollupでプログラムを実行するための低レベルの命令を示します。EVMと同様に、高レベル言語で記述されたコントラクトは、VMが解釈できる低レベル言語(バイトコード)にコンパイルする必要があります。このバイトコードは、VMにデプロイされたときにプログラムを実行する際に使用されるオペコードを指定します。

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

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

ネイティブEVMオペコードのゼロ知識回路の構築

この方法では、全てのEVM命令セットを算術回路に実装する必要があり、複雑で時間のかかる作業となります。しかし、開発者は既存のブロックチェーン開発ツールを使用してスマートコントラクトを作成したり、既存のイーサリアムコントラクトを大規模な修正なしにZK-rollupに移植したりすることができるという利点があります。

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

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

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

EVM互換性によるゼロ知識仮想マシンの分類 [ソース]

zkEVMの構築を困難にしているものは?

EVMはゼロ知識計算を念頭に置いて作られていないため、証明回路にとって不親切な機能を備えています。ここではzkEVMの構築を困難にする4つの要素を説明します:

  • 特殊なオペコード
  • スタックベースのアーキテクチャ
  • ストレージのオーバーヘッド
  • 証明コスト
  1. 特殊なオペコード
    通常のVMとは異なり、EVMはプログラムの実行(CALL、DELEGATECALL)やエラー処理(REVERT、INVALID)などの操作に特別なオペコードを使用します。このため、EVMの動作に対応した証明回路を設計するプロセスが複雑化します。
  2. スタックベースのアーキテクチャ
    EVMはスタックベースのアーキテクチャを採用しており、レジスタベースの構造より単純ですが、計算証明の難易度が高くなります。このため、zkSyncのzkEVMやStarkWareのStarkNetなど、著名なゼロ知識VMレジスタベースのモデルを使用しています。
  3. ストレージのオーバーヘッド
    EVMのストレージ・レイアウトは、Keccakハッシュ関数とMerkle Patricia Trieに依存しており、いずれも高い証明オーバヘッドを持っています。zkSyncなどのzkVMは、KECCAK256関数を置き換えることによってこの問題の回避に取り組んでいますが、これは既存のイーサリアムツールとインフラとの互換性を破壊する可能性があります。
  4. 証明コスト
    前述の問題が解決されたとしても、証明書生成のプロセスが残っています。ゼロ知識証明の生成には、専用のハードウェアが必要であり、時間、費用、労力コストが無視できないものとなります。

このように、EVMと互換性のあるzkEVMを構築する上で障害となる問題をいくつか挙げてみました。しかし、ゼロ知識技術におけるいくつかのブレークスルーによって、これらの問題を軽減することが可能になり、zkEVMソリューションへの関心が再び高まっています。

なぜzkEVMが重要なのか?

完全に機能するzkEVMを構築することで、EVM互換のZK-rollupプロジェクトの開発が奨励されます。これにはいくつかの利点があります:

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

プロトコルのルールによって、全ての検証ノードはイーサリアム仮想マシンで行われたすべての計算を再実行する必要があります。この方法は、イーサリアムノードが独立してプログラムの正しさを検証できるため、セキュリティを確保できますが、イーサリアムネットワークが管理できるトランザクションはわずか~15~20件と、スケーラビリティに限界があります)。

EVMと互換性のあるZKロールアップは、ネットワークセキュリティを損なうことなく、イーサリアムスループット問題を解決することができます。他のスケーリングプロトコルと同様に、ZK-rollupはイーサリアムのコンセンサスプロトコル規則に縛られることなく、実行速度を最適化することができるのです。ZK-rollupsは、イーサリアムの高い手数料を負担することなく、1秒間に約2000件のトランザクションを処理できるとする試算もります。

しZK-rollupsは他のスケーリングプロジェクトと比較して、高いセキュリティ保証も有しており、有効性証明によってオフチェーン計算の正しさを検証します。つまり、L2上のスマートコントラクトで実行されたトランザクションを、ノードが再実行することなくL1(イーサリアム)上で確実に検証することができるのです。これによって、セキュリティを低下させることなく、イーサリアムの処理速度を大幅に向上させることができます。

2. 低コスト

ロールアップは、トランザクションデータをCALLDATAとしてイーサリアムに書き込むことで、イーサリアム・メインネットからセキュリティを導き出します。しかし、OptimisiticロールアップとZK-rollupsでは、イーサリアムに書き込むべきデータ量が異なります。

Optimisiticロールアップはオフチェーン取引の有効性の証明を行わないため、全てのトランザクション関連データ(署名や取引パラメータを含む)をオンチェーンに公開する必要があります。全てのデータをオンチェーンに公開しなければ、挑戦者は無効なロールアップトランザクションに異議を唱えるための不正証明を構築することができません。

逆に、ZK-rollupは、有効性証明が既に状態遷移の信頼性を保証しているため、最小限のデータをイーサリアムにポストする余裕があります。zkEVMは、トランザクション入力を省略して最終的な状態変化のみを公開し、CALLDATA要件をさらに削減することもできます。

これは開発者とユーザーにとって有益です。なぜなら、ロールアップコストの大部分はデータをオンチェーンに投稿することに由来するからです。CALLDATAを最小限に抑えることで、ZK-rollupは分散型取引所やNFTマーケットプレイス予測市場、その他多くのようなdAppsをより安く使用することができます。

3. 迅速なファイナリティと資本効率

ZK-rollupには、セキュリティの向上以外にも、Optimisiticロールアップと比較して、ファイナリティの高速化という利点があります。ブロックチェーンにおけるファイナリティとは、取引が不可逆的になるまでの時間のことで、ネットワーク参加者がその正当性を客観的に証明できなければ、トランザクションは確定しません。

ZK-rollupsでは、zkEVMで実行されたトランザクションは、イーサリアムにポストされた直後に確定されることが多くあります。各トランザクションバッチには即座に検証可能な有効性の証明が付属しているため、メインのイーサリアムチェーンは状態の更新を迅速に適用することができます。

Optimisiticロールアップは証明のないVMトランザクションをポストするだけなので、トランザクションが確定する前にチャレンジ期間を経過する必要があります。チャレンジ期間とは、トランザクションイーサリアムに送信された後、誰でもチャレンジできる1~2週間の期間です。

ファイナリティが遅くなることは、ユーザーエクスペリエンスに多くの影響を与えます。例えば、遅延期間が終了するまで、ユーザーはロールアップから資産を引き出すことができません。流動性プロバイダーはこの問題を解決するかもしれませんが、引き出しに高価値の資産やNFTが含まれる場合は効果がない可能性があります。

zkEVMには、上記のような問題はありません。より速いファイナリティは、NFTトレーダー、DeFi投資家、またはシームレスに資産を移動させる必要のあるアービトラージトレーダーなどのパワーユーザーにとって素晴らしいものとなります(特にL1-L2間)。

4. ネットワーク効果

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

例えば、開発者は、テストされ監査されたコードライブラリ、広範なツール、ドキュメントなどにアクセスすることができます。イーサリアムのインフラと互換性のない新しいzkVMの作成は、プロジェクトや開発チームがイーサリアムネットワーク効果を利用することを断ち切ることを意味します。

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

現在のzkEVMプロジェクトは、ネイティブEVMオペコードをサポートするzkVMと、カスタマイズされたEVMオペコードを使用するzkVMの2つの主要カテゴリに分類されます。以下では、異なる zkEVM プロトコルを比較し、それらがどのように機能するかを説明します:

Polygon zkEVM
Polygon Hermezは、EVMの互換性をサポートするために設計されたゼロ知識仮想マシンを持つPolygon ZK-rollupです。そのため、EVMバイトコードは「マイクロオペコード」にコンパイルされ、uVM-プログラム実行の正しさを検証するためにSNARK証明とSTARK証明を使用する仮想マシンで実行されます。

2つの証明タイプを組み合わせるというのは、戦略的な判断です。STARK(Scalable Transparent ARgument of Knowledge)証明は生成速度が速いですが、SNARK(Succinct Non-Interactive Argument of Knowledge)証明はサイズが小さく、イーサリアム上で検証するコストが安いからです。

Polygon Hermez zkEVMは、STARK証明回路を使用して、状態遷移の妥当性証明を生成します。STARK証明はSTARK証明の正しさを検証し(「証明の証明」を生成すると考えてください)、検証のためにイーサリアムに提出されます。

zkSync zkEVM
zkSyncはMatter Labsが開発したEVM互換のZK-rollupで、独自のzkEVMを搭載しています。

zkSyncは以下の戦略でイーサリアムの互換性を実現します:

  1. Solidityで書かれたコントラクトコードを、異なる仮想マシン用のバイトコードコンパイル可能な中間言語であるYulにコンパイルする。
  2. Yulバイトコードを(LLVMフレームワークを使用して)zkSyncのzkEVM用に特別に設計された、回路互換性のあるカスタムバイトコードセットに再コンパイルする。

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

Scroll zkEVM

Scrollは開発中の新しいzkEVM実装です。Scrollチームは、EVMの各オペコードに対してゼロ知識回路の設計を計画しています。これによって、開発者は基盤となるEVMバイトコードを変更することなく、イーサリアムネイティブのスマートコントラクトEVMをScroll上に展開できるようになります。

中でもScroll zkEVMは、ストレージの正しさを検証するために「暗号アキュムレーター」を使用する予定です。これは、コントラクトバイトコードが与えられたアドレスから正しくロードされたことを証明するために使用されます。

また、バイトコードと実行トレースをリンクするための回路も提供します。実行トレースは、どのVM命令がどのような順序で実行されたかを指定するシーケンスです。証明者は証明生成時に実行トレースを提出し、計算が元のバイトコードと整合していることを検証します。

Applied ZKP zkEVM

Applied ZKPはEthereum Foundationが資金提供するプロジェクトで、EVM互換のZK-rollupとイーサリアムブロックの妥当性証明生成の仕組みを開発しています。ブロックと有効性証明のペアリングによって、ノードがブロックを再実行する必要がなくなるため、最後の部分が重要となります。

Applied ZKPの革新的な点は、計算とストレージを分離したことにあります。ZKPでは、状態証明とEVM証明という2種類の有効性証明を使っています。

  1. 状態証明
    ストレージ、メモリ、スタックに触れる操作が正しく行われたことを確認し、状態証明は、基本的に読み書き操作の正確さを検証します
  2. EVM証明
    計算が正確なオペコードを正しいタイミングで呼び出したかどうかをチェックします。EVM証明は、計算自体を検証するとともに、ステートプルーフが各オペコードに対して正しい演算を実行したことを確認します。

AppliedZKPのzkEVMは、バスマッピングを使用してステートプルーフとEVMプルーフをリンクさせます。また、イーサリアムのブロックが有効と判断されるには、両方の証明が確認される必要があります。

zkEVMの開発の進捗状況

zkSyncを除いて、ほとんどのzkEVMはまだ生産中です。しかし、ゼロ知識テクノロジーの開発は進んでいるため、完全に機能するzkEVMのリリースの見通しはこれまでよりも良くなっています。

一方、開発者はStarkNetのゼロ知識VMを使用して、ゼロ知識アプリケーションの利点を活用することができます。StarkNetはEVMと互換性がありませんが、SolidityのソースコードをZKに適したカスタムバイトコードコンパイルすることができます。また、Cairo(StarkNetの言語)でコントラクトを記述することも可能です。

Alchemyに無料でサインアップして、StarkNetでのビルドを今すぐ始めましょう!