mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-01-18 22:35:39 +01:00
Merge pull request #4796
e8b5f0dMove CBlockIndex, CChain and related code out of main (jtimon)6db83dbDecouple CChain from mapBlockIndex (jtimon)
This commit is contained in:
65
src/main.cpp
65
src/main.cpp
@@ -391,72 +391,19 @@ void UnregisterNodeSignals(CNodeSignals& nodeSignals)
|
||||
nodeSignals.FinalizeNode.disconnect(&FinalizeNode);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// CChain implementation
|
||||
//
|
||||
|
||||
CBlockIndex *CChain::SetTip(CBlockIndex *pindex) {
|
||||
if (pindex == NULL) {
|
||||
vChain.clear();
|
||||
return NULL;
|
||||
}
|
||||
vChain.resize(pindex->nHeight + 1);
|
||||
while (pindex && vChain[pindex->nHeight] != pindex) {
|
||||
vChain[pindex->nHeight] = pindex;
|
||||
pindex = pindex->pprev;
|
||||
}
|
||||
return pindex;
|
||||
}
|
||||
|
||||
CBlockLocator CChain::GetLocator(const CBlockIndex *pindex) const {
|
||||
int nStep = 1;
|
||||
std::vector<uint256> vHave;
|
||||
vHave.reserve(32);
|
||||
|
||||
if (!pindex)
|
||||
pindex = Tip();
|
||||
while (pindex) {
|
||||
vHave.push_back(pindex->GetBlockHash());
|
||||
// Stop when we have added the genesis block.
|
||||
if (pindex->nHeight == 0)
|
||||
break;
|
||||
// Exponentially larger steps back, plus the genesis block.
|
||||
int nHeight = std::max(pindex->nHeight - nStep, 0);
|
||||
if (Contains(pindex)) {
|
||||
// Use O(1) CChain index if possible.
|
||||
pindex = (*this)[nHeight];
|
||||
} else {
|
||||
// Otherwise, use O(log n) skiplist.
|
||||
pindex = pindex->GetAncestor(nHeight);
|
||||
}
|
||||
if (vHave.size() > 10)
|
||||
nStep *= 2;
|
||||
}
|
||||
|
||||
return CBlockLocator(vHave);
|
||||
}
|
||||
|
||||
CBlockIndex *CChain::FindFork(const CBlockLocator &locator) const {
|
||||
CBlockIndex* FindForkInGlobalIndex(const CChain& chain, const CBlockLocator& locator)
|
||||
{
|
||||
// Find the first block the caller has in the main chain
|
||||
BOOST_FOREACH(const uint256& hash, locator.vHave) {
|
||||
BlockMap::iterator mi = mapBlockIndex.find(hash);
|
||||
if (mi != mapBlockIndex.end())
|
||||
{
|
||||
CBlockIndex* pindex = (*mi).second;
|
||||
if (Contains(pindex))
|
||||
if (chain.Contains(pindex))
|
||||
return pindex;
|
||||
}
|
||||
}
|
||||
return Genesis();
|
||||
}
|
||||
|
||||
const CBlockIndex *CChain::FindFork(const CBlockIndex *pindex) const {
|
||||
if (pindex->nHeight > Height())
|
||||
pindex = pindex->GetAncestor(Height());
|
||||
while (pindex && !Contains(pindex))
|
||||
pindex = pindex->pprev;
|
||||
return pindex;
|
||||
return chain.Genesis();
|
||||
}
|
||||
|
||||
CCoinsViewCache *pcoinsTip = NULL;
|
||||
@@ -3709,7 +3656,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
|
||||
LOCK(cs_main);
|
||||
|
||||
// Find the last block the caller has in the main chain
|
||||
CBlockIndex* pindex = chainActive.FindFork(locator);
|
||||
CBlockIndex* pindex = FindForkInGlobalIndex(chainActive, locator);
|
||||
|
||||
// Send the rest of the chain
|
||||
if (pindex)
|
||||
@@ -3756,7 +3703,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
|
||||
else
|
||||
{
|
||||
// Find the last block the caller has in the main chain
|
||||
pindex = chainActive.FindFork(locator);
|
||||
pindex = FindForkInGlobalIndex(chainActive, locator);
|
||||
if (pindex)
|
||||
pindex = chainActive.Next(pindex);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user