getblocktemplate は、ブロック候補を組み立てるための情報をソフトウェアが Bitcoin のノードから取得するインターフェースです。プログラム間で要求と構造化された応答をやり取りする JSON-RPC を使います。通常のモードはテンプレートを提供し、別のモードは独自のブロック案を事前に調べます。どちらも、それ自体では作業証明を探しません。
通常の mode=template では、ペーターのプログラムは直前のブロック、取引、許される報酬などを受け取ります。これは作業案であり、発見済みのブロックではありません。ソフトウェアは報酬を割り当てる特別な先頭取引 coinbase を作り、ブロックを組み立てる必要があります。ヘッダーはブロックのデータを短くまとめた部分です。その後、採掘の目標値を満たすハッシュを探します。ハッシュはヘッダーの数値による暗号学的な指紋であり、条件を満たせば計算作業の証明である Proof of Work になります。getblocktemplate 自体は受取先アドレスを受け付けず、採掘機の計算も開始しません。正常な応答だけでは、ペーターが採掘中とはいえません。 [1]
ノードが、ペーターのプログラムには理解できない形式のデータを送ったとしましょう。そのため要求には rules 欄があり、対応するルールを伝えます。ここで確認した Bitcoin Core v29.0 は segwit を要求し、テストネットワーク Signet では signet も要求します。SegWit は、取引の検証用データの扱いなどを変更した仕組みです。正しい単語を加えるだけでは足りず、ソフトウェアが実際に処理できなければなりません。capabilities はインターフェースの別の機能を知らせるもので、rules の代わりにはなりません。細かな要件は実装とバージョンによります。 [2]
data には、プログラム間で送れる形式に並べた取引全体が入ります。このようにデータを並べる処理をシリアライズと呼びます。データの基本単位であるバイトは、数字の 0–9 と文字の a–f を使う十六進数で表されています。応答には取引の短い識別子も含まれます。技術文書 BIP 145 では、txid は witness データを含めずに計算し、hash はそれを含めます。Witness には、資金を使う権限を示す署名などが入ります。ブロックヘッダーの主要な Merkle root は取引全体をまとめた指紋で、witness hash ではなく txid を使います。両者の取り違えは単なる呼び方の問題ではありません。まとめた指紋が誤り、組み立てたブロックが無効になるおそれがあります。 [3]
ペーターは、変化があったかをノードに絶えず問い合わせる必要はありません。Long polling では、サーバーが以前の情報を置き換えたくなるまで要求を開いたままにできます。プログラムは longpollid を受け取り、そのまま送り返します。サーバーはその値からプログラムが待っている更新を識別します。プログラムは、その文字列から特定の意味を読み取ろうとしてはいけません。BIP 22 は長い待機時間を想定しています。不完全または無効な応答が続く場合は、即座の再試行を繰り返すのではなく、試行の間隔を空けます。何も返らず待っているだけなら、それ自体は障害ではありません。 [4]
通常の要求を繰り返しても、毎回新しく内容が選ばれるとは限りません。Bitcoin Core v29.0 は用意したテンプレートをキャッシュに保持します。直前のブロックが変わった場合、または未承認取引のローカルな集合である mempool が変わり、準備から五秒を超えて経過した場合に作り直します。ヘッダーの時刻は別に更新できます。そのため、ペーターが同じ取引の組み合わせを再び受け取っても、ノードが停止したとは限りません。この特定バージョンの動作は、呼び出すたびに固有の採掘ジョブができるという約束でもありません。 [2]
ペーターはブロックの組み立て方を変え、負荷の大きい探索の前に誤りを見つけたいと考えています。proposal モードでは、ブロック全体を十六進数の表現で data に渡します。Bitcoin Core v29.0 は Merkle root も検査しますが、計算作業の証明である有効な Proof of Work が既に見つかっていることは要求しません。案がノードが現在使っているチェーンの最後のブロックにつながらなければ、inconclusive-not-best-prevblk が返ります。この検査の前提が満たされていないという意味で、案の有効性を全面的に判定したわけではありません。事前検査はブロックをネットワークへ配信することもありません。 [2]
必要な作業証明が見つかると、ソフトウェアは submitblock でブロック全体を提出できます。hexdata が運ぶのは、ヘッダーや指紋だけではなく、シリアライズしたブロック全体の十六進数表現です。Bitcoin Core 29 の文書では、受理時は null、それ以外では仕様に沿った文字列の結果を返します。省略可能な第二引数 dummy は無視され、報酬を指定するものではありません。ノードが受理しても永久の確定は保証されません。その後のチェーンの進展で、どの枝が主流として残るかが変わる場合があります。 [5]
起動したばかりのノードは、必要な履歴をまだ取得、検証できていないかもしれません。主要ネットワークの mainnet では、Bitcoin Core v29.0 は接続先のピアがない場合や、初期同期 IBD(initial block download)の間はテンプレートを提供しません。これは現在のネットワークで働くための準備の問題であり、特定のブロックを拒否したわけではありません。原因を調べるときは、待機中の long poll、準備不足のノード、案の検査結果を区別します。どれも「新しい仕事がない」ように見えても、必要な対処は異なります。 [2]
理解を深めるには、この項目とあわせて次もお読みください Block Template, マイニング, Stratum V2, Extranonce, Bitcoin, Bitcoin Core. 次の項目からも参照されています ASIC Miner, Solo Mining, Job Negotiation.