見出し画像

【完全保存版】zkEVM(polygon zkEVM Testnet)の具体的な処理を読み解こう!

0 はじめに

まずは、thirdwebを使って、polygon zkEVMERC20のコントラクトを作成しました。

https://thirdweb.com/polygon-zkevm-testnet/0xa5e5A617B3Cb9732686eb5f3Cc3AD8Ad1B85cae5/tokens

やり方がご不明な場合は、こちらの記事をご参照ください。

そして、あるウォレットに送ったTransferのトランザクションを元にみていきたいと思います。

「0xbc…」から「0xec…」「100pt」送っています。(ptはここでの単位です。)

こちらがpolygon zkEVMのエクスプローラです。

https://testnet-zkevm.polygonscan.com/tx/0x433193d5151fd57c7ee8fb47faf75c8bb6dec9443d254d711ed8233b3199e564

1 L1(イーサリアム)とのやりとりについて

L1とのやりとりをしているのは、こちらの3つになります。

それぞれを見てみましょう。

https://testnet-zkevm.polygonscan.com/tx/0x433193d5151fd57c7ee8fb47faf75c8bb6dec9443d254d711ed8233b3199e564

ただし、すぐ下に出てきますが、Batchは「polygon zkEVM」内でやっているように感じました。

2 バッチ処理について

今回のトランザクションに対応するバッチについて、トランザクションは1つしかありませんでした。

ちなみに、他のバッチも確認したところ、必ずしも1つではなく、数個のトランザクションがあるものもありました。

https://testnet-zkevm.polygonscan.com/batch/64249

ちなみに、「L1 Txn Batch Index」とありましたが、「poygon zkEVM」のエクスプローラに記載されていました。

バッチのイメージはこのようになりました。

3 シーケンス処理について

次は、シーケンス処理を確認していきます。

1 FromとToについて

まずは、FromToをこのように確認できます。

詳細は後ほど扱います。

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

2 入力データについて

次に、「Input Data」を見てみましょう。

このように、sequenceBatchesという関数が入っていることがわかります。

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

3 コントラクトアドレスについて

それをもとに、先ほどのToのアドレスを確認してみましょう。

すると、下のように、「TransparentUpgradableProxy」でしたので、「実装コントラクト」を確認していきます。

https://goerli.etherscan.io/address/0xa997cfd539e703921fd1e3cf25b4c241a27a4c7a#code

こちらになります。

先ほどの「sequenceBatches」関数もありました。

https://goerli.etherscan.io/address/0xa997cfd539e703921fd1e3cf25b4c241a27a4c7a#writeProxyContract

ちなみに、ここまでの図がこんなイメージです。

4 sequenceBatches関数について

なお、sequenceBatches関数はこちらです。

バッチが強制的に順序付けられるべきかどうかなども確認し、順序付け(シーケンス)を行なっています。

https://goerli.etherscan.io/address/0x91a7287653bd74e9e49dc2729f1b526e4c4b0d67#code

5 実装コントラクトについて

ちなみに、こちらの実装コントラクトの名前は「PolygonZkEVMTestnetV2」です。

わかりやすくて良い名前だと思いました。

https://goerli.etherscan.io/address/0x91a7287653bd74e9e49dc2729f1b526e4c4b0d67#code

6 信頼されたシーケンサーについて

ちなみに、「trustedSequencer」を見てみると、このように、「0x33…e7」であることがわかりました。

https://goerli.etherscan.io/address/0xa997cfd539e703921fd1e3cf25b4c241a27a4c7a#readProxyContract

つまり、先ほど実行していた「From」「TrustedSequencer」であったことがわかりました。

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

こんな感じですね。

4 バッチ検証処理について

では、最後にバッチの検証(verify)処理について見てみましょう。

1 コントラクトアドレスについて

「To」は先ほどのシーケンス処理と同じですが、「From」が違うようです。

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

2 信頼されたアグリゲータについて

結論としては、こちらは「trustedAggregator」です。

https://goerli.etherscan.io/address/0xa997cfd539e703921fd1e3cf25b4c241a27a4c7a#readProxyContract

つまり、こういうことだったのですね。

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

3 入力データについて

では「input Data」を見てみましょう。

まずは、「verifyBatchesTrustedAggregator」という関数が入っています。

信頼されたアグリゲータがバッチを検証すると言った予測ができますね。

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

現状、このようなイメージですね。

ちなみに、「Input Data」をデコードしたものがこちらです。

まずは64173番から64261番までのバッチがまとめられているということがわかりました。

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

そして、新しいステートルートも渡しています。

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

そして、極め付けが、「proof」です。

これをもとに検証しているのだと推測できます。

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

4 verifyBatchesTrustedAggregator関数について

では、「verifyBatchesTrustedAggregator」関数を見てみましょう。

https://goerli.etherscan.io/address/0x91a7287653bd74e9e49dc2729f1b526e4c4b0d67#code

見てみると、内部関数の「_verifyAndRewardBatches」を使っていたり、「newStateRoot」batchNumToStateRootの最後のバッチに適用したりしています。

https://goerli.etherscan.io/address/0x91a7287653bd74e9e49dc2729f1b526e4c4b0d67#code

つまり、newStateRootとは最後のバッチ(今回は64261番)のステートルートであることが確認できました。

64261番のバッチはこちらです。

「State Root」「0x47…df」となっています。

https://testnet-zkevm.polygonscan.com/batch/64261

これが、下のように、引数として渡している「newStateRoot」と一致していることが確認できました。

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

5 _verifyAndRewardBathches関数について

内部関数である、「_verifyAndRewardBathches」関数についても、少し見てみましょう。

https://goerli.etherscan.io/address/0x91a7287653bd74e9e49dc2729f1b526e4c4b0d67#code

このように、ゼロ知識証明としては、「SNARK」を使い(zk-SNARK)検証していることが確認できました。

https://goerli.etherscan.io/address/0x91a7287653bd74e9e49dc2729f1b526e4c4b0d67#code

以上で確認が終わりました。

今回は、polygon zkEVMがL1とのやりとりで行っている

①バッチ処理
②シーケンス処理
③検証処理

について確認をしていきました。

以上です。

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