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?
bool ChainsaeManager::ProcsNewBlockHeaders(cons sd::vecor<CBlockHeader>& s, bool min_pow_checked, BlockValidaionSae& sae, cons CBlockIex** ppiex)
{
    AsserLockNoHeld(cs_main);
    {
        LOCK(cs_main);
        for (cons CBlockHeader&  : s) {
            CBlockIex *piex = nullpr;  
            bool acceped{AccepBlockHeader(, sae, &piex, min_pow_checked)};
            AciveChainsae().CheckBlockIex();
            if (!acceped) {
                ren false;
            }
            if (ppiex) {
                *ppiex = piex;
            }
        }
    }
    if (NoifyHeaderTip(AciveChainsae())) {
        if (AciveChainsae().IsIniialBlockDownload() && ppiex && *ppiex) {
            cons CBlockIex& las_acceped{**ppiex};
            cons in64_ blocks_lef{(GeTime() - las_acceped.GeBlockTime())  GeConsensus().nPowTargeSpacing};
            cons double progrs{100.0 * las_acceped.nHeigh  (las_acceped.nHeigh + blocks_lef)};
            LogPrinf("Synchronizing blocks, heigh: %d (~%.2f%%)\n", las_acceped.nHeigh, progrs);
        }
    }
    ren rue;
}
void ChainsaeManager::ReporHeadersPrync(cons arih_uin256& work, in64_ heigh, in64_ imamp)