それは難しいアプローチだ。
再編成(reorg)を起こして、無効なチェーンを切り離す必要がある。
このコードはめったにテストされず、かなり複雑なので、シンプルで安全なものが最善だ。
自分が考えていたのはこうだ。(まだテストしていない)メインチェーンのすべてのブロックをチェックする。不正なブロックが見つかった場合、そのチェーンのbnChainWorkをすべて0に設定して再びベストチェーンになれないようにし、フォークレベルまでベストチェーンワークを下げることで、フォーク後の新しいブロックが再編成を引き起こすようにする。(実際にreorgを行わずにpindexBestを変更することはできない)
これはまだ完璧ではない。reorgをトリガーするために有効なブロックを1つ受信する必要がある。
チェック後にAddToBlockIndexやReorganizeを開始することはおそらく可能だが、はるかに慎重な注意が必要になる。おそらくAddToBlockIndexの新しいベストブロックを設定する部分を分離すべきだ。おそらく以下のコードの代わりにそうすることになるだろう。
Code: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;
}