イーサリアム、Glamsterdamのガス再価格設定がコントラクトの前提を崩す中、Hoodiテストネットのフォークを保留
重要ポイント
- •コア開発者は、ChainSecurityが指摘した問題が解決されるまで、GlamsterdamアップグレードのHoodiテストネットフォークを延期しており、新たな日付は発表されていない。
- •EIP-8037とEIP-8038は状態関連のガスコストを大幅に引き上げ、新規ストレージスロットの書き込みは22,100から110,020ガスへ、コードのデプロイは1バイトあたり200から1,530ガスへ上昇する。
- •失敗したEIP-7702デリゲーション取引は依然有効な承認を公開しうり、デリゲートコントラクトが誰でもセットアップ関数を呼び出せる場合、攻撃者がアカウントの所有権を主張できる可能性がある。
- •フォーク前に固定されたガス量は不足する可能性があり、今日65,000ガスで収まる送金に150,000以上が必要になることがあり、初回受取人への送金で最も起こりやすい。
- •財団はこの再価格設定を、ベーススループット約3倍の性能目標に基づくさらなるガスリミット引き上げの前提条件と位置付けており、今後の開発者コールでいずれかのEIPが修正される可能性もある。

イーサリアム財団の開発者Marius van der Wijden氏は、11月6日のアップデートで、セキュリティ企業ChainSecurityが特定した問題が解決されるまで、コア開発者はHoodiテストネットをフォークしないと述べた。Hoodiは、イーサリアムがプロトコル変更をメインネットに展開する前にリハーサルを行う公開テストネットワークである。同氏は、コントラクト開発者と監査人に対し、今後のGlamsterdamアップグレードが崩す8つのガス不変条件についてプロジェクトを確認するよう求めた。ガスはイーサリアムが取引が実行するすべての操作に価格を付ける単位であり、その価格が動けば、古い数値を前提に書かれたコードは、コード自体が変わらなくても異なる挙動を示す可能性がある。
この文脈での不変条件とは、コードが常に真であるとみなす規則のことである。例えば「固定のガス予算がこの呼び出しには十分である」や「マイニングされたデリゲーションは適用済みである」など。財団の不変条件リポジトリは、Glamsterdamで変化する8つの前提を列挙しており、これまでの発見の大部分はそのうち2つに関するものだとしている。
2つの提案がガスコストを再形成
この変更を牽引するのは2つの提案だ。EIP-8037は新しい状態、すなわち新規アカウント、ストレージスロット、デプロイされたコードの作成価格を引き上げ、通常の実行とは別に計測する。EIP-8038は既存の状態の読み取り・更新の価格を引き上げる。リポジトリがテスト対象とする仕様では、未使用ストレージスロットへの書き込みは22,100ガスから110,020へ、ウォーム状態の既存スロットの更新は2,900から10,100へ、コードのデプロイは1バイトあたり200ガスから1,530へ上昇する。これらの数値は仕様が変われば変動する。
Glamsterdamテストの停止は、ChainSecurityの10月13日のレビューに続くもので、以前にも報告した通りである。リポジトリはこれらの発見に加え、コントラクトソースコードの公開レジストリSourcifyで検証済みのコントラクトに対する財団自身のスキャン結果や、取引レシートを読み取るソフトウェアなどのオフチェーンのケースを反映している。
マイニングされた取引はデリゲーションの適用を証明しなくなる
EIP-7702は、通常のイーサリアムアカウントが、デリゲートコントラクトを指す承認に署名することでスマートコントラクトコードを実行できるようにする仕組みだ。この仕組みは2025年のPectraアップグレードで導入され、それ以降ウォレットが展開してきたスマートアカウント機能の基盤となっている。承認は1回のみの使用を想定している。Glamsterdam以前はその全コストが前払いだったため、支払えない取引は無効となりブロックに入ることはなかった。取引がマイニングされていれば、デリゲーションは適用済みだった。
リポジトリのINV-8エントリは、EIP-8037が変える内容を説明している。コストの一部は現在、アカウントの状態に依存し、承認の処理中にのみ課金される。空のアカウントからのデリゲーションは235,606ガスかかり、以前は25,000だった。旧数値で予算化された取引は受理され、承認の適用中にガスを使い切り、失敗ステータスのままブロックに入る可能性がある。デリゲーションは取り消され、承認を使用済みとするカウンターであるアカウントのノンスの増加も取り消される。しかし、署名済みの承認は公開され、依然として有効なままだ。
それ自体はウォレットが未設定のままになるだけで、侵害されたことを意味しない。危険が生じるのは、デリゲートコントラクトが誰でもそのセットアップ関数を呼び出せる場合だ。攻撃者は露出した承認を自身の取引で再提出し、セットアップを先に呼び出して自分をアカウントのオーナーにすることができる。公開メンプールでの承認のフロントランニングは以前から可能だった。リポジトリの指摘は、失敗した取引がそれ自体で有効な承認を公開するため、プライベートにルーティングしても保護にならないという点だ。このパターンはサンプルコードとともに文書化されており、影響を受けたウォレットは特定されていない。
実務上の変更はウォレット、リレイヤー、インデクサーに及ぶ。リポジトリは、レシートを信用するのではなく、デリゲーション取引後にアカウントのコードとノンスを確認することを推奨している。失敗した承認は露出済みとして扱い、アカウントのノンスを進めるか、安全なコントラクトに再度デリゲートすることで取り消すべきだ。最悪ケースのコストを前払いする仕様変更が提案されているが採用されておらず、開発者は現在の挙動が続く前提で構築するよう求められている。
ガス予算はコントラクト外にあることも多い
最も広範なエントリであるINV-4は、フォーク前に固定されたあらゆるガス量を対象とする。その数値がどこに書かれていても、コントラクトコード、設定値、署名済みメッセージ、オフチェーンソフトウェアのいずれであっても、現在は不足する可能性がある。最後のグループには、ユーザーの代わりに取引を提出するサービスであるリレイヤーや、キーパーや取引所の出金システムが含まれる。
初回受取人が最も一般的な引き金となる。残高ゼロのアドレスへのトークン送金は新しい残高スロットを作成し、空のアドレスへのETH送金は新しいアカウントを作成するが、どちらもEIP-8037でははるかに高く価格付けされる。リポジトリによれば、今日65,000ガスで収まる送金に150,000以上が必要になる可能性があるという。
固定数値がどこにあるかが、不足の深刻さを左右する。オフチェーンソフトウェアでは取引全体が取り消され、より多くのガスを付けて再送できる。コントラクト、その設定、署名済みメッセージでは、内側の呼び出しのみが失敗する。外側のコントラクトがその失敗を捕捉した場合、結果はしばしば最終的なものとなる。失敗として記録されたメッセージ、スキップされたコールバック、誤って計上された報酬などだ。フォーク前に署名されたマルチシグ取引、署名済みメタ取引、すでに送信済みのクロスチェーンメッセージを含め、これらの数値にはまったく編集できないものもある。
INV-7は同じ問題を予約されたガスに適用する。Solidityのtransferとsend関数は固定の2,300ガスを渡すが、新しいストレージスロットを書き込む受取側コントラクトは現在110,000以上を必要とする。スマートウォレット、ペイメントスプリッター、receive関数にロジックを持つボルトが明白な候補だ。
以前は取り消されていた失敗パスが完走しうる
ChainSecurityの10月13日の分析は、過去の監査を通過した一部の保護機構が機能しなくなる可能性がある理由を説明している。コントラクトは失敗を記録したり項目をスキップしたりフォールバックを試みたりするため、失敗した外部呼び出しを捕捉することが多い。誰かが意図的にガスを過少供給した場合、意図的なガス不足攻撃と呼ばれる攻撃であり、再試行可能であるべき操作が恒久的な失敗として記録されるため、これが危険となる。
コントラクトは通常、この攻撃に2つの方法で防御している。呼び出し後に残ガスを確認するものと、失敗ハンドラが完走するにはコストが高すぎることに依存するものだ。Glamsterdamは両方を弱体化させる。EIP-8037は、ガスリミットが16,777,216を超える取引に、通常のgasleft()チェックでは見えないストレージコスト用の独立したリザーバを与える。呼び出しの取り消しや新規書き込みスロットのクリアでも、消費済みガスが返還されることがある。ChainSecurityの言葉を借りれば「コントラクトコードが変わらなくても、以前は取り消されていた失敗パスが現在は完走しうる」。
同社は現在、呼び出し後の残ガスから失敗理由を推測しないよう助言している。同社の推奨アプローチは、可能な限り操作全体を取り消すか、残ガスに基づいて不可逆的な決定を下す代わりにリカバリーパスを確保することだ。
過去の監査だけではこのギャップを埋めることはできない。監査は当時有効だったガス規則に基づいてコードを評価したからだ。財団は内部監査に加えてChainSecurityとDedaubを起用しているが、11月6日の投稿は、特にオフチェーンコードについてはすべてのプロジェクトをレビューできないと認めている。設計上の選択も修正の形を左右する。調整可能な設定として保存されたガスリミットは単純に引き上げられるが、固定定数として書き込まれた場合は、再デプロイと移行が唯一の道となる可能性がある。
イーサリアムが再価格設定を推し進める理由
財団のこの変更についての論拠は価格設定の正確さにある。コントラクト開発者向けの8月のガイダンスによれば、状態操作のガス価格は2021年のBerlinフォークが最後の調整だった。これは状態の読み取りに関する現行のコールド/ウォーム価格設定を確立したフォークである。ノードが追跡するアカウント、残高、コントラクトストレージの実行記録であるイーサリアムの状態は、それ以来大幅に成長しており、最近のガスリミット引き上げがその成長を加速させた。投稿はこの再価格設定をさらなるガスリミット引き上げの前提条件と位置付け、新しい料金体系はベーススループットを約3倍にする性能目標から導出されたと述べている。
同じ投稿は、新しい価格での過去のメインネット取引のリプレイでは大多数が変化せず、指摘された問題のほとんどはガスリミットの引き上げで対処できると報告した。一般ユーザーには対応不要と伝えられた。更新されたウォレットとインフラが変更に対応するためだ。11月の調査結果は、この最後の条項により重みを置いている。変更への対応には現在、失敗したデリゲーション後のアカウント状態の確認や、初回受取人向けのリレイヤー予算の適正化が含まれるが、旧ガス規則では求められなかった作業である。
次回のコアデベロッパーズコールが決めること
リポジトリによれば、財団は次回のオールコアデベロッパーズコール、すなわちイーサリアムのプロトコル変更が合意される常設のフォーラムに先立ちフィードバックを収集している。反応次第で、EIP-8037とEIP-8038を若干修正するか、現状のままにする可能性がある。問題が解決されるまでHoodiはフォークされず、11月6日の投稿は新たな日付を示していない。同じ投稿によると、Glamsterdamの次に予定されているアップグレードであるHegotaの作業は並行して続いている。
Hoodiフォーク前のチェック項目
- コントラクトチーム: 財団の影響を受けるコントラクトの検索ツールにアドレスを入力し、リストの有無にかかわらず、ガス値をハードコードしているコードや残ガスで分岐するコードを確認する。
- ウォレットとRPCプロバイダー: 新しい料金体系に合わせてガス見積もりを更新する。財団は、キャッシュされたガス定数がコストを過小評価し失敗取引を引き起こすと警告している。
- リレイヤー、キーパー、バンドラー: リミットを調整可能にし、マージンを付けて新しい規則で再見積もりし、リザーバ閾値の両側で取引をテストする。
- 監査人: リポジトリには、AIコーディングエージェントでチェックを実行する手順が含まれており、コードと結果はローカルに保持される。
注視すべきシグナルは、財団ブログに掲載されるHoodiフォーク日、いずれかのEIP仕様の改訂、影響を受けたプロジェクトによる修正確認である。財団は、詳細が広まる前に問題を修正できるよう、公開イシューではなくglamsterdam@ethereum.orgへの非公開報告をチームに求めている。
この記事は元々Coindooに掲載されたものです。