226 / 736XNONCE

Extranonce

マイナーが次の試行を続けるための仕組み

アレナは新しいブロックができる仕組みを学んでいます。マイナーは入力データを変え、その短い指紋にあたるハッシュを計算します。その数値がネットワークの条件を満たせば成功です。では、変更できるある欄の値をすべて試しても成功しなかったら、どうするのでしょうか。Extranonce を使うと、新たな入力の組み合わせを用意して探索を続けられます。Bitcoin のルールを緩めたり報酬を約束したりするものではなく、同じ試行の繰り返しを避けるための仕組みです。

Extranonce は、マイニング用ソフトウェアが通常 coinbase に入れる追加の可変データです。Coinbase は採掘報酬を割り当てる、ブロックの特別な最初のトランザクションを指します。このデータを変えると、ブロックヘッダーに入る取引全体の指紋も変わり、新しい探索用の入力を作れます。ヘッダーにある別の nonce 欄が大きくなるわけではありません。

ヘッダーはブロックのデータを短くまとめたものです。ビットはゼロか一を表し、八ビットで一バイトになります。ヘッダー内の nonce は 32 ビットの欄で、ほかのデータが一定なら 2^32 通りの値を使えます。同じヘッダーと同じ nonce で再計算しても、ハッシュも結果も同じです。Extranonce はこの欄を延長するのではなく、ほかのデータを変えて新しいヘッダーを用意します。アレナにとっては、カウンターをもう一度試せる新しい課題をもらうようなものです。実際には、ルールの範囲内でヘッダーのほかの部分も変更できます。 [1] [5]

ここでいう coinbase は取引所ではなく、各ブロックの最初のトランザクションです。その extranonce を変えると、符号化された取引データと、そこから計算される識別子 TXID が変わります。指紋を段階的に組み合わせる木構造を通じて、ヘッダーに格納される取引全体の指紋 Merkle root にも影響します。ソフトウェアは影響を受ける枝を再計算しなければなりません。ほかの取引はそのままでよくても、古いルートを使い続けることはできません。この計算のつながりが、採掘用の新しい入力を生みます。 [1]

単純なモデルとして、ほかのデータを固定し、extranonce の二つのバイトを自由に変えられるとします。これで 2^16 通り、32 ビットの nonce と合わせると 2^48 通りの入力の組み合わせができます。これは試せる候補の数であり、見つかるブロックの数ではありません。条件が簡単になるわけでも、この範囲に成功があると確約されるわけでもありません。利点は探索を続ける場所が増えることです。自由に使える空間を増やしても、実際に計算する機械自体が速くなるわけではありません。 [1]

Extranonce の領域は、制約のない白紙ではありません。Bitcoin の具体的なルールである BIP 34 は、coinbase の入力データ欄 scriptSig の先頭に、正しく符号化したブロック高、つまりチェーン内の位置を入れるよう求めています。100 バイトという上限は extranonce だけでなく、coinbase の scriptSig 全体に適用されます。必須データの場所と正しい形式を維持する必要があります。アレナがそれを上書きしたら、その後の計算は無効なブロックの解を探すことになります。 [3] [4]

プールで共同採掘する際は、機械ごとに異なる候補を探すのが有効です。採掘課題を配るプロトコル Stratum V2 は、extranonce の分割も利用します。上位のサーバー upstream がデータの先頭部分にあたる固定の extranonce_prefix を割り当て、中継ソフトウェアは自分のクライアント用に別の部分を確保し、残りを下位の downstream へ渡せます。方向は各接続から見た相対的なものです。割り当てられたプレフィックスは、末端のマイナーが自由に変更してよい領域ではありません。固定することで、参加者の作業を分離できます。 [2]

Stratum V2 の拡張チャネルでは、SubmitSharesExtended が結果とともに変更したバイトを送ります。Coinbase は coinbase_tx_prefix、extranonce_prefix、extranonce、coinbase_tx_suffix の順に連結します。これらは、採掘用ソフトウェアがやり取りするデータの各部分を表す名前です。extranonce 欄は合意した長さでなければなりません。短い表記が同じ数値に見えても、バイト列が違えば別のトランザクションになり得ます。コンピューターは人間のおおまかな解釈ではなく、正確なデータを比較します。 [2]

Stratum V2 の Standard Job は Merkle root が固定された課題です。末端の機器が変更できるのは、ヘッダーのバージョン、カウンター、時刻にあたる version、nonce、nTime の許可された部分だけです。拡張チャネルのように独自の extranonce を送るわけではありません。上位ソフトウェアが新しい coinbase とルートを作り、別の課題を配ることができます。システム全体がこの仕組みを使っていても、アレナの機器には extranonce の設定が見当たらない場合があります。 [2]

以前の作業結果を処理している間に、新しいプレフィックスが届いたとします。Stratum V2 の SetExtranoncePrefix は、その後に同じチャネル、つまり対応する採掘セッションで送られる課題に適用されます。結果には正しい課題識別子 job_id と、割り当てられた領域を結び付けておく必要があります。すべてを最新のプレフィックスに置き換えると、古い結果のもとになったデータを変えてしまうおそれがあります。Extranonce は異なる試行を作り、その関係を把握する仕組みであって、課題を後から書き換えるものではありません。 [2]

理解を深めるには、この項目とあわせて次もお読みください Nonce, Merkle Tree, Mining Share, Block Template, Bitcoin. 次の項目からも参照されています ASIC Miner, Stratum V1, Stratum V2, Block Template.

DOC · 001Bitcoin Developer Guide — Mining and nonce space文書 DOC · 002Stratum V2 — Extended extranonce and jobs仕様 DOC · 003BIP 34 — Height in coinbase仕様 DOC · 004Bitcoin Developer Reference — Coinbase input文書 DOC · 005NIST — Binary data units文書
改訂日: 一次資料を優先 · 投資助言ではありません