暗号通貨におけるナンスとは?ビットコインマイニング、イーサリアム、暗号技術

暗号通貨におけるナンスとは?ビットコインマイニング、イーサリアム、暗号技術

2010年12月、ベルリンで開催されたカオス・コミュニケーション・コングレスのステージで、fail0verflowと呼ばれる小規模グループが、PlayStation 3のソニーのマスター署名キーを抽出したと発表した。このエクスプロイトは256ビット楕円曲線暗号を破ったわけでも、AES暗号を解読したわけでもない。ソニーのコード署名システムが、生成するすべての署名に同じ番号を再利用しているという事実を利用したのだ。その番号はナンス(nonce)だった。

同じ単語「nonce」が、暗号通貨の世界の3つの分野で登場するが、それ以外に共通点はほとんどない。ビットコインマイナーが有効なブロックハッシュを探すために毎秒何兆回も繰り返す変数であり、イーサリアムウォレットが送信トランザクションの順序付けに使用するカウンターであり、トランザクションが停止すると後続の署名済みトランザクションがすべてブロックされる理由でもある。また、AES-GCM暗号が2つの暗号化されたメッセージの内容が互いを漏洩しないようにするために必要な固有の値でもある。1つの単語で3つの役割があり、どれも互換性はない。初心者が「nonceが低すぎる」エラーを誤解したり、マイナーが不可能な設定を設計したり、PS3のようなシステムが信頼の基点を失ったりするのは、これらが混同されるからである。

「一度だけ使用される番号」と呼ばれる32ビットのnonce:起源

バクロニムは至る所で見られる。「nonceは一度だけ使われる数字の略」という表現は、おおむね正しいが、歴史的には誤りである。英語のnonceという単語は、暗号技術よりも約750年も前から存在していた。「for the nonce」という表現は、1200年頃の中英語写本に登場し、「この特定の機会のために」という意味だった。

暗号学は1978年にニーダム・シュローダー認証プロトコルでこの用語を借用しました。そこで定義される特性はランダム性ではなく、定義された範囲内での一意性です。ウィキペディアは実際の運用に倣い、ナンスを「暗号通信で一度だけ使用できる任意の数値」と定義しています。カウンターもこれに該当します。タイムスタンプもそうです。乱数も、あるいはこれら3つの組み合わせも該当します。重要なのは、システム内部で、同じナンスが同じ鍵で、あるいは同じコンテキストで再び出現しないことです。

1つの単語で処理が完了し、処理は3つに分割されます。ビットコインのマイニングnonceは、ブロックハッシュが難易度ターゲットを下回るまで変化します。イーサリアムのアカウントnonceは、ネットワークが繰り返し使用を拒否するカウンターです。対称暗号化における暗号学的nonceは、鍵とペアになった値であり、一度再利用すると暗号化が破られます。

その言葉は曖昧だが、文脈はそうではない。

暗号通貨におけるナンス

ビットコインマイニングにおけるnonceの仕組み

ビットコインでは、ナンスは80バイトのブロックヘッダー内の32ビットのフィールドを占めます。つまり4バイトです。値は0から4,294,967,295までです。約43億通りの数値が考えられますが、サトシがプロトコルを書いた当時は途方もない数に思えたものの、今では机サイズのASICで数マイクロ秒で使い果たされてしまいます。

マイニングとは、有効なブロックハッシュを生成する値をそのフィールド内で見つけるための競争です。80バイトのヘッダーを取り上げます。これをビットコインのブロックチェーンが動作する暗号学的ハッシュ関数であるSHA-256に2回通します。256ビットの数値が出力されます。この数値を、ネットワークの難易度ターゲットによって設定されたターゲットハッシュと比較します。難易度ターゲットは、プルーフオブワークを推進するコンセンサスメカニズムです。ターゲットより低い場合は、ブロックが有効となり、マイナーが勝ちます。ターゲットより高い場合は、nonceを1つ増やして再ハッシュします。ビットコインマイナーは、誰かが有効なnonceを見つけて新しいブロックがブロックチェーンに追加されるまで、これを繰り返します。

これほど大きなタスクに対して、なぜこんなに小さなフィールドなのか?構造的な理由があります。nonceは、マイナーが変更できるヘッダーの中で最も安価な部分です。他のすべてのフィールドには依存関係があります。マークルルートはブロックのトランザクションを要約しているため、これを変更すると、新しいハッシュを試行する前にトランザクションツリー全体を再計算する必要があります。nonceはこれらすべてを回避します。各ハッシュ試行は独立しています。nonceをインクリメントしても、ランダムな値を選択するのと何ら変わりなく、進歩は見込めません。これは、合意言語で装った総当たり攻撃です。

この設計はおよそ1年間持ちこたえた。その後、ASICによって破られた。現代のマイナーは、43億個のnonce空間全体を秒ではなくマイクロ秒で使い果たす。Bitmain Antminer S21 Proは毎秒234テラハッシュで動作する。このハードウェアでは、nonceフィールド全体が約18マイクロ秒で使い果たされる。2026年5月現在、ビットコインネットワークの総ハッシュレートは996 EH/s近くで、難易度は132兆4700億である。1台のS21 Proだけで、毎秒数万回、考えられるすべてのnonce値を処理できる。

つまり、サトシのプロトコルでは、32ビットの領域が枯渇した後、マイナーには2つのクリーンな出口が用意されている。1つ目は、コインベーストランザクションのscriptSig内に格納されている「エクストラノンス」というフィールドだ。BIP34でコード化されている。2~100バイトで、マイナーが制御できる。エクストラノンスを変更すると、コインベースTXIDが変わり、マークルルートを再計算する必要があり、ブロックヘッダーも変更され、32ビットのノンスを新たに検索する必要がある。2つ目の出口は、タイムスタンプをインクリメントするか、プロトコルで許可されている範囲内でバージョンビットをローテーションすることだ。今日のマイニングプールは、通常の運用の一環として、これらすべてをローテーションしている。ノンスの調整が最もコストの低い変更であり、エクストラノンスの調整が2番目にコストが低い。マークルとタイムスタンプのローテーションは、再計算にかかる作業量が多い順に、さらにコストが低い。

誰かが目標値(マイナーはこれを「ゴールデンナンス」と呼ぶ)を下回るハッシュ値を出すと、新しいブロックがピアツーピアネットワーク全体に拡散され、すべての参加者は現在の検索を中断して次のラウンドを最初からやり直す。

ASICモデルハッシュレート32ビットnonceを使い切る時が来た効率
アントマイナーS21 200 TH/秒約21マイクロ秒17.5 J/TH
Antminer S21 Pro 234 TH/秒約18マイクロ秒15 J/TH
Antminer S21 XP 270 TH/s約16マイクロ秒13.5 J/TH

最近の実際の例が、この抽象化を裏付けています。2026年初頭にマイニングされたブロック948,000は、ブロックハッシュが`000000000000000000001b01841afc366a4f999b291c8563ee0d0db956fc2db44`で、当選したnonce値は2,582,463,598です。この単一の整数とブロックヘッダーの残りの部分を組み合わせることで、ブロックチェーンに追加できるほど低いハッシュが生成されました。そのラウンドでマイナーが試した他のnonceはすべて、大きすぎる値になっていました。

これが、機械的に言えばプルーフ・オブ・ワークの本質です。謎解きのようなパズルではありません。電気代を支払って、有効なナンスを探す作業です。

ハッシュnonceとアカウントnonce:同じ単語だが、役割は異なる

仮想通貨では「nonce」という言葉がもう一つ別の用途にも使われており、この重複が新規参入者にとって最大の混乱要因となっている。ビットコインのマイニングnonceは検索変数であり、イーサリアムのアカウントnonceはカウンターである。両者は名前こそ共通しているものの、それ以外に共通点はほとんどない。

ハッシュノンス(ビットコイン)アカウントのnonce(イーサリアム)
仕事ターゲット以下の有効なハッシュを検索アカウントごとの送信トランザクションの順序
生息地ブロックヘッダー(32ビット)アカウントの状態(整数値、0から開始)
誰がそれを変異させるのかハードウェアマイナーは毎秒数十億を処理ウォレットは自動的に、送信ごとに1つ
「間違っている」とはどういう意味か宝くじ券が無効です。次の番号を試してください。取引が拒否されたか、停止しています。
合意に縛られているのか?はい、これは作業の証拠ですいいえ、これはリプレイ保護です

ハッシュナンスは、マイナーが破棄する一時的な数値です。アカウントナンスは、ネットワークがあなたのアドレスに刻み込む永続的な状態です。ビットコインブロックのブロックチェーンナンスをシーケンスカウンターのように扱うなど、この2つを混同すると、イーサリアムの「ナンスが低すぎます」エラーを解釈して、マイニング設定が壊れていると思い込む人が出てきます。ブロックチェーンが異なれば役割も異なりますが、同じ用語です。単一のエコシステム内であっても、ブロックチェーン操作におけるナンスの役割は、コンセンサス層を監視しているかアカウント層を監視しているかによって完全に異なります。

イーサリアムアカウントのnonceとトランザクションのスタック問題

イーサリアム上の外部所有アカウントはすべて、独自のnonceを持っています。カウンターは、アドレスが初めてトランザクションを送信したときにゼロから始まります。そこから、ブロックに取り込まれるトランザクションごとに1ずつ増加します。何かを送信すると、ウォレットはネットワークに現在の値を問い合わせ、次の番号を付加して署名します。ネットワークは、送信キューを厳密な順序でのみ受け入れます。nonceは0、次に1、次に2です。ギャップは許可されません。

この厳密な順序付けこそが、イーサリアムのリプレイ攻撃に対する防御力の源泉です。署名されたトランザクションは特定のナンスに紐付けられ、EIP-155以降は特定のチェーンIDにも紐付けられています。攻撃者は、既に実行済みのトランザクションを新しいトランザクションであるかのように再送信することはできません。再送信が到着する頃には、アカウントのナンスは既にそのトランザクションよりも先に進んでいます。チェーンIDは、クロスチェーンのリプレイ攻撃を同じタイミングで阻止します。1つのチェーン内では、確認済みのトランザクションは、既に先に進んでいるカウンター上の特定の時点に存在します。

同じように厳格な順序付けが、新しいイーサリアムウォレットが繰り返し直面する問題点を生み出している。チップが少なすぎるトランザクションが送信されると、バリデーターはそれを無視する。mempoolはそれを優先キューから削除する。トランザクションは宙ぶらりんの状態になり、承認も失敗もせず、ただ放置される。さらに悪いことに、同じアドレスが署名した後続のトランザクションはすべて、より高いnonceを取得する。ネットワークは、放置されたトランザクションが承認されるか置き換えられるまで、それらのトランザクションには一切触れようとしない。1つの遅いトランザクションがキュー全体を停滞させてしまうのだ。

解決策は、replace-by-fee と呼ばれる仕組みにあります。ウォレットは、停止したトランザクションと同じnonce で、より多くのガスを設定した新しいトランザクションを再送信します。2021 年 8 月のロンドンアップグレード以降、イーサリアムで使用されているガス価格モデルである EIP-1559 では、新しいトランザクションは `maxFeePerGas` と `maxPriorityFeePerGas` の両方を元のトランザクションより少なくとも 10% 引き上げる必要があるというルールが定められています。停止したトランザクションを置き換えるのではなく、完全に削除したい場合は、停止した nonce でより高いチップを設定したゼロ ETH の自己送金を送信します。スロットは自動的に消費され、キュー内の後続のトランザクションはすべてブロックが解除されます。

参考までに、2026年5月の数値を示します。平均優先度チップは約1.875 Gweiです。標準的な21,000ガスのキャンセルは、平穏な日には約0.05ドルになりますが、混雑時には数ドルまで上昇します。誰もが最終的に苦労して学ぶ教訓が1つあります。それは、常に最も低い保留中のnonceを最初に置き換えることです。前のトランザクションがまだ保留されている間に、後のトランザクションの手数料を引き上げても、何も効果はありません。

アカウントの抽象化によって、この話は少し変わります。ERC-4337スマートアカウントは2次元のnonceを使用し、整数を192ビットの「キー」と64ビットのシーケンスに分割します。異なるキーは並列トランザクションストリームを形成します。あるキーで処理が停止したバッチは、別のキーの処理を妨げません。アカウントnonceは、ついに単一の線形カウンタの域を超えました。

最後に、もう一つ誤解を解いておきましょう。2022年9月のマージでイーサリアムがプルーフ・オブ・ステークに移行した際、アカウントのnonceは削除されませんでした。削除されたのはブロックヘッダー内のマイニングnonceです。これは、バリデーターがハッシュパズルではなくスロットによって選択されるようになったためです。アカウントnonceは、これまで通りアカウント状態トライの中に残っています。

暗号化における暗号学的ノンス:壊滅的なバージョン

ブロックチェーンの枠から外れると、暗号学的ナンスの方がより鋭い働きをする。これを間違えると、足元が崩れ落ちるような事態になりかねない。

現代の認証付き暗号はすべて、秘密鍵とメッセージごとのノンスをペアにしています。TLS 1.3 の主力である AES-GCM は 96 ビットを使用します。NIST SP 800-38D がその仕様を記述しました。RFC 8439 (2018 年 6 月) で規定された代替方式である ChaCha20-Poly1305 は、同じ 96 ビットのノンス長をコピーし、256 ビットの鍵とペアにしています。どちらの方式にも共通するルールは、簡単に言うと、各 (鍵、ノンス) ペアが正確に 1 回実行されるということです。再利用は緩やかな劣化ではなく、急激な劣化です。

崖っぷちはどんな様子でしょうか? AES-GCM で、1 つの鍵の下で nonce を再利用します。攻撃者が両方の暗号文を傍受したと仮定します。攻撃者は 2 つの暗号文を XOR 演算します。すると、基となる 2 つの平文の XOR 演算結果が出力されます。機密性は、たった 1 つのステップで失われます。さらに悪いことに、GCM の認証モードでは、内部認証サブキー (その鍵の下ですべての暗号文に署名する値) が漏洩します。サブキーを入手した攻撃者は、新しい認証済み暗号文を作成し、正当な受信者はそれを本物として受け入れます。最先端の暗号でも、 1 つの不適切な nonce を使用すると、シーザーシフトに引っかかってしまいます。

これらはすべて事実です。2016年にUSENIX WOOTで発表された論文「Nonceを軽視する攻撃者」では、本番環境のHTTPSエンドポイントをスキャンし、GCM nonceを再利用しているサーバーを184台発見しました。これらのバグのあるビルドには、特定のCisco IOS XEイメージとRadware ADCファームウェアが含まれていました。CVE-2016-0270および関連する複数のCVEがこれらのバグを追跡しています。

2010年12月にソニーがPS3をハッキングした事件は、暗号方式がECDSAと異なっていたものの、同じ問題が原因だった。ECDSA署名には、署名ごとに一意かつ秘密の値kが必要である。ソニーの署名コードは、この一意性を省略していた。定数kをハードコードし、すべての署名で再利用していたのだ。攻撃者に、異なるメッセージに対して同じkを持つ2つのECDSA署名を与えれば、未知数が2つある2つの線形方程式を解くことになる。これを解けば、秘密署名鍵が閉じた形で得られる。fail0verflowは、ベルリンで開催された第27回カオス・コミュニケーション・コングレスのステージで、この仕組みを解説した。ソニーのマスター署名鍵は、数時間以内にインターネット上に流出した。それまで製造されたすべてのPS3は、信頼の連鎖を一斉に失った。

2013年にRFC 6979として成文化された決定論的な修正では、乱数生成器がプロセスから除外されます。メッセージと秘密鍵のHMACからkを導出します。同じメッセージ、同じ鍵、同じkなので、乱数生成器が破損する心配はありません。最新のビットコインライブラリは、デフォルトで決定論的なECDSAを採用しています。

これらの話から 2 つの帰結が導き出され、開発者を混乱させることがよくあります。AEAD 暗号 (AES-GCM、ChaCha20-Poly1305) では、予測可能な nonce で問題ありません。カウンターが機能します。一意性だけが要件です。ECDSA および Schnorr 署名では、ルールが逆転します。予測可能なkは致命的です。署名 nonce は一意で、予測不可能で、秘密である必要があります。この 2 つの陣営を混同すると、カスタム ウォレット コードで nonce 再利用バグが繰り返し発生します。Kopia バックアップ プロジェクトの 2024 年の監査では、長期間使用されているキーでランダムな GCM nonce 衝突のリスクが記録され、新しい SDK のペネトレーション テスト レポートでは、同様の発見が毎月報告されています。

ノンス vs 塩 vs IV:3つの混乱を避ける

セキュリティ関連の記事では、まるで同じ意味であるかのように3つの単語が安易に使われています。「Salt(塩)」「Nonce(ナンス)」「IV(IV)」。これらは同義語ではありません。

ソルトはパスワードハッシュ化に用いられる要素です。ユーザーごとにランダムな値を生成し、それをハッシュに混ぜることで、「password123」のような事前に計算されたレインボーテーブルがデータベースに対して機能しなくなります。ソルトはハッシュの横に平文で存在し、隠蔽されることはありません。2人のユーザーが同じソルトを共有するのは不便です。片方のソルトを解読した攻撃者が、もう片方のソルトも解読できてしまうからです。しかし、それで世界が終わるわけではありません。

ノンスはメッセージングと署名に関係します。対称暗号化ではメッセージごとに、ECDSAでは署名ごとに使用されます。AES-GCMのようなAEAD暗号では、ハッシュの横にソルトがあるように、ノンスが平文で公開されます。ECDSAはノンスを隠蔽し、秘密として扱い、毎回新しい乱数を要求します。いずれの場合も、衝突は単なる不都合ではなく、致命的です。保証全体が失われます。

IV(initialization vectorの略)は、新しい仕様でnonceと呼ばれるものの旧称です。CBCおよびCTRモードでは長年この用語が使われていました。最新のAEADドキュメントでは、主に「vector」が数学の宿題のように聞こえ、人々がそれを繰り返し使用していたため、「nonce」という名称に変更されました。「nonce」は、このルールをより厳密に適用しています。

付箋に収まるルールを一つだけ知りたいですか?ソルトはあなたが保管している秘密を守ります。ノンスはあなたが送信する秘密を守ります。

暗号通貨におけるナンス

ビットコインマイニングのトリビアを超えて、nonceが重要な理由

ナンスは小さなオブジェクトです。ビットコインでは32ビット、イーサリアムではカウンター、AES-GCMでは12バイトです。そのサイズに比べて、非常に大きな意味を持ちます。一般ユーザーにとって、イーサリアムのトランザクションが滞ったり、銀行サイトとのTLSハンドシェイクが成功したり、ハードウェアウォレットが署名したりするたびに、ナンスが正しく処理されるかどうかが重要になります。開発者にとって、ナンスの誤処理は、カスタム暗号コードに致命的なバグが発生する最も一般的な原因です。PS3の事例は極端な例でしたが、同じ不具合が新しいウォレットSDKやバックアップツールにも繰り返し発生しています。ビットコインの経済においては、32ビットのナンスとエクストラナンスの仕組みが、ASICマイニングをそもそも公平な宝くじのようなものにしたのです。サトシ・ナカモトの最も重要な設計上の選択の一つが、目立たないヘッダーフィールドの中に隠されているのです。

ナンスとは、この出来事が一度だけ、この順序で、正確にこの方法で起こったことを示すものです。ナンスを取り除くと、一意性に依存するすべてのシステムは、攻撃者が安価に再構築できるものへと崩壊します。コンセンサスは崩壊し、リプレイ攻撃に対する防御は失われ、暗号化は漏洩し、署名は偽造されます。

質問は?

どちらも同じですが、方法は異なります。Solanaはアカウントレベルのnonceを保持し、オフライン署名用に永続的なnonceアカウントを追加します。プルーフ・オブ・ステークのEthereumは、2022年9月のマージ後もアカウントnonceを保持しましたが、バリデーターがハッシュパズルではなくスロットによって選択されるようになったため、ブロックヘッダーからマイニングnonceを削除しました。

イーサリアムでは、唯一の方法は手数料による置換(replace-by-fee)です。これは、より高いガス料金を支払うことで、同じnonceを持つ未確認トランザクションを別のトランザクションと意図的に交換するものです。承認後は、同じアカウントで2つのトランザクションが同じnonceを共有することはできません。AES-GCMでは、1つの鍵の下でnonceを共有することは完全に禁止されています。nonceの再利用は、機密性と認証性を同時に損なうからです。

replace-by-feeを実行します。スタックしているトランザクションと同じnonceで、`maxFeePerGas`と`maxPriorityFeePerGas`を10%以上増やした新しいトランザクションを送信します。置き換えではなくキャンセルする場合は、スタックしているnonceで、より高いチップを添えて、自分のアドレスにゼロ額の送金を行います。常に、保留中のnonceの中で最も低いものを最初に置き換えてください。

3つの役割、根底にある考え方は1つ。ナンスは一意性を確保し、同じ操作が繰り返されないようにする。アカウントベースの台帳ではトランザクションの順序付けを行う。そして、プルーフ・オブ・ワークで有効なハッシュを探す際にマイナーが調整する検索変数でもある。仕組みは違えど、目的は同じ。つまり、各イベントを他のすべてのイベントと区別することだ。

このフレーズは通常、アカウントレベルまたは認証用のnonceを指します。セッション、トランザクション、またはAPIリクエストに紐づけられた使い捨ての値で、リクエストをリプレイできないようにするものです。ここでいう「トークン」はERC-20トークンとは異なります。OAuthとOpenID Connectはどちらも、認証フローにおいてnonceトークンを利用します。

「nonce」とは、特定の暗号化スコープ内で一度だけ使用される数値を意味します。ビットコインでは、マイナーが有効なハッシュを見つけるために循環する32ビットの検索フィールドとして使用されます。イーサリアムでは、1つのアカウントからの送信トランザクションの順序付けを行うカウンターとして使用されます。暗号化では、鍵とペアになったメッセージごとの値として使用され、決して繰り返されてはなりません。

Ready to Get Started?

Create an account and start accepting payments – no contracts or KYC required. Or, contact us to design a custom package for your business.

Make first step

Always know what you pay

Integrated per-transaction pricing with no hidden fees

Start your integration

Set up Plisio swiftly in just 10 minutes.