Initial Block Download、略してIBDは、Bitcoinノードの初回同期です。通常の手順では過去のブロックを取得し、自分のソフトウェアのルールで検証して、まだ使われていない資金の現在の状態を作ります。
自宅でFull Nodeを起動したとします。Bitcoinのブロックと取引を自分で検証するプログラムです。ブロックは、共有する履歴に追加する取引のまとまりです。他の参加者はすでに長い履歴を持っていますが、新しいノードにはまだありません。まず取得するのは、ブロック同士をつなぐ短い記録であるヘッダーです。そこには計算作業の証拠であるProof of Workも含まれます。マイナーは計算を繰り返してこの証拠を探し、ほかの参加者は見つかった結果を素早く確認できます。ヘッダーの一覧は本の目次に似ていて、全体を見渡す助けにはなりますが、手に入れただけで全ページを読んで確認したことにはなりません。 [1] [7]
接続先が異なる履歴の枝を示しても、ノードは投票で決めません。ヘッダーから累積した計算作業量を比較し、さらに検証する候補を選びます。ブロック数が多いからといって、作業量も多いとは限りません。また、膨大な作業量があっても無効な取引がルールを免除されるわけではなく、選んだ枝の中身は引き続き検証する必要があります。 [1] [2] [6]
ノードは複数の接続先から同時にブロックを取得できるため、一つの送信元の速度に頼る必要はありません。ただし、検証済みの履歴につなぐには、それ以前の状態が必要です。支払いの入力は、今回使おうとしている過去の金額を指します。ノードはその金額が実在し、まだ使われていないことを確かめます。このため、後のブロックを取得済みでも、前のブロックの処理を待つ場合があります。ダウンロード完了と同期完了が同じではない理由の一つです。 [1] [2]
ノードはブロックの中身を、Merkle Treeによって作られたヘッダー内の取引の指紋と照合します。ほかにも、資金が使われる順序や、マイナーの報酬が認められた額を超えていないかなどを確認します。適用するのは、その履歴上の時点で有効だったルールです。デジタル署名は、秘密の数値である秘密鍵を使って支払いの許可を証明し、鍵そのものは公開しません。古い署名やその他の使用条件の検証には、後述するassumevalidという特別な設定があります。ヘッダーや、信頼できそうな接続先から届いたファイルが、これらの検証全体の代わりになるわけではありません。 [2] [3]
ブロックを処理するたびに、ノードは使用済みの出力を取り除き、新しい出力を加えます。出力とは、後で使うための条件が付いた具体的な金額です。まだ使われていない出力をUTXOと呼びます。その集合があれば、次の支払いのたびに全履歴を最初から読み直さずに検証できます。銀行口座の一覧でも、過去の全取引のコピーでもありません。 [2] [3]
一定の条件下で、Bitcoin Coreは古いスクリプト検証、つまり署名やその他の使用条件の確認を省略できます。assumevalidは、履歴が外部で検証された既知のブロックを指定する設定です。祖先関係、十分な作業量、深さも条件になります。ほかの必要な検証は残りますが、検証結果の一部を前提として受け入れます。したがって、誤った前提に危険がないわけではありません。assumevalid=0でこの最適化を無効にすると、その分コンピューターの作業量が増えます。 [2]
Pruned Nodeは古いブロックファイルを処理した後に削除し、現在のUTXOと必要な情報を残します。通常のIBDでは、やはり履歴を取得して処理します。全履歴を永久に保存しないだけです。節約するのは保存容量であって、初回のダウンロード量が自動的に減るわけではありません。削除済みのブロックが後の作業で必要になれば、再取得が必要になることがあります。 [2] [7]
Bitcoin Core v29.0は、最後に受け入れたブロックの古さ、最低限の累積作業量、読み込み状態などを見ます。この動作用のフラグが一度false(初回同期は終了)になると、同じ実行中にtrue(初回同期は進行中)へ戻ることはありません。プログラムの動作を決める目安であり、世界のどこにも新しいブロックがないという証明ではありません。後で接続が切れても、最新状態を確実に示す指標にはなりません。 [2] [5]
速い回線は役立ちますが、コンピューターには計算とディスクへの書き込みも必要です。処理時間はCPU、メモリー、ストレージ、接続先の利用状況にも左右されます。getblockchaininfoの技術的な出力にあるverificationprogressは、検証の進み具合の推定です。残り時間の保証でも、単なるダウンロード済みバイトの割合でもありません。正常に終了すれば、次の起動時は保存した進捗から続けられ、毎回最初から始める必要はありません。 [5] [7]
AssumeUTXOでは、対応するUTXOスナップショット、つまり特定のブロック時点の保存状態を利用できます。ソフトウェアはその内容を想定された指紋と照合し、そこから早めに現在へ追いつきながら、バックグラウンドで履歴を処理できます。その後、履歴を検証して得られた状態も比較します。誰かの任意のデータベースを受け入れる仕組みでも、過去を永久に検証しない方法でもありません。早く使えることと、履歴の検証が完了することは別の段階です。 [4] [8]
理解を深めるには、この項目とあわせて次もお読みください Pruned Node, AssumeUTXO, Block Propagation, Compact Blocks, Bitcoin, Bitcoin Core. 次の項目からも参照されています Block Propagation, Compact Blocks, Pruned Node, AssumeUTXO.