zk-ASMが安全で信頼できないインターネットを実現する方法

Web3.com Ventures オリジナル調査分析

0xフィッシュロソファー

注: この記事はかなり技術的に密度の高い記事であり、zk-Proofs や zk-Rollups の基本的な概念を理解していることを前提としています。これらの原則のより一般的な紹介については、こちらをご覧ください。

導入

ゼロ知識証明、特に zk-SNARK (簡潔な非対話型知識論証) は、Web 3 の最先端技術の中でも最も重要なものの 1 つです。このサブフィールドにおけるメディアや投資の注目は、Ethereum などの L1 ブロックチェーンに非常に大きなスケーラビリティを提供するスケーリング ソリューションである zk-Rollups に集まっていますが、これは zk-SNARK の唯一の用途ではありません。このエッセイでは、ゼロ知識アセンブリ コード (zkASM) の概念を詳細に分析し、zk-Rollups とそれ以降の両方での使用例を評価し、私たちが知っているインターネットを再発明する理論的可能性を探ります。

技術原則

zk-ASM は、その名前が示すように、ZK と ASM という 2 つの主要な技術的部分から構成されています。ZK 部分は zk-SNARK (簡潔な非対話型知識論) を指し、ASM 部分はアセンブリ コードを指します。zk-ASM の可能性を理解するには、まず、一見難解なこの 2 つの概念の理論的基礎を理解する必要があります。

zk-SNARKs

zk-SNARK は zk-Proofs の最高峰です。これは、証明されているデータについて何も明らかにしない、あるステートメントが True であることを簡潔に証明するものです。たとえば、「C(m) = 0 となる m を知っています」というステートメントを主張する人がいるとします。ここで、m はギガバイト長のメッセージで、C は関数です。zk-SNARK は非常に短い証明 (< 1GB) で、すぐに検証でき、m について何も明らかにされません (公開されている情報以外) [1]。

では、この「C(m)」とは何でしょうか。どのように役立つのでしょうか。この関数は実際には算術回路、または図 [2] に示すように、実行したい特定の関数の有向非巡回グラフ (DAG) 表現です。「m」は基本的に回路への入力データであり、回路内の特定の「ノード」は個別の論理ゲートまたは算術演算です。たとえば、「+」ノードは入力として「2」と「3」を持ち、次の演算子に「5」を出力します。したがって、任意の算術または論理演算を「算術回路」にエンコードできます。

zk-SNARK を実行するコードの表現としてこの演算回路ができたら、この zk-SNARK の構築を開始できます。基本的に、zk-SNARK は「代数の基本定理」によって可能になります。「代数の基本定理」では、次数「d」の多項式には最大で「d」個の根があると述べています [3]。数学的なトリックは 2 つのステップです。(1) 証明したい関数「f(m)」を何らかの方法で多項式に変換する (そしてそれに固執する)、(2)「代数の基本定理」を使用して多項式を操作し、簡潔な証明を提供する。専門用語では、最初の部分は「多項式コミットメント スキーム」(PCS) と呼ばれ、2 番目の部分は「多項式インタラクティブ オラクル証明」(PIOP) [4] と呼ばれます。

PCS と PIOP の具体的な実装はこの記事の範囲外ですが、これまでに zk-SNARK のコアステップの大まかな概要を導き出しました。

  1. zk-SNARKを実行する関数(コード関数、数式など)を選択する

  2. この関数を算術回路C(m)としてエンコードする

  3. PCSを実行してこの演算回路の多項式表現を取得します。

  4. PIOP を実行して、元の「m」のサイズの対数である簡潔な証明を取得します。

そして、なんと、メッセージが何であるかを明かすことなく、誰かが特定のメッセージを知っていることを証明できるカスタムビルドの zk-SNARK が完成しました。

アセンブリコード

zk-ASM のパズルの 2 番目のピースは、アセンブリ コードのアイデアです。アセンブリ コードは、機械が読みやすいものの、人間が解読するのはかなり難しい、非常に低レベルの言語命令を含む言語のクラスです。Python、Java、さらには C などの高水準言語とは異なり、アセンブリ言語には、プロセッサ上の一連のデータ レジスタとハードコードされたメモリ位置での移動、比較、追加、ジャンプなどの非常に基本的な機能が含まれています。たとえば、画面に 1 から 9 までの数字を出力する Python コードは 123456789 です。

かなり分かりやすいでしょう?これがx86アセンブリバージョンです[5]:

特にこのような単純な操作の場合は、はるかに厄介です。では、なぜアセンブリ言語を使用するのでしょうか。前述のように、これらの命令は人間が読むのは簡単ではないかもしれませんが、マシンが読み取って実行できるように 110011001 バイトコードに「アセンブル」するのは非常に簡単です(これをアセンブラと呼びます)[6]。比較すると、PythonやJavaなどの高級言語は人間が読むのがはるかに簡単ですが、これらの言語で書かれたプログラムはプロセッサで直接実行することはできません。代わりに、私たちが書いたPythonまたはJavaコードを噛み砕いて、上記のようなアセンブリコードのダンプを吐き出し、マシンがアセンブルして実行する「コンパイラ」に頼る必要があります。同じPythonまたはJavaが、異なるプロセッサや異なるオペレーティングシステムでスムーズに実行されることが期待できます。これは、コンパイラが大変な作業を行い、ソースコードをそのプロセッサまたはオペレーティングシステムに固有のアセンブリ言語にコンパイルするためです。

すべての言語はアセンブリ コードにコンパイルされるため (アセンブリ コード自体も実行可能バイナリにコンパイルされるため)、アセンブリは本質的に「すべての言語の母」のようなものです。ここで、アセンブリ言語 (x86 や RISC-V など) のすべてのオペランドを算術回路表現に変換でき、このアセンブリ言語のすべてのオペランドの zk-SNARK 証明を提供できるとします。これは、理論的には、このアセンブリ言語にコンパイルされる任意の高水準言語 (Python や Java など) で記述された任意のプログラムの zk-SNARK を提供できることを意味します。これが、zk-ASM について考慮する必要がある理由です。

実用的なアプリケーション

zk-EVM ロールアップ: ポリゴン zk-ASM

zk-ASM の最も重要な用途の 1 つは、Ethereum 仮想マシン互換の zk-Rollups、または zk-EVM を作成することです。zk-EVM は、プログラマーがコードをほとんど変更せずに (変更した場合) zk-Rollup ベースの L2 チェーンにデプロイできるため、ブロックチェーンのスケーラビリティにとって非常に重要です [7]。この分野では、Polygon の zk-EVM は、zk-ASM を使用してこの目標を達成する方法を示す模範的なケース スタディです。

プログラマーが Ethereum L1 ブロックチェーン上で開発する場合、通常は C に似た高水準言語である Solidity でコーディングします。この Solidity コードは、ADD、SLOAD、EQ などの一連の EVM オペコードにコンパイルされてから、L1 ブロックチェーン上で実行されます [8]。デフォルトでは、このプロセスでは明らかに zk-Proof は作成されません。Polygon のトリックは、各 EVM オペコードを、zk-SNARK に非常に適合したカスタム記述の zk-ASM に解釈する方法を作成することです。次に、L2 zk-EVM が zk-ASM を実行し、同時に ASM の zk-SNARK 回路を作成して、zk-SNARK 証明を作成します [9]。たとえば、EVM の ADD オペコードは、次のように Polygon の zk-ASM に変換されます [10]。

Polygon zk-EVM の巧妙な処理はアセンブリ レベルで行われるため、平均的な Ethereum プログラマーが触れるコードである「Solidity」レベルから 2 レベル離れています。これが、ほとんどの開発者が Ethereum メインネット用に構築された EVM コードを Polygon zk-EVM に直接移植できる理由です。さらに、Polygon zk-EVM は Ethereum の技術スタックをオペコード レベルまで「維持」するため、コンパイルされたオペコードの分析に依存するデバッグ インフラストラクチャはすべて使用可能でそのままの状態に保たれます。これは、オペコード レベルで zk-Proofs を提供しない zk-Sync などの他の zk-EVM 設計とは異なります。したがって、Polygon が独自のアセンブリ言語を発明して証明している場合でも、「EVM コードを検証することはできますが、そのために異なる内部ロジックを使用するだけです」と Vitalik は書いています [11]。

ロールアップを超えて: zk-WASM

zk-EVM は、zk-ASM の唯一の用途ではありません。アセンブリ言語は本質的に「すべての言語の母」であり、zk-ASM の作成により、そのアセンブリ言語にコンパイルされる任意の言語で記述された汎用プログラムに対して zk-Proof が解除されるという以前の主張を思い出してください。Web アセンブリ (WASM) は、最も重要な新興アセンブリ言語の 1 つです。2018 年に初めて公開された WASM のポイントは、Web アプリの実行速度を向上させ、Web の背後にある主要なコーディング言語である JavaScript の実行を補完するアセンブリ言語を作成することです [12]。

本質的には、Webが長年にわたって発展するにつれて、Webアプリのサイズと複雑さが増大し、ブラウザがJavaScriptで書かれたものすべてをコンパイルするのに信じられないほど時間がかかることが多くなり、複雑なコンパイル-最適化-リロードサイクルに頼らざるを得なくなりました[12]。一方、WebAssemblyは、移植性があり、モジュール化され、簡単に実行できるアセンブリ言語を提供することで、複雑なブラウザ実行エンジンに依存する必要性を排除します。さらに、アセンブリ言語であるWASMを使用すると、プログラマーはブラウザでネイティブに実行されるC、C ++、Rust、Java、またはRubyでコードスニペットを直接記述できます。そのため、WASMは「分散サーバーレス機能を提供する」ための選択肢となるテクノロジーになりました[13]。

では、なぜ、どのようにしてzk-SNARKが登場するのでしょうか。WASMはクライアント側の技術であり、ユーザーの入力やデータと直接やり取りできるという点でユニークです。これにはパスワードや個人情報などの機密データが含まれることが多いため、(1)プログラムが正しく実行されること、(2)機密情報が漏洩しないことを保証する技術が必要です。前述のように、zk-SNARKはこれら両方の問題を解決する完璧なソリューションであり、WASMを保護する上で重要なパズルのピースです[14]。

zk-WASMの開発はまだ初期段階ですが、最近WebAssembly用のプロトタイプzk-SNARK回路をリリースしたプロジェクトがいくつかあります。たとえば、Delphinus Labの「ZAWA」zk-SNARKエミュレーターは、WASM仮想マシンのオペランドとセマンティクスを演算回路にエンコードする方法を提示し、zk-SNARK証明を実行できるようにします[13]。時間が経つにつれて、zk-WASM回路は間違いなく継続的に最適化され、汎用言語(C、C ++、Rust、Rubyなど)で書かれたプログラムがzk-Proofsのパラダイムを採用できるようになります。

結論

このエッセイでは、zk-ASM の理論的根拠を探るとともに、zk-ASM の 2 つの典型的なケース スタディ (Polygon による zk-ASM を使用したオペコード レベルの zk-EVM の作成、および zk-SNARK を WebAssembly に適用して zk-WASM の作成) を検討しました。最終的に、zk-ASM の約束は、Web 2 の相互運用性とスケールを、Web 3 の信頼性とセキュリティと組み合わせることです。

一方で、ブロックチェーンは現在のスループットのボトルネックを超えて拡張し、実行をサポートする可能性をますます模索していますが、他方では、Web 2 方式はユーザーデータとプライバシーの保護が不十分であるという批判にさらされるようになっています。プログラマーは Web 2 コードで Web 3 設計パラダイムを採用し、Web 2 言語とコードをブロックチェーンに導入できるため、汎用 zk-ASM は Web 2 と Web 3 の世界の融合点となる可能性があります [15]。この意味で、zk-ASM により、より安全で信頼できないインターネットを再考できる可能性があります。

🐦 @0xfishylosopher

📅 2022年12月17日

免責事項:上記の情報は純粋に教育目的であり、財務上のアドバイスを構成するものではなく、著者の見解のみを表しています。Delphinus Lab は Web3.com Ventures のポートフォリオ企業です。

参考文献

[1] https://z.cash/technology/zksnarks/

[2] https://cs251.stanford.edu/lectures/lecture14.pdf

[3] https://www.britannica.com/science/fundamental-theorem-of-algebra

[4] 効率的なSNARKの構築: https://cs251.stanford.edu/lectures/lecture15.pdf

[5] 例: https://www.tutorialspoint.com/assembly_programming/assembly_loops.htm

[6] https://en.wikipedia.org/wiki/Assembly_ language

[7] https://www.alchemy.com/overviews/zkevm

[8] オペコードの一覧: https://ethereum.org/en/developers/docs/evm/opcodes/

[9] https://wiki.polygon.technology/docs/zkEVM/zkASM/introduction

[10] https://wiki.polygon.technology/docs/zkEVM/zkASM/some-examples

[11] https://vitalik.ca/general/2022/08/04/zkevm.html

[12] https://blog.developer.adobe.com/ Understanding-webassembly-wasm-d5b592208ecc

[13] https://jhc.sjtu.edu.cn/~hongfeifu/manuscriptb.pdf

[14] https://hyperoracle.medium.com/zkwasm-the-next-chapter-of-zk-and-zkvm-471038b1fba6

[15] https://delphinuslab.com/zk-wasm/