本文へ移動

チェーンID

EVMチェーンID、EIP-155のレガシートランザクションにおけるリプレイドメイン、型付きトランザクション、CHAINID、ウォレットとRPCの検証、EIP-712ドメイン、非EVMネットワーク識別子を検証優先で解説します。

更新日

教育目的の情報であり、投資、法律、セキュリティ上の助言ではありません。チェーンIDの一致は所定のリプレイリスクを軽減しますが、RPC、ネットワーク、コントラクト、資産、署名要求、最終状態の真正性を証明するものではありません。

直接の答え

EVMエコシステムにおけるチェーンIDは、リプレイドメインのパラメーターとして設定される整数です。EIP-155は保護されたレガシートランザクションの署名にこの値を結び付けます。タイプ2などの型付きトランザクションは、それぞれの署名対象ペイロードにこの値を符号化します。CHAINIDはEVM実行中にこの値を公開し、eth_chainIdはJSON-RPCを通じてこの値を返します。これらは相互に関連するインターフェースであり、普遍的な身元証明書ではありません。

この値は世界全体で一意または恒久的であるとは限りません。プライベートネットワークや争いのあるフォークは値を再利用でき、RPCが虚偽を返す場合もあります。同じアドレスでもチェーンごとにコードや状態が異なり得ます。EIP-712のチェーンIDドメインフィールドは任意であり、生のメッセージや非EVMシステムには別のリプレイ防止規則とネットワーク識別規則があります。したがって、正しく利用するには、具体的な署名方式、エンドポイント、ジェネシスまたはチェックポイント、アプリケーションドメインを確認する必要があります。

仕組み

  1. まずエコシステムと識別子の意味を特定します。EVMのEIP-155整数、EIP-712ドメイン、CAIP-2の名前空間付き参照、Cosmosの文字列チェーンID、Solanaのジェネシスハッシュなどがあります。名前空間のない数値をエコシステム間で比較してはいけません。
  2. 信頼できるネットワークのスナップショットを固定します。RPC URL、想定チェーンIDの10進表記と16進表記、ジェネシスまたはファイナライズ済みチェックポイント、先頭ブロック、クライアント設定、重要なコントラクトの codeHash、情報源の時刻を記録します。ウォレットのネットワーク名とアイコンは信頼できないメタデータです。
  3. EVM署名では eth_chainId を照会し、JSON-RPCの16進数量を精度を失わずに解析します。正規化した整数を想定設定およびウォレットプロバイダーの状態と比較します。net_version で代用せず、不一致なら署名を構築する前に拒否します。
  4. 正確な署名ドメインを再構築します。保護されていないレガシートランザクション、EIP-155で保護されたレガシー符号化、型付きエンベロープを区別します。EIP-712ではドメインフィールド、verifyingContract、nonce、期限を確認し、リレー式またはスマートアカウントのインテントでは内部のプロトコルハッシュを調べます。
  5. アクティブなチェーン上の実行対象を確認します。受取人、価値、calldata、トークンアドレス、コントラクトコードまたはプロキシ実装、アカウントnonce、手数料、シミュレーション状態を確認します。チェーンIDはドメインを分離しますが、これらの真正性を証明しません。
  6. EIP-1193の chainChanged、アカウント変更、切断を厳格な状態境界として扱います。キャッシュした価格提示、アローワンス、nonce、シミュレーション、署名要求を破棄し、チェーンと対象を再取得して、確認済みの生トランザクションだけを固定したエンドポイントへ送信します。
  7. 対象チェーン上で取引を照合します。署名済み生データとハッシュ、RPCの受理結果、レシートのステータス、ブロック番号とハッシュ、nonceの使用、状態変化、必要なファイナリティを確認します。チェーン分岐、ID変更、L1/L2ドメインの混同、プロバイダーのずれを監視し、説明できない差異があれば処理を停止します。

計算例

  • 16進数と10進数によるRPCの確認。 Baseの10進チェーンIDは 8453 であり、eth_chainId では 0x2105 と表されます。すなわち 2 * 4096 + 1 * 256 + 0 * 16 + 5 = 8453 です。Ethereumメインネットは 1 = 0x1、Arbitrum Oneは 42161 = 0xa4b1 です。ウォレットが 8453 を想定しているのに 0x1 を受け取った場合、表示されたネットワーク名を信用せず、署名前に中止しなければなりません。
  • 保護されたレガシートランザクションのv。 EIP-155レガシートランザクションでは v = 35 + 2 * chainId + yParity です。チェーンIDが 1 なら値は 37 または 38、チェーンIDが 61 なら 157 または 158 です。逆算すると floor((37 - 35) / 2) = 1 です。この計算は型付きトランザクションのy-parityフィールドにも、27 または 28 を使う保護されていないレガシー署名にも適用できません。
  • 型付きトランザクションと誤ったチェーンでの拒否。 タイプ2のペイロードは chain_id=8453 に結び付けられています。21,000 gas、ベースフィー 20 gwei、最大プライオリティフィー 2 gwei、最大フィー 30 gwei の場合、実効ガス価格は min(30, 20 + 2) = 22 gwei、手数料は 21,000 * 22 gwei = 0.000462 ETH です。規則を正しく適用しIDが 1 に設定されたチェーンは、署名ドメインの不一致によりこのペイロードを拒否するため、拒否自体にそのチェーン上のガス代は発生しません。ID 8453上でも別の理由で失敗する可能性があります。
  • 非EVMと二重の識別子。 Cosmos EVMのデプロイでは、Cosmos SDKの文字列ID local-1 と独立したEVM整数ID 262144 = 0x40000 を併用できます。Cosmosネイティブ署名は文字列とアカウント番号およびsequenceを使用し、EVMトランザクション署名は整数ドメインを使用します。Solanaはジェネシスハッシュを公開し、EIP-155整数ではなく、トランザクションメッセージ内のrecent blockhashまたはdurable nonceを使用します。

リスク

  • 誤ったRPCエンドポイントまたはウォレットのアクティブチェーンへ接続する。
  • チェーンID、状態、送信結果について虚偽を返す悪意あるRPCを信用する。
  • チェーンIDの16進表記と10進表記を混同する。
  • 大きなチェーンIDを安全でない数値型で解析して精度を失う。
  • net_version が常に eth_chainId と等しいとみなす。
  • EIP-1193の chainChanged イベントまたはネットワーク切替時の競合を見落とす。
  • 切替後もキャッシュ済みnonce、価格提示、承認、シミュレーションを再利用する。
  • チェーンIDが世界的に登録され、衝突しないと仮定する。
  • 同じチェーンIDを再利用するプライベートネットワークやフォーク間で署名する。
  • フォークがIDを変更または維持した場合の動作を定義しない。
  • EIP-155ドメインのない保護されていないレガシートランザクションを受け入れる。
  • レガシーの v 式を型付きトランザクションや他の署名へ適用する。
  • 生メッセージまたは personal_sign 要求にチェーンドメインが含まれると仮定する。
  • EIP-712ドメインのチェーンIDを省略または誤って符号化する。
  • verifyingContract、アプリケーションnonce、期限、目的を省略する。
  • 同一のコントラクトアドレスを、コードと状態を比較せずに信用する。
  • L1、L2、ブリッジの送信元と移転先の署名ドメインを混同する。
  • リレー式インテント、permit、スマートアカウント操作の内部ドメインを無視する。
  • ウォレット追加時のメタデータ、エクスプローラーのラベル、アイコンをネットワーク認証とみなす。
  • EVMの意味論をCosmos、Solana、Bitcoinなどへそのまま移植する。

よくある誤解

  • チェーンIDは世界的に一意かつ恒久的な公式登録番号である。
  • 正しいチェーンIDがRPCエンドポイント、ネットワーク、コントラクトの真正性を証明する。
  • すべてのEthereum署名は自動的にチェーンIDへコミットする。
  • 異なるチェーンIDは、あらゆる署名メッセージとアプリケーションインテントのリプレイを防ぐ。
  • すべてのブロックチェーンがEIP-155形式の整数チェーンIDを使う。

関連トピック

出典

ナビゲーション

Wiki を検索...