Bitcoin Coreでundo dataのチェックサム不一致エラーが出ても、-txindexが有効なら全ブロックの再インデックス(reindex)なしで修復できる可能性がある。壊れたrev*.datのデータを部分的に再構築する方法と、なぜ一般的な対処法では直らないのかを解説する。
undo dataのチェックサムエラーとは何が起きているのか

Bitcoin Coreはブロックチェーンデータを blocks/ ディレクトリに保存している。その中にあるrevファイル(rev*.dat)がundo dataの格納場所だ。undo dataとは、ブロックを巻き戻すときに使う「ロールバック用の記録」のこと。チェーン再編成(reorg)が起きた際、ノードはこのデータを使ってUTXOセット(未使用残高の集合)を安全に元の状態へ戻す。
チェックサム不一致エラーは、ディスク上のundo dataが保存時に記録されたチェックサム値と一致しない状態を指す。原因はディスクの部分的な故障、突然の電源断、ファイルシステムの不整合などだ。この状態になると、該当するブロックのundo dataを読み取れなくなるため、getblockstats や高詳細度の getblock が失敗する。
ただし、新規ブロックの検証と追記は通常どおり続く。壊れているのは過去ブロックのundo dataだけであり、ノードは最新のチェーンに追従できる。要は「現在は動いているが、過去を参照する操作ができない」状態だ。
なぜ -reindex-chainstateやinvalidateblockでは直らないのか

このエラーに対する一般的なアドバイスは -reindexだ。しかし、より短時間で済む代替手段として -reindex-chainstateやinvalidateblockを試したくなる。結論から言うと、これらはundo dataの破損を修復できない。
-reindex-chainstateが効かない理由
-reindex-chainstateはUTXOセットをゼロから再構築する。しかし、既存のブロックインデックス(各ブロックの位置情報やundo dataの保存先を示すメタデータ)は保持される。ブロックインデックスには「このブロックのundo dataはrevファイルのどこに書いてあるか」というundo positionが記録されている。再構築後もundo positionはそのまま残るため、壊れたundo dataの場所は変わらない。結果として、同じエラーが再発する。
invalidateblock+reconsiderblockが失敗する理由
invalidateblockで壊れたブロックを無効化し、その後にreconsiderblockで再度有効化すれば、巻き戻し時にundo dataが書き直されるのではないか。そう考えるのは自然だ。実際にはこの手順は失敗する。
ブロックを無効化するには、そのブロックまでチェーンを巻き戻す必要がある。巻き戻しには当該ブロックのundo dataが必須だ。しかし、壊れているのはまさにそのundo dataなので、巻き戻し処理がそこで停止してしまう。さらに、たとえ巻き戻せたとしても、再接続時にundo dataが書き直されるのは「undo positionがまだ無いブロック」だけだ。既存のundo positionを持つブロックはそのまま残るため、結局修復されない。
要は、-reindex以外のショートカットはundo positionをリセットしないため、壊れたundo dataは常に残り続ける。これが「通常のアドバイスはreindexになる」理由だ。
-txindexがあればundo dataを再構築できる仕組み

-txindex(トランザクションインデックス)を有効にして起動しているノードでは、すべてのトランザクションが検索可能な形でインデックス化されている。これがundo dataの部分修復を可能にする鍵だ。
undo dataの中身は、そのブロックに含まれる各トランザクションの入力が「どのUTXOを消費したか」を記録したものだ。つまり、消費されたUTXOの一覧である。-txindexがあれば、トランザクションの入力から過去の出力を参照できるため、undo dataを再構築できる。理論上はバイト単位で復元し、元の位置に書き戻すだけでよい。
undo data 1件のディスク上の構造は以下のとおりだ。
| バイト数 | 内容 |
|---|---|
| 4 | ネットワークマジック(メインネットではf9beb4d9) |
| 4 | CBlockUndoのサイズ(リトルエンディアン) |
| サイズ分 | CBlockUndo本体(コインベーストランザクション以外の各入力が消費したUTXOの一覧) |
この構造が分かれば、壊れた部分だけを対象に再構築できる。ただし、この作業にはBitcoin Coreのデータ構造に対する深い理解と、独自のスクリプトやツールが必要だ。公式に提供されている「部分修復コマンド」は存在しない。
壊れたrevファイルを修復する実践手順

実際に部分修復を行うには、以下の手順を踏む。前提として -txindexが有効であること、そしてBitcoin Coreのデータ構造に精通していることが必要だ。
1. ノードを停止して対象ブロックを特定する
まずノードを安全に停止する。次にdebug.logに出力されたエラーメッセージから、壊れているrevファイルの番号(nFile)とオフセット(nPos)を確認する。続いて、該当するブロックの高さとハッシュをブロックインデックスから特定する。
2. ブロックデータを読み出してundo dataを再構築する
対象ブロックをディスクから読み出し、コインベーストランザクション以外の各トランザクションについて、入力が消費したUTXOを -txindex経由で取得する。これらをCBlockUndoのフォーマットに従って直列化する。
3. 再構築したデータを元の位置に書き戻す
ネットワークマジック(4バイト)とサイズ(4バイト、リトルエンディアン)を付与し、もともと壊れていたrevファイル内の同一オフセットに書き込む。チェックサムは書き込み時にBitcoin Coreが再計算するため、一貫性が保たれる。
この方法の利点は、数日かかるreindexが数分で済むことだ。一方で、誤った位置に書き込むとデータをさらに壊すリスクもある。手動で行う場合は、必ず対象ファイルのバックアップを取ってから作業する。
それでも直らないときの最終手段 -reindex

部分修復の手順が難しい、または手元にツールがない場合は、結局 -reindexが確実な解決策になる。全ブロックを最初から検証し直し、ブロックインデックスとundo dataをすべて作り直すため、破損箇所は確実に解消される。
-reindexの所要時間はマシンの性能とチェーンのサイズに依存するが、メインネットでは数日かかるのが一般的だ。SSDを使用し、-dbcache を大きめに設定すると所要時間を短縮できる。なお、-reindexはブロックチェーンの生データ自体は消さない。ブロックインデックスとUTXOセット、undo dataをすべて再構築するだけだ。
-reindexを実行する際は、コマンドラインから bitcoind -reindex -txindex=1 のように指定する。GUI版では起動オプションに -reindex を追加する。完了後は通常どおりノードが同期を再開する。
よくある質問
チェックサムエラーが出てもノードの運用は続けられるのか
新規ブロックの検証と追記は継続できる。ただし、過去ブロックのundo dataを必要とする操作(getblockstats、高詳細度のgetblock、ブロックエクスプローラのバックエンドなど)は失敗し続ける。放置すると、該当ブロックを含むチェーン再編成が起きた場合に巻き戻し処理が失敗するリスクがある。
-txindexがない場合はどうすればいいのか
部分修復は -txindexが前提だ。無効なまま運用しているノードでは、入力が消費したUTXOを検索できないためundo dataを再構築できない。この場合は -reindexが唯一の選択肢になる。とりあえずノードを停止し、-reindex -txindex=1 を付けて再起動すると、再インデックスと同時に将来の部分修復に備えたtxindexも作成される。
-reindexを実行しても -txindexのデータは残るのか
-reindexはブロックインデックスとUTXOセット、undo dataを再構築する。txindex(トランザクションインデックス)も再構築の対象に含まれる。つまり、-reindexを実行しても -txindexのデータは消えないが、最初から再作成されることになる。
revファイルの破損を予防する方法はあるのか
突然の電源断や強制終了を避けるのが最も効果的だ。ノードを停止する際は必ず bitcoin-cli stop を使い、OSのシャットダウン前に正常終了させる。UPS(無停電電源装置)の導入や、ディスクのSMART情報を定期的に確認するのも有効だ。
部分修復用のツールは公式に提供されているのか
公式には提供されていない。部分修復はBitcoin Coreの内部データ構造に対する深い理解が必要で、コミュニティで共有されているスクリプトや手順を参考にするか、自分で実装する必要がある。安全を優先するなら -reindexを選ぶのが確実だ。
この記事のポイント
- undo dataのチェックサムエラーは過去ブロックの巻き戻し用データが壊れている状態
- -reindex-chainstateやinvalidateblockではundo positionが残るため修復できない
- -txindexが有効ならundo dataを再構築して部分的に書き戻せる
- 部分修復は技術的に高度で、公式ツールは存在しない
- 確実に直すなら -reindexが最終手段。数日かかるが確実に解消される

「エミリーズ・クリプト・インサイダー」のリサーチ担当として、暗号資産の現場で日々生まれる疑問や悩みを丹念に追いかける。
Reddit や海外フォーラムに寄せられる声を読み解き、「初心者がつまずきやすいポイント」「経験者でも見落としがちな落とし穴
」を一つずつ記事として整理している。
専門的な話を誰もが理解できる言葉に置き換えることに全力を注ぐ。情報の正確さと読みやすさの両立を信条としている。
