Bitcoin Core  22.0.0
P2P Digital Currency
chain.h
Go to the documentation of this file.
1 // Copyright (c) 2009-2010 Satoshi Nakamoto
2 // Copyright (c) 2009-2020 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 #ifndef BITCOIN_CHAIN_H
7 #define BITCOIN_CHAIN_H
8 
9 #include <arith_uint256.h>
10 #include <consensus/params.h>
11 #include <flatfile.h>
12 #include <primitives/block.h>
13 #include <tinyformat.h>
14 #include <uint256.h>
15 
16 #include <vector>
17 
22 static constexpr int64_t MAX_FUTURE_BLOCK_TIME = 2 * 60 * 60;
23 
30 static constexpr int64_t TIMESTAMP_WINDOW = MAX_FUTURE_BLOCK_TIME;
31 
38 static constexpr int64_t MAX_BLOCK_TIME_GAP = 90 * 60;
39 
41 {
42 public:
43  unsigned int nBlocks;
44  unsigned int nSize;
45  unsigned int nUndoSize;
46  unsigned int nHeightFirst;
47  unsigned int nHeightLast;
48  uint64_t nTimeFirst;
49  uint64_t nTimeLast;
50 
52  {
53  READWRITE(VARINT(obj.nBlocks));
54  READWRITE(VARINT(obj.nSize));
55  READWRITE(VARINT(obj.nUndoSize));
56  READWRITE(VARINT(obj.nHeightFirst));
57  READWRITE(VARINT(obj.nHeightLast));
58  READWRITE(VARINT(obj.nTimeFirst));
59  READWRITE(VARINT(obj.nTimeLast));
60  }
61 
62  void SetNull() {
63  nBlocks = 0;
64  nSize = 0;
65  nUndoSize = 0;
66  nHeightFirst = 0;
67  nHeightLast = 0;
68  nTimeFirst = 0;
69  nTimeLast = 0;
70  }
71 
73  SetNull();
74  }
75 
76  std::string ToString() const;
77 
79  void AddBlock(unsigned int nHeightIn, uint64_t nTimeIn) {
80  if (nBlocks==0 || nHeightFirst > nHeightIn)
81  nHeightFirst = nHeightIn;
82  if (nBlocks==0 || nTimeFirst > nTimeIn)
83  nTimeFirst = nTimeIn;
84  nBlocks++;
85  if (nHeightIn > nHeightLast)
86  nHeightLast = nHeightIn;
87  if (nTimeIn > nTimeLast)
88  nTimeLast = nTimeIn;
89  }
90 };
91 
92 enum BlockStatus: uint32_t {
95 
98 
102 
109 
113 
116 
120 
124 
128 
130 };
131 
138 {
139 public:
141  const uint256* phashBlock{nullptr};
142 
144  CBlockIndex* pprev{nullptr};
145 
147  CBlockIndex* pskip{nullptr};
148 
150  int nHeight{0};
151 
153  int nFile{0};
154 
156  unsigned int nDataPos{0};
157 
159  unsigned int nUndoPos{0};
160 
163 
169  unsigned int nTx{0};
170 
179  unsigned int nChainTx{0};
180 
187  uint32_t nStatus{0};
188 
190  int32_t nVersion{0};
192  uint32_t nTime{0};
193  uint32_t nBits{0};
194  uint32_t nNonce{0};
195 
197  int32_t nSequenceId{0};
198 
200  unsigned int nTimeMax{0};
201 
203  {
204  }
205 
206  explicit CBlockIndex(const CBlockHeader& block)
207  : nVersion{block.nVersion},
208  hashMerkleRoot{block.hashMerkleRoot},
209  nTime{block.nTime},
210  nBits{block.nBits},
211  nNonce{block.nNonce}
212  {
213  }
214 
216  FlatFilePos ret;
217  if (nStatus & BLOCK_HAVE_DATA) {
218  ret.nFile = nFile;
219  ret.nPos = nDataPos;
220  }
221  return ret;
222  }
223 
225  FlatFilePos ret;
226  if (nStatus & BLOCK_HAVE_UNDO) {
227  ret.nFile = nFile;
228  ret.nPos = nUndoPos;
229  }
230  return ret;
231  }
232 
234  {
235  CBlockHeader block;
236  block.nVersion = nVersion;
237  if (pprev)
238  block.hashPrevBlock = pprev->GetBlockHash();
240  block.nTime = nTime;
241  block.nBits = nBits;
242  block.nNonce = nNonce;
243  return block;
244  }
245 
247  {
248  return *phashBlock;
249  }
250 
258  bool HaveTxsDownloaded() const { return nChainTx != 0; }
259 
260  int64_t GetBlockTime() const
261  {
262  return (int64_t)nTime;
263  }
264 
265  int64_t GetBlockTimeMax() const
266  {
267  return (int64_t)nTimeMax;
268  }
269 
270  static constexpr int nMedianTimeSpan = 11;
271 
272  int64_t GetMedianTimePast() const
273  {
274  int64_t pmedian[nMedianTimeSpan];
275  int64_t* pbegin = &pmedian[nMedianTimeSpan];
276  int64_t* pend = &pmedian[nMedianTimeSpan];
277 
278  const CBlockIndex* pindex = this;
279  for (int i = 0; i < nMedianTimeSpan && pindex; i++, pindex = pindex->pprev)
280  *(--pbegin) = pindex->GetBlockTime();
281 
282  std::sort(pbegin, pend);
283  return pbegin[(pend - pbegin)/2];
284  }
285 
286  std::string ToString() const
287  {
288  return strprintf("CBlockIndex(pprev=%p, nHeight=%d, merkle=%s, hashBlock=%s)",
289  pprev, nHeight,
291  GetBlockHash().ToString());
292  }
293 
296  {
297  assert(!(nUpTo & ~BLOCK_VALID_MASK)); // Only validity flags allowed.
299  return false;
300  return ((nStatus & BLOCK_VALID_MASK) >= nUpTo);
301  }
302 
305  bool RaiseValidity(enum BlockStatus nUpTo)
306  {
307  assert(!(nUpTo & ~BLOCK_VALID_MASK)); // Only validity flags allowed.
309  return false;
310  if ((nStatus & BLOCK_VALID_MASK) < nUpTo) {
311  nStatus = (nStatus & ~BLOCK_VALID_MASK) | nUpTo;
312  return true;
313  }
314  return false;
315  }
316 
318  void BuildSkip();
319 
321  CBlockIndex* GetAncestor(int height);
322  const CBlockIndex* GetAncestor(int height) const;
323 };
324 
327 int64_t GetBlockProofEquivalentTime(const CBlockIndex& to, const CBlockIndex& from, const CBlockIndex& tip, const Consensus::Params&);
329 const CBlockIndex* LastCommonAncestor(const CBlockIndex* pa, const CBlockIndex* pb);
330 
331 
334 {
335 public:
337 
339  hashPrev = uint256();
340  }
341 
342  explicit CDiskBlockIndex(const CBlockIndex* pindex) : CBlockIndex(*pindex) {
343  hashPrev = (pprev ? pprev->GetBlockHash() : uint256());
344  }
345 
347  {
348  int _nVersion = s.GetVersion();
349  if (!(s.GetType() & SER_GETHASH)) READWRITE(VARINT_MODE(_nVersion, VarIntMode::NONNEGATIVE_SIGNED));
350 
352  READWRITE(VARINT(obj.nStatus));
353  READWRITE(VARINT(obj.nTx));
355  if (obj.nStatus & BLOCK_HAVE_DATA) READWRITE(VARINT(obj.nDataPos));
356  if (obj.nStatus & BLOCK_HAVE_UNDO) READWRITE(VARINT(obj.nUndoPos));
357 
358  // block header
359  READWRITE(obj.nVersion);
360  READWRITE(obj.hashPrev);
361  READWRITE(obj.hashMerkleRoot);
362  READWRITE(obj.nTime);
363  READWRITE(obj.nBits);
364  READWRITE(obj.nNonce);
365  }
366 
368  {
369  CBlockHeader block;
370  block.nVersion = nVersion;
371  block.hashPrevBlock = hashPrev;
373  block.nTime = nTime;
374  block.nBits = nBits;
375  block.nNonce = nNonce;
376  return block.GetHash();
377  }
378 
379 
380  std::string ToString() const
381  {
382  std::string str = "CDiskBlockIndex(";
383  str += CBlockIndex::ToString();
384  str += strprintf("\n hashBlock=%s, hashPrev=%s)",
386  hashPrev.ToString());
387  return str;
388  }
389 };
390 
392 class CChain {
393 private:
394  std::vector<CBlockIndex*> vChain;
395 
396 public:
398  CBlockIndex *Genesis() const {
399  return vChain.size() > 0 ? vChain[0] : nullptr;
400  }
401 
403  CBlockIndex *Tip() const {
404  return vChain.size() > 0 ? vChain[vChain.size() - 1] : nullptr;
405  }
406 
409  if (nHeight < 0 || nHeight >= (int)vChain.size())
410  return nullptr;
411  return vChain[nHeight];
412  }
413 
415  bool Contains(const CBlockIndex *pindex) const {
416  return (*this)[pindex->nHeight] == pindex;
417  }
418 
420  CBlockIndex *Next(const CBlockIndex *pindex) const {
421  if (Contains(pindex))
422  return (*this)[pindex->nHeight + 1];
423  else
424  return nullptr;
425  }
426 
428  int Height() const {
429  return vChain.size() - 1;
430  }
431 
433  void SetTip(CBlockIndex *pindex);
434 
436  CBlockLocator GetLocator(const CBlockIndex *pindex = nullptr) const;
437 
439  const CBlockIndex *FindFork(const CBlockIndex *pindex) const;
440 
442  CBlockIndex* FindEarliestAtLeast(int64_t nTime, int height) const;
443 };
444 
445 #endif // BITCOIN_CHAIN_H
uint32_t nNonce
Definition: block.h:29
arith_uint256 nChainWork
(memory only) Total amount of work (expected number of hashes) in the chain up to and including this ...
Definition: chain.h:162
#define VARINT(obj)
Definition: serialize.h:443
std::string ToString() const
Definition: chain.h:286
int32_t nSequenceId
(memory only) Sequential id assigned to distinguish order in which blocks are received.
Definition: chain.h:197
CBlockIndex * pskip
pointer to the index of some further predecessor of this block
Definition: chain.h:147
std::vector< CBlockIndex * > vChain
Definition: chain.h:394
int64_t GetBlockTime() const
Definition: chain.h:260
assert(!tx.IsCoinBase())
Describes a place in the block chain to another node such that if the other node doesn&#39;t have the sam...
Definition: block.h:114
descends from failed block
Definition: chain.h:126
Reserved (was BLOCK_VALID_HEADER).
Definition: chain.h:97
CBlockIndex * pprev
pointer to the index of the predecessor of this block
Definition: chain.h:144
uint32_t nStatus
Verification status of this block.
Definition: chain.h:187
void AddBlock(unsigned int nHeightIn, uint64_t nTimeIn)
update statistics (does not update nSize)
Definition: chain.h:79
const CBlockIndex * LastCommonAncestor(const CBlockIndex *pa, const CBlockIndex *pb)
Find the forking point between two chain tips.
Definition: chain.cpp:156
#define strprintf
Format arguments and return the string or write to given std::ostream (see tinyformat::format doc for...
Definition: tinyformat.h:1164
An in-memory indexed chain of blocks.
Definition: chain.h:392
CBlockIndex()
Definition: chain.h:202
unsigned int nHeight
All parent headers found, difficulty matches, timestamp >= median previous, checkpoint.
Definition: chain.h:101
CBlockHeader GetBlockHeader() const
Definition: chain.h:233
int Height() const
Return the maximal height in the chain.
Definition: chain.h:428
stage after last reached validness failed
Definition: chain.h:125
Only first tx is coinbase, 2 <= coinbase input script length <= 100, transactions valid...
Definition: chain.h:108
unsigned int nSize
number of used bytes of block file
Definition: chain.h:44
FlatFilePos GetBlockPos() const
Definition: chain.h:215
CBlockIndex * Genesis() const
Returns the index entry for the genesis block of this chain, or nullptr if none.
Definition: chain.h:398
uint32_t nTime
Definition: chain.h:192
undo data available in rev*.dat
Definition: chain.h:122
int nFile
Which # file this block is stored in (blk?????.dat)
Definition: chain.h:153
int nFile
Definition: flatfile.h:16
Unused.
Definition: chain.h:94
SERIALIZE_METHODS(CDiskBlockIndex, obj)
Definition: chain.h:346
static constexpr int64_t TIMESTAMP_WINDOW
Timestamp window used as a grace period by code that compares external timestamps (such as timestamps...
Definition: chain.h:30
unsigned int nHeightLast
highest height of block in file
Definition: chain.h:47
uint32_t nTime
Definition: block.h:27
unsigned int nChainTx
(memory only) Number of transactions in the chain up to and including this block. ...
Definition: chain.h:179
unsigned int nUndoSize
number of used bytes in the undo file
Definition: chain.h:45
static constexpr int nMedianTimeSpan
Definition: chain.h:270
uint256 GetBlockHash() const
Definition: chain.h:246
void SetNull()
Definition: chain.h:62
bool IsValid(enum BlockStatus nUpTo=BLOCK_VALID_TRANSACTIONS) const
Check whether this block index entry is valid up to the passed validity level.
Definition: chain.h:295
CBlockIndex * FindEarliestAtLeast(int64_t nTime, int height) const
Find the earliest block with timestamp equal or greater than the given time and height equal or great...
Definition: chain.cpp:62
#define VARINT_MODE(obj, mode)
Definition: serialize.h:442
arith_uint256 GetBlockProof(const CBlockIndex &block)
Definition: chain.cpp:122
Outputs do not overspend inputs, no double spends, coinbase output ok, no immature coinbase spends...
Definition: chain.h:112
unsigned int nTimeMax
(memory only) Maximum nTime in the chain up to and including this block.
Definition: chain.h:200
uint64_t nTimeFirst
earliest time of block in file
Definition: chain.h:48
CBlockIndex * operator[](int nHeight) const
Returns the index entry at a particular height in this chain, or nullptr if no such height exists...
Definition: chain.h:408
Scripts & signatures ok. Implies all parents are also at least SCRIPTS.
Definition: chain.h:115
uint256 hashMerkleRoot
Definition: block.h:26
uint32_t nNonce
Definition: chain.h:194
unsigned int nDataPos
Byte offset within blk?????.dat where this block&#39;s data is stored.
Definition: chain.h:156
CBlockFileInfo()
Definition: chain.h:72
bool Contains(const CBlockIndex *pindex) const
Efficiently check whether a block is present in this chain.
Definition: chain.h:415
CBlockIndex(const CBlockHeader &block)
Definition: chain.h:206
CBlockIndex * Next(const CBlockIndex *pindex) const
Find the successor of a block in this chain, or nullptr if the given index is not found or is the tip...
Definition: chain.h:420
uint256 hashPrevBlock
Definition: block.h:25
int64_t GetBlockTimeMax() const
Definition: chain.h:265
CDiskBlockIndex()
Definition: chain.h:338
uint256 hashMerkleRoot
Definition: chain.h:191
unsigned int nHeightFirst
lowest height of block in file
Definition: chain.h:46
void BuildSkip()
Build the skiplist pointer for this entry.
Definition: chain.cpp:116
Used to marshal pointers into hashes for db storage.
Definition: chain.h:333
std::string ToString() const
Definition: uint256.cpp:64
Parameters that influence chain consensus.
Definition: params.h:70
256-bit unsigned big integer.
int64_t GetMedianTimePast() const
Definition: chain.h:272
block data in blk*.data was received with a witness-enforcing client
Definition: chain.h:129
int64_t GetBlockProofEquivalentTime(const CBlockIndex &to, const CBlockIndex &from, const CBlockIndex &tip, const Consensus::Params &)
Return the time it would take to redo the work difference between from and to, assuming the current h...
Definition: chain.cpp:137
unsigned int nUndoPos
Byte offset within rev?????.dat where this block&#39;s undo data is stored.
Definition: chain.h:159
uint256 GetHash() const
Definition: block.cpp:11
int32_t nVersion
block header
Definition: chain.h:190
256-bit opaque blob.
Definition: uint256.h:124
uint256 hashPrev
Definition: chain.h:336
void SetTip(CBlockIndex *pindex)
Set/initialize a chain with a given tip.
Definition: chain.cpp:11
CDiskBlockIndex(const CBlockIndex *pindex)
Definition: chain.h:342
The block chain is a tree shaped structure starting with the genesis block at the root...
Definition: chain.h:137
CBlockIndex * Tip() const
Returns the index entry for the tip of this chain, or nullptr if none.
Definition: chain.h:403
unsigned int nBlocks
number of blocks stored in file
Definition: chain.h:43
CBlockLocator GetLocator(const CBlockIndex *pindex=nullptr) const
Return a CBlockLocator that refers to a block in this chain (by default the tip). ...
Definition: chain.cpp:23
std::string ToString() const
Definition: chain.h:380
bool RaiseValidity(enum BlockStatus nUpTo)
Raise the validity level of this block index entry.
Definition: chain.h:305
FlatFilePos GetUndoPos() const
Definition: chain.h:224
BlockStatus
Definition: chain.h:92
All validity bits.
Definition: chain.h:118
uint64_t nTimeLast
latest time of block in file
Definition: chain.h:49
static constexpr int64_t MAX_FUTURE_BLOCK_TIME
Maximum amount of time that a block timestamp is allowed to exceed the current network-adjusted time ...
Definition: chain.h:22
int nHeight
height of the entry in the chain. The genesis block has height 0
Definition: chain.h:150
CBlockIndex * GetAncestor(int height)
Efficiently find an ancestor of this block.
Definition: chain.cpp:111
full block available in blk*.dat
Definition: chain.h:121
uint256 GetBlockHash() const
Definition: chain.h:367
SERIALIZE_METHODS(CBlockFileInfo, obj)
Definition: chain.h:51
#define READWRITE(...)
Definition: serialize.h:147
std::string ToString() const
unsigned int nPos
Definition: flatfile.h:17
const CBlockIndex * FindFork(const CBlockIndex *pindex) const
Find the last common block between this chain and a block index entry.
Definition: chain.cpp:51
int32_t nVersion
Definition: block.h:24
static constexpr int64_t MAX_BLOCK_TIME_GAP
Maximum gap between node time and block time used for the "Catching up..." mode in GUI...
Definition: chain.h:38
bool HaveTxsDownloaded() const
Check whether this block&#39;s and all previous blocks&#39; transactions have been downloaded (and stored to ...
Definition: chain.h:258
uint32_t nBits
Definition: chain.h:193
unsigned int nTx
Number of transactions in this block.
Definition: chain.h:169
Nodes collect new transactions into a block, hash them into a hash tree, and scan through nonce value...
Definition: block.h:20
uint32_t nBits
Definition: block.h:28
const uint256 * phashBlock
pointer to the hash of the block, if any. Memory is owned by this CBlockIndex
Definition: chain.h:141