45 / 736REORG

Reorg

チェーンの再編成

確認済みの支払いでも、一時的に確認が失われることがあります。ノードがBitcoinの別の有効な履歴を採用し、それまで追っていた末尾のブロックを置き換えるのがReorgです。

Bitcoinノードは、ブロックやトランザクションを検証するプログラムです。Reorgは、Bitcoinノードが、累積Proof of Workの多い別の有効な分岐へ切り替えることです。Proof of Workはマイニングで示された仕事量を表します。ノードは直近のブロックと支払いを見直しますが、Bitcoinのルールが変わるわけでも、他人の支払いを取り消すボタンが生まれるわけでもありません。

アンナが20,000 satoshiを受け取ります。satoshiはbitcoinの小さな単位です。ウォレットには1確認と表示され、支払いは彼女のノードが受け入れたブロックに入っています。その後、ノードは、この支払いをまだ含まない別の有効な分岐を知ります。その分岐の累積マイニング仕事量が上回ると、ノードはそちらへ切り替えます。こうして履歴の一部を置き換えることをReorgと呼びます。鍵を盗まれたり署名を変えられたりしていなくても、アンナの支払いは再び確認待ちになり得ます。判断基準は投票でも単なるブロック数でもなく、chainworkです。これは各ブロックが難易度に応じて示す仕事量の合計を指します。無効な分岐は、仕事量が多くても拒否されます。 [1] [4]

次にどう表示されるかは新しい分岐次第です。そこにもアンナの支払いがあれば、確認数は変わっても確認済みのままです。なければBitcoin CoreはMempoolへ戻そうとする場合があります。Mempoolは、ブロックへの収録を待つ未確認トランザクションの一時的な一覧です。ただし、必ず戻れるとは限りません。過去のトランザクションの出力には、金額とそれを支出するための条件が記録されています。新しい分岐で同じ資金が別のトランザクションに使われていたり、使おうとする過去の出力が存在しなかったり、時間などの受け入れ条件を満たさなかったりすることがあります。再び待っている支払いと、新しい履歴では認められなくなった支払いは区別する必要があります。 [1]

1確認は支払いを含むブロックを数えたものです。その後にブロックが続くたびに確認数が増え、競合する分岐が上回る必要のある仕事量も増えます。最新ブロック内の支払いは1確認であり、採用済みの履歴の奥に入るほど、その部分の置き換えは一般に難しくなります。ただし、有限の確認数で置き換えが絶対に不可能だと数学的に保証できるわけではありません。店舗や取引所は、支払額と受け入れられるリスクに応じて待ち時間を決めます。 [3] [5]

Reorgだけで攻撃があったとは言えません。二人のマイナーが、同じ前のブロックにつながるブロックをほぼ同時に見つけることがあります。情報は瞬時に伝わらないため、ノードが一時的に異なる末尾を追うことになります。一方の有効な分岐がより多くの仕事量を積むと、ノードはそちらに移り、採用されなかったブロックはStale Blockになります。ただし、Double Spend攻撃では同じ仕組みを悪用できます。攻撃者は、同じ資金を別の宛先に払った履歴を採用させようとします。そのため、切り替えの原因と、影響を受けた支払いを確認することが重要です。 [4] [5]

Reorgではノードのルールは変わらず、そのルールに合う履歴の中から選びます。Hard Forkは有効性のルールを変えるため、新旧のソフトウェアが同じブロックを違って判断することがあります。再編成だけで新しい通貨ができたり、Bitcoinのルールが書き換わったりするわけではありません。以降では、ノードが履歴の切り替えをどう実行するかを説明します。 [4]

Tipは、現在採用している分岐の最後のブロックです。分岐点は、現在のアクティブチェーンと代替分岐が共有する最後のブロックです。Reorg の深さは通常、その共通祖先まで戻るために末端から切り離す必要があるブロック数で表します。1ブロックの Reorg は末端を置き換え、より深い Reorg は複数の確認済みブロックを巻き戻します。深さは個々のノードの状態に対して定まります。 [1]

Full Nodeは自分でルールを検証します。以下の関数名はBitcoin Coreでの実装を示します。Bitcoin Core は単に高さが最大、または最も人気のある分岐を選ぶわけではありません。候補チェーンは有効化の際にノードのコンセンサスルールを満たす必要があり、chainwork が大きくても無効なブロックが有効になることはありません。FindMostWorkChain は、無効であることがまだ判明していない候補から作業量が最大のものを選びます。これは完全な検証の完了を意味せず、ActivateBestChain でブロックを接続する際にさらに検査が行われます。無効と判明した分岐は除外されます。 [1]

UTXOはまだ支出されていないトランザクション出力で、UTXO集合は利用可能な出力を集めたものです。undoデータには、ブロックの影響を戻すための情報を保存します。DisconnectTip と関連する検証処理は、切り離したブロックの影響を逆順に取り消します。使用済みの UTXO が復元され、除外されたブロックが作成した出力は確認済みではなくなります。そのため Bitcoin Core は取り消し用データを保存し、分岐点の UTXO 集合を正確に再構築できるようにしています。 [1]

ここでのrollbackは、切り離したブロックより前の状態に戻すことです。chainstateは採用した履歴に対応するノードの作業状態を指します。巻き戻し後、ConnectTip は chainwork がより大きい分岐のブロックを順方向に接続します。各トランザクションは、再構築した UTXO 集合と該当する高さで有効なルールに照らして再検証されます。結果は一つの具体的な履歴に対応する chainstate であり、両分岐のトランザクションを混ぜた状態ではありません。 [1]

Coinbase Transactionはブロックの最初のトランザクションで、マイナーへの報酬を割り当てます。高さhはチェーン内でのブロックの位置です。Coinbase トランザクションは例外で、切り離し後に mempool へ戻りません。コンセンサスルールでは、高さ h で作成された coinbase 出力を最初に使用できるのはブロック h + 100 です。末端が h + 99 のとき、元のブロックは100確認を持ち、成熟条件は次のブロックへの使用トランザクションの収録を許します。Reorg が coinbase を含むブロックを除外すると、そのブロック報酬はアクティブな chainstate から消えます。除外された履歴に依存する後続トランザクションも無効になる場合があります。 [1] [2] [3]

以下は特定バージョンのプログラムの関数名であり、ウォレット利用者が追加で行う操作ではありません。Bitcoin Core v29.0 では手順が明示されています。FindMostWorkChain は無効と判明していない候補から chainwork が最大のものを探し、ActivateBestChainStep は現在の末端を切り離すことがあります。ConnectTip が代替ブロックを検証して接続し、MaybeUpdateMempoolForReorg が切り離したブロック内のトランザクションを再検査します。有効化の途中で候補の無効性が判明し、別の分岐の探索を続ける場合もあります。大きな Reorg では切り離しと接続を行うブロックが増えるため、ActivateBestChain の処理時間が長くなる可能性があります。 [1]

理解を深めるには、この項目とあわせて次もお読みください 承認, Proof of Work, Stale Block, 二重支払い, Full Node, UTXO. 次の項目からも参照されています 承認, 二重支払い, コインベース取引, Soft Fork.

DOC · 001Bitcoin Core v29.0 — chain activation and mempool reconciliation一次資料 DOC · 002Bitcoin Core v29.0 — coinbase maturity validation一次資料 DOC · 003Bitcoin Core v29.0 — confirmation depth一次資料 DOC · 004Bitcoin Developer Guide — Block Chain文書 DOC · 005Bitcoin whitepaper — Sections 5 and 11一次資料
改訂日: 一次資料を優先 · 投資助言ではありません