原文:https://notes.ethereum.org/@vbuterin/enshrined_zk_evm
翻訳者:Dengchain Community[1)翻訳チーム
Etherの上に構築されたOptimistic RollupsやZK RollupsなどのLayer2 EVMプロトコルは、EVM検証に依存しています。しかし、これには大規模なコードベースを信頼する必要があり、コードベースに脆弱性がある場合、これらのVMはハッキングされる危険性があります。さらに、L1 EVMと完全に同等であることを意図しているZK-EVMでさえ、L1 EVMから独自のEVM実装への変更を複製するために、何らかの形のガバナンス機構を必要とします。
これらのプロジェクトはイーサネット・プロトコルにすでに存在する機能を複製しており、イーサネットのガバナンスはすでにアップグレードとバグ修正を担当しているため、この状況は理想的ではありません!さらに、今後数年間で、ライトクライアント [2] はますます強力になり、やがて ZK-SNARKs を使用して L1 EVM の実行を完全に検証するようになると予想しています。その時点で、EtherNet ネットワークは事実上 ZK-EVM を内蔵することになります。したがって、なぜ ZK-EVM をネイティブでロールアップできるようにしないのかという疑問が生じます。
この記事では、実装可能なカプセル化 ZK-EVM のいくつかのバリエーションについて説明し、トレードオフと設計上の課題、および特定の方向を取らない理由について詳しく説明します。プロトコル機能を実装する利点は、エコシステムから離れ、基礎となるプロトコルをシンプルに保つ利点と天秤にかけるべきです。
ZK-EVMのパッケージ化で得たい主な機能は何ですか?
基本機能: イーサネット ブロックの検証。プロトコル機能 (それがオペコードであるか、プリコンパイルであるか、または他のメカニズムであるかは未定) は、入力として (少なくとも) プリステート ルート、ブロック、およびポストステート ルートを受け入れ、ポストステート ルートが実際にプリステート ルート上でブロックを実行した結果であることを検証しなければなりません。
イーサネットのマルチクライアント哲学[3]との互換性は、単一の証明システムの使用を避け、その代わりにクライアントごとに異なる証明システムを許容することを意味します。
データ可用性の要件: カプセル化されたZK-EVMを介して実行されるEVMの実行について、以下のことを意味します。EVMの実行では、基礎となるデータの可用性を保証したい[4]ので、別の証明システムを使用する証明者は実行を再証明でき、その証明システムに依存するクライアントは新しく生成された証明を検証できる。
証明はEVMとブロックデータ構造の外部に格納される:ZK-EVM機能はSNARKをEVMへの直接入力として受け取りません。その理由は、クライアントによって期待するSNARKの種類が異なるからです。その代わりに、ブロブ検証に似ているかもしれません。トランザクションは、プルーフを必要とするステートメント(プレステート、ブロックボディ、ポストステート)を含むことができ、オペコードまたはプリコンパイルはこれらのステートメントのコンテンツにアクセスすることができ、クライアントのコンセンサスルールは、これらのステートメントのそれぞれについて、データの可用性とブロック内のプルーフの存在をチェックします。
監査可能性:いずれかの実行が証明された場合、ユーザーや開発者がそれをチェックできるように、基礎となるデータが利用可能であることを望みます。事実上、これはデータの可用性要件が重要であるもう1つの理由を追加します。
スケーラビリティ: 特定のZK-EVMシナリオで脆弱性が発見された場合、私たちはそれを素早く、ハードフォークを必要とせずに修正できるようにしたいと考えています。そのため、EVMとブロックデータ構造の外部にプルーフを格納することの重要性が高まります。
ALMOST-EVMのサポート: L2の魅力の1つは、実行レベルでイノベーションを起こし、EVMをスケールアップできることです。ある L2 の VM が EVM とわずかに異なるだけである場合、L2 の EVM と同じ部分はネイティブのプロトコル内 ZK-EVM を使用し、EVM と異なる部分については独自のコードに依存するだけでよいと思います。これは、ZK-EVMの機能を設計することで、呼び出し元がビットフィールド、オペコード、アドレスリストを指定し、EVM自体ではなく、外部から供給されるテーブルで処理できるようにすることで実現できます。また、限られた範囲でガスコストをカスタマイズ可能にすることもできます。
オープンとクローズの マルチクライアント システム
マルチクライアントのアイデアは、おそらく上記のリストの中で最も主張の強い要件です。>.これを放棄して ZK-SNARK スキームに集中するという選択肢もあります。これは設計を単純化しますが、Ether にとってより大きな アイデアの転換 (Ether の長年にわたるマルチクライアント哲学を事実上放棄することになるため) となり、より大きなリスクをもたらすという代償を伴います。長期的な将来、たとえばフォーマルな検証技術がより洗練されたときなどには、このルートに進むほうがよいかもしれませんが、現時点ではリスクが大きすぎるように思われます。
もう1つの選択肢は、クローズド・マルチクライアント・システムで、そこではプロトコルで証明システムの固定セットが知られています。例えば、PSE ZK-EVM[5] 、Polygon ZK-EVM[6] and Kakarot[7] の3つのZK-EVMを使用することにするかもしれない。ブロックが有効とみなされるには、これら3つのうち2つの証明が必要である。これは単一の証明システムよりは良いが、システムの適応性が低くなる。ユーザーは各証明システムのバリデータを維持しなければならず、例えば新しい証明システムを組み込んだ政治的ガバナンスプロセスに影響を与えることは避けられないからだ。
このことが、私が好むオープンなマルチクライアントシステムの原動力となり、そこでは証明は「ブロックの外」に置かれ、クライアントによって個別に検証されます。個々のユーザーは、その証明システムのために証明を作成する証明者がいる限り、好きなだけ多くのクライアントを使用してブロックを検証することができます。証明システムは、プロトコルのガバナンス・プロセスを説得するのではなく、ユーザーを説得して実行させることで影響力を得る。しかし、このアプローチには、後述するように、はるかに高い複雑性コストがかかります。
私たちがZK-EVM実装に求める主な機能は何でしょうか?
正しい機能とセキュリティの基本的な保証の他に、最も重要な機能は速度です。N スロット後にのみ各ステートメントの答えを返す非同期プロトコル内 ZK-EVM 関数を設計することは可能ですが、各ブロッククロックで何が起こっても独立であるように、証明が数秒で生成できることを確実に保証できれば、問題ははるかに簡単になります。
イーサリアムのブロックの証明を生成するには、今日では何分も何時間もかかりますが、大規模な並列化を妨げる理論的な理由はありません。再帰的 SNARK を使用して証明をマージすることができます。さらに、FPGAやASICによるハードウェアアクセラレーションは、証明を最適化するのに役立ちます。しかしながら、これを達成することは、過小評価されるべきではない重要な工学的課題です。
プロトコル内のZK-EVM機能は、具体的にどのようなものですか?
EIP-4844 blobトランザクション[8]と同様に、ZK-EVM宣言を含む新しいトランザクションタイプを導入します:
ZK-EVM 宣言を含む新しいトランザクションタイプを紹介します。align: left;">EIP-4844と同様に、メモリプールで伝播されるオブジェクトは、トランザクションの変更バージョンになります。
後者は前者に変換できますが、逆はできません。また、(EIP-4844[9]で導入された)ブロック側のカーオブジェクトを拡張し、ブロック内で行われた宣言の証明リストを含むようにしました。
実際には、おそらく次のように分割したいことに注意してください。サイドカーを2つに分け、1つはブロブ用、もう1つは証明用とし、証明の種類ごとに別のサブネット(ブロブ用には別のサブネット)を用意することになるでしょう。
コンセンサスレイヤーでは、検証ルールを追加します:ブロックは、クライアントがブロック内の各ステートメントに対して有効な証明を見た場合のみ、受け入れることができます。その証明は、transaction_and_witness_blob/code>の連結が(Block, Witness)ペアの直列化であること、およびpre_state_root/code>でのWitness(i)の使用が有効であることを証明するZK-SNARKでなければなりません。の使用が有効であり、(ii) 正しいpost_state_root
が出力されることです。潜在的に、クライアントはM-of-Nの複数のタイプの証明を待つことを選択することができます。
ここで言及すべき哲学的なポイントの1つは、ブロックの実行自体は、単に と同じタイプの証明が必要であるとみなすことができるということです。(σpre,σpost,Proof)トリプル
の1つで、ZKEVMClaimTransaction/code>オブジェクトで提供されるトリプルと一緒にチェックする必要があります。このように、ユーザーのZK-EVM実装は、実行クライアントを置き換えることができます。実行クライアントは、(i)証明者とブロックビルダー、および(ii)インデックスをローカルで使用し、データを保存することを気にするノードによって使用されます。
検証と再証明
2つのイーサリアムクライアントがあり、1つはPSE ZK-EVM、もう1つはPolygon ZK-EVMを使用していると仮定します。-どちらの実装も、イーサネットブロックの実行を5秒以内に証明できるところまで進化しており、それぞれの証明システムに対して、証明を生成するハードウェアを実行する独立したボランティアが十分にいるとします。
残念ながら、個々の証明システムは含まれていないため、プロトコルでインセンティブを受けることはありません。しかし、研究開発に比べれば、証明者を運営するコストは低く、したがって、公共財の資金調達に使われているのと同じ汎用機関を通じて、単純に証明者に資金を提供することができます。証明者に資金を提供することができます。
誰かがZKEvmClaimNetworkTransactionを公開し、PSE ZK-EVMの証明バージョンだけを公開したとします。多角形ZK-EVMの証明ノードはこれを見て、証明を計算し、多角形ZK-EVMの証明を再公開します。
これにより、ブロックを受け入れる最も早い正直なノードと、最も遅い正直なノードとの間の最大遅延の合計が増加します。δから2δ+Tprove(ここではTprove <5sと仮定する)に増加します。
しかし、良いニュースは、シングルスロット最終決定性を使用する場合、SSFに固有のコンセンサスレイテンシの複数のラウンドと一緒に、この追加のレイテンシをほぼ確実に「パイプライン化」できるということです。たとえば、この4スロットの提案[10]では、「ヘッダー投票」ステップは基礎となるブロックの妥当性をチェックするだけでよいかもしれませんが、「凍結と確認」ステップは証明の存在を必要とします。
拡張: ほぼEVMのサポート
ZK-EVM機能の望ましい目標の1つは、ほぼEVMをサポートすることです。EVM です。
いくつかの変更は単純な方法でサポートできます。ZKEVMClaimTransaction
が変更されたEVMルールの完全な記述を渡すことを可能にする言語を定義できます。
ガス料金テーブルをカスタマイズする(ユーザーはガス料金を減らすことはできませんが、増やすことはできます)
特定のオペコードを無効にする
ブロック番号を設定する(これはハードフォークによって異なるルールを意味します)
L1ではなくL2専用のEVM変更セット全体をアクティブにするフラグを設定する、または他の単純な変更
新しいプリコンパイラ(またはオペコード)を導入することで、ユーザーがよりオープンに新機能を導入できるようにするために、ZKEVMClaimNetworkTransactionのblobの一部として含まれるプリコンパイルされた入出力スクリプトを
EVMの実行が変更されます。inputs
の配列は空で初期化されます。used_precompile_addresses
内のアドレスへのi番目の呼び出しで、inputsRecord(calle_address, gas, input_calldata)
をinputs
に追加し、inputsRecord(calle_address, gas, input_calldata)/code>.code>のRETURNDATA
をoutputs[i]
にセットする。最後に、used_precompile_addresses
が合計len(outsputs)
回呼び出されたことと、inputs_commitments
がinputs
のSSZシリアライズと同じかどうかをチェックします。code>のSSZシリアライズは、結果と一致するblobコミットを生成します。inputs_commitments
を公開する目的は、外部のSNARKが入力と出力の関係を簡単に証明できるようにすることです。入力(ハッシュで格納)と出力(バイトで格納)の非対称性に注意してください。これは、入力だけを見てEVMを理解するクライアントが実行できる必要があるためです。EVMの実行はすでに彼らのために入力を生成しているので、彼らは生成された入力が主張された入力と一致するかどうかをチェックするだけでよく、ハッシュチェックだけで済みます。しかし、出力はその全体が彼らに提供されなければならないので、データ利用可能でなければならない。
もう1つの有用な機能は、どの送信者アカウントからでも呼び出せる「特権トランザクション」を許可することかもしれない。これらのトランザクションは、他の2つのトランザクションの間や、プリコンパイラが別の(おそらく特権トランザクションでもある)トランザクションで呼び出されたときに実行することができる。
この設計は、新規または変更されたプリコンパイラに加えて、新規または変更されたオペコードをサポートするように変更することができます。この設計は、プリコンパイラだけでも非常に強力です。例えば:
used_precompile_addresses
を、状態に特定のフラグを持つ通常のアカウント アドレスのリストを含むように設定し、それが正しく構築されていることを証明する SNARK を生成することで、次のようなものをサポートできます。Arbitrum Stylus[12]スタイルの機能で、コントラクトがEVMやWASM(または他のVM)でコードを書くことができる。
複数のEVMによって実行された入出力レコードと特権トランザクションが正しい方法で一致することを検証する外部チェックを追加することで、同期チャネルを介して通信する複数のEVMの並列システムを実証できます。
タイプ4のZK-EVM[13]は、Solidityやその他の高レベル言語をSNARKに適したVM実装に直接変換するものと、EVMコードにコンパイルして組み込みのZK-EVMで実行する。2番目の(そして必然的に遅くなる)実装は、欠陥のある証明者が脆弱性をアサートするトランザクションを送信した場合にのみ実行することができ、2つの場所で異なる処理を行うトランザクションを提供した場合に報奨金を徴収する。
すべてのコールがゼロを返すようにし、ブロックの最後に追加された特権トランザクションへのコールをマッピングすることで、純粋に非同期なVMを実装することが可能です。
拡張:ステートフルな証明者のサポート
拡張:ステートフルな証明者のサポート上記の設計の課題の1つは、完全にステートレスであることです。理想的なデータ圧縮を使用すると、ERC20の送信は、ステートフル圧縮を使用した場合、単なるステートレス圧縮と比較して、最大3倍のスペース効率になります。
これに加えて、ステートフルなEVMは、ERC20の送信に必要なデータを提供する必要がありません。EVMは立会人データを提供する必要がありません。どちらの場合も原理は同じです。以前のEVMの実行でデータが入力または生成されたため、そのデータが利用可能であることをすでに知っているため、利用可能なデータを要求するのは無駄です。
ZK-EVM関数をステートフルにしたい場合、2つの選択肢があります:
σpreがnullであることを要求するか、既存のσpreがnullであることを要求します。strong>か、利用可能なキーと値のデータの事前に宣言されたリストか、σpostの以前の実行からのリスト
タプル(σpre, σpost, Proof)に追加します。(σpre、σpost、Proof)タプルに、ブロックによって生成されたレシートRのブロブコミットメントを追加する。 ZKEVMClaimTransactionでは、ブロック、目撃者、レシート、あるいは通常のEIP-4844ブロブトランザクションを表すものなど、以前に生成または使用された任意のブロブ約束を参照することができます。位置jのデータは、コミットメントiのバイトNを挿入する.....N+k-1")
(1) 本質的に:そのステートレスEVM検証を含む(カプセル化)、ただしEVMサブチェーンを含む(カプセル化)。(2)Essentiallyは、以前に使用または生成されたブロブを辞書として使用する、最小限の組み込みステートフル圧縮アルゴリズムを作成します。(2)の場合、(1)の場合よりも時間制限を設ける方が簡単です。
閉じた多重証明システムと連鎖したデータ
閉じた多重証明システムは、M-of-N構造を持つ固定数の証明が存在するため、上記の複雑さの多くを回避することができます。クローズド多重証明システムは、特に、データが連鎖の中にあることを保証することを心配する必要がない。加えて、クローズド・マルチプルーバー・システムは、ZK-EVM証明をチェーンダウンして実行することができます。
しかし、クローズド マルチプルーバー システムでは、ガバナンスが複雑になり、監査可能性がなくなります。
ZK-EVMがプロトコルとして機能する場合、Layer2プロジェクトの継続的な役割は何ですか?
現在 Layer2 チームによって実装されている EVM 検証機能は、プロトコルによって処理されますが、 Layer2 プロジェクトは、いくつかの重要な機能を引き続き担当します:
Layer2プロジェクトは、いくつかの重要な機能を引き続き担当します:
高速な事前承認:単一スロットの確定がLayer1スロットを遅くする可能性がある一方で、Layer2プロジェクトはすでに、単一スロットよりもはるかに低いレイテンシで、Layer2自身のセキュリティに裏打ちされた「事前承認」をユーザーに提供しています。このサービスは、今後も純粋にLayer2によって処理されます。
MEV緩和戦略:これには、暗号化されたメモリプール、レピュテーションベースのシーケンス選択、およびレイヤー1が実装したくないその他の機能が含まれる可能性があります。
EVMの拡張:Layer2プロジェクトは、ユーザーに大きな価値を提供するEVMの重要な拡張を含むことができます。これには、Arbitrum Stylus[15]のようなほぼEVMとWASMのサポートや、SNARKフレンドリーなCairo (https://www.cairo-lang.org/) 言語のような根本的に異なるアプローチが含まれます。
ユーザーおよび開発者向けの利便性:Layer2チームは、ユーザーやプロジェクトをエコシステムに引き込み、歓迎することに尽力しています。この関係は今後も続くだろう。
.