採掘用 Nonce は公開の uint32 探索パラメーターであり、秘密情報や署名用 nonce ではありません。他のヘッダーフィールドを固定すると 2^32 通りあり、現代の ASIC はすぐに探索し尽くします。そのため採掘ソフトウェアは coinbase トランザクション内の Extranonce と、それに伴う Merkle root、または nTime と許可された version ビットを変更して探索空間を更新します。
Bitcoin のヘッダーは version、前のブロックのハッシュ、Merkle root、time、nBits、4 バイトの Nonce からなる 80 バイトです。Nonce は little-endian 順で直列化する符号なし 32 ビット整数です。このフィールドを変えると直列化したヘッダーと double-SHA-256 ハッシュが変わりますが、その操作だけで取引一覧は変わりません。 [Bitcoin Developer Reference — Block headers]
SHA-256 の入力を少し変えても成功へ向かう有用な方向は得られません。Nonce を一つ増やすとほぼ無関係な 256 ビットハッシュになり、異なるヘッダーは独立した確率的試行として扱えます。全く同じヘッダーを再計算すれば常に同じハッシュになり、成功値へ導く有用な勾配はありません。 [Bitcoin Developer Reference — Block headers] [Bitcoin Developer Guide — Mining]
他のヘッダーフィールドを固定した場合、4 バイトの Nonce は正確に 4,294,967,296 通り、つまり 2^32 通りです。現代の ASIC はこの範囲を毎秒何度も探索できるため、Nonce フィールドだけでは現代の採掘に足りません。全範囲の探索は有効な Proof of Work の発見を保証しません。 [Bitcoin Developer Reference — Block headers] [BIP 320 — nVersion bits for general purpose use]
Mining Pool と採掘ソフトウェアは coinbase トランザクション内で Extranonce を使います。名前は似ていますが、別のヘッダーフィールドではありません。Extranonce を変えると coinbase txid、続いてヘッダーの Merkle root が変わり、新たな 2^32 通りの採掘用 Nonce の探索空間ができます。 [Bitcoin Developer Guide — Mining] [Bitcoin Developer Reference — Transactions]
Coinbase トランザクションは Merkle ツリーの葉です。ツリーを再計算すると、その txid の変更がヘッダーの Merkle root に反映されます。前のブロックのハッシュとほぼ同じブロック内容を保ちつつ新しいヘッダーが得られ、他の取引を変える必要はありません。 [Bitcoin Developer Reference — Block headers] [Bitcoin Developer Guide — Mining]
許可された範囲内で nTime を変えたり、version rolling で許可された version ビットを変えたりして探索空間を広げます。BIP320 は特定の nVersion ビットの汎用利用を提案していますが、提案自体が全ビットの任意変更を許すわけではありません。合意規則と採掘ジョブの規則は引き続き適用され、最終ハッシュは target を満たす必要があります。 [BIP 23 — getblocktemplate pooled mining] [BIP 320 — nVersion bits for general purpose use]
共同採掘では Mining Pool やジョブ調整者が worker ごとに異なる coinbase/Extranonce などのパラメーターを割り当て、同じヘッダーを重複して計算する無駄を避けます。BIP23 は任意のパラメーター noncerange も記述しています。Stratum プロトコルは多数の ASIC に探索空間を分配します。 [BIP 23 — getblocktemplate pooled mining] [Bitcoin Developer Guide — Mining]
Nonce の数値自体に良し悪しはありません。Full Node は具体的なヘッダー全体をハッシュし、nBits から得た有効な target と比較します。小さい Nonce だけでは何も証明せず、ヘッダー全体のハッシュが target 以下であることが必要です。この条件を満たしても、ブロックの他の有効性規則の検証に代わりません。 [Bitcoin Developer Reference — Block headers] [Bitcoin Core v30.0 — Proof of Work validation]
Nonce は暗号署名の文脈でも使われます。秘密の署名スカラーを異なるメッセージに誤って再利用すると Private Key が漏れるおそれがあります。採掘用 Nonce は公開のヘッダーデータで秘密にする必要はありません。署名の公開データを、その秘密スカラーや採掘カウンターと混同してはいけません。 [BIP 340 — Schnorr Signatures]
Bitcoin Core の getblockheader は既定の詳細出力で nonce、bits、time などを返します。verbose パラメーターを false にすると、直列化したヘッダーを16進数で返します。独立に確認するには正確な 80 バイトを組み立てるかデコードし、double-SHA-256 を計算して、Bitcoin のバイト順を守り数値としてのハッシュを有効な target と比較します。 [Bitcoin Developer Reference — Block headers] [Bitcoin Core RPC — getblockheader] [Bitcoin Core v30.0 — Proof of Work validation]
理解を深めるには、この項目とあわせて次もお読みください ブロックヘッダー, ビットコイン・マイニング, Proof of Work, Mining Target, コインベース取引, Bitcoin. 次の項目からも参照されています ブロックヘッダー, コインベース取引, ASIC Miner, Mining Target.