[EIP1344] チェーンIDを返す新オペコードを追加する提案を理解しよう！

# はじめに

初めまして。
**CryptoGames**というブロックチェーンゲーム企業でエンジニアをしている **cardene（かるでね）** です！
スマートコントラクトを書いたり、フロントエンド・バックエンド・インフラと幅広く触れています。

https://cryptogames.co.jp/

代表的なゲームは**クリプトスペルズ**というブロックチェーンゲームです。

https://cryptospells.jp/

今回は、**EIP155**に基づくチェーンのユニーク識別子を返す、新たなオペコードである`CHAINID`を提案している**EIP1344**についてまとめていきます！

:::note info
以下にまとめられているものを翻訳・要約・補足しながらまとめていきます。
:::

https://eips.ethereum.org/EIPS/eip-1344

他にも様々なEIPについてまとめています。

https://cardene.notion.site/ERC-EIP-2a03fa3ea33d43baa9ed82288f98d4a9?pvs=4

# 概要

このEIP（Ethereum Improvement Proposal、イーサリアム改善提案）は、**EIP155**によるユニークなチェーン識別子を返すオペコードを追加する内容を指しています。
**EIP155**は、トランザクションの再生攻撃を防ぐために、特定のチェーンにトランザクションを固定する方法を定義しており、各イーサリアムベースのチェーンにはユニークな識別子があります。

この提案により、コントラクトは実行中に自身がどのチェーン上にあるかを確認できるようになります。
これは、同じコントラクトが異なるイーサリアムネットワーク（例えばメインネットとテストネット）上で動作する場合に特に有用です。
チェーンの識別子を知ることで、コントラクトはネットワーク特有の処理を条件分岐で実行できるようになり、より柔軟で安全な設計が可能になります。

このオペコードの追加は、開発者がコントラクト内で直接チェーンの識別子にアクセスできるようにすることで、より効率的かつ効果的なコントラクトの開発を可能にします。
これにより、チェーン固有のロジックをコントラクトに組み込む必要がある場合の複雑さが軽減され、イーサリアムエコシステム全体の拡張性と互換性が向上します。

:::note info
**EIP155**については以下の記事を参考にしてください。
:::

https://qiita.com/cardene/items/2526432899353e4a0225

# 動機

**EIP155**は、異なるチェーン間での再生攻撃を防ぐためにチェーンIDの使用を提案しています。
特に、署名を取り扱う時に、コントラクト内で同様の可能性を持つことは大きな利点となります。
これは、**EIP712**を使用するレイヤー2の署名スキームで特に有用です。

この文脈での「**再生攻撃**」とは、あるチェーン上で有効なトランザクションが他のチェーン上でも無許可で再利用されることを指します。
**EIP155**によるチェーンIDの組み込みは、このような攻撃から保護するためにトランザクションを特定のチェーンに固定します。

コントラクトが署名を扱う時にチェーンIDを利用することで、コントラクトは署名が正しいチェーン上で生成されたものであることを確認できるようになります。
これにより、異なるチェーン間での署名の再利用を防ぎ、特に**EIP712**を利用するレイヤー2のソリューションにおいて、より高いセキュリティレベルを実現することができます。
**EIP712**は構造化されたデータの署名を可能にする標準であり、これを使用することで、ユーザーはより透明性の高い署名プロセスを体験することができます。

チェーンIDをコントラクト内で利用することによる利点は、セキュリティの向上と、異なるチェーン間でのトランザクションの信頼性を確保することにあります。
これは、イーサリアムエコシステムが多層化し、複数のチェーンやレイヤー2ソリューションが登場する中で、ますます重要になっています。

:::note info
**EIP712**については以下の記事を参考にしてください。
:::

https://qiita.com/cardene/items/f54bc85cb66de5a54257

# 仕様

新たに追加されるオペコード`CHAINID`は、アドレス`0x46`に配置され、スタックから引数を取らずに動作します。
このオペコードの主な機能は、イーサリアムネットワーク上で現在のチェーンIDをスタックにプッシュすることです。
チェーンIDは、ネットワークを特定するための`256`ビットの数値です。
このオペコードの実行には基本的なガスコスト（`G_base`）がかかります。

この機能は、ブロックチェーンの設定からチェーンIDを取得し、それが**EIP155**によって定義されたユニークな識別子と一致することを保証します。
**EIP155**は、異なるチェーン間でトランザクションが再生されるのを防ぐために、チェーンごとにユニークな識別子を設定することを提案しています。
そのため、`CHAINID`オペコードは、スマートコントラクトが現在実行されているチェーンのIDを正確に把握することを可能にし、チェーン固有のロジックを実装する際に有用です。

重要な点として、トランザクションが**EIP155**のユニークな識別子を持っていない場合でも、`CHAINID`オペコードは設定されたチェーンIDを返します。
これは、すべてのトランザクションが**EIP155**の識別子を必要とするわけではないが、スマートコントラクトが常に現在のチェーンIDにアクセスできるようにするためです。

# 補足

**EIP712**は現在、コンパイル時にチェーンIDを指定することを提案していますが、この方法にはハードフォーク後や人為的エラーによる資金の損失や署名メッセージの再生攻撃といった問題が伴います。
提案された`CHAINID`オペコードを導入することで、これらの問題を解決し、現在のチェーンIDに基づいた署名の検証が可能になります。

チェーンIDは現在、特定のネットワークに対してどのように設定されるかについての明確な仕様がなく、クライアントの実装者やチェーンコミュニティが行う手動の選択に依存しています。
分裂が発生した場合、チェーンIDを使用しているコミュニティが2つのチェーンに分裂する可能性があり、この場合、両方のチェーンで同じチェーンIDを維持することは再生保護の観点から安全ではありません。
この問題を解決するために、開発者はチェーンIDの値が更新された場合にアプリケーションがそれに対応できるようにする必要があります。
チェーンIDの変更を記録する信頼できるオラクルを実装することで、このような更新が発生した時にアプリケーションが対応できるようになります。

しかし、すべてのシナリオでグローバルオラクルを利用することが適切ではありません。
たとえば、Plasma L2パラダイムでは、オペレーターがL2ネットワークからベースチェーンにトランザクションのブロックを提出しますが、これらの提出はメインチェーンの重要なイベント、例えばチェーンIDの更新と完全には一致しません。
オペレーターがチェーンIDの更新を制御できない場合、プロトコルに大きなセキュリティリスクが生じる可能性があります。
このような分裂中にチェーンIDの振る舞いを過度に指定しようとすると、意図しない結果が生じる可能性があります。
そのため、アクセスのためのシンプルなオペコードが最適です。

提案された`CHAINID`オペコードは、この機能を実装するための最もシンプルな方法を提供し、開発者にチェーンIDの変更をグローバルまたはローカルに処理する柔軟性を与えます。
これにより、特定のネットワークやアプリケーションのニーズに応じて、最適な解決策を実装することができます。

# 互換性

このEIPは、トランザクション署名用に**EIP155**チェーンIDドメインセパレータを実装するすべてのチェーンと完全な互換性があります。

# 実装

Trinity Pythonクライアントのリファレンス実装は[こちら](https://github.com/ethereum/py-evm/pull/1803)です。

トラストレス・チェーンIDオラクルの実装例は[こちら](https://github.com/fubuloubu/chain-id-oracle/blob/master/ChainIdOracle.vy)です。

# 引用

Richard Meissner (@rmeissner), Bryant Eisenbach (@fubuloubu), "EIP-1344: ChainID opcode," Ethereum Improvement Proposals, no. 1344, August 2018. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-1344.

# 最後に

今回は「**EIP155**に基づくチェーンのユニーク識別子を返す、新たなオペコードである`CHAINID`を提案している**EIP1344**」についてまとめてきました！
いかがだったでしょうか？

質問などがある方は以下のTwitterのDMなどからお気軽に質問してください！

[Twitter @cardene777](https://twitter.com/cardene777)

他の媒体でも情報発信しているのでぜひ他も見ていってください！

https://chaldene.net/

https://zenn.dev/heku

https://mirror.xyz/0xcE77b9fCd390847627c84359fC1Bc02fC78f0e58

https://cardene.notion.site/ERC-EIP-2a03fa3ea33d43baa9ed82288f98d4a9?pvs=4