nonce:イーサリアムのトランザクションが順番待ちになる理由

·4 分で読める·SSP Editorial Team 著
SSP Academy カバー:イーサリアムの nonce を解説

nonce:イーサリアムのトランザクションが順番待ちになる理由

Bitcoin では、同じウォレットから送った無関係な二つの支払いは、どの順番で承認されても構いません。Ethereum ではそうはいきません。アドレスから送られるすべてのトランザクションには番号が付いており、ネットワークはそれらを厳密に順番どおりに処理します。この番号が nonce です。nonce を理解すると、イーサリアムウォレットで最も戸惑う場面のいくつかが説明できます。あるトランザクションがいつまでも承認されず、その後のトランザクションがすべてその後ろで止まってしまう、という状況です。

nonce とは

通常のイーサリアムアカウントでは、nonce はカウンターです。つまり、そのアドレスがこれまでに送信したトランザクションの数です。最初のトランザクションは nonce 0、次は 1、というように進みます。署名するトランザクションにはそれぞれ nonce が含まれ、ネットワークは nonce n − 1 がブロックに取り込まれた後でなければ nonce n を受け付けません。

nonce には二つの役割があります。

  • リプレイ保護。署名済みのトランザクションを二度送信することはできません。nonce 5 が一度使われると、そのアドレスからの nonce 5 の別のトランザクションはすべて無効になるからです。
  • 順序付け。一つのアカウントのトランザクションは、意図したとおりの順番で正確に実行されます。これは、あるトランザクションが別のトランザクションに依存する場合に重要です。たとえば、承認してからスワップする場合です。

一つの詰まったトランザクションが残りを止めてしまう理由

順序のルールには副作用があります。nonce 5 が手数料が低すぎて取り込まれないままメモリプールに残っていると、nonce 6、7、8 も、どれだけ手数料を払っていても取り込まれません。それらは nonce 5 の後ろで順番を待つことになります。

だからこそ、手数料が低すぎるトランザクションが一つあるだけで、ウォレットが固まったように見えることがあるのです。何も失われてはいません。キューが一か所で止まっているだけです。

キューの詰まりを解消する

各 nonce は一度しか使えないため、詰まったトランザクションは置き換えることで解決します。

  • 高速化:同じ nonce で、より高い手数料を付けた新しいトランザクションに署名します。ノードは古いバージョンを置き換え、先にブロックに取り込まれた方が有効になります。
  • キャンセル:同じ nonce で、自分自身に金額ゼロを送るトランザクションに、より高い手数料を付けて署名します。これが承認されれば、元のトランザクションが承認されることは二度とありません。

置き換えのトランザクションが受け入れられるには、一般に元のトランザクションよりも明らかに高い手数料が必要です。詰まったトランザクションと手数料による置き換えでは、Bitcoin における同等の手段を解説しています。

よくある nonce の問題

  • 「nonce が低すぎる」(エラーメッセージ nonce too low)。その nonce を使ったトランザクションがすでに使用されています。多くの場合、別のウォレットや端末が同じアドレスから送信したことが原因です。
  • 欠番。アカウントがまだ 7 の段階で nonce 9 のトランザクションを送ると、7 と 8 が揃うまで待たされます。通常は、何かが破棄されたか、別の場所で署名されたことを示しています。
  • 二台の端末、一つのアカウント。二つのアプリが同時に同じアドレスから送信すると、両方が同じ nonce を選んでしまうことがあります。その場合、片方のトランザクションは失敗します。

ほかのチェーンではどうしているか

  • Bitcoin などの UTXO チェーンには、アカウントの nonce がありません。各トランザクションは特定のコインを使い、コインは一度しか使えません。これがリプレイや二重支払いを防いでいます。
  • Solana は代わりに最近のブロックハッシュを使います。トランザクションは短い時間枠の間だけ有効です。二台の端末で承認を集めるような時間のかかる署名のために、特別なアカウントに保存される永続 nonceを提供しています。

スマートアカウントにも nonce がある

ERC-4337 上に構築されたスマートコントラクトアカウントは、通常のトランザクションを送信しません。代わりにユーザーオペレーションに署名し、バンドラーがそれを共有の EntryPoint コントラクト経由で送信します。それでも各アカウントには EntryPoint が管理する nonce があり、同じリプレイ保護が働きます。この規格では、アカウントごとに独立した複数の nonce の系列を持つこともできるため、互いに関係のない操作が待ち合う必要はありません。全体像については基本原理から学ぶアカウント抽象化で解説しています。

SSP における nonce

Ethereum および SSP が対応するほかの EVM チェーンでは、SSP アカウントは 2-of-2 マルチシグで管理される ERC-4337 スマートアカウントです。すべての操作に nonce が含まれ、SSP Wallet と SSP Key の両方がそれを含めて署名します。そのため、承認済みの操作がリプレイされることも、履歴の別の位置で再利用されることもありません。

実用上の影響が一つあります。アカウントのコントラクトは、そのアカウントから最初に送信する操作によってデプロイされます。最初の送信にはデプロイが含まれるため、その後の送信よりも目に見えて多くのガスを消費します。これは想定どおりの動作で、チェーンごと・アカウントごとに一度だけ発生します。

率直なまとめ

nonce は、すべてのイーサリアムアカウントがトランザクションを一度だけ、順番どおりに処理するためのカウンターです。これによりリプレイから守られ、依存関係のあるトランザクションの順序も保たれます。その代わり、手数料が低すぎるトランザクションが一つあると、その後ろにあるものすべてが止まってしまうことがあります。

そうなったときは、さらにトランザクションを重ねて送らないでください。詰まっているトランザクションを同じ nonce とより高い手数料で置き換えるか、キャンセルすれば、キューは解消されます。

この記事をシェアする

関連記事