用語集 / マイニングとコンセンサス
オーファンブロック
- オーファンブロックとは?
- オーファンブロックとは、自分のノードが親ブロックをまだ見ていないために検証も接続もできないブロックのことであり、この言葉で多くの人が意味しているものとは異なります。
この言葉には2つの使われ方があります。プロトコル上では、既知の祖先がなく接続できない、順序外で到着したブロックを指します。日常的な用法やほとんどのブロックエクスプローラーでは、単に競争に負けた有効なブロックを指し、これは正確にはステールブロック(stale block)と呼ばれます。Bitcoin Coreは、2015年2月にリリースされたバージョン0.10で、オーファンブロックを一切保持しなくなりました。
仕組み
オーファンブロックは、ブロックを受信してからそれがどこに属するかを知るまでの間隙にのみ存在します。
検証は順序立てて行われます。ブロックを検査するには、その直前の時点の未使用出力の集合が必要であり、これはそれ以前のすべてのブロックを順に適用することで構築されます。親が欠けているブロックをノードに渡すと、ヘッダーのプルーフ・オブ・ワークは検証できますが、それ以外は何も検証できません。手数料も、ブロック補助金も、入力がすでに使用済みかどうかもわかりません。そのブロックは無効なのではなく、検証不能なのです。
旧バージョンのBitcoin Coreは、そうしたブロックをメモリに保持し、欠けている親ブロックが現れるのを待っていました。当時はブロックがアナウンスに応じて要求されていたため、ピアが順序外でブロックを届けることが容易にあり得たからです。ヘッダーファースト同期がその必要性をなくしました。現在のノードは、1つのブロック本体を要求する前に、80バイトのヘッダーの連鎖をダウンロードして検査するため、到着したブロックがどこに属するかを常に把握しており、複数のピアにブロック本体を同時に要求しても混乱は生じません。オーファンブロックプールは同じリリースで削除され、現代のノードでは真のオーファンブロックを生成することは事実上不可能です。
しかし1つだけ名前が残りました。Bitcoin Coreは、入力を見ていないトランザクションのためにオーファントランザクションプールを今も維持しており、デフォルトで最大100件を保持します。欠けている親トランザクションが数秒遅れで到着するという妥当な見込みに基づいています。そのため、Core自身のログや設定にこの言葉が現れる場合、それはトランザクションのことを指しており、ブロックのことを指すことは決してありません。
目にする場所
オーファンという言葉が残っているのは、主に別のものを説明している場面です。
ブロックエクスプローラーは混乱の最大の発生源です。複数のエクスプローラーが、競合するブロックが勝利した際に破棄された有効なブロックを列挙するオーファンブロックのページを公開しており、報道がそのラベルをそのまま伝えています。マイニングプールのダッシュボードも同様で、実際にはステール率であるものをオーファン率として報告しています。多くの部分がビットコイン初期のウィキからコピーされたアルトコインのドキュメントでは、この用語が両方の意味で区別なく使われています。
Bitcoin Coreはそうではありません。認識している競合する分岐を問い合わせると、各先端をactive、valid fork、valid headers、headers only、invalidのいずれかのステータスで報告します。オーファンというステータスは存在しません。かつてこの言葉が表していた状況がもはや発生しないからです。
読者にとって有用な判断基準は、問題のブロックが一度でも検査されたかどうかです。誰かがそのブロックの高さ、トランザクション数、マイニングしたプールを答えられるなら、そのブロックは完全に検証されたうえで競争に負けたのであり、使うべき言葉はステールです。
オーファンブロックvsステールブロック
オーファンブロックは親が不明であるため検証できません。ステールブロックは検証済みで完全に有効であり、同じ高さの別のブロックが先に構築されたという理由だけで放棄されました。いくつかのエクスプローラーを含め、オーファンと言う人のほとんどはステールを意味しているため、情報源から結論を引き出す前に、どちらを意味しているかを確認する価値があります。どちらもユーザーとしての損失はありません。破棄されたブロック内の支払いはメモリプールに戻り、通常は1~2ブロック以内に再びマイニングされます。