見出し画像

【完全保存版】zkEVMについて、基礎からしっかり理解しよう!

0 はじめに

本日は、zkEVMについて学んでいきたいと思います。

ちなみに、「zk」とは「zero-knowledge(ゼロ知識)」の略です。

そのためゼロ知識証明を用いたEVMの話となってきます。

1 そもそも、なぜzkEVMが必要なの?

1 ブロックチェーンのトリレンマについて

「ブロックチェーンのトリレンマ」ヴィタリックが提唱した概念です。

「スケーラビリティ」「分散化」「セキュリティ」全て同時には実現できないという概念です。

https://pol.techtec.world/blockchain-usecase/algorand/blockchain-trilemma-ppos

そのため、どれか一つを犠牲にするしかありません。

2 イーサリアムにおけるスケーラビリティ

そして、イーサリアムは「スケーラビリティ」を犠牲にしています。

この課題を解決してくれるのが、zkEVMです。

2 ゼロ知識証明とは

具体的な内容に入る前に、ゼロ知識証明についても学んでいきましょう。

ゼロ知識証明(ZKP) とは、ある情報の所有権や有効性を、その情報自体を明らかにすることなく証明する技術です。

よく例に出るのが、「洞窟の問題」です。

https://note.com/standenglish/n/n9e147b802da3

私が「とびらの合言葉」を知っていた場合、その合言葉を相手に教えずに、私が知っていることを証明するといった感じです。

詳しくは、こちらをご確認ください。

3 ゼロ知識証明の関係者

ゼロ知識証明では証明者(Pさん)検証者(Vさん)が出てきます。

合言葉を例にすると、証明者合言葉を知っていることを証明し、検証者が、それが正しいかを検証します。

https://towardsdatascience.com/what-are-zero-knowledge-proofs-7ef6aab955fc

4 ゼロ知識証明の条件

ゼロ知識証明には次の3つの条件が必要です。

① 完全性
② 健全性
③ ゼロ知識性

https://twitter.com/poopmandefi/status/1630064486337101825

1 完全性

証明者が正直である時、正しく証明できることが完全性です。

例えば、私が本当に合言葉を知っているのであれば、それが証明できなければなりません。

2 健全性

証明者が嘘をつこうとする時、それを見破れることが健全性です。

例えば、私が合言葉を知らないのに知っているふりをすれば、検証者は見破れなければなりません。

3 ゼロ知識性

検証者が追加情報なしで検証できることがゼロ知識性です。

例えば、検証者は、ヒントとして合言葉の最初の1文字を要求することができません。

5 ゼロ知識証明の種類

ゼロ知識証明には大きく「対話型」「非対話型」の2種類があります。

1 対話型

よく例に出てくるのが「対話型」です。

例えば先ほどの、「洞窟の問題」対話型です。

https://note.com/standenglish/n/n9e147b802da3

何度かやりとりをすることによって、証明者が本当に合言葉を知っているかを確かめていきます。

しかし、やりとりが必要となってしまうので、実際にはブロックチェーンではあまり使われません。

2 非対話型

ブロックチェーンでは、こちらがメインです。

その名の通り、対話することなく、相手の主張を検証します。

ポイントは2つのアルゴリズムを使うことにあります。

2-1 証明(proof)の作成

まずは証明者がアルゴリズムに情報を送り、証明(proof)を作成します。

https://www.altoros.com/blog/zero-knowledge-proof-improving-privacy-for-a-blockchain/

ちなみに、zkEVM「EVMのルールに則って計算している」という証明の作成に使われることになります。

2-2 証明(proof)の送付

次は、この証明(proof)を証明者検証者に送ります。

https://www.altoros.com/blog/zero-knowledge-proof-improving-privacy-for-a-blockchain/

これはzkEVMで作られた証明(proof)イーサリアム上のコントラクトに送付する際に出てきます。

2-3 証明(proof)の検証

最後に、検証者が証明(proof)を検証する関数を使って、証明(proof)を検証します。

関数からは結果が返ってきます。

https://www.altoros.com/blog/zero-knowledge-proof-improving-privacy-for-a-blockchain/

これはzkEVMで作られた証明(proof)イーサリアム上のコントラクトの関数で検証する際に出てきます。

6 非対話型の種類

さらに、非対話型には、有名なものとして、「zk-SNARK」「zk-STARK」があります。

1 zk-SNARKについて

zk-SNARK2012年に登場し、Zcashを始めとした多くのプロジェクトコード開発者が存在しています。

実際に、下の記事で扱った3つのプロジェクトは、全て「zk-SNARK」です。

一方、次の2つの問題もあります。

①量子耐性がない
②信頼されたセットアップが必要

詳細はこの記事をご参照ください。

2 zk-STARKについて

一方、zk-STARK2018年に登場しました。

zk-SNARKが抱えていた問題であった、量子耐性を持ち
「信頼されたセットアップ」も必要ありません。

有名なプロジェクトとしては「StarkNet」などがあります。

一方、zk-STARKは現時点で、ドキュメント開発者が少ないという欠点もあります。

7 EVMの機能について

では、ここからは、EVM(イーサリアム・バーチャル・マシン)の話にいきましょう。

このEVMには大きな2つの役割があります。

1 コントラクト計算(smart contract computation)

EVMは、Ethereumブロックチェーン上でスマートコントラクト実行するソフトウェア環境です。

これを「コントラクト計算(smart contract computation)」 と呼びます。

つまり、各ノード計算を行わなければなりません。

https://ethereum.org/en/developers/docs/evm/?ref=blog.thirdweb.com

2 状態計算(state computation)

EVMはまた、各スマートコントラクトを実行した後、イーサリアムチェーンの有効な状態を計算し更新します。

これは 「状態計算(state computation)」 と呼ばれます。

3 なぜ上の2つをEVMでやる必要があるのか

EVMで①計算②状態の更新をしなければいけないのは大変そうです。

なぜそれを基本的にはオフチェーンでできないのでしょうか?

それは、オフチェーンでやると、「本当にEVMのルールに則ってやっているのかが証明できない」ためです。

逆い言えば、EVM内でこの2つを行えば、EVMのルールに則ってやっていることが明らかです。

4 zkEVMを使った解決

上の問題は、オフチェーンでやることで、「本当にEVMのルールに則ってやっているのかが証明できない」ということでした。

ということは、オフチェーンであっても、それが証明できればオフチェーンでやることが可能です。

下のような構成になります。

計算はオフチェーンで行いますが、その証明(proof)EVMに送ります。(実際には、特定のコントラクト

ゼロ知識証明によって、この検証が可能であるため、EVMのルールに則ったまま、オフチェーンで行うことが可能です。

8 実際にzkEVMでコントラクトを作ってみよう!

理論が分かりましたら、後は作ってみましょう!

エンジニアの方でなくても、この記事に沿っていただければ、zkEVMコントラクトのデプロイを行うことが可能です。

なお、フロントエンドとの連携などについては、こちらをご参照ください。

ぜひやってみてください。

9 証明(proof)の検証の部分を見てみよう

では、実際の検証の部分をpolygon zkEVMを例に見てみましょう。

ちなみに、以下、テストネットで行っているので、イーサリアムとあるところは、実際にはGoerliです。

まず、下が実際のデータです。

https://goerli.etherscan.io/tx/0x217518105ed03c40affa75d8cac26f9b903ec18d0056970c7b9f1860ba7da5b7

1 送信者について

コントラクトに送るのは、アグリゲータです。

64173番から64261番までのバッチをコントラクトに送ります。

バッチの中にはトランザクションが入っています。

2 送付先コントラクトについて

送り先はイーサリアムチェーン検証を行うコントラクトのプロキシです。

(プロキシについてイメージが湧きにくい場合は、一旦は、検証を行うコントラクトに送ると考えて良いと思います。)

このコントラクトにある、検証を行う関数証明(proof)の検証を行います。

ここまでのイメージは、このようになります。

3 証明(proof)の送付について

最後に、証明(proof)を送る箇所を見てみましょう。

下のように入力データの一つに証明(proof)が含まれています。

4 コントラクト内での検証について

では、コントラクトのコードを簡単に見てみましょう。

下の、「verifyBatchesTrustedAggregator」を実行しています。

そして、この中で、「_verifyAndRewardBatches」という関数を実行しています。

「_verifyAndRewardBatches」関数はこちらになります。

この中で、proofを用いて、下のように検証を行っていることが確認できました。

以上が検証の部分になります。

詳細はこちらをご確認ください。

以上で、zkEVMについての記事を終わりにします。

最後までありがとうございました!


サポートをしていただけたらすごく嬉しいです😄 いただけたサポートを励みに、これからもコツコツ頑張っていきます😊