diff --git a/src/node/blockstorage.cpp b/src/node/blockstorage.cpp index 73bc4e00723..763fd297446 100644 --- a/src/node/blockstorage.cpp +++ b/src/node/blockstorage.cpp @@ -56,6 +56,17 @@ static FILE* OpenUndoFile(const FlatFilePos& pos, bool fReadOnly = false); static FlatFileSeq BlockFileSeq(); static FlatFileSeq UndoFileSeq(); +std::vector BlockManager::GetAllBlockIndices() +{ + AssertLockHeld(cs_main); + std::vector rv; + rv.reserve(m_block_index.size()); + for (auto& [_, block_index] : m_block_index) { + rv.push_back(&block_index); + } + return rv; +} + CBlockIndex* BlockManager::LookupBlockIndex(const uint256& hash) { AssertLockHeld(cs_main); @@ -242,11 +253,7 @@ bool BlockManager::LoadBlockIndex(const Consensus::Params& consensus_params) } // Calculate nChainWork - std::vector vSortedByHeight; - vSortedByHeight.reserve(m_block_index.size()); - for (auto& [_, block_index] : m_block_index) { - vSortedByHeight.push_back(&block_index); - } + std::vector vSortedByHeight{GetAllBlockIndices()}; std::sort(vSortedByHeight.begin(), vSortedByHeight.end(), CBlockIndexHeightOnlyComparator()); diff --git a/src/node/blockstorage.h b/src/node/blockstorage.h index 0fd87ddaf12..a051e908089 100644 --- a/src/node/blockstorage.h +++ b/src/node/blockstorage.h @@ -123,6 +123,8 @@ private: public: BlockMap m_block_index GUARDED_BY(cs_main); + std::vector GetAllBlockIndices() EXCLUSIVE_LOCKS_REQUIRED(::cs_main); + /** * All pairs A->B, where A (or one of its ancestors) misses transactions, but B has transactions. * Pruned nodes may have entries where B is missing data. diff --git a/src/validation.cpp b/src/validation.cpp index 2828b4ae988..58488be3a73 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -4069,11 +4069,7 @@ bool ChainstateManager::LoadBlockIndex() bool ret = m_blockman.LoadBlockIndexDB(); if (!ret) return false; - std::vector vSortedByHeight; - vSortedByHeight.reserve(m_blockman.m_block_index.size()); - for (auto& [_, block_index] : m_blockman.m_block_index) { - vSortedByHeight.push_back(&block_index); - } + std::vector vSortedByHeight{m_blockman.GetAllBlockIndices()}; std::sort(vSortedByHeight.begin(), vSortedByHeight.end(), CBlockIndexHeightOnlyComparator());