詳解Optimism

こんにちはCryptoGames Inc.の<a href="https://twitter.com/yamapyblack">yamapyblack</a>です。
最近FrontierDAOというDAOを立ち上げました。フルオンチェーンゲーム作ってます。
https://medium.com/@yamapyblack/full-on-chained-game-by-frontierdao-b8e50549811d

今回はLayer2のOptimisticRollupの「Optimism」を取り上げます。
Optimismのexplorerやコントラクトを実際に見ながら、Rollupの仕組みを見ていきたいと思います。
※ざっくりLayer2に関する知識がある方を対象としています

# Optimistic Ethereum Explorer

OptimismのExplorerはこちらです。
https://optimistic.etherscan.io/

パッと見た感じ、L1のEtherscanと変わらんやん、と思いかもしれませんが、結構カスタマイズされています。

まず一番左から。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117960/df19c862-7614-fd10-a517-52704e032c16.png)

「<b>ブロックナンバーは？</b>」
この「Ba」ってやつがブロックナンバーに見えるんですが、実は違います。クリックすると「Batch Index」であり、ブロックナンバーではないんですね。

ブロックナンバーみたいなもんじゃん？と思うかもしれませんが、<b>間隔が一定ではありません</b>。
画像を見ると、9分、3分、9分、3分となっており、一定ではないようです。

Optimismは決まった時間で生成されるBlockはなく、処理したトランザクションをまとめて送っているだけなので、こうなってます。

トランザクションのところをクリックすると、以下画面に飛びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117960/ff562e7b-3b70-a0a6-84e1-0e4de7e4be76.png)

Indexがカウントアップしてますね。シーケンサによって作られていることがわかります。

続いて、Hashのところをクリックしてみましょう。Rollup先の<b>L1のトランザクションが見れます</b>。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117960/b2e6567f-2577-2b8d-bbca-80c32a3ef89d.png)

※L1のEtherscanに飛んでます。

なるほどー、L2の複数トランザクションをまとめてL1にRollupしている。それをExplorerから見ることができるんですね。

# Rollup先のコントラクトは？

Rollupのトランザクションを見ればわかるのですが、「CanonicalTransactionChain」というコントラクトの「appendSequencerBatch」を実行しています。

https://etherscan.io/address/0x5e4e65926ba27467555eb562121fac00d24e9dd2#code

githubはこれだと思います。
https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L1/rollup/CanonicalTransactionChain.sol#L276

引数はないように見えますが、calldataの中身を分解して、実際のデータは「<b>ChainStorageContainer</b>」に入れています。

internalトランザクション
https://etherscan.io/tx/0x2a6914c453dd775eca6b50391795db895746a38e2e5c58abc433827aa217dda8/advanced#internal

中身あまり見てないですが、txのMarkleRootと、tx数などを入れているようです。

# State

ここまでトランザクションのRollupを見てきましたが、OptimisticRollupでは、txとstateをL1に書き込んでいます。Stateのほうも見てみましょう。

https://etherscan.io/address/0xBe5dAb4A2e9cd0F27300dB4aB94BeE3A233AEB19

「<b>StateCommitmentChain</b>」というコントラクトのappendStateBatchを実行しています。

https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L1/rollup/StateCommitmentChain.sol#L85

こちらはbyte配列でいれています。
実際のデータは「<b>ChainStorageContainer</b>」に入れています。txを保存しているコントラクトと同じコントラクトですが、コントラクトは2個存在し、異なるアドレスとなっています。
以下にoptimsimのコントラクトアドレス一覧があります。

https://github.com/ethereum-optimism/optimism/tree/develop/packages/contracts/deployments/mainnet#readme

# チャレンジはどうなってるの？

Optimismのドキュメントを読むと、BondManagerにシーケンサのETHが担保としてプールしていて、チャレンジ成功するとそのETHがスラッシュされると記載があります。

BondManagerはこちら
https://etherscan.io/address/0xcd626E1328b41fCF24737F137BcD4CE0c32bc8d1#code

うーん、みた感じプールされてない？ですかね。。。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117960/3eae62bb-3a94-4c9a-69b1-e62983161e12.png)

isCollateralizedというfunctionがあったので、シーケンサのアドレス「0x473300df21D047806A082244b417f96b32f13A33」を入れてみたところ、trueとなりました。
担保していると言い張っているようです。

ここがtrueじゃないとrollUpのtxを起こせないので、まあ当然といえば当然です。が、実際は担保していないように見えます。
Optimismが「Proofs disabled」になっているのは、こーゆーことなんでしょうかね。

https://l2beat.com/?view=risk

# まとめ

optimismがtxとstateをきちんとRollupしていることがわかりました。
explorerを見れば、L2のどのtxがL1のRollupに対応するか簡単にわかっていいですね。
ただ、チャレンジのしくみはまだ整っていないようなので、そこが早くLIVEになることが期待されます！