本文へ移動

ウォレットの nonce ギャップから復旧する方法

EVM アカウントで最初に欠けた nonce を特定し、置換かキャンセルかを判断して、ウォレットや複数端末でのトランザクション滞留を防ぎます。

更新日

教育目的の参考情報であり、投資助言ではありません。投資により損失が生じる可能性があります。

直接の回答

EVM 互換チェーンでは、一つの外部所有アカウント(EOA)からのトランザクションは nonce 順に実行されます。次に実行できる nonce が欠けているか停止していると、それより大きい nonce のトランザクションは、手数料が高くてもキューに残ることがあります。復旧では未解決の最小 nonce を最初に処理します。チェーンと送信者を確認し、確定済みと保留中の nonce データを比較したうえで、目的のトランザクションを置換するか、同じ nonce のキャンセルトランザクションを競合させます。

キャンセルはプロトコル上の取り消しではありません。通常は同じ nonce を使い、そのアカウントから自身へ送る 0 ETH の送金です。先にブロックへ入った有効なトランザクションが勝ち、確定済みのトランザクションはこの方法では取り消せません。

この手順は通常の EVM EOA トランザクション向けです。スマートアカウントやアカウント抽象化の処理ではコントラクト独自の nonce 方式を使うことがあり、UTXO ネットワークのトランザクションモデルは異なります。

nonce ギャップがキューを止める理由

EOA の nonce は順番に増えるカウンターです。一つの nonce で実行できるトランザクションは一件だけで、アカウントは nonce 25 より先に nonce 26 を実行できません。そのためノードは、すぐ実行できるトランザクションと、将来の実行を待つ高 nonce のトランザクションを分けます。

キューは単一のグローバルで権威ある mempool ではありません。各 RPC ノードが認識・保持する保留トランザクションの集合は異なります。ウォレットには表示されてもエクスプローラーにはなく、ある RPC では見えて別の RPC では見えないことがあります。未送信、ノードのプールからの破棄、または照会先サービスまで未伝播である可能性があります。

latest を指定した eth_getTransactionCount は最新ブロック状態の件数を返し、EOA では確定済みトランザクションの次の nonce と解釈できます。pending を指定した同じ呼び出しは、単一ノードの保留状態を照会します。両者の差は、そのノードが保留トランザクションを認識していることを示しますが、すべての公開ノードが認識している証明にはなりません。

署名前に診断する

  1. すべての端末とアプリで、影響を受けたアドレスからの送信を止めます。ネットワーク、chain ID、送信者アドレス、トランザクションハッシュ、nonce、宛先、金額、calldata、gas limit、手数料フィールドを記録します。
  2. ウォレット、エクスプローラー、RPC が同じチェーンと送信者を参照していることを確認します。nonce は一つのチェーン上のアカウントに属し、ウォレットのインストール環境には属しません。
  3. latestpending の両方で eth_getTransactionCount を照会し、できれば独立した二つの RPC プロバイダーを使います。不一致は mempool の見え方の違いであり、オンチェーン状態の不整合の証明ではありません。
  4. 送信者のトランザクションを nonce ごとに調べます。利用可能ならノードのトランザクションプール API で、実行可能な pending と将来用の queued を区別できます。公開 RPC はこの非標準 API を無効にしていることがよくあります。
  5. latest の値から始め、確定済みトランザクションがない最初の nonce を探します。その nonce の既知のトランザクションがまだ見えるか、破棄されたか、ローカルでのみ作成されたかを判断します。

ウォレットのステータス表示だけで行動しないでください。正しいチェーン上の確定 nonce、トランザクションレシート、ブロック収録が決定的な証拠です。

最初の未解決 nonce を置換またはキャンセルする

元の操作を維持する場合:ウォレットのスピードアップ機能を使うか、送信者、nonce、宛先、金額、calldata が同じで、競争力のある手数料を設定したトランザクションを再送します。署名前に全フィールドを確認してください。payload を変えると別の操作になります。

元の操作を断念する場合:未確定の間に、同じ nonce と競争力のある手数料を使い、そのアドレスから自身へ 0 ETH を送ります。これは自己送金を勝たせようとするだけです。元のトランザクションが先に確定する可能性があるため、置換側のレシートが得られ、元の側が未確定であることを確認するまでキャンセル成功と見なしてはいけません。

置換の受け入れはノードの方針であり、共通の上昇率はありません。EIP-1559 トランザクションでは maxPriorityFeePerGasmaxFeePerGas の両方を上げる必要があり、maxFeePerGas は現在の base fee で有効でなければなりません。ウォレットの推定値とクライアント規則は異なります。replacement transaction underpriced は、受信ノードが現在の方針で置換を受け入れなかったことを意味します。

最小 nonce が確定したら、レシート、latest、残高、および上位 nonce の全トランザクションを再確認します。キューのトランザクションは直ちに実行可能になる一方、関係する全ノードから破棄されたものは意図的な再送が必要です。以前のコピーが収録されていないことを確認せず、むやみに再送しないでください。

あるアドレスは nonce 24 まで確定しているため、latest は 25 です。一つの RPC は pending を 25 と返し、ウォレットは nonce 26 と nonce 27 をキュー中と表示します。どのプロバイダーも nonce 25 の送信済みトランザクションを見つけられません。

所有者はまず、正しいチェーン、送信者、記録済み payload を確認します。nonce 25 に実行したい操作があったなら、現在の手数料でその操作を nonce 25 として再構築し送信します。実行したい操作がなければ、nonce 25 で 0 ETH の自己送金を提出できます。nonce 27 の手数料だけを上げてもギャップは埋まりません。

nonce 25 が収録されたら、nonce 26 や nonce 27 に触る前にレシートを確認します。どちらも破棄済みの可能性と、ギャップ解消後すぐ実行される可能性があるため、個別に確認します。

リスクと中止条件

  • 置換は元のトランザクションと競合します。オンチェーンの証拠が出るまでは、元の宛先、金額、コントラクト呼び出しが実行され得ると考えます。
  • 信頼できる画面で送信者アドレス全体、chain ID、nonce、calldata を確認します。マルウェアや信用できない「復旧」サイトは送金や承認に差し替える可能性があります。
  • 置換手数料に十分なネイティブ通貨を残します。コントラクト呼び出しが後で revert しても、収録されたトランザクションには gas が課されます。
  • nonce ギャップの復旧にシードフレーズや秘密鍵を開示する必要はありません。正規の RPC、エクスプローラー、サポート担当者が要求することはありません。
  • アドレスが侵害されている場合、公開置換の繰り返しが攻撃者との手数料競争になることがあります。侵害端末の使用を止め、場当たり的に手数料を上げずインシデント対応計画に従います。
  • RPC 間で結果が違う、元の宛先が不明、payload を再構築できない、または高額なコントラクト操作の場合は、署名前に中止して専門家へ相談します。

複数端末や自動署名者で継続利用する場合は、アカウントとチェーンごとに一つの nonce アロケーターを使い、署名を直列化し、予約済み nonce とハッシュを永続記録し、確定状態と送信ノードの保留プールの両方に照合します。ウォレットのローカル履歴をリセットしても、オンチェーン状態や他ノードの mempool は変わりません。

よくある誤解

  • 「nonce 27 の手数料を上げれば nonce 25 を飛ばせる。」 先行 nonce が実行可能になった後の優先度は上がり得ますが、ギャップは修復しません。
  • 「見つからなければキャンセル済みだ。」 あるノードが破棄しても、別のノード、ビルダー、取引相手が保持している場合があります。署名済みトランザクションは再送できます。
  • 「0 ETH の自己送金は元の取引を取り消す。」 同じ nonce で競合するだけで、元の取引が確定した後は効果がありません。
  • pending がネットワークの最終回答だ。」 照会したノードの保留状態であり、プロバイダーごとに異なります。

関連トピック

出典

ナビゲーション

Wiki を検索...