Track parent->child relations for blocks

Allows to cheaply find all possible children of a block.
This commit is contained in:
Alexander Block 2019-01-22 14:18:34 +01:00
parent 04a51c9ef4
commit 2bf6eb1c7c
2 changed files with 13 additions and 0 deletions

View File

@ -68,6 +68,7 @@
CCriticalSection cs_main;
BlockMap mapBlockIndex;
PrevBlockMap mapPrevBlockIndex;
CChain chainActive;
CBlockIndex *pindexBestHeader = NULL;
CWaitableCriticalSection csBestBlock;
@ -3042,6 +3043,11 @@ CBlockIndex* AddToBlockIndex(const CBlockHeader& block)
setDirtyBlockIndex.insert(pindexNew);
// track prevBlockHash -> pindex (multimap)
if (pindexNew->pprev) {
mapPrevBlockIndex.emplace(pindexNew->pprev->GetBlockHash(), pindexNew);
}
return pindexNew;
}
@ -3827,6 +3833,11 @@ bool static LoadBlockIndexDB(const CChainParams& chainparams)
{
CBlockIndex* pindex = item.second;
vSortedByHeight.push_back(std::make_pair(pindex->nHeight, pindex));
// build mapPrevBlockIndex
if (pindex->pprev) {
mapPrevBlockIndex.emplace(pindex->pprev->GetBlockHash(), pindex);
}
}
sort(vSortedByHeight.begin(), vSortedByHeight.end());
BOOST_FOREACH(const PAIRTYPE(int, CBlockIndex*)& item, vSortedByHeight)

View File

@ -157,7 +157,9 @@ extern CScript COINBASE_FLAGS;
extern CCriticalSection cs_main;
extern CTxMemPool mempool;
typedef boost::unordered_map<uint256, CBlockIndex*, BlockHasher> BlockMap;
typedef std::unordered_multimap<uint256, CBlockIndex*, BlockHasher> PrevBlockMap;
extern BlockMap mapBlockIndex;
extern PrevBlockMap mapPrevBlockIndex;
extern uint64_t nLastBlockTx;
extern uint64_t nLastBlockSize;
extern const std::string strMessageMagic;