46 / 736STALE

Stale Block

メインチェーンに残らなかった有効なブロック

Stale Block は、脇の分岐に残った有効な Bitcoin ブロックです。不正がなくても発生します。二人のマイナーがほぼ同時にブロックを見つけ、その後ネットワークが片方の分岐だけを伸ばす場合があるためです。

Stale Block は Bitcoin のルールを満たしていますが、アクティブチェーンには含まれません。アクティブチェーンとは、ブロックやトランザクションを検証するコンピューターであるノードが、確認数や使用可能な資金を判断するために使う履歴です。有効な分岐の間では、蓄積されたマイニングの作業量が選択を決めます。受取人にとっては、確認が一つ減って再び待つことになり得ますが、それだけでビットコインが失われるわけではありません。

マイナーのアンナとパベルを想像してください。二人とも同じ最新ブロックの続きを作ろうとしています。アンナが新しいブロックを見つけても、その知らせがパベルに届く前に、彼も別のブロックを見つけるかもしれません。含むトランザクションが少し違うだけで、どちらも有効な場合があります。ノードはブロックやトランザクションを検証します。各ノードが二つのブロックを知る順序は異なるため、一時的に別々の末端をたどります。片方の有効な分岐がより多くの作業量を蓄積し、ノードが検証すると、その分岐に切り替わります。使われなくなった分岐のブロックが Stale Block です。 [1]

Bitcoin には、同じ資金を二度とも有効に使えてしまわないよう、一つの履歴が必要です。したがって、二つのブロックがそれぞれルールを守っていると確認するだけでは足りません。ノードは、どの有効な分岐をたどるかも選びます。ブロックの有効性とチェーンの選択は別の問題です。Stale Block はマイニングの作業証明である Proof of Work、トランザクション、署名のすべてが正しくても、選ばれた履歴の外にあることがあります。それを理由に欠陥や不正があると判断することはできません。 [1] [2]

パベルのブロックに自分の支払いが入り、ウォレットに確認数1と表示されたとします。その後アンナの分岐が選ばれた場合、結果はその内容によります。同じトランザクションがそちらにもあれば、確認された状態が続きます。なければ、ノードが持つ未確認トランザクションの一覧である Mempool に戻り、別のブロックを待つ可能性があります。ただし、必ず戻るとは限りません。引き続き受け入れ可能で、新しい履歴と矛盾しない必要があります。新しい履歴に同じ資金を使う別のトランザクションがあるなら、元の支払いも同時に確認されることはできません。 [2]

普通の支払いと、ブロックの最初に置かれる Coinbase Transaction は区別が必要です。後者はマイナーに報酬を割り当てるトランザクションで、新規発行されたビットコインと取引手数料を含みます。パベルのブロックがアクティブチェーンの外に残れば、その coinbase 報酬はその履歴では使えません。普通の支払いのように Mempool へ移ることもありません。それでも、パベルが使った電力は戻りません。マイナーはブロックを見つけるだけでなく、ほかの参加者に素早く知らせることも重視します。 [1] [2]

記事やブロックエクスプローラーでは、Stale Block を Orphan Block と呼ぶことがあります。同義語として使われがちですが、厳密な意味には違いがあります。Orphan Block は、ノードが直前のブロックをまだ知らず、チェーンに接続できないブロックです。一方、Stale Block は直前のブロックが既知で、自身も有効な場合があります。ただ選択された分岐の外にあるのです。入力の検証に必要な過去のトランザクションをノードが持っていないとき、そのトランザクションにも orphan という言葉を使います。資料がどちらの意味で使っているか確認しましょう。 [1]

ノードがすでにパベルのブロックを使っていて、その後アンナの分岐に置き換えると、Reorg が起こります。アクティブと見なす履歴の一部を変更することです。そのため、ウォレットの確認数が変わることがあります。この例のような短い競争は、正直なマイニングでも発生します。ただし攻撃者が履歴の変更を利用し、同じ資金による別の支払いを通す Double Spend を試みることもあります。Stale Block があるだけでは、その意図は証明できません。出来事の経緯と、競合するトランザクションの有無を調べる必要があります。 [1] [2]

新しいブロックの知らせは、瞬時に世界中へ届くわけではありません。伝わるのが遅いほど、ほかのマイナーが知らずに同じ直前のブロックを基に作業を続ける時間も長くなります。転送速度、ノード間の接続、ブロック間隔に対する伝播時間が影響します。Stale Rate は、見つかった有効なブロックのうちアクティブチェーンに残らない割合です。Bitcoin のルールで決まった固定の割合ではありません。数値を比べる際は、観測期間と、観測者が実際にどのブロックを把握したかも考慮します。 [1] [3]

BIP152 は Compact Block Relay を定めています。ノードは新しいブロック内のトランザクションの多くを Mempool ですでに知っているため、その全内容を再送する必要がない場合があります。短い識別子を使って手元のデータからブロックを組み立て、足りないトランザクションだけを要求します。転送量を節約でき、条件が合えば新しいブロックをより早く知ることにもつながります。転送方法の改善であって、有効性のルールを変えるものではありません。ほぼ同時に二つのブロックが見つかることを完全には防げません。 [3]

分岐に蓄積された作業量を技術的には chainwork と呼びます。実際に消費された電力の測定でも、コンピューターの台数による投票でもありません。各ブロックは、マイニングの作業証明である Proof of Work の難易度に基づく値を加えます。そのため「長いチェーンが勝つ」より「chainwork の大きい有効な分岐が選ばれる」のほうが正確です。ノードはルールが守られているかを検証します。作業量がどれほど多くても、無効なトランザクションが有効になるわけではありません。また stale は、あるノードがその時点で選んでいる履歴とブロックとの関係を表します。 [1] [2]

ブロックエクスプローラーは便利ですが、表示しているのはそのサービスの見方です。ルールを検証する自分の Full Node があれば、独立に受け入れた履歴を調べられます。ノードがそのブロックのデータを保存していれば、Bitcoin Core の getblock はアクティブチェーンの外にあるブロックに対して confirmations: -1 を返します。保存領域を節約するプルーニングで削除されたなど、データがない場合はエラーになります。この値だけでは、そのブロックがすべての有効性検証を通った証拠にはなりません。位置を正確に把握するには、識別子である hash、直前のブロック、高さ(そのブロックより前にあるブロックの数)、chainwork も確認し、個々の支払いの行方は別に調べます。二つのブロックは同じ高さでも異なる hash を持ち得ます。 [4] [5]

理解を深めるには、この項目とあわせて次もお読みください Reorg, 承認, Block, Block Header, Proof of Work, マイニング. 次の項目からも参照されています Reorg, Mining Pool, Hashrate, Selfish Mining.

DOC · 001Bitcoin Developer Guide — Block Chain文書 DOC · 002Bitcoin Core v29.0 — chain activation and mempool reconciliation一次資料 DOC · 003BIP 152 — Compact Block Relay仕様 DOC · 004Bitcoin Core v29.0 — getblock文書 DOC · 005Bitcoin Core v29.0 — block RPC implementation一次資料
改訂日: 一次資料を優先 · 投資助言ではありません