【完全保存版】zkEVM(polygon zkEVM Testnet)の具体的な処理を読み解こう!
0 はじめに
まずは、thirdwebを使って、polygon zkEVMでERC20のコントラクトを作成しました。
やり方がご不明な場合は、こちらの記事をご参照ください。
そして、あるウォレットに送ったTransferのトランザクションを元にみていきたいと思います。
「0xbc…」から「0xec…」に「100pt」送っています。(ptはここでの単位です。)
こちらがpolygon zkEVMのエクスプローラです。
1 L1(イーサリアム)とのやりとりについて
L1とのやりとりをしているのは、こちらの3つになります。
それぞれを見てみましょう。
ただし、すぐ下に出てきますが、Batchは「polygon zkEVM」内でやっているように感じました。
2 バッチ処理について
今回のトランザクションに対応するバッチについて、トランザクションは1つしかありませんでした。
ちなみに、他のバッチも確認したところ、必ずしも1つではなく、数個のトランザクションがあるものもありました。
ちなみに、「L1 Txn Batch Index」とありましたが、「poygon zkEVM」のエクスプローラに記載されていました。
バッチのイメージはこのようになりました。
3 シーケンス処理について
次は、シーケンス処理を確認していきます。
1 FromとToについて
まずは、FromとToをこのように確認できます。
詳細は後ほど扱います。
2 入力データについて
次に、「Input Data」を見てみましょう。
このように、sequenceBatchesという関数が入っていることがわかります。
3 コントラクトアドレスについて
それをもとに、先ほどのToのアドレスを確認してみましょう。
すると、下のように、「TransparentUpgradableProxy」でしたので、「実装コントラクト」を確認していきます。
こちらになります。
先ほどの「sequenceBatches」関数もありました。
ちなみに、ここまでの図がこんなイメージです。
4 sequenceBatches関数について
なお、sequenceBatches関数はこちらです。
バッチが強制的に順序付けられるべきかどうかなども確認し、順序付け(シーケンス)を行なっています。
5 実装コントラクトについて
ちなみに、こちらの実装コントラクトの名前は「PolygonZkEVMTestnetV2」です。
わかりやすくて良い名前だと思いました。
6 信頼されたシーケンサーについて
ちなみに、「trustedSequencer」を見てみると、このように、「0x33…e7」であることがわかりました。
つまり、先ほど実行していた「From」が「TrustedSequencer」であったことがわかりました。
こんな感じですね。
4 バッチ検証処理について
では、最後にバッチの検証(verify)処理について見てみましょう。
1 コントラクトアドレスについて
「To」は先ほどのシーケンス処理と同じですが、「From」が違うようです。
2 信頼されたアグリゲータについて
結論としては、こちらは「trustedAggregator」です。
つまり、こういうことだったのですね。
3 入力データについて
では「input Data」を見てみましょう。
まずは、「verifyBatchesTrustedAggregator」という関数が入っています。
信頼されたアグリゲータがバッチを検証すると言った予測ができますね。
現状、このようなイメージですね。
ちなみに、「Input Data」をデコードしたものがこちらです。
まずは64173番から64261番までのバッチがまとめられているということがわかりました。
そして、新しいステートルートも渡しています。
そして、極め付けが、「proof」です。
これをもとに検証しているのだと推測できます。
4 verifyBatchesTrustedAggregator関数について
では、「verifyBatchesTrustedAggregator」関数を見てみましょう。
見てみると、内部関数の「_verifyAndRewardBatches」を使っていたり、「newStateRoot」をbatchNumToStateRootの最後のバッチに適用したりしています。
つまり、newStateRootとは最後のバッチ(今回は64261番)のステートルートであることが確認できました。
64261番のバッチはこちらです。
「State Root」は「0x47…df」となっています。
これが、下のように、引数として渡している「newStateRoot」と一致していることが確認できました。
5 _verifyAndRewardBathches関数について
内部関数である、「_verifyAndRewardBathches」関数についても、少し見てみましょう。
このように、ゼロ知識証明としては、「SNARK」を使い(zk-SNARK)、検証していることが確認できました。
以上で確認が終わりました。
今回は、polygon zkEVMがL1とのやりとりで行っている
①バッチ処理
②シーケンス処理
③検証処理
について確認をしていきました。
以上です。
サポートをしていただけたらすごく嬉しいです😄 いただけたサポートを励みに、これからもコツコツ頑張っていきます😊