原文
EIP-8295: State Tiering by Periods — weiihann (2026-06-10)
EIP-8295: 期間によるステートの階層化
EIP(Ethereum 改善提案)-EIP(Ethereum 改善提案)-8295は、EIP(Ethereum 改善提案)-8188が記録する書き込み年齢シグナルに価格を付けます。約1年間触れられていないステートへの書き込みは、最近変更されたステートへの書き込みよりもコストが高くなります。読み込みは変更されません。何も削除されたり期限切れになったりすることはなく、非アクティブなステートへの書き込みがより高価になるだけです。
EIP-8295の機能
EIP-8188から last_written_block を読み取り、それをティア(階層)に変換します。
-
periodはブロックの粗いバケットであり、period = (block_number - PERIOD_START_BLOCK) // PERIOD_LENGTHと定義されます。 -
アイテムは
current_period - last_written_period < INACTIVE_MIN_AGEの場合 Active(アクティブ)であり、それ以外の場合は Inactive(非アクティブ)です。デフォルトのターゲットでは、これは約1年以内に書き込まれたことを意味します。 -
Activeなステートへの書き込みは、今日とまったく同じように通常のガス(gas)コストがかかります。Inactiveなステートへの書き込みは、通常のガスに加えて
INACTIVE_ACCOUNT_WRITE_SURCHARGEまたはINACTIVE_STORAGE_WRITE_SURCHARGEがかかります。このサーチャージ(surcharge)は追加であり、置き換えではありません。 -
ティアは書き込み前に評価されます。Inactiveなアイテムは一度サーチャージを支払い、書き込みによってその
last_written_blockが更新されるため、その後の書き込みではActiveになります。 -
読み込みは変更されず、これはEIP-2929のウォーム/コールドキャッシュの区別とは独立しており、読み取りアクセスは引き続きEIP-2929によって管理されます。
サーチャージは通常の実行ガスと同様に振る舞います。返金不可であり、コールフレームが後にリバート(取り消し)されても消費されます。書き込みがリバートされたフレーム内で発生した場合、EIP-8188フィールドの更新もステートの残りの部分と共にリバートされるため、アイテムはInactiveのままであり、後の書き込みで再度支払うことになります。
ステートの作成は階層化されません。新しいステートの作成はEIP(Ethereum 改善提案)-8037によって価格設定され、サーチャージは、Inactiveなステートを復活させる方法が、新しいステートを割り当てるよりも同じノードリソースを消費する安価な方法にならないように調整されるべきです。
なぜ価格設定が必要なのか
EIP-8188単独ではストレージのヒントに過ぎません。クライアントがデータベースを階層化することを可能にしますが、誰もが支払うものを変更しないため、根本的な誤った価格設定が残ります。
-
更新年齢は価格設定されていません。 何年も触れられていないステートへの書き込みは、昨日触れられたステートへの書き込みと同じコストがかかります。古い書き込みはより深いデータベースパスを引き込み、クライアントのホット/コールド分離を無効にするにもかかわらずです。一律のコストは、アクティブなセットには過剰に課金し、長期間使われていないステートへの変更には過少に課金します。
-
放棄されたステートは補償されないコストを課します。 一度書き込まれたステートは永続的に残り、継続的なストレージとルックアップの負担はノードオペレーターに課せられますが、作成者からの継続的な貢献はありません。更新年齢サーチャージは、プロトコル内での期限切れや削除なしに、継続的なコストシグナルを提供します。
-
クライアントローカルなシグナルは価格設定できません。 クライアントは書き込み年齢をプライベートに追跡できますが、コンセンサス価格がなければ、攻撃者は深くコールドなステートを安価に変更し、すべてのノードのコミットおよびストレージコストを膨らませることができます。EIP(Ethereum 改善提案)-8188フィールドに対してコンセンサスで価格設定することで、これを防ぎます。
なぜ生のブロック番号ではなく期間なのか
EIP-8188は生のブロック番号を保存します。これは最も粒度が細かく、ポリシーに依存しない記録だからです。価格設定にはその解像度は必要ありません。固定長の期間にバケット化することで、決定の粗さ(Active/Inactiveの境界のみが重要)と一致し、アイテムのティアがブロックごとではなく期間の境界でのみ変更されるため、ガス見積もりにとってティアが安定します。期間パラメータは8295内に完全に存在するため、保存されるメタデータは価格設定ポリシーから解放され、2つの提案は異なるタイムラインで進めることができます。
FAQ
読み取り専用だが頻繁にアクセスされるステートはどうなりますか?
読み取りコストは今日と同じです。ティアは書き込みのみに影響します。頻繁に読み取られるが一度も書き込まれないコントラクトは変更がなく、そのティアは時間とともにInactiveに移行しますが、結果は何もありません。唯一影響を受けるのは、常に読み取られるがめったに書き込まれないステート(例えば、年に一度更新される設定値)です。その年次更新はInactiveコストを支払うか、所有者が更新してActiveに保ちます。
ユーザーはステートをActiveに保つために書き換え続けるだけではないですか?
はい、それが目的です。更新年齢価格設定は、将来の書き込みを安価にしたい当事者が継続的にステートを維持するコストを支払うようにします。スロットをActiveに保ちたいなら、更新費用を支払います。そうしないなら、最終的な書き込みでInactiveコストを支払います。Activeセットはプロトコルによって厳密に制限されませんが、更新期間中に利用可能なガスによって経済的にレート制限されます。最も安価な更新が、期間ごとにActiveに保てる量の上限を設定します。今日のメインネットでは、その上限は現在の総ステートよりもはるかに低い値です。
悪意のあるアクターがすべてのステートを永遠にActiveに保とうとしたらどうなりますか?
更新費用を支払うことで、一部をActiveに保つことは可能です。これは設計通りです。問題は、攻撃者がどれだけ多くのステートをActiveに保てるか、そしてそのコストはいくらかです。
アカウントの場合、潜在的に多くのアカウントを作成し、最小限の価値の転送で更新できます。ストレージの一部はERC(Ethereum Request for Comments)-20残高や他の公開書き込み可能なコントラクトステートを通じて間接的に更新できます。したがって、最悪のケースは、すべての古いステートがInactiveになることではありません。最悪のケースは、大量のステートがActiveのままになる今日の状況とほぼ同じです。それでも現状よりは厳密に良いです。なぜなら、Activeに保つことが繰り返される有料アクションになるからです。
2つの制限があります。更新はサイクルごとにガスを消費するため、Activeに保たれるセットは更新期間内のガスによってレート制限されます。また、すべてのステートが均等に更新可能ではありません。アカウントは簡単ですが、任意のストレージスロットはそうではありません。ストレージの更新はコントラクト固有の書き込みパスに依存するからです。このメカニズムは、すべての古いステートがInactiveになることを保証しません。大量のステートをActiveに保つには繰り返し費用がかかることを保証します。これは、攻撃がプロトコルに壊滅的な損失を引き起こさない限り、それを阻止するのに十分です。
なぜステートの有効期限切れ (state expiry) をしないのですか?
8188と同じ答えです。ステートの有効期限切れには復活パスが必要であり、オンデマンドで古いステートを提供する分散型インフラが必要ですが、それはまだ存在しません。8295はそれらを一切必要としません。ステートはコンセンサスから離れることはありません。書き込みコストが高くなるだけです。サーチャージは、有効期限切れが最終的に提供するであろうコスト圧力を、今日利用可能な形で提供します。
アクティベーション
8295はEIP-8188に依存し、同じフォークで、またはそれ以降にアクティベートされる必要があります。価格設定がメタデータを読み取る前に、メタデータが蓄積されている必要があります。価格設定定数と期間長は調整可能であり、スロットのタイミングが変更された場合、保存されたフィールドに触れることなく、後のEIP(Ethereum 改善提案)で再導出できます。
結び
EIP-8188はプロトコルに共有の書き込み年齢境界を与えます。EIP-8295はそれに価格を付けます。両者合わせて、すべての書き込みを等しく安価に扱うことをやめ、変更可能なパスが全ステートと共にスケールすることを強制するのをやめます。これらは今日の制約内で、まだ出荷されていないインフラに依存することなく実現されます。これはステートの有効期限切れの代替ではありません。これは、今解決できる問題の一部です。
1 post - 1 participant