Re:(satoshiの引用投稿)

それは難しいアプローチだ。

再編成(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;

}