|
|
|
@ -3133,12 +3133,10 @@ bool CChainState::InvalidateBlock(BlockValidationState& state, CBlockIndex* pind
|
|
|
|
|
// it up here, this should be an essentially unobservable error.
|
|
|
|
|
// Loop back over all block index entries and add any missing entries
|
|
|
|
|
// to setBlockIndexCandidates.
|
|
|
|
|
BlockMap::iterator it = m_blockman.m_block_index.begin();
|
|
|
|
|
while (it != m_blockman.m_block_index.end()) {
|
|
|
|
|
if (it->second.IsValid(BLOCK_VALID_TRANSACTIONS) && it->second.HaveTxsDownloaded() && !setBlockIndexCandidates.value_comp()(&it->second, m_chain.Tip())) {
|
|
|
|
|
setBlockIndexCandidates.insert(&it->second);
|
|
|
|
|
for (auto& [_, block_index] : m_blockman.m_block_index) {
|
|
|
|
|
if (block_index.IsValid(BLOCK_VALID_TRANSACTIONS) && block_index.HaveTxsDownloaded() && !setBlockIndexCandidates.value_comp()(&block_index, m_chain.Tip())) {
|
|
|
|
|
setBlockIndexCandidates.insert(&block_index);
|
|
|
|
|
}
|
|
|
|
|
it++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
InvalidChainFound(to_mark_failed);
|
|
|
|
@ -3157,21 +3155,19 @@ void CChainState::ResetBlockFailureFlags(CBlockIndex *pindex) {
|
|
|
|
|
int nHeight = pindex->nHeight;
|
|
|
|
|
|
|
|
|
|
// Remove the invalidity flag from this block and all its descendants.
|
|
|
|
|
BlockMap::iterator it = m_blockman.m_block_index.begin();
|
|
|
|
|
while (it != m_blockman.m_block_index.end()) {
|
|
|
|
|
if (!it->second.IsValid() && it->second.GetAncestor(nHeight) == pindex) {
|
|
|
|
|
it->second.nStatus &= ~BLOCK_FAILED_MASK;
|
|
|
|
|
m_blockman.m_dirty_blockindex.insert(&it->second);
|
|
|
|
|
if (it->second.IsValid(BLOCK_VALID_TRANSACTIONS) && it->second.HaveTxsDownloaded() && setBlockIndexCandidates.value_comp()(m_chain.Tip(), &it->second)) {
|
|
|
|
|
setBlockIndexCandidates.insert(&it->second);
|
|
|
|
|
for (auto& [_, block_index] : m_blockman.m_block_index) {
|
|
|
|
|
if (!block_index.IsValid() && block_index.GetAncestor(nHeight) == pindex) {
|
|
|
|
|
block_index.nStatus &= ~BLOCK_FAILED_MASK;
|
|
|
|
|
m_blockman.m_dirty_blockindex.insert(&block_index);
|
|
|
|
|
if (block_index.IsValid(BLOCK_VALID_TRANSACTIONS) && block_index.HaveTxsDownloaded() && setBlockIndexCandidates.value_comp()(m_chain.Tip(), &block_index)) {
|
|
|
|
|
setBlockIndexCandidates.insert(&block_index);
|
|
|
|
|
}
|
|
|
|
|
if (&it->second == m_chainman.m_best_invalid) {
|
|
|
|
|
if (&block_index == m_chainman.m_best_invalid) {
|
|
|
|
|
// Reset invalid block marker if it was pointing to one of those.
|
|
|
|
|
m_chainman.m_best_invalid = nullptr;
|
|
|
|
|
}
|
|
|
|
|
m_chainman.m_failed_blocks.erase(&it->second);
|
|
|
|
|
m_chainman.m_failed_blocks.erase(&block_index);
|
|
|
|
|
}
|
|
|
|
|
it++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Remove the invalidity flag from all ancestors too.
|
|
|
|
@ -4261,8 +4257,8 @@ void CChainState::CheckBlockIndex()
|
|
|
|
|
|
|
|
|
|
// Build forward-pointing map of the entire block tree.
|
|
|
|
|
std::multimap<CBlockIndex*,CBlockIndex*> forward;
|
|
|
|
|
for (std::pair<const uint256, CBlockIndex>& entry : m_blockman.m_block_index) {
|
|
|
|
|
forward.insert(std::make_pair(entry.second.pprev, &entry.second));
|
|
|
|
|
for (auto& [_, block_index] : m_blockman.m_block_index) {
|
|
|
|
|
forward.emplace(block_index.pprev, &block_index);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
assert(forward.size() == m_blockman.m_block_index.size());
|
|
|
|
|