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); }
bool Finalise() { LogPrintf("Finalise()\n"); StopRPCThreads(); ShutdownRPCMining(); SecureMsgShutdown(); mempool.AddTransactionsUpdated(1); if (pwalletMain) bitdb.Flush(false); StopNode(); { LOCK(cs_main); if (pwalletMain) pwalletMain->SetBestChain(CBlockLocator(pindexBest)); } if (pwalletMain) bitdb.Flush(true); UnregisterWallet(pwalletMain); delete pwalletMain; pwalletMain = NULL; finaliseRingSigs(); if (nNodeMode == NT_FULL) { std::map<uint256, CBlockIndex*>::iterator it; for (it = mapBlockIndex.begin(); it != mapBlockIndex.end(); ++it) { delete it->second; }; mapBlockIndex.clear(); if (fDebug) LogPrintf("mapBlockIndex cleared.\n"); } else { std::map<uint256, CBlockThinIndex*>::iterator it; for (it = mapBlockThinIndex.begin(); it != mapBlockThinIndex.end(); ++it) { delete it->second; }; mapBlockThinIndex.clear(); if (fDebug) LogPrintf("mapBlockThinIndex cleared.\n"); }; CTxDB().Close(); fs::remove(GetPidFile()); return true; }
void CNode::PushGetBlocks(CBlockIndex* pindexBegin, uint256 hashEnd) { // Filter out duplicate requests if (pindexBegin == pindexLastGetBlocksBegin && hashEnd == hashLastGetBlocksEnd) return; pindexLastGetBlocksBegin = pindexBegin; hashLastGetBlocksEnd = hashEnd; PushMessage("getblocks", CBlockLocator(pindexBegin), hashEnd); }
bool CWalletDB::WriteBestBlock(const CBlockLocator& locator) { WriteIC(std::string("bestblock"), CBlockLocator()); // Write empty block locator so versions that require a merkle branch automatically rescan return WriteIC(std::string("bestblock_nomerkle"), locator); }