50 / 736NONCE

Nonce

ブロックヘッダー内の採掘カウンター

Nonce は、採掘装置が Bitcoin の新しいブロックを探すときに変更する数値です。値を変えるたびに計算の入力が変わり、採掘の条件を満たせるか、もう一度試せます。

採掘者はブロックヘッダーの数値的な指紋であるハッシュを計算します。Proof of Work(計算による作業の証明)を満たすには、その結果が target と呼ばれる規定の上限以下でなければなりません。Nonce は、次の試行を用意するために変えられる値の一つです。パスワードでも秘密鍵でもなく、ブロックの公開後は誰でも確認できます。

Anna の採掘装置は、取引をまとめた新しいブロックを作ろうとしています。ブロックの情報を簡潔にまとめたヘッダーから、SHA-256 で数値的な指紋、つまりハッシュを計算します。Bitcoin はこの計算を二度行うため、double-SHA-256 と呼びます。結果が許容上限を超えたら、例えば Nonce を 10 から 11 に変えて再計算します。Anna が手で数字を当てるのではなく、装置が大量の試行を自動で行います。ただし、Nonce を大きくしてもハッシュが小さくなるとは限らず、成功に近づくわけでもありません。全く同じヘッダーなら必ず同じハッシュになるので、再計算しても新しい機会は生まれません。 [1] [2]

Nonce には 4 バイト、つまり 32 ビットが割り当てられています。表せる整数は 0 から 4,294,967,295 までで、両端を含めて 4,294,967,296 通り、すなわち 2^32 通りです。人には膨大に感じられても、採掘専用の ASIC という装置はこの範囲を素早く調べられます。全数を試しても成功は保証されません。他のヘッダーデータが同じなら、最初に戻っても以前の結果を繰り返すだけです。そのため、ソフトウェアは別のヘッダーも用意します。 [1] [5]

一つの方法は Extranonce を変えることです。名前は似ていますが、追加のヘッダーフィールドではありません。採掘報酬を割り当てるブロック先頭の取引、coinbase トランザクションの内部にあるデータです。これを変えると取引の識別子 txid が変わり、続いてヘッダーに入る取引全体の指紋、Merkle root が変わります。装置には新しい入力ができるので、同じ Nonce の値を再び使っても、今度は別のヘッダーのハッシュを計算することになります。この新しい 2^32 通りも、ブロックの発見を保証するものではありません。 [2] [3]

ブロックエクスプローラーでは、あるブロックの Nonce が小さく、別のブロックでは大きいことがあります。その数だけでは発見の難しさも優劣も分かりません。Full Node は Bitcoin のルールに従ってブロックと取引を独立に検証するプログラムです。このプログラムは、ヘッダー全体のハッシュを計算し、有効な target と比べます。target の圧縮表現は nBits に入っています。重要なのはハッシュがその上限以下であることで、Nonce の大小ではありません。さらにノードは、取引とブロックの他の有効性ルールも確認しなければなりません。 [1] [8]

取引の署名について読むときも nonce が登場します。そこでは、支出を承認する秘密鍵 Private Key とともに署名アルゴリズムが使う、秘密の補助的な数値を指すことがあります。専門的にはスカラーと呼びます。異なるメッセージにこの値を誤って再利用すると、秘密鍵が漏れるおそれがあります。採掘用 Nonce は公開情報であり、同じ数値が異なるヘッダーに出てきても構いません。また、署名の公開部分は、その秘密の補助値とは別物です。一方の用途のルールを、そのまま他方に当てはめないことが大切です。 [9]

多くの装置が Mining Pool で共同作業する場合、全台が同じヘッダーを計算しても新しい試行は増えません。そこで調整役が coinbase や Extranonce などに異なるデータを割り当てます。Stratum などのプロトコルがジョブを伝達し、接続された採掘単位は workers とも呼ばれます。BIP23 には、Nonce の範囲を指定する任意のパラメーター noncerange も記されています。すべてのプールがこれを使う必要があるわけではなく、プールがブロックの有効性ルールを変更できるわけでもありません。 [4] [2]

Merkle Tree は取引の指紋を段階的に組み合わせ、共通の指紋 Merkle root を作る仕組みです。Coinbase トランザクションの識別子 txid は、木の葉の一つとして計算に入ります。したがって Extranonce を変えると、新しい txid を経て Merkle root も変わります。他の取引や前のブロックへの参照を維持したまま、異なるヘッダーを得られます。確認済みのブロックを書き換えるのではありません。まだ有効な Proof of Work を探している、新しいブロックの候補を変更しています。 [1] [2]

ソフトウェアは、許容範囲内で時刻 nTime を変えたり、許可されたバージョンビットを変えたりして、さらに別のヘッダーを用意できます。後者を version rolling と呼びます。BIP320 は選ばれた nVersion ビットの汎用利用を提案していますが、この提案だけで全ビットを自由に変えられるわけではありません。ネットワークと割り当てられたジョブのルールは引き続き適用されます。どの方法でも、最終ハッシュが有効な target を満たす必要があります。 新しい BIP323 は利用するビット数の拡大を提案していますが、まだ Draft(草案)です。 [4] [5] [10]

技術資料を読むには形式も役立ちます。ヘッダーは 80 バイトで、バージョン、前のブロックのハッシュ、Merkle root、時刻、nBits、4 バイトの Nonce が入ります。Nonce は uint32 型の符号なし 32 ビット整数です。最下位バイトを先に置く little-endian 順で記録します。Nonce だけを変えるとヘッダーと double-SHA-256 ハッシュは変わりますが、取引一覧は変わりません。ソフトウェアには正確な表現が必要ですが、採掘の意味を理解するために手作業で組み立てられる必要はありません。 [1]

詳しく確認するなら、Bitcoin Core の getblockheader に特定ブロックのハッシュを指定します。既定の詳細出力には nonce、bits、time などが含まれます。verbose パラメーターを false にすると、正確な 80 バイトのヘッダーが16進数で返ります。そのデータから double-SHA-256 を計算し、数値としての結果を有効な target と比較できます。独自に実装する場合は Bitcoin のバイト順に注意が必要です。誤ってバイトを反転すると比較が変わります。エクスプローラーで Nonce を読むだけでは、この検証の代わりにはなりません。 [1] [6] [8]

理解を深めるには、この項目とあわせて次もお読みください Block Header, マイニング, Proof of Work, Mining Target, コインベース取引, Bitcoin. 次の項目からも参照されています Block Header, コインベース取引, ASIC Miner, Stratum V1.

DOC · 001Bitcoin Developer Reference — Block headers文書 DOC · 002Bitcoin Developer Guide — Mining文書 DOC · 003Bitcoin Developer Reference — Transactions文書 DOC · 004BIP 23 — getblocktemplate pooled mining仕様 DOC · 005BIP 320 — nVersion bits for general purpose use仕様 DOC · 006Bitcoin Core RPC — getblockheader文書 DOC · 007Bitcoin Core RPC — getblocktemplate文書 DOC · 008Bitcoin Core v30.0 — Proof of Work validation一次資料 DOC · 009BIP 340 — Schnorr Signatures仕様 DOC · 010BIP 323 — 24 nVersion bits for general purpose use文書
改訂日: 一次資料を優先 · 投資助言ではありません