ベルリンハードフォーク前のガスコスト EVM によって実行されるすべてのオペコードには、関連するガス コストがあります。それらのほとんどは固定コストを持ちます。PUSH1 は常に 3 単位のガス、MUL は 5 単位のガスがかかります。その他は変化します。たとえば、SHA3 のオペコード コストは入力のサイズによって異なります。 ベルリン ハードフォークの影響を最も受けるオペコードである SLOAD と SSTORE に焦点を当てます。 EXT* や CALL* などのアドレス固有のオペコードについては、ガス コストも変化するため、後で説明します。 ベルリン前のSLOADのガスコストEIP-2929 より前は、SLOAD のガス コストは単純で、常に 800 ガスを消費していました。だから、(今のところ)何も言うことはありません。 ベルリン以前のSSTOREのガス料金SSTORE は、ガス消費の点ではおそらく最も複雑なオペコードです。そのコストは、ストレージ スロットの現在の値、新しい値、以前に変更されたかどうかなどによって異なります。基本的な理解を得るためにいくつかのケースを分析するだけです。さらに詳しく知りたい場合は、記事の最後にある EIP リンクをお読みください。
この部分の詳細は興味深いものではありませんが、重要なのは、SSTORE は高価であり、そのコストはいくつかの要因に依存するということです。 EIP-2929以降のガス消費量EIP-2929 は、上記のすべてのオペコードのガス消費に影響します。しかし、これらの変更について詳しく説明する前に、この EIP によって導入された重要な概念である、アクセスされたアドレスとアクセスされたストレージ キーについて説明する必要があります。 アドレスまたはストレージ キーは、以前のトランザクションで「使用」された場合、「アクセスされた」とみなされます。たとえば、別の契約を呼び出すと、その契約のアドレスは「アクセス済み」としてマークされます。同様に、一部のスロットを SLOAD または SSTORE すると、トランザクションの残りの部分もアクセスされたとみなされます。どのオペコードがそれを実行するかは関係ありません。SLOAD がスロットを読み取る場合、後続の SLOAD と SSTORE の両方がアクセスされたと見なされます。 ここで注目すべきは、ストレージ キーが一部のアドレスに「組み込まれている」ということです。この EIP では次のように説明されています。 「トランザクションの実行中、accessed_addresses: Set[Address] と accessed_storage_keys: Set[Tuple[Address, Bytes32]] のセットを維持します。」 つまり、ストレージ スロットがアクセスされると言う場合、実際にはペア (アドレス、ストレージ キー) がアクセスされると言います。 次に、新たなガス消費についてお話しします。 ベルリン後のSLOADベルリンハードフォークの前は、SLOAD は固定量の 800 ガスを消費していました。ここで、ストレージ スロットにアクセスしたかどうかが重要になります。アクセスされていない場合、ガスコストは 2100 です。アクセスされている場合は 100 です。したがって、スロットがアクセスされたストレージ キーのリストに含まれている場合、SLOAD のガス消費量は 2000 未満になります。 ベルリン後のSSTOREEIP-2929 のコンテキストで、前の SSTORE の例をもう一度見てみましょう。 ストレージ スロットの値が 0 から 1 (またはゼロ以外の値) に変更された場合、ガス コストは次のようになります。
ストレージ スロットの値が 1 から 2 (またはその他のゼロ以外の値) に変更された場合、ガス消費量は次のようになります。
ストレージ スロットの値が 1 (またはゼロ以外の値) から 0 に変更された場合、ガス コストは前の場合と同じになり、さらに払い戻しが行われます。 ストレージ スロットの値が以前に同じトランザクションで変更されている場合、後続のすべての SSTORE のガス消費量は 100 になります。 ご覧のとおり、SSTORE が変更しているスロットが以前にアクセスされた場合、最初の SSTORE は 2100 ガス未満を消費します。 要約する次の表は上記の値を比較したものです。 最後の行では、スロットがアクセスされたかどうかについて話す必要がないことに注意してください。以前に書き込まれたことがある場合は、アクセスされているからです。 EIP-2930: オプションのアクセス リスト トランザクション冒頭で述べたもう一つの EIP は EIP-2930 です。この EIP は、トランザクションにアクセス リストを追加できる新しいトランザクション タイプを追加します。つまり、トランザクションの実行が始まる前に、どのアドレスとスロットを訪問したと見なすかを事前に宣言できるということです。たとえば、アクセスされていないスロットへの SLOAD には 2100 GAS かかりますが、スロットがトランザクション アクセス リストに追加されると、同じオペコードのコストは 100 GAS のみになります。 しかし、すでにアクセスされたアドレスやストレージキーのガス消費量が少ない場合、ガス消費量を削減するためにすべてをトランザクション アクセス リストに追加すればよいということでしょうか?素晴らしい!ガス代を支払う必要はありません!ただし、これは完全に真実ではありません。アドレスを追加してキーを保存するたびに、ガス料金を支払う必要があるからです。 例を見てみましょう。契約 A にトランザクションを送信する場合、アクセス リストは次のようになります。 アクセスリスト: [{ 住所: ""、 ストレージキー: [ 「0x0 ...」 ] }] このアクセス リストを添付したトランザクションを送信すると、slot0x0 を使用する最初のオペコードは SLOAD となり、2100 ガスではなく 100 ガスを消費します。これにより、ガスが 2000 削減されます。ただし、ストレージ キーがトランザクションのアクセス リストに追加されるたびに、1900 ガスが消費されます。つまり、ガソリン100円しか節約できなかったのです。 (スロットにアクセスする最初のオペコードが SLOAD ではなく SSTORE だった場合、2100 ガスを節約できます。つまり、キーを保存するコストを考慮すると、合計で 200 ガスを節約できることになります。) これは、トランザクション アクセス リストを使用する限りガスを節約できることを意味しますか?いいえ、アクセス リストにアドレスを追加するにも料金を支払う必要があるためです (つまり、「 ( )のガス。訪問したアドレスこれまでは、オペコード SLOAD と SSTORE についてのみ説明してきましたが、Berlin アップグレードで変更されたオペコードはこれらだけではありません。たとえば、オペコード CALL の前の固定消費量は 700 です。ただし、EIP-2929 以降では、アドレスがアクセス リストにない場合は消費量が 2600 になり、リストにある場合は 100 になります。また、アクセスされたストレージ キーと同様に、以前にどのオペコードでアクセスしたかは関係ありません (たとえば、EXTCODESIZE が初めて呼び出された場合、そのオペコードは 2600 GAS かかりますが、同じアドレスを使用する後続の EXTCODESIZE、CALL、または STATICCALL は 100 GAS しかかかりません)。 これはアクセス リストを使用したトランザクションにどのような影響を与えますか?たとえば、トランザクションをコントラクト A に送信し、そのコントラクトが別のコントラクト B を呼び出す場合、次のようなリストを追加できます。 アクセスリスト: [{ アドレス: "", ストレージキー: [] }] このアクセス リストをトランザクションに追加するには 2400 GAS を支払う必要がありますが、アドレス B を使用する最初のオペコードのコストは 2600 GAS ではなく 100 GAS のみになります。つまり、これを行うことで 100 GAS を節約できます。 B が何らかの方法でストレージを使用し、どのキーが使用されているかがわかっている場合は、それらをアクセス リストに追加することもできます。これにより、キーごとに 100 ~ 200 ガスを節約できます (最初のオペコードが SLOAD か SSTORE かによって異なります)。 しかし、なぜ別の契約について話しているのでしょうか?私たちが呼んでいる契約はどうですか?この契約でこれらの操作を実行しないのはなぜですか? アクセスリスト: [ {アドレス: "", ストレージキー: []}, {アドレス: "", ストレージキー: []}, ] これを実行することは可能ですが、EIP-2929 では、呼び出されるコントラクトのアドレス (つまり tx.to) がデフォルトで accessed_addresses リストに追加されることが明確に規定されているため、コスト効率は良くありません。したがって、追加の 2400 ガスを支払う必要はありません。 前の例をもう一度分析してみましょう。 アクセスリスト: [{ 住所: ""、 ストレージキー: [ 「0x0 ...」 ] }] 複数のストレージ キーを追加する場合を除き、これは実際には無駄です。 SLOAD が常に最初にストレージ キーを使用すると仮定すると、損益分岐点に達するには少なくとも 24 個のストレージ キーが必要になります。 ご想像のとおり、分析を行うことと、アクセス リストを手動で作成することは、それほど楽しいことではありません。幸いなことに、もっと良い方法があります。 eth_createAccessList RPC メソッドGeth (バージョン 1.10.2 以降) には、アクセス リストを生成するために使用できる新しい eth_createAccessListRPC メソッドがあります。これは eth_estimateGas と同様に使用されますが、ガスの推定値を返す代わりに、次のようなものを返します。 { "アクセスリスト": [ { 「アドレス」: 「0xb0ee076d7779a6ce152283f009f4c32b5f88756c」、 「ストレージキー」: [ 「0x0 ... 「0x0000000000000000000000000000000000000000000000000000000000000000000000001」 ] } ]、 "ガス使用": "0x8496" } つまり、トランザクションで使用されるアドレスとストレージ キーのリストと、アクセス リストが追加された場合に消費されるガスが提供されます。 (eth_estimateGas と同様に、これは推定値であり、トランザクションが実際にマイニングされたときにこのリストは変更される可能性があります。) ただし、これは、リストにアクセスせずに同じトランザクションを送信する場合よりもガス消費量が低くなることを意味するものではありません。 時間の経過とともに正しい使用方法がわかってくると思いますが、疑似コードは次のようになると思います。 ガス推定 = 推定ガス(tx)とする アクセスリスト、ガス使用済み } を createAccessList(tx) にします。 ガス使用量 > ガス推定値の場合 アクセスリスト[tx.to]を削除する } tx.accessList = アクセスリスト; 送信トランザクション(tx) 契約を緩めるアクセス リストの主な目的はガスを使用することではないことに注意する必要があります。 EIP で説明されているとおり: 「トランザクションは、アクセスして前払いする予定のアカウントとストレージ スロットを事前に指定できるため、EIP-2929 によってもたらされる契約破棄のリスクが軽減されます。最終的に、実際の実行では、オペコード SLOAD と EXT* は 100 ガスしか消費しません。この低いガス消費は、この EIP によって引き起こされる破棄を防ぐだけでなく、EIP-1884 によって制限されている契約を「緩和」します。」 つまり、契約でトランザクションの実行コストについて想定している場合、ガス コストの増加によって契約が機能しなくなる可能性があります。たとえば、コントラクトが someOtherContract.someFunction{gas: 34500}() のように別のコントラクトを呼び出すと、someFunction が正確に 34500 ガスを消費すると想定されるため、エラーが発生します。しかし、適切なアクセス リストを追加すると、契約は再び機能します。 自分でテストする自分でテストしたい場合は、Hardhat と geth で実行できる複数の例を含むこのリポジトリをクローンしてください。手順については README を参照してください。 |
<<: Chia公式回答:Chiaマイニングに参加する前に知っておくべき20の質問
>>: AMA レビュー | HECOスターのファンタスティックファンタジーナイトオンラインラウンドテーブルフォーラム
Baozou レビュー: Dentacoin は、世界の歯科業界向けに特別に開発されたブロックチェー...
最近の拡張問題についてまとめてみましょう。何が起こっているのか、ここに示します。中国は優れたコンピュ...
有名な起業家で投資家の双子の兄弟、キャメロン・ウィンクルボス氏とタイラー・ウィンクルボス氏によって設...
ビットコインプレスリリース:米国サンフランシスコ — 第 2 世代のブロックチェーン アーキテクチャ...
11月30日、アラブ首長国連邦政府がブロックチェーンハッカソンイベントを主催し、優勝者には14万ドル...
Crazy Comment : 今日東京で開催されたスマートコントラクトカンファレンスには約 400...
ハッカーの攻撃手法に新たな変化が起こっています。標的の携帯電話番号さえあれば、被害者の銀行口座やビッ...
私は上級マイナーであり、しばらくの間DeFi 「ファーマー」としても働いていました。私はこれまで多く...
OneBit は近距離無線通信技術を使用して、モバイル アプリで MasterCard ネットワー...
3月29日、ブラックロックのCEOラリー・フィンク氏はビットコインETFのパフォーマンスに「嬉しい...
ウー・サイード著者 |コリン・ウーこの号の編集者 |コリン・ウー 19日夜、中国の暗号業界で昔ながら...
クレイジー解説:ブロックチェーン業界に関する調査レポートを発表する証券会社が増えている。ブロックチェ...
暗号通貨市場全体が低迷する中、分散型自律組織(DAO)という分野が市場の他の分野よりも好調に推移して...
GDP データの真の価値は、次の四半期に何が起こるかを示唆する点にあります。米国経済と10月27日に...
幸運をもたらすマイニングマシン - KoiコンピューティングパワーサーバーC16シリーズの最初の内部...