イーサリアムのガス代の2つのキーと21のEIP
この記事はホワイトプランに掲載され、著者:Li。
Gas費の問題は、現在のEthereum 1.0チェーンが直面している最も深刻な問題の一つです。Ethereumの計算能力は非常に高いですが、ブロックチェーンの構造上の問題(各フルノードが同じデータを計算するため、タスクが単一のノードの計算リソースを奪い合う)により、大量のタスクを処理する際にEthereumは混雑し、混雑するとGas費が非常に高くなります。
DeFiアプリケーションの爆発的な成長は、この現象をさらに悪化させています。ここで言及すべきは、Ethereumはブロックチェーン取引をパッケージ化するだけでなく、スマートコントラクトなどもチェーン上に公開されるため、スマートコントラクトがチェーン上で実行される際にはリソースを消費します。そのため、ユーザーがDeFiで行うほぼすべてのステップにはGas費が必要であり、これがGasモデルの問題の一つです。
最近、EthereumコミュニティではEIP-1559に関する議論が激化しています。多くのマイニングプールがこの提案の実装に同意していないためです。この提案はGas費の構成を調整するもので、Gasが高い問題を解決することはできませんが、Gas費の期待を高め、体験を向上させることができます。
最近の関連ニュースとして、3月16日にEthereumの開発者フィリップ・カストンゲイが別の提案EIP-3382を提案し、ブロックGas制限を各ブロック12,500,000 Gasに固定することを提案しました。また、Gas制限が12,500,000でない場合、ブロックは無効とされるブロック検証ルールの更新も行われます。これは、ブロックGas制限に関する合意を得るためであり、マイナーの制約を受けないようにするためです。
元のルールでは、ブロックGas制限はEthereum内で唯一ノードの合意によって決定されないデータ部分であり、マイナーが選択するパラメータです。彼は、これは重要なパラメータであり、少数の参加者がネットワークの残りの部分に突然有害な変化を加えることを避けるためにノードの合意が必要だと考えています。
EIP1559やEIP-3382のようにGas費を調整する提案は多くあります。Gas費はEthereumの運用過程で重要な位置を占めているため、Gas費には多くの歴史的な物語があります。Gas費に関するすべての情報を閲覧すると、Gas費の解決は容易ではないことがわかります。
今日は、ホワイトプランチームが読者のために、EthereumのGas費に関連する資料をほぼすべて紹介します。設計の変更、EIPの改訂などを含みます。お役に立てれば幸いです。
Gas費を理解したい場合は、TXStreetの動的画像を参考にするとよく理解できます。
TXStreetはEthereumのブロックパッケージングプロセスを交通輸送に例えています
ブロックパッケージングを自動車による輸送プロセスに抽象化すると、道路の幅や自動車の容量の制限に直面します。そのため、自動車に乗るプロセスには競争が生じ、高い価格を支払う者が優先されると理解できます。また、混雑によって平均的な費用も「つり上げられます」。
自動車が走行する道路は基本的なリソースであり、「通行料」を支払ってカバーする必要があります。そして、パッケージングに必要なGas費は「Gas費」であり、羊毛は羊の身から出るもので、Gas費は最終的に「通行料」を支払うために使われます。したがって、Gas費(Gas費)は最終的にEthereumのリソース使用に対する費用です。
早期のGasに関する最初のキー
Gasの概念はコンピュータ分野から来ており、Ethereumでは最初にEthereumホワイトペーパーに由来します。ホワイトペーパーの著者はPolkadotの創設者であるGavinであり、言うまでもなく、Ethereumホワイトペーパーは理論的に取引に含まれるGasは任意の値であると指摘しています。理論的には、より多くの取引をカバーする必要があり、最大で2^256(既知の宇宙の原子数にほぼ等しい取引をカバーできる)に達することができます。
設計は無限ですが、処理能力は有限です。Geth 1.6バージョンでは、Gas計算が64ビット値を使用するように切り替えられ、64ビットの単一ブロックが収容できる取引量は人体中の赤血球の数の44倍です。しかし、これは理論であり、現実は大きく異なります。
このバージョンが確認される前に、Vitalikが設計したEthereum Gasモデルには、Gas費の支払いプロセスがデフォルトでコントラクト内にあるという興味深い詳細があります。つまり、コントラクトの実行中にコントラクト内の残高が減少し、実行による消費が不足するとコントラクトは一時停止します。
初期のEthereumコントラクトでの実行設定による内蔵の課金
その後、GavinがEthereumに参加し、Gasの支払いメカニズムを変更しました。このように、コントラクトの実行による支払いから送金者の支払いに変更されました。Vitalikは、これは「契約支払い」方式から「送信者支払い」方式に変わったと説明しています。これは、各個別の取引ステップで少しずつETHを持ち去ることを代替するものです。
Ethereum初期のVitalikとGavinがミニハッカソンで、中央の神はJeffrey
これは比較的理解しやすい「Gas費の支払い」です。さらに詳細な部分を解剖するには、ホワイトペーパー内のGasに関連する部分を見なければなりません。
GasはEthereum内のすべての計算量の計価単位であり、Ethereum上でより多くの計算を行うには、より多くのGasを支払う必要があります。
このような使用者が支払うモデルは、リソースの乱用を避けることができます。開発者が各種の計算に対して料金を支払うと、できるだけコードを簡潔かつ効率的に書くようになります。また、Gasの存在は、攻撃者が無効な計算を通じて(そのため、多くの操作を実行するにはGasが必要です)Ethereumネットワークに対して洪水攻撃を行うのを防ぐことができます。以下に統計されているEIPの一つは、アカウントアクセスのGas値を引き上げて攻撃の可能性を減少させることです。
Gasを支払う必要がある場所を知るだけでなく、GasPriceとGasLimitについても理解する必要があります。
GasPriceは取引送信者が各単位Gasに対して支払う意向のある価格(Wei単位)です。取引送信者は、支払う意向のある各単位Gasの価格をカスタマイズできます。例えば、ある取引が10Gasを消費する場合、送信者が3Wei/Gasを支払う意向があるとすると、取引の総コストは30Weiになります。私たちが使用するウォレットには、Gas費を調整するための高度なオプションがあります。
GasLimitは取引送信者が取引の実行に使用できるGasの最大量です。GasLimitがなければ、送信者のアカウント残高が誤って消費され尽くす可能性があります。GasLimitは安全メカニズムであり、アカウント内のすべてのETHを消費するのを防ぎます。
さらに、GasLimitは前払いGasとして定義することもできます。ノードが取引を検証する際、最初にGasPriceにGasLimitを掛けて取引の固定コストを算出します。もし取引送信者のアカウント残高が取引の固定コストを下回る場合、その取引は無効と見なされます。取引が完了した後、残りのGasは送信者のアカウントに返却されます。これが、MetMaskを使用してコントラクトを実行する際に、Gasを予測するのが非常に高いが、実行後の価格がそれほど高くない理由です。
1つのブロックに含まれる内容
これは1つのブロック内の固有の内容であり、取引部分には237件の送金と39件のコントラクト内部取引があります。具体的に取引を確認すると、より詳細なGas費の支出がわかります。また、燃料制限が12493113であることも確認できます。記事の冒頭で言及したEIP-3382では、各ブロックのGas制限を12500000に制限しています。これがこの部分です。こうすることで、各ブロックで得られる報酬の合計が比較的制御可能になります。
ETH1.0チェーンに関しては、各オペコードのGas費計算があり、私たちはその中で価格が高い部分を抜粋して読者に参考として提供します。オペコードは最終的にチェーンの実行とリソースの使用を決定します。例えば、コントラクトを作成する場合のコスト計算は以下の通りです:
固有コスト = Gtransaction + Gtxdatazero * Nzeros + Gtxdatanonzero * Nnonzeros + Gtxcreate
ここで:
- Gtransaction = 21,000 Wei
- Gtxcreate = 32,000 Wei
- Gtxdatazero = 4 Wei
- Gtxdatanonzero = 68 Wei(イスタンブールアップグレード時に16weiに変更されます)
以下のオペコードに対して、皆さんはそれぞれの値を確認できます。
Ethereum 1.0チェーンのオペコードに対応するGas値消費
以上の説明から得られる基本的な理解は、Gas費はEthereumのチェーン上のリソースを使用することによって生じるものであり、計算が多ければ多いほどGasが高くなり、スマートコントラクトの操作では各個別のステップごとにGasを支払う必要があるということです。また、補足として、送信者がGasを非常に高く設定すると、マイナーは取引を優先的に実行します。なぜなら、マイナーは特定の取引を優先的にパッケージ化することができるからです。
Gas費に密接に関連する21のEIP
次に、Gasに関するEIP提案を詳しく見ていきましょう。提案はおおよそ時間順に並べられています。
EIP-5: RETURNとCALLのGas使用量の調整
このEIPは、RETURN文字列や他の動的サイズの配列の関数を呼び出すことを可能にします。現在、Ethereum仮想マシン内部から別のコントラクト/機能を呼び出す際には、出力のサイズを事前に指定する必要があります。また、書き込まれていないメモリに対しても料金を支払う必要があり、動的サイズのデータを返すことは非常に高価で柔軟性がないため、実際には使用できません。このEIPで提案された解決策は、CALLが返す際に実際に書き込まれたメモリに対してのみ料金を支払うことです。
EIP-150:大量IO操作のGasコストの変化
- EXTCODESIZEのGas費用を20から700に増加。
- EXTCODECOPYの基本Gasコストを20から700に増加。
- BALANCEのGas費用を20から400に増加。
- SLOADのGasコストを50から200に増加。
- CALL、DELEGATECALL、CALLCODEのGas費用を40から700に増加。
- SELFDESTRUCTのGasコストを5000から5000に増加。
SELFDESTRUCTが新しく作成されたアカウントに命中した場合、25000の追加Gas費用が発生します(CALLに似ています)。 - 提案されたGas制限目標を550万に引き上げ。
EIP-158:状態クリア
いかなる場合でも、call残高などが0のアカウントは、25000のアカウント作成Gasコストを消費しなくなります。
EIP-1108:alt_bn128プレコンパイルのGasコストを削減
楕円曲線計算のプレコンパイルの現在の価格は高すぎます。プレコンパイルの再価格設定は、Ethereum上の多くのプライバシーソリューションや拡張ソリューションに大いに役立ちます。Ethereumベースのzk-SNARKプロトコルにとって、EIP-1108はzk-SNARKの検証にかかるGasコストを大幅に削減するだけでなく、複数のzk-SNARK証明をバッチ処理するのにも役立ちます。これは、単一のzk-SNARK回路を小さな単一回路サイズのバッチに分割するために使用できる技術でもあり、zk-SNARKの構築と展開が容易になります。
現在、これらの取引のコストは約6,000,000Gasです。このEIPはそれを1,000,000Gasに削減することができ、プロトコルをより実用的にします。
EIP-1283:SSTOREオペコードのGas調整
このEIPは、SSTOREオペコードの計量変更を提案し、コントラクトストレージの新しい用途を実現し、大多数の実装の動作方式と一致しない場所で過剰なGasコストを削減します。これはEIP-1087の代替案として機能することができます。EIP-1087では、キャッシュの使用を変更するための異なる最適化戦略の実装をより友好的にしようとしています。
EIP-2028:取引データのGasコストを削減
Calldata(GTXDATANONZERO)のGasコストを現在の68バイトから16バイトに削減することを提案し、数学的モデルと経験的推定によってサポートします。
EIP-2200:ネットGas計量の構造的定義
このEIPは、SSTOREオペコードに対してネットGas計量変更の構造的定義を提供し、コントラクトストレージの新しい用途を実現し、大多数の実装の動作方式と一致しない場所で過剰なGasコストを削減します。これはEIP-1283とEIP-1706の組み合わせとして機能します。
EIP-2565:ModExpGasコスト
ModExpプレコンパイルの実際の操作コストを正確に反映するために、このEIPはGasコストを計算するためのアルゴリズムを指定します。このアルゴリズムは、乗算の複雑さのコストを推定し、指数演算に必要な反復回数の近似値を掛け算します。
EIP-1559:ETH 1.0チェーンの料金市場の変化
Ethereumは単純なオークションメカニズムを使用して、歴史的な価格で取引手数料を設定します。ユーザーは入札(「Gasprices」)を行い、マイナーは最高入札の取引を選択し、指定された入札に従って取引を含めます。これにより効率が低下します。
このEIPでの提案は、基本料金の金額を開始点とし、その料金はネットワークの混雑度に応じて上下に調整されます。ネットワークが各ブロックのGasの目標使用量を超えると、基本料金はわずかに増加し、容量が目標数を下回ると基本料金はわずかに減少します。
これらの基本料金の変動は制限されているため、異なるブロック間の基本料金の最大差は予測可能です。これにより、ウォレットはユーザーのためにGas費を高度に信頼できる方法で自動的に設定できます。ネットワークが活発な期間でも、大多数のユーザーは手動でGas費を調整する必要がありません。大多数のユーザーにとって、基本料金は彼らのウォレットによって推定されます。
EIP-2929:状態アクセスオペコードのGasコストの増加
SLOAD(0x54)のGasコストを2100に増加させ、CALLオペコードファミリー(0xf1、f2、f4、fA)、BALANCE 0x31、およびEXT*オペコードファミリー(0x3b、0x3c、0x3f)を2600に増加させます。また、SSTOREの計量方式を改革し、SELFDESTRUCTなどのオペコードに固有の「実際のストレージ負荷」を正しく価格設定することを保証します。
一般的に、オペコードのGasコストの主な機能は、そのオペコードを処理するのに必要な時間を推定することです。目標は、Gas制限がブロックを処理するのに必要な時間の制限に対応することです。しかし、ストレージアクセスオペコード(SLOAD、CALL、BALANCE、EXT*オペコード)は歴史的に過小評価されてきました。2016年の上海DoS攻撃では、最も深刻なクライアントエラーが修正された後、攻撃者が使用した戦略の一つは、大量のアカウントにアクセスまたは呼び出す取引を単純に送信することでした。
提案されたEIPは、これらのオペコードのコストを約3倍増加させ、最悪のケースでの処理時間を約7〜27秒に減少させます。データベースレイアウトの改善は、クライアントがストレージを直接読み取るように再設計することを含み、Merkleツリーにジャンプするのではなく、これによりこの状況をさらに減少させますが、これらの技術は完全に展開されるまでに長い時間がかかる可能性があり、たとえこの技術が採用されても、ストレージへのアクセスのIOコストは依然として実質的に残ります。
EIP-1077: コントラクト呼び出しのGasリレー
DAppの主な障害は、チェーン操作を実行するために複数のトークンが必要であることです。ユーザーが実行意図を示すためにメッセージに署名することを許可しますが、第三者のリレーターがメッセージを実行することを許可することで、この問題を回避できます。Ethereum取引は常にETHが必要ですが、スマートコントラクトはEIP-191署名を採用し、ETHを持たない信頼できない第三者に取引を実行するための報酬を転送することができます。これにより、彼らの一般的な形式を標準化し、ユーザーがトークンで取引を支払うことを許可する方法を提供することで、アプリケーション開発者に大きな柔軟性を提供し、アプリケーションユーザーがブロックチェーンと対話する主要な方法となる可能性があります。
EIP-1087:SSTORE操作のGas計量
このEIPは、EVMSSTORE操作のGas課金方式を変更し、不必要なGasコストを削減し、コントラクトストレージに新しい用途を提供することを提案します。
EIP-1285:CALLオペコードにGcallstipendGasを追加
GcallstipendはCALLオペコードの費用パラメータを2,300から3,500Gas単位に増加させます。
EIP-1380:内部呼び出しのGasコストを削減
内部呼び出しのGasコストを削減することで、SolidityやVyperなどのスマートコントラクト言語に大きな利益をもたらします。これにより、彼らはCALLを使用してJUMP内部操作呼び出しを行うことができます。
EIP-1613: Gasステーションネットワーク
コントラクトが「代金引換」を受け入れ、Gasを支払うことを許可することで、非ETHユーザーがスマートコントラクトにアクセスできるようになります(例えばdapp)。
dappとの通信には現在ETHにGas費を支払う必要があり、これがdappの採用をEthereumユーザーに制限しています。したがって、コントラクト所有者はGas費を支払うことでユーザー獲得を増やしたり、ユーザーが法定通貨でGas費を支払うことを許可したりすることを望むかもしれません。また、第三者が特定のコントラクトのGasコストを補助することを望むかもしれません。EIP-1077で述べた解決策は、ETHを含まないアドレスからの取引を許可することができます。
EIP-1930:厳格なGasセマンティクスを持つCALL。十分なGasがない場合は元に戻す
特定のGas量を使用してCALLを実行するためのスマートコントラクト機能を追加します。これができない場合は、実行を元に戻すべきです。
EIP-2045:EVMオペコードの粒状Gasコスト
EVMオペコード(ADD、SUB、MULなど)の計算は、通常、ストレージオペコードのI/O(SLOAD、SSTOREなど)に対して高く評価されます。現在、最小のGasコストは1(すなわち1Gas単位)であり、ほとんどの計算オペコードのコストは1に近い(例えば3、5、または8)ため、コストを削減できる範囲は制限されています。「粒状」と呼ばれる新しい最小Gas単位は、Gasの一部であり、Gasコストの範囲を拡大し、現在の最小レベルを下回ることができるようにします。
EIP-2046:静的呼び出しのプレコンパイルに対するGasコストを削減
プレコンパイルを呼び出す基本GasコストSTATICCALLを700から40に削減します。これにより、プレコンパイルをより効率的に使用し、総コストが700未満のプレコンパイルを使用できるようになります。
EIP-2542:新しいオペコードTXGASLIMITとCALLGASLIMIT
スマートコントラクトが現在の取引および実行フレームワークのGas制限に関する情報にアクセスできるようにします。リレー、メタ取引、Gas費、アカウント抽象化などの概念が普及する中で、特定のコントラクトにとってGas支出を正確に追跡できることが重要です。
EIP-3322:アカウントGasストレージオペコード
Gasを需要の少ないブロックから需要の多いブロックに移動させることで、Gas供給の弾力性と価格の安定性をもたらします。不幸なことに、これは不必要な状態の増加を奨励します。高度なGasストレージメカニズムを導入することで、Gas市場はより少ないストレージと計算を必要とします。
EIP-2780:内部取引Gasを削減
内部取引のコストを21,000から7,000Gasに削減します。
現在、21,000取引のGas内部コストはETHを送信するコストを非常に高くし、小規模(数十ドル)のコストは通常非常に高くなります。他のEIP(例えばEIP-1559)もGas価格と初回価格オークションの変化を考慮していますが、安全な方法でETHを送信するコストを大幅に削減し、このような取引の数を増やすことは積極的です。
第二のキー:RollupとGas
初期のGasの物語はEthereum Gas費モデルの策定に関するものでしたが、現在ではGas費を削減する以外にも、最良のスケーリングとGas費削減の方法は取引データの圧縮です。
これがRollupと大きく関係しています。
単純なEthereum取引(ETHを送信する)は約110バイトを必要とします。しかし、Rollup内のETH転送はわずか12バイトしか占有しないため、Rollupは基盤となるチェーンのスケーラビリティを約10倍向上させる可能性があります。特定の計算において、Rollupを採用することで、スケーラビリティは100倍以上向上することもあります。
これは絶対に目を見張る成果であり、これがなぜEth2.0がRollupを中心にした開発路線となったのかの理由です。
Gas費の調整は長期的な概念とプロセスであり、無数のEthereumエンジニアによる詳細な修正の結果です。単一のGas EIPの調整だけを見ても、Gas費の重要性やGas費の調整の難しさを感じるには不十分です。しかし、確かなことは、EthereumのGas問題の最終的な解決策は必ずEth2.0であり、期待を持ち続けてください。