本文へ移動

「replacement transaction underpriced」の解決方法

この RPC エラーは、同一送信者・同一 nonce の取引がノードの手数料引き上げポリシーを満たさなかったことを示します。安全な確認、スピードアップ、キャンセル方法を説明します。

更新日

教育目的のみであり、財務またはセキュリティ上の助言ではありません。置換やキャンセルによって意図しない取引が実行される可能性があり、ネットワーク手数料は取り戻せません。

直接回答

replacement transaction underpriced は RPC またはトランザクションプールによる拒否であり、EVM コントラクトの revert ではありません。通常は、同じ送信者かつ同じ nonce の取引をノードがすでに認識している一方、新しく送信した取引の関連手数料フィールドが、そのノードの置換ポリシーを満たすほど上がっていないことを意味します。

まず、チェーン、送信者、nonce、既知のすべての取引ハッシュの状態を確認します。元の取引が保留中で置換する意図があるなら、まったく同じ nonce を使い、ウォレットまたはノードのポリシーに従って手数料フィールドを引き上げます。gasLimit だけを増やす、スリッページを変える、同じ署名済み取引を繰り返し配信するといった操作では、手数料引き上げルールを満たせません。

仕組み

  1. Nonce は取引の順番を特定します。 外部所有アカウントの取引には連続する nonce が使われます。ある送信者と nonce の取引をすでに持つノードは、同じ位置の別の取引を置換候補として扱います。後の nonce は、先の nonce が取り込まれるか別の方法で解決されるまでキューに残ることがあります。
  2. 置換はローカルなプールポリシーです。 Ethereum コンセンサスは共通の引き上げ率を定めていません。クライアント、RPC 事業者、プライベートリレーでポリシーや認識する保留取引が異なる場合があります。Geth の legacy pool の現在の既定値は 10% ですが、運用者が変更でき、他のクライアントが同じとは限りません。
  3. EIP-1559 には二つの実行手数料上限があります。 maxPriorityFeePerGas はバリデーターチップを、maxFeePerGas はブロック基本手数料を含む gas 当たり総額を制限します。Geth の legacy pool では、新しい fee cap と tip cap の両方が旧値を上回り、設定された率のしきい値も満たす必要があります。ウォレットは片方だけでなく両方を計算すべきです。
  4. プールの受理は確認ではありません。 あるノードが置換を受理しても、別のノードは元の取引を保持していることがあります。canonical なアカウント順序に取り込めるのは、同じ送信者と nonce につき一つだけです。先に取り込まれた有効な候補が他をそのチェーン上で無効にしますが、画面の反映は遅れる場合があります。
  5. 手数料上限と支払額は別です。 EIP-1559 の実効 gas 価格は fee cap に制限され、未使用 gas には課金されません。maxFeePerGas を上げると最大負担は増えますが、最終価格が必ず上がるわけではありません。ただし基本手数料とチップの条件次第では、高い上限まで支払う可能性があります。

解決手順と例

保留取引の nonce が 42maxFeePerGas = 30 gweimaxPriorityFeePerGas = 2 gwei だとします。10% の引き上げを求めるノードは、31 gwei2.1 gwei の候補を拒否し、35 gwei2.5 gwei の候補なら例示したしきい値を超えます。それでも現在の基本手数料により 35 gwei の fee cap では実効チップが少なすぎる場合、待機が続くことがあります。この率は一例であり、ネットワーク全体の保証ではありません。

次の順序で進めます。

  1. 正しいネットワークと送信者を確認します。ウォレットに加え、独立した RPC またはブロックエクスプローラーで元のハッシュとすべての置換ハッシュを照会します。
  2. 確認済み取引数と pending ビューを比較します。nonce 42 がすでに確認済みなら、まだ保留中だと想定して別の取引を作らないでください。
  3. 元の tovaluedata をデコードします。スピードアップでは意図した操作と nonce を維持します。キャンセルでは通常、ウォレットが同じ nonce で送信者自身に 0 ETH を送りますが、これは競合する置換であり、プロトコル上の取り消しではありません。
  4. 可能ならウォレットのスピードアップまたはキャンセル機能を使います。それ以外は、ノードの現在の引き上げポリシーと手数料見積もりを取得し、整数丸めの余裕を持って EIP-1559 の両上限を上げます。口座が value + gasLimit x maxFeePerGas を負担できることも確認します。
  5. 取引全体を再確認してから署名します。配信は一度にし、すべてのハッシュを保存して候補すべてのレシートを監視します。保留中ハッシュにレシートはなく、正しいチェーンとブロックに結び付いたレシートが実行の確認点です。

リスク

  • キャンセルは保証されません。キャンセルがブロック生成者に届く前に元の取引が取り込まれる場合があり、非公開または伝播の弱い取引は確認中の RPC から見えないことがあります。
  • nonce を間違えると、旧取引の置換ではなく新しい送金やコントラクト呼び出しを作る可能性があります。古い calldata の再署名により、価格、allowance、期限、プロトコル状態が変わった操作を実行する危険もあります。
  • あるエンドポイントが受理した置換を別のエンドポイントが拒否することがあります。RPC を何度も切り替えると、複数候補が別々のプールに残り、ウォレット表示が分かりにくくなります。
  • gasLimit を上げても取引の優先度は上がりません。手数料上限の無計画な引き上げは不要な最大費用を生みます。スリッページやコントラクト calldata の変更は実行内容を変えるだけで、プールのルールは直りません。
  • Blob 取引、アカウント抽象化の user operation、L2、プライベートリレーは異なるプールや置換規則を使う場合があります。Geth の通常 EVM 取引ポリシーが適用されると決めつけないでください。

送信者や nonce に心当たりがない、元の calldata をデコードできない、取引が確認済みかもしれない、ウォレットが別の受取人や金額を示す、または RPC がシードフレーズや秘密鍵を要求する場合は、再署名せず調査してください。正当なトラブルシューティングで秘密の復元情報を開示する必要はありません。

よくある誤解

  • 「残高不足である。」 残高不足は別の検証エラーです。このメッセージは競合取引とプールの置換価格設定を指します。
  • 「10% 上げれば必ず通る。」 これは Geth で一般的な既定値であり、コンセンサス規則ではありません。事業者設定、クライアント、取引タイプ、整数丸めによってはさらに必要です。
  • 「高い手数料の取引がどこでも元取引を置換した。」 取引プールはローカルです。一つの RPC に受理されても、すべてのプールから元取引が消えるわけではなく、どちらが先に取り込まれるかも保証されません。
  • 「キャンセルで確認済み取引を元に戻せる。」 できません。キャンセルが競合できるのは nonce が未解決の間だけです。確認済みの状態変更には、存在する場合に限りアプリケーション層の別の救済策が必要です。

関連トピック

出典

ナビゲーション

Wiki を検索...