233 / 736ORPH

Orphan Block

前の章が欠けているブロック

Jana は自分のノード、つまり Bitcoin を検証するコンピューターを動かしています。あるブロックが届きましたが、そこから参照されている直前のブロックをノードはまだ知りません。本の前のページがないまま次のページを受け取るようなものです。新しい文章はあっても、つながりが欠けています。これが狭い意味での Orphan Block です。ただし記事や一覧では、履歴は分かっているのに脇の枝に残ったブロックにも同じ言葉が使われます。名前を直訳するより、この違いを理解することが大切です。

厳密には、Orphan Block は特定のノードにとって直前のブロックが未知であるブロックです。広い用法では、アクティブなチェーン外の Stale Block を指すこともあります。どちらの呼び名だけでも、不正や欠陥は断定できません。まずノードが持つデータと、意図された意味を確認する必要があります。

直前のブロックは親ブロックとも呼ばれます。本来の Orphan Block では Jana のノードは親を知らず、つながりの検証を終えられません。一方、Stale Block は親が既知で、ブロック全体も有効な場合があります。ノードが別の枝を現在の履歴として採用しているだけです。Bitcoin Developer Guide はこの意味の違いを明示しています。エクスプローラーで orphan と見た Jana は、前のブロックがないのか、それとも主鎖に残らなかっただけなのかを先に確かめます。 [1]

Bitcoin Coreにもこの区別があります。これはノードを動かすためのソフトウェアで、Bitcoinのルールに従ってブロックや取引を検証します。Bitcoin Core 29 の AcceptBlockHeader は、前のブロックの識別用指紋を参照する hashPrevBlock で直前のブロックを探します。索引に記録がなければ prev-blk-not-found を返します。親を知っていて無効と記録していれば bad-prevblk です。前者は「判断の前提が足りない」、後者は「無効なブロックの上に続けている」という意味です。欠けていた親が届けば次の検査へ進めますが、それだけでブロック全体の受け入れが保証されるわけではありません。 [2]

ブロックには、識別やつながりを示す短い情報であるヘッダーと、取引を収めた本体があります。Bitcoin Core 0.10.0 は headers-first 同期を導入しました。先にヘッダーを取得して検証し、その後は複数のブロックを並行してダウンロードできます。そのため Jana のノードは、前のブロック全体がディスクにない段階でも、そのヘッダーを知っている場合があります。本体がないことと、直前のブロックが未知であることは違います。混同すると通常の取得処理まで不思議な問題に見えてしまいます。 [3]

Bitcoin Core 29 の getchaintips は、ノードが知る各枝の先端を Jana に示します。active はアクティブなチェーン、valid-fork は完全に検証済みの非アクティブな枝です。valid-headers はブロックがそろっていても完全には検証されていない状態、headers-only は一部のブロックがない状態を表します。invalid は無効なブロックを含む枝です。同じ問題を並べた一覧ではありません。ヘルプの orphaned branches という表現でも、この区別がなくなるわけではありません。 [4]

異なるブロック A と B が高さ 900000 にあると考えてみましょう。これは説明用の例で、特定の事件の記録ではありません。高さはチェーン上の位置なので、競合するブロックが同じ値を持てます。Jana は識別用の指紋である hash と、前のブロックへの参照 previousblockhash で区別します。有効な枝同士の選択は、高さだけでなく累積作業量で決まります。プログラムに指示を出す RPC インターフェースでは、これを chainwork と呼びます。各ブロックの難易度に対応する期待作業量を積み上げた値です。 [1] [5]

主鎖の外にあるブロックを Jana が getblock で問い合わせると、Bitcoin Core 29 は confirmations = -1 と返すことがあります。これは特別な状態の印で、通常の確認回数ではありません。カウントダウンでも、チェーン再編成の深さが負という意味でもなく、親がない証拠にもなりません。Jana はブロックの識別情報や枝の状態と併せて読みます。また、自分のノードが、ほかの参加者が過去に見たすべてのブロックを持っているとは限りません。 [5]

ブロック報酬は coinbase という特別な最初の取引で作られ、同名の取引所とは関係ありません。取引の出力には、ビットコインの金額と、それを使うために満たすべき条件が記録されています。 Bitcoin Core 29 の COINBASE_MATURITY は 100 です。高さ H で作られた出力を初めて使えるのは、高さ H+100 の有効なブロックです。経過した分数ではなく、高さの差を見ます。ただし、この待機条件はアクティブなチェーンへの組み入れに代わるものではありません。報酬のブロックが非アクティブな枝に残る間、その出力は未使用出力を記録するアクティブな UTXO 集合にありません。別の場所でブロックが増えても、そのお金は自動的には戻りません。 [6] [7] [1] [8]

Jana はブロックの hash、直前のブロック、枝の状態、ソフトウェアのバージョンを保存します。getchaintips と getblock の回答、それを取得した時刻も添えます。この観測時刻はヘッダーの time と分けて記録します。ブロックに書かれた時刻は、自分のコンピューターが観測した時刻ではないからです。記録は後の観測との比較に役立ちますが、それだけで攻撃や特定の通信障害、世界全体の orphan 比率を証明するわけではありません。まずは一つのノードの、ある時点の状態を示しています。 [4] [5]

理解を深めるには、この項目とあわせて次もお読みください Stale Block, Reorg, Block Propagation, Proof of Work, Bitcoin. 次の項目からも参照されています Stale Block.

DOC · 001Bitcoin Developer Guide — Block height and forks文書 DOC · 002Bitcoin Core 29 — Header acceptance一次資料 DOC · 003Bitcoin Core 0.10.0 — Headers-first synchronization一次資料 DOC · 004Bitcoin Core 29 — getchaintips文書 DOC · 005Bitcoin Core 29 — getblock文書 DOC · 006Bitcoin Core 29 — Coinbase maturity一次資料 DOC · 007Bitcoin Core 29 — Coinbase input validation一次資料 DOC · 008Bitcoin Developer Guide — Transaction outputs文書
改訂日: 一次資料を優先 · 投資助言ではありません