
失敗した呼び出し後に継続して実行されるコントラクトは、現在、呼び出された側が意図的にリバートしたのか、単にガスが足りなくなったのかを判別する信頼できる方法を持っていない。このギャップが、不十分なガスによる攻撃の根本的な原因であり、新しいドラフト提案はEVMレベルでこれを埋めようとしている。 月曜日にEthereum Magiciansで議論が開始されたEIP-8456は、暫定的にオペコード0xA5でガス2のCALLSTATUSという命令を追加する。これは、現在のフレーム内で最新のcallまたはcreate操作の完了状態を3ビットでプッシュする。 ビット0はリバートを意味し、ビット1はガス不足などの異常な停止を意味し、ビット2は下位フレームで何らかの停止が発生したことを意味する。 作者は、現在の唯一の証拠が呼び出し後のgasleft()の算術演算であり、すべての再価格付けフォークがそのしきい値を破壊してきたと指摘している。提案されているEIP-8037の二次元ガスは、その貯蔵量がGASオペコードを通じて見えないため、この算術演算をさらに弱める。 では、なぜ3番目のビットが必要なのか? 実際の呼び出しのほとんどは、プロキシ、OpenZeppelinのfunctionCallラッパー、Multicall3、またはERC-1271署名チェッカーなどの中間者を経由する。もし直接的な呼び出し先の終了状態のみが報告されるなら、ガス不足停止をキャッチして理由付きでリバートするラッパーは、意図的なリバートのように見えることになる。 ドラフトは、各フレームを上昇する粘着性のフラグを保持し、ガスのみを制御する送信者が呼び出し元に単純なリバートを読み込ませることは不可能にする。 これは原因ではなく結果を報告し、呼び出し先は依然としてINVALIDを使用して意図的に停止を発生させることができる。 これは、展開済みコントラクトがそれを読み取らないため、この命令がリリースされた後に書かれたコードのみを保護する。 現在までに外部レビューはなく、オペコード番号は未確定であり、58のリストされたケースに対するプロトタイプとテストもまだ未実装である。 リンク - https://t.co/KnByUBgWrY
