本文へ移動

Ethereumメンプールのトランザクション置換

同一送信者・同一ノンスのEthereumトランザクション置換を、クライアント固有の手数料上限引上げ、キャンセル競争、Blobトランザクション、非公開経路、レシート、ファイナリティまで解説します。

更新日

教育目的の情報であり、取引またはセキュリティに関する助言ではありません。置換とキャンセルは競争結果、クライアント、送信経路に左右されます。元のトランザクションが排除されたと判断する前に、チェーン、送信者、ノンス、署名済みペイロード、手数料フィールド、レシート、ファイナリティを確認してください。

直接の答え

Ethereumのトランザクション置換とは、同一送信者から同じ nonce で送られた別の候補よりも、新たに署名されたトランザクションをノードが優先できるローカルなトランザクションプール方針です。コンセンサス層にあるグローバルなReplace-by-Feeスイッチではありません。あるノードが新しいハッシュを受け入れても、他のノード、非公開リレー、ビルダーから古い署名済みトランザクションが消えるわけではありません。どの候補がアカウントのノンスを消費するかを決めるのは、正規チェーンへの取り込みです。

ウォレットの「スピードアップ」は通常、元の宛先、金額、calldataを維持して手数料フィールドを引き上げます。公開プールの「キャンセル」は通常、同じ送信者とノンスを使う金額ゼロの自己送金を作ります。これは競合トランザクションであり、取り消し操作ではありません。元のトランザクションが先に取り込まれれば、その送金やコントラクト呼出しは元に戻りません。製品固有の非公開経路では別のキャンセルAPIを定義できます。たとえばFlashbots Protectは、オンチェーンに置かれない認証付きキャンセルを文書化していますが、これを公開Ethereumのトランザクション置換一般に当てはめてはいけません。

仕組み

  1. 正確な履歴を固定します。チェーンID、クライアントとバージョン、先頭ブロックとベースフィー、送信経路、送信者、正規アカウントノンス、元の署名済み生バイト列、トランザクションハッシュ、種類を記録します。関連する複数の公開・非公開ビューを照合し、ウォレット表示や一つのRPC応答をグローバル状態とみなしません。
  2. 元のトランザクションを正確に分類します。受入れ前の拒否、ローカルでpending、ノンスギャップのためqueued、dropまたはevict、非公開送信、正常に取り込み、status = 0 で取り込み、再編成で除外、ファイナライズ済みを区別します。ノンスが正規チェーンで消費された後は置換できると考えてはいけませんが、再編成により競争が再開する場合があります。
  3. 新しい意図を定義します。スピードアップでは意図した意味を持つ全フィールドを再現します。公開キャンセルの試行では通常、同じ送信者とノンスを使い、to = sendervalue = 0、空のcalldataを設定します。署名前にチェーンID、種類、宛先、金額、calldata、アクセスリスト、gas上限、Blobハッシュ、認可を比較します。
  4. 対象ノードの実際の置換方針を確認します。legacyおよびtype-1トランザクションは gasPrice を使い、type-2は maxFeePerGasmaxPriorityFeePerGas を持ちます。type-3はさらに maxFeePerBlobGas を持ち、sidecarが必要です。現在のGethで通常の txpool.pricebump = 10blobpool.pricebump = 100 が既定であることはGethの設定例であり、Ethereum全体の定数ではありません。
  5. 引上げ条件と資金要件を分けて計算します。type 2の実効価格は min(maxFeePerGas, baseFeePerGas + maxPriorityFeePerGas) です。候補には有効なエンコード、十分なintrinsic gas、送金額と最大手数料エクスポージャーを賄う残高も必要です。上限を高めても不正なcalldataは修復できず、EVM実行の成功も保証しません。
  6. 意図を持って送信し、すべての応答を保存します。公開再送信は意図を漏らし、MEVの対象になる可能性があります。非公開リレーはそれぞれ可視性、キャンセル、ビルダー範囲、稼働性が異なります。各経路で新旧ハッシュを追跡し、ローカル受入れによって競合候補が削除されたと仮定したり、金額を伴う第三の候補を無闇に送ったりしません。
  7. 正規チェーン上の勝者を照合します。必要なファイナリティ水準で、レシートのブロックとハッシュ、トランザクション索引、status、gas使用量、実効gas価格、ログ、送信者ノンス、残高、コントラクト状態を確認します。敗れたハッシュは、証拠に応じて置換済み、drop済み、引き続き観測中と記録し、再編成後は分析をやり直します。

計算例

  • 通常のtype-2における教材用引上げ。 古い候補は maxFeePerGas = 40 gweimaxPriorityFeePerGas = 2 gwei です。引上げ幅を 10% とするGethの教材用設定では、算術上のしきい値は 44 gwei2.2 gwei です。44/2.1 gwei の候補は優先手数料のしきい値を満たしませんが、44/2.2 gwei は両方の教材用しきい値に達します。ベースフィーが 32 gwei、gas使用量が 21,000 の場合、実効価格は 34.2 gwei、総手数料は 718,200 gwei = 0.0007182 ETH、ベースフィー焼却額は 0.000672 ETH、優先手数料は 0.0000462 ETH です。実際の受入れは、実装、バージョン、wei単位の整数丸めに左右されます。
  • ベースフィー感応度。 置換候補の上限を 66/4.4 gwei とします。ベースフィーが 60 gwei なら実効価格は min(66, 60 + 4.4) = 64.4 gwei です。ベースフィーが 65 gwei なら実効価格は 66 gwei、実効優先手数料はわずか 1 gwei です。ベースフィーが 67 gwei なら 66 < 67 であるため、ローカルの引上げテストを満たしていても、その上限では候補ブロックに取り込めません。
  • キャンセル競争。 元のノンス 20 のトランザクションは、加盟店に 5 ETH を送ります。これが 21,000 * 42 gwei = 0.000882 ETH の手数料で先に勝てば、加盟店は 5 ETH を受け取り、キャンセル候補はnonce too lowになります。金額ゼロの自己送金が 21,000 * 45 gwei = 0.000945 ETH の手数料で先に勝てば、ノンス 20 を消費し、元のトランザクションは同じ正規履歴に後から入れません。「キャンセル」をクリックしただけでは結果は分かりません。
  • Blobプールの境界。 古いtype-3候補の実行手数料上限は 100 gwei、優先手数料上限は 3 gwei、Blob手数料上限は 20 gwei です。引上げ幅を 100% とするGeth Blobプールの教材用設定では、算術上のしきい値は 200/6/40 gwei です。200/6/39 gwei の候補はBlob上限を満たしません。200/6/40 gwei は三つすべての教材用しきい値に達しますが、有効なsidecar、ノンス、残高、プール受入れがなお必要です。この値は通常のトランザクションや他のクライアントのルールではありません。

リスク

  • 誤ったチェーンIDまたはネットワークを選ぶ。
  • 誤った送信者またはアカウントノンスを選ぶ。
  • 古い先頭ブロック、ベースフィー、正規ノンスを使う。
  • 元のトランザクションが取り込み済みまたはファイナライズ済みなのに置換を試みる。
  • 通常のトランザクションプール規則をERC-4337 UserOperation に適用する。
  • 別のクライアント、プロバイダー、バージョン、設定も同じ方針だと仮定する。
  • wei単位の整数丸めにより引上げしきい値を下回る。
  • 必要なEIP-1559手数料フィールドの一方だけを引き上げる。
  • maxFeePerGas を候補ブロックのベースフィーより低く設定する。
  • Blob手数料上限、sidecar、Blobプール固有ルールを見落とす。
  • 金額と認可した最大手数料を賄う残高がない。
  • 署名、種類、エンコード、intrinsic gas、チェーンドメインが無効である。
  • 宛先、金額、calldata、アクセスリスト、Blobハッシュを誤って変更する。
  • 公開キャンセルトランザクションが取り込み競争に負ける。
  • 古いトランザクションが他のノードまたはビルダー入力に残る。
  • 非公開リレーが送信内容を漏えい、検閲、dropしたり、キャンセルに失敗したりする。
  • 公開再送信が意図をフロントランニング、サンドイッチ、その他のMEVにさらす。
  • ノンスギャップが後続トランザクションを妨げ、重複送金を招く。
  • 置換候補が取り込まれてもrevertまたはout-of-gasとなり、ノンスと手数料を消費する。
  • 再編成、ファイナリティ、レシート履歴の誤りにより候補が復活または誤分類される。

よくある誤解

  • 手数料が高い候補は古いトランザクションをネットワーク全体から削除する。
  • 数値上のノンスが同じなら、送信者が異なっても二つのトランザクションは互いを置換する。
  • ウォレットの「キャンセル」は、取り込み済みのトランザクションを元に戻せる。
  • 一つのノードが置換を受け入れれば、ビルダーも取り込むことが証明される。
  • 一律10%の引上げ規則が、全クライアント、Blobトランザクション、非公開リレー、UserOperation に適用される。

関連トピック

出典

ナビゲーション

Wiki を検索...