Line data Source code
1 : // Copyright (c) 2009-2010 Satoshi Nakamoto 2 : // Copyright (c) 2009-2019 The Bitcoin Core developers 3 : // Distributed under the MIT software license, see the accompanying 4 : // file COPYING or http://www.opensource.org/licenses/mit-license.php. 5 : 6 : #include <chain.h> 7 : #include <util/time.h> 8 : 9 : #include <tinyformat.h> 10 : 11 3020 : std::string CBlockFileInfo::ToString() const 12 : { 13 3020 : return strprintf("CBlockFileInfo(blocks=%u, size=%u, heights=%u...%u, time=%s...%s)", nBlocks, nSize, nHeightFirst, nHeightLast, FormatISO8601Date(nTimeFirst), FormatISO8601Date(nTimeLast)); 14 0 : } 15 : 16 0 : std::string CBlockIndex::ToString() const 17 : { 18 0 : return strprintf("CBlockIndex(pprev=%p, nHeight=%d, merkle=%s, hashBlock=%s)", 19 0 : pprev, nHeight, hashMerkleRoot.ToString(), GetBlockHash().ToString()); 20 0 : } 21 : 22 269769 : void CChain::SetTip(CBlockIndex& block) 23 : { 24 269769 : CBlockIndex* pindex = █ 25 269769 : vChain.resize(pindex->nHeight + 1); 26 1044197 : while (pindex && vChain[pindex->nHeight] != pindex) { 27 774428 : vChain[pindex->nHeight] = pindex; 28 774428 : pindex = pindex->pprev; 29 : } 30 269769 : } 31 : 32 41089 : CBlockLocator CChain::GetLocator(const CBlockIndex *pindex) const { 33 41089 : int nStep = 1; 34 41089 : std::vector<uint256> vHave; 35 41089 : vHave.reserve(32); 36 : 37 41089 : if (!pindex) 38 8981 : pindex = Tip(); 39 710692 : while (pindex) { 40 710688 : vHave.push_back(pindex->GetBlockHash()); 41 : // Stop when we have added the genesis block. 42 710688 : if (pindex->nHeight == 0) 43 41085 : break; 44 : // Exponentially larger steps back, plus the genesis block. 45 669603 : int nHeight = std::max(pindex->nHeight - nStep, 0); 46 669603 : if (Contains(pindex)) { 47 : // Use O(1) CChain index if possible. 48 491083 : pindex = (*this)[nHeight]; 49 491083 : } else { 50 : // Otherwise, use O(log n) skiplist. 51 178520 : pindex = pindex->GetAncestor(nHeight); 52 : } 53 669603 : if (vHave.size() > 10) 54 301295 : nStep *= 2; 55 : } 56 : 57 41089 : return CBlockLocator(vHave); 58 41089 : } 59 : 60 491786 : const CBlockIndex *CChain::FindFork(const CBlockIndex *pindex) const { 61 491786 : if (pindex == nullptr) { 62 1074 : return nullptr; 63 : } 64 490712 : if (pindex->nHeight > Height()) 65 245486 : pindex = pindex->GetAncestor(Height()); 66 507652 : while (pindex && !Contains(pindex)) 67 16940 : pindex = pindex->pprev; 68 490712 : return pindex; 69 491786 : } 70 : 71 11406 : CBlockIndex* CChain::FindEarliestAtLeast(int64_t nTime, int height) const 72 : { 73 11406 : std::pair<int64_t, int> blockparams = std::make_pair(nTime, height); 74 11406 : std::vector<CBlockIndex*>::const_iterator lower = std::lower_bound(vChain.begin(), vChain.end(), blockparams, 75 175079 : [](CBlockIndex* pBlock, const std::pair<int64_t, int>& blockparams) -> bool { return pBlock->GetBlockTimeMax() < blockparams.first || pBlock->nHeight < blockparams.second; }); 76 11406 : return (lower == vChain.end() ? nullptr : *lower); 77 : } 78 : 79 : /** Turn the lowest '1' bit in the binary representation of a number into a '0'. */ 80 296240088 : int static inline InvertLowestOne(int n) { return n & (n - 1); } 81 : 82 : /** Compute what height to jump back to with the CBlockIndex::pskip pointer. */ 83 197615482 : int static inline GetSkipHeight(int height) { 84 197615482 : if (height < 2) 85 119455 : return 0; 86 : 87 : // Determine which height to jump back to. Any number strictly lower than height is acceptable, 88 : // but the following expression seems to perform well in simulations (max 110 steps to go back 89 : // up to 2**18 blocks). 90 197496027 : return (height & 1) ? InvertLowestOne(InvertLowestOne(height - 1)) + 1 : InvertLowestOne(height); 91 197615482 : } 92 : 93 22422140 : const CBlockIndex* CBlockIndex::GetAncestor(int height) const 94 : { 95 22422140 : if (height > nHeight || height < 0) { 96 3668998 : return nullptr; 97 : } 98 : 99 18753142 : const CBlockIndex* pindexWalk = this; 100 18753142 : int heightWalk = nHeight; 101 114227417 : while (heightWalk > height) { 102 95474275 : int heightSkip = GetSkipHeight(heightWalk); 103 95474275 : int heightSkipPrev = GetSkipHeight(heightWalk - 1); 104 102957090 : if (pindexWalk->pskip != nullptr && 105 95371553 : (heightSkip == height || 106 90043593 : (heightSkip > height && !(heightSkipPrev < heightSkip - 2 && 107 7482815 : heightSkipPrev >= height)))) { 108 : // Only follow pskip if pprev->pskip isn't better than pskip->pprev. 109 45611044 : pindexWalk = pindexWalk->pskip; 110 45611044 : heightWalk = heightSkip; 111 45611044 : } else { 112 49863231 : assert(pindexWalk->pprev); 113 49863231 : pindexWalk = pindexWalk->pprev; 114 49863231 : heightWalk--; 115 : } 116 : } 117 18753142 : return pindexWalk; 118 22422140 : } 119 : 120 7564308 : CBlockIndex* CBlockIndex::GetAncestor(int height) 121 : { 122 7564308 : return const_cast<CBlockIndex*>(static_cast<const CBlockIndex*>(this)->GetAncestor(height)); 123 : } 124 : 125 6667466 : void CBlockIndex::BuildSkip() 126 : { 127 6667466 : if (pprev) 128 6667136 : pskip = pprev->GetAncestor(GetSkipHeight(nHeight)); 129 6667466 : } 130 : 131 629360 : arith_uint256 GetBlockProof(const CBlockIndex& block) 132 : { 133 629360 : arith_uint256 bnTarget; 134 : bool fNegative; 135 : bool fOverflow; 136 629360 : bnTarget.SetCompact(block.nBits, &fNegative, &fOverflow); 137 629360 : if (fNegative || fOverflow || bnTarget == 0) 138 48 : return 0; 139 : // We need to compute 2**256 / (bnTarget+1), but we can't represent 2**256 140 : // as it's too large for an arith_uint256. However, as 2**256 is at least as large 141 : // as bnTarget+1, it is equal to ((2**256 - bnTarget - 1) / (bnTarget+1)) + 1, 142 : // or ~bnTarget / (bnTarget+1) + 1. 143 629312 : return (~bnTarget / (bnTarget + 1)) + 1; 144 629360 : } 145 : 146 1421 : int64_t GetBlockProofEquivalentTime(const CBlockIndex& to, const CBlockIndex& from, const CBlockIndex& tip, const Consensus::Params& params) 147 : { 148 1421 : arith_uint256 r; 149 1421 : int sign = 1; 150 1421 : if (to.nChainWork > from.nChainWork) { 151 916 : r = to.nChainWork - from.nChainWork; 152 916 : } else { 153 505 : r = from.nChainWork - to.nChainWork; 154 505 : sign = -1; 155 : } 156 1421 : r = r * arith_uint256(params.nPowTargetSpacing) / GetBlockProof(tip); 157 1421 : if (r.bits() > 63) { 158 0 : return sign * std::numeric_limits<int64_t>::max(); 159 : } 160 1421 : return sign * int64_t(r.GetLow64()); 161 1421 : } 162 : 163 : /** Find the last common ancestor two blocks have. 164 : * Both pa and pb must be non-nullptr. */ 165 1174177 : const CBlockIndex* LastCommonAncestor(const CBlockIndex* pa, const CBlockIndex* pb) { 166 1174177 : if (pa->nHeight > pb->nHeight) { 167 0 : pa = pa->GetAncestor(pb->nHeight); 168 1174177 : } else if (pb->nHeight > pa->nHeight) { 169 281674 : pb = pb->GetAncestor(pa->nHeight); 170 281674 : } 171 : 172 1188394 : while (pa != pb && pa && pb) { 173 14217 : pa = pa->pprev; 174 14217 : pb = pb->pprev; 175 : } 176 : 177 : // Eventually all chain branches meet at the genesis block. 178 1174177 : assert(pa == pb); 179 1174177 : return pa; 180 : }