原文

多次元料金市場におけるガスオーバーフロー

フィードバックと主要なアイデアを提供してくれたVitalik Buterinに感謝します。

要約: この記事では、EIP-7999における「ユニバーサルオーバーフロー」を分析します。これは、CALL周辺のレガシーなスカラー型リテインガスパターンを維持しつつ、集約されたEVMガスすべてを最も高価なEVMリソースで価格設定することによる主要な非効率性を回避するための最小限の方法です。

背景

多次元料金市場は、リソース消費を正確に制御できる、望ましい最終的なリソース価格設定メカニズムです。実行、ステート成長、calldata、ブロブデータなどの希少な各リソースには独自のベース料金が設定され、トランザクションはこれらのリソースにおける実際の消費量に応じて料金を支払います。これにより、市場は開発者によって安全と見なされる目標と制限に従ってリソースを公正に価格設定でき、これらの制限内でリソースを最大容量で消費できるようになります。ここで検討されている実装はEIP-7999であり、これはEIP-7706に基づいて構築されており、ユーザーが単一のmax_feeを設定できるようにすることで、UXを簡素化しつつ、良好な経済的効率性を維持します。

多次元料金市場における主な懸念は、ガス可観測性(イントロスペクション)への対処方法です。具体的には、一部のコントラクトはCALLファミリーのオペコード(以下、CALLと略記)のガスパラメータに依存して、呼び出し元の利用可能なガスの一部のみを転送し、呼び出し元コントラクトで完了する残りの操作のためにガスを保持します。ガスパラメータは多次元ではないため、ガスイントロスペクションに依存する開発者は、リソース次元間でどれだけのガスを転送できるかという点で粒度が不足します。一般的にガスイントロスペクションから脱却することが望ましい一方で、現時点ではこれが開発者やユーザーに受け入れられるかどうかは不明です。

このため、EIP-7999はガスパラメータを持つサブコールに対処するためのオプションを概説しています。基本的なアプローチは、EVMがガスパラメータg_cを持つレガシーなサブコールを再解釈し、呼び出し元の各リソース次元における残りの予算の一部を転送することです。呼び出し元の次元jにおける残りの予算がg_jであり、残りの集約ガスがg_r := である場合、呼び出しは各次元jにおいて を転送します。

ユーザーが単一のトランザクションガス制限を提供し、EVMガスを集約することで、EVMで現在行われているように処理を進めることができます。欠点は、集約されたEVMガス制限が最終的に最も高価なEVMリソースで消費されない場合、ユーザーは不必要に高いmax_fee割り当てmを規定しなければならないことです。

jをベース料金b_jと反事実的なリソースごとの制限g_jを持つ非決定論的なEVMリソースのインデックスとし、iを決定論的なガス使用量g_iとベース料金b_iを持つリソースのインデックスとします。最も高価なEVMリソースをb_ := と定義します。集約されたトランザクションガス制限g_a(g_a = )は、個々のEVMガス制限g_jを使用する場合と比較して、実行前のベース料金カバレッジを以下のように増加させます。

決定論的リソースiを含む資金チェックのベース料金部分は次のようになります。

これを軽減するための提案されたオプションは次のとおりです。

  • トランザクション後のチェックで、トランザクションの合計料金がmax_feeを超過した場合にブロックを無効にする。
  • ブロック構築者に、実行後チェックの一部として不足している資金を供給する能力と責任を与える。
  • トランザクターに、希望に応じてすべての次元の制限を提供する能力を与える。

最後の箇条書きのオプションは、ハイブリッドEVMガス設計です。これはEIP-7999で提示された最も満足のいくオプションです。ガスパラメータを持つCALLに依存するユーザーは集約されたEVMガスを使用でき、他のすべてのユーザーは各リソースに対して個別の制限を持つことができます。一部のユーザーは特定のリソースのみを集約できます。しかし、集約されたEVMガスに依存するユーザーにとっては、不必要に高いmax_fee割り当てが残ります。

ユニバーサルオーバーフロー

「ハイブリッドEVMガス」を改善するための一つのアイデアが「ユニバーサルオーバーフロー」です。これは、ガスパラメータを持つCALLを含む一般的なユースケースにおいて、最も高価なEVMリソースで価格設定されなければならないガスの割合を減らします。Vitalikはこの設計を次のように提案しました。

ガスにはn+1の次元があり、そのn+1番目が「ユニバーサルオーバーフロー」です。すべての操作は、意図された形式のガスから消費しようとし、それが尽きるとユニバーサルオーバーフローから消費を開始します。GASオペコードは残りのユニバーサルオーバーフローを返し、CALLオペコードはすべての新しいガス次元を転送しますが、指定されたユニバーサルオーバーフローのみを転送します。

言い換えれば、レガシーなCALLは残りの通常の多次元ガス制限をすべて転送しますが、スカラーガスパラメータは転送されるユニバーサルオーバーフローの量のみを制御します。これにより、レガシーなガス可観測性の主要なリテインガスユースケースが維持されます。つまり、呼び出し元はスカラーガス値を使用してCALL後のバッファを予約でき、実行の大部分は複数の次元で価格設定されます。図1は、ユニバーサルオーバーフローを緑色で、通常のガス制限を赤色で示すサブコールです。

ユニバーサルオーバーフロー

図1. 緑色のユニバーサルオーバーフローは、赤色の通常の多次元リソース制限と並んで追加のトランザクションパラメータとして指定されます。レガシーなCALLは残りの通常の多次元制限をすべて転送しますが、そのスカラーガスパラメータは共有されるユニバーサルオーバーフローの量を決定します。リソースの通常の制限が尽きると、トランザクションはそのユニバーサルオーバーフローを利用します。

この設計では、実行前のベース料金資金チェックは、トランザクションのすべてのEVMガスに対して最も高価なリソースをmax_feeでカバーすることを要求せず、ユニバーサルオーバーフローの量に対してのみ要求します。これが主にCALL実行後に呼び出し元が保持したいガスである一般的なケースでは、これはトランザクションに割り当てられた総EVMガスの小さな割合に過ぎず、経済的効率性を大幅に向上させることができます。ユニバーサルオーバーフロー制限o_uは任意のEVMリソースjに費やされる可能性があるため、実行前のベース料金資金チェックは以下を要求します。

改善点は、b_がEVMガス制限の合計 全体に適用されなくなったことです。厳格なブロック有効性事前チェックでは、o_uが任意の単一EVMリソースに完全に費やされる可能性に備えて容量を予約する必要があります(例:各EVM次元でo_uのヘッドルームを予約する)。

また、有用であるかどうかわからない2番目の機能もあります。複数の分岐を持つ複雑なトランザクションは、ユニバーサルオーバーフローをより代替可能なガスバッファとして利用できますが、そのバッファに対して最も高価なリソースに応じてより多くの資金を事前に割り当てる必要があります。

一つの制限は、ユニバーサルオーバーフローがGASをすべての残りの実行容量の尺度として保持しないことです。EVMは通常の多次元制限を追跡しますが、レガシーなGASオペコードは、スカラーCALLパラメータが制御できるユニバーサルオーバーフローのみを報告します。したがって、各次元に残っている通常のガスの量を知る必要があるコントラクトは、新しい多次元イントロスペクションメカニズム、またはスカラーインターフェースが有用であり続けるのに十分なユニバーサルオーバーフローを必要とするかもしれません。

EIP-8037との関係

EIP-8037は、単一のベース料金を共有する通常のガスとステートガスの2つのリソースを使用します。組み込みガス後のガスがEIP-7825の通常のガス予算を超過した場合、その超過分は特別なステートガスリザーバーに配置され、ステート作成操作のみが消費できます。残りの、リザーバーではないガス(EIP-8037ではgas_left)は、ここでは実行ガスと呼びます。ユニバーサルオーバーフローとの類似点は、CALLガスパラメータがフォールバックガスとしても機能する予算を制御することです。EIP-8037では、実行ガスもステートガスリザーバーを使い果たした後、ステート作成操作によって消費されることがあります。

しかし、EIP-7999の場合、オーバーフローリソースは個別のリソースである必要があり、最も関連性の高いベース料金で資金チェックが行われます。実行ガス自体がオーバーフローリソースとして使用される場合、厳格な資金チェックは、EIP-7999で説明されている「集約されたEVMガス」を本質的に反映するように、最大ベース料金で実行ガス制限全体に適用される必要があります。これははるかに広範なトランザクションに影響を与え、経済的効率性を低下させるでしょう。

EIP-7999の現在の計画は、ステート作成を独自のベース料金を持つ独立したリソースに分割することです。その後、EIP-8037と同様に、EIP-7825のトランザクションガスキャップによる特別な処理が必要になります。実行ガス制限はEIP-7825のトランザクションガスキャップを超えることはできません。このキャップを維持するために、クライアントはユニバーサルオーバーフローから消費された実行ガスを含め、消費された総実行ガスも追跡します。実行操作は、結果として生じる総実行ガス消費量がキャップ内に収まる範囲でのみ、ユニバーサルオーバーフローから引き出すことができます。

オーバーフローベクトル

実行前の資金チェックから最悪ケースの項o_u b_も削除できれば理想的です。したがって、ユニバーサルオーバーフローの潜在的な拡張として、単一のユニバーサルオーバーフローの代わりに、n個のEVMリソースそれぞれに1つのコンポーネントを持つ「オーバーフローベクトル」を使用することが考えられます。可能なレガシー可観測性ルールの一つは、o_r := とし、GASオペコードがo_rを返すようにすることです。o_r>0の場合、ガスパラメータg_cを持つCALLは、各リソース次元jにおいて のオーバーフローガスを転送します。o_r=0の場合、ベクトルオーバーフローは転送しません。ユニバーサルオーバーフローとは異なり、この集約はリソース固有のベクトルのスカラー射影に過ぎないため、保持されたガスミックスが十分であるかどうかのランタイムシグナルとしては不十分である可能性があります。通常の多次元制限は完全に転送されます。

図2は典型的なユースケースを示しています。サブコールは通常の多次元制限の下で実行され、その後の呼び出し元側の処理は保持されたオーバーフローベクトルを使用できます。

オーバーフローベクトル

図2. 黄色のオーバーフローベクトルは、赤色の通常の多次元リソース制限ごとに1つの追加オーバーフローを持ちます。サブコールで渡されるオーバーフローベクトルの量は、オーバーフローベクトルの集約ガスに対するCALLガスパラメータによって決定されます。リソースの通常の制限が尽きると、トランザクションはそれに関連付けられたオーバーフローを利用します。この例では、呼び出し元はオーバーフローベクトル全体を後で使用するために予約しています。サブコールはそれに渡された通常の多次元制限の下で実行され、その後の呼び出し元側の処理は保持されたオーバーフローベクトルを使用できます。

ユーザーが各リソース次元におけるトランザクションのオーバーフロー使用量について信頼できる見積もりを持っている場合、オーバーフローベクトルは過剰なmax_fee割り当てを回避できます。各オーバーフローコンポーネントは個別に指定され、価格設定されるため、事前資金チェックは、その予算が実際にそのリソースに割り当てられていない限り、最も高価なリソースでオーバーフロー予算を請求する必要はありません。

オーバーフローベクトルの経済的効率性の改善が、その複雑さを考慮してユニバーサルオーバーフローよりも採用を正当化するかどうかは不明です。ユーザーがオーバーフローベクトルのみに依存する場合、コントラクトは通常、GASによって返される集約ガスから、リソース全体に残っているオーバーフローガスのミックスが意図された実行(例えば、サブコール後に実行されるように設定された操作)に十分であるかどうかをランタイムで判断できません。このため、以下で議論するハイブリッドバリアントが動機付けられます。保持されたガスのリソースミックスが不確実な場合、ユーザーはその不確実な部分にユニバーサルオーバーフローを使用しつつ、事前にわかっているリソース使用量にはオーバーフローベクトルを使用できます。

その他のバリエーション

ガス予約

CALLで指定されたガスに比例してガス制限ベクトルを転送する(以前に検討された基本的なアプローチ)ことと、指定されたガスに比例してオーバーフローベクトルを転送することの違いは、オーバーフローベクトルが呼び出し元の通常のガス制限ベクトルとは異なるリソース構成を持つように選択できる点です。これは、呼び出し元コントラクトが、呼び出されたコントラクトが行う操作とは異なる一連のCALL後操作(例:クリーンアップ、会計処理、ログ出力)のためにガスを予約したい場合があるため有益です。つまり、リソースミックスが異なる可能性があるということです。オーバーフローベクトルを使用すると、転送されるものとは異なるミックスを予約することが可能になります。

より侵襲的ではあるが、潜在的によりクリーンなEVMの変更は、コントラクトがランタイムで特定のガスベクトルを明示的に予約できるようにすることです。概念的には、これにより呼び出し元の残りの予算が、利用可能(転送可能)なベクトルと、CALL後の実行のために残ることが保証される予約済み(転送不可)のベクトルに分割されます。これは、(a) 利用可能なベクトルから予約済みベクトルにガスを移動させるオペコード(オプションで後で解放する)を介して、または (b) 転送されるガスベクトルと予約済みガスベクトルの両方を受け取る多次元CALLバリアントを介して実現できます。

ハイブリッドオーバーフロー

この記事で提案された2つのアプローチは、オーバーフローベクトルとユニバーサルオーバーフローo_uの両方を許可することで組み合わせることもできます。リソースの通常のガス制限が尽きた場合、プロトコルはまずそのリソースのオーバーフローベクトルコンポーネントo_jに残っているガスを使用し、その後でユニバーサルオーバーフローo_uからガスを使用します。対応するベース料金資金チェックは次のようになります。

しかし、このハイブリッドもレガシー可観測性ルールを必要とします。最も簡単なルールは、GASオペコードがo_uのみを返し、レガシーなCALLガスパラメータが転送されるユニバーサルオーバーフローの量のみを制御するというものです。したがって、オーバーフローベクトルはレガシーなガス可観測性を介して公開されず、レガシーなCALLの下では、サブコール後に発生する処理のために呼び出し元に残ります。

結論

ユニバーサルオーバーフローは、CALL周辺のレガシーなスカラー型リテインガスパターンを維持しつつ、集約されたEVMガスすべてを最も高価なEVMリソースで価格設定することによる主要な非効率性を回避するための最小限の方法を提供します。最高価格の資金要件を明示的に提供されたユニバーサルオーバーフローに限定することで、実行の大部分に対する多次元価格設定を放棄することなく、コントラクトに使い慣れたリテインガスバッファを提供します。オーバーフローベクトルとハイブリッドソリューションは、有用な改良を提供する可能性があります。それでも、ユニバーサルオーバーフローは、ガス可観測性と多次元料金市場を調和させるための直感的なベースラインを提供します。

1件の投稿 - 1人の参加者

トピック全体を読む