それは難しいアプローチだ。
再編成(reorg)を起こして、無効なチェーンを切り離す必要がある。
このコードはめったにテストされず、かなり複雑なので、シンプルで安全なものが最善だ。
自分が考えていたのはこうだ。(まだテストしていない)メインチェーンのすべてのブロックをチェックする。不正なブロックが見つかった場合、そのチェーンの bnChainWork をすべて 0 に設定して再びベストチェーンになれないようにし、フォークレベルまでベストチェーンワークを下げることで、フォーク後の新しいブロックが再編成を引き起こすようにする。(実際に reorg を行わずに pindexBest を変更することはできない)
これはまだ完璧ではない。reorg をトリガーするために有効なブロックを 1 つ受信する必要がある。
チェック後に AddToBlockIndex や Reorganize を開始することはおそらく可能だが、はるかに慎重な注意が必要になる。おそらく AddToBlockIndex の新しいベストブロックを設定する部分を分離すべきだ。おそらく以下のコードの代わりにそうすることになるだろう。
bool CTxDB::LoadBlockIndex()
{
...
// メインチェーンのブロックを検証
vector<CBlockIndex*> vChain;
for (CBlockIndex* pindex = pindexBest; pindex && pindex->pprev; pindex = pindex->pprev)
{
vChain.push_back(pindex);
CBlock block;
if (!block.ReadFromDisk(pindex))
return error("LoadBlockIndex() : block.ReadFromDisk failed");
if (!block.CheckBlock())
{
bnBestChainWork = pindex->pprev->bnChainWork;
foreach(CBlockIndex* pindex2, vChain)
pindex2->bnChainWork = 0;
}
}
return true;
}