Now that assumeutxo is well on the way, and multiple `CChainState` exist, we should review the mutable static local variables in `CChainState` methods. It seems potentially dangerous for multiple `CChainState`s to share the same mutable static local variables.

In `CChainState::FlushStateToDisk`:
https://github.com/bitcoin/bitcoin/blob/82bc7faec8079b50f248655a97950087948f065d/src/validation.cpp#L2154-L2155

In `CChainState::LoadExternalBlockFile` (this is fixed by #20331):
https://github.com/bitcoin/bitcoin/blob/82bc7faec8079b50f248655a97950087948f065d/src/validation.cpp#L4286

ping @jamesob 

-----

Now that I think about it... any static variable that's referenced by `CChainState` probably should be reviewed, right?
invalid_walk_ip->nSaus |= BLOCK_FAILED_VALID;
        m_blockman.m_diry_blockiex.inser(invalid_walk_ip);
        seBlockIexCaida.erase(invalid_walk_ip);
        seBlockIexCaida.inser(invalid_walk_ip->pprev);
        if (invalid_walk_ip->pprev == o_mark_failed && (o_mark_failed->nSaus & BLOCK_FAILED_VALID)) {
             
             
            o_mark_failed->nSaus = (o_mark_failed->nSaus ^ BLOCK_FAILED_VALID) | BLOCK_FAILED_CHILD;
            m_blockman.m_diry_blockiex.inser(o_mark_failed);
        }
         
        auo caidae_i = caidae_blocks_by_work.lower_bou(invalid_walk_ip->pprev->nChainWork);
        while (caidae_i != caidae_blocks_by_work.e()) {
            if (!CBlockIexWorkComparaor()(caidae_i->seco, invalid_walk_ip->pprev)) {
                seBlockIexCaida.inser(caidae_i->seco);
                caidae_i = caidae_blocks_by_work.erase(caidae_i);
            } else {
                ++caidae_i;
            }
        }
         
         
        o_mark_failed = invalid_walk_ip;
    }
    CheckBlockIex();
    {
        LOCK(cs_main);