Bitcoin ABC  0.29.9
P2P Digital Currency
blockindex.h
Go to the documentation of this file.
1 // Copyright (c) 2009-2020 The Bitcoin developers
2 // Distributed under the MIT software license, see the accompanying
3 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
4 
5 #ifndef BITCOIN_BLOCKINDEX_H
6 #define BITCOIN_BLOCKINDEX_H
7 
8 #include <arith_uint256.h>
9 #include <blockstatus.h>
10 #include <flatfile.h>
11 #include <kernel/cs_main.h>
12 #include <primitives/block.h>
13 #include <sync.h>
14 #include <uint256.h>
15 #include <util/time.h>
16 
17 struct BlockHash;
18 
25 class CBlockIndex {
26 public:
29  const BlockHash *phashBlock{nullptr};
30 
32  CBlockIndex *pprev{nullptr};
33 
35  CBlockIndex *pskip{nullptr};
36 
38  int nHeight{0};
39 
41  int nFile GUARDED_BY(::cs_main){0};
42 
44  unsigned int nDataPos GUARDED_BY(::cs_main){0};
45 
47  unsigned int nUndoPos GUARDED_BY(::cs_main){0};
48 
52 
60  unsigned int nTx{0};
61 
65  unsigned int nSize{0};
66 
77  unsigned int nChainTx{0};
78 
79 private:
83  uint64_t nChainSize{0};
84 
85 public:
88 
90  int32_t nVersion{0};
92  uint32_t nTime{0};
93  uint32_t nBits{0};
94  uint32_t nNonce{0};
95 
98  int32_t nSequenceId{0};
99 
101  uint64_t nTimeReceived{0};
102 
104  unsigned int nTimeMax{0};
105 
106  explicit CBlockIndex() = default;
107 
108  explicit CBlockIndex(const CBlockHeader &block)
110  nTime{block.nTime}, nBits{block.nBits}, nNonce{block.nNonce},
111  nTimeReceived{0} {}
112 
115  FlatFilePos ret;
116  if (nStatus.hasData()) {
117  ret.nFile = nFile;
118  ret.nPos = nDataPos;
119  }
120  return ret;
121  }
122 
125  FlatFilePos ret;
126  if (nStatus.hasUndo()) {
127  ret.nFile = nFile;
128  ret.nPos = nUndoPos;
129  }
130  return ret;
131  }
132 
134  CBlockHeader block;
135  block.nVersion = nVersion;
136  if (pprev) {
137  block.hashPrevBlock = pprev->GetBlockHash();
138  }
140  block.nTime = nTime;
141  block.nBits = nBits;
142  block.nNonce = nNonce;
143  return block;
144  }
145 
147  assert(phashBlock != nullptr);
148  return *phashBlock;
149  }
150 
154  int64_t GetChainTxCount() const { return nChainTx; }
155 
159  uint64_t GetChainSize() const { return nChainSize; }
160 
164  bool UpdateChainStats();
165 
174  bool HaveTxsDownloaded() const { return GetChainTxCount() != 0; }
175 
176  NodeSeconds Time() const {
177  return NodeSeconds{std::chrono::seconds{nTime}};
178  }
179 
180  int64_t GetBlockTime() const { return int64_t(nTime); }
181 
182  int64_t GetBlockTimeMax() const { return int64_t(nTimeMax); }
183 
184  int64_t GetHeaderReceivedTime() const { return nTimeReceived; }
185 
186  int64_t GetReceivedTimeDiff() const {
187  return GetHeaderReceivedTime() - GetBlockTime();
188  }
189 
190  static constexpr int nMedianTimeSpan = 11;
191 
192  int64_t GetMedianTimePast() const {
193  int64_t pmedian[nMedianTimeSpan];
194  int64_t *pbegin = &pmedian[nMedianTimeSpan];
195  int64_t *pend = &pmedian[nMedianTimeSpan];
196 
197  const CBlockIndex *pindex = this;
198  for (int i = 0; i < nMedianTimeSpan && pindex;
199  i++, pindex = pindex->pprev) {
200  *(--pbegin) = pindex->GetBlockTime();
201  }
202 
203  std::sort(pbegin, pend);
204  return pbegin[(pend - pbegin) / 2];
205  }
206 
207  std::string ToString() const;
208 
214  return nStatus.isValid(nUpTo);
215  }
216 
221  return nStatus.isAssumedValid();
222  }
223 
226  bool RaiseValidity(enum BlockValidity nUpTo)
229  // Only validity flags allowed.
230  if (nStatus.isInvalid()) {
231  return false;
232  }
233 
234  if (nStatus.getValidity() >= nUpTo) {
235  return false;
236  }
237 
238  // If this block had been marked assumed-valid and we're raising
239  // its validity to a certain point, there is no longer an assumption.
240  if (IsAssumedValid() && nUpTo >= BlockValidity::SCRIPTS) {
241  nStatus = nStatus.withClearedAssumedValidFlags();
242  }
243 
244  nStatus = nStatus.withValidity(nUpTo);
245  return true;
246  }
247 
249  void BuildSkip();
250 
252  CBlockIndex *GetAncestor(int height);
253  const CBlockIndex *GetAncestor(int height) const;
254 };
255 
256 #endif // BITCOIN_BLOCKINDEX_H
BlockValidity
Definition: blockvalidity.h:10
@ TRANSACTIONS
Only first tx is coinbase, 2 <= coinbase input script length <= 100, transactions valid,...
@ SCRIPTS
Scripts & signatures ok.
Nodes collect new transactions into a block, hash them into a hash tree, and scan through nonce value...
Definition: block.h:23
uint32_t nNonce
Definition: block.h:31
uint32_t nBits
Definition: block.h:30
uint32_t nTime
Definition: block.h:29
BlockHash hashPrevBlock
Definition: block.h:27
int32_t nVersion
Definition: block.h:26
uint256 hashMerkleRoot
Definition: block.h:28
The block chain is a tree shaped structure starting with the genesis block at the root,...
Definition: blockindex.h:25
bool IsValid(enum BlockValidity nUpTo=BlockValidity::TRANSACTIONS) const EXCLUSIVE_LOCKS_REQUIRED(
Check whether this block index entry is valid up to the passed validity level.
Definition: blockindex.h:211
uint256 hashMerkleRoot
Definition: blockindex.h:91
uint64_t nTimeReceived
(memory only) block header metadata
Definition: blockindex.h:101
std::string ToString() const
Definition: blockindex.cpp:28
CBlockIndex * pprev
pointer to the index of the predecessor of this block
Definition: blockindex.h:32
bool IsAssumedValid() const EXCLUSIVE_LOCKS_REQUIRED(
Definition: blockindex.h:219
void BuildSkip()
Build the skiplist pointer for this entry.
Definition: blockindex.cpp:83
int64_t GetHeaderReceivedTime() const
Definition: blockindex.h:184
CBlockHeader GetBlockHeader() const
Definition: blockindex.h:133
uint64_t nChainSize
(memory only) Size of all blocks in the chain up to and including this block.
Definition: blockindex.h:83
arith_uint256 nChainWork
(memory only) Total amount of work (expected number of hashes) in the chain up to and including this ...
Definition: blockindex.h:51
const BlockHash * phashBlock
pointer to the hash of the block, if any.
Definition: blockindex.h:29
CBlockIndex()=default
bool HaveTxsDownloaded() const
Check whether this block's and all previous blocks' transactions have been downloaded (and stored to ...
Definition: blockindex.h:174
unsigned int nDataPos GUARDED_BY(::cs_main)
Byte offset within blk?????.dat where this block's data is stored.
Definition: blockindex.h:44
unsigned int nUndoPos GUARDED_BY(::cs_main)
Byte offset within rev?????.dat where this block's undo data is stored.
Definition: blockindex.h:47
BlockStatus nStatus GUARDED_BY(::cs_main)
Verification status of this block. See enum BlockStatus.
Definition: blockindex.h:87
int64_t GetChainTxCount() const
Get the number of transaction in the chain so far.
Definition: blockindex.h:154
uint32_t nTime
Definition: blockindex.h:92
unsigned int nTimeMax
(memory only) Maximum nTime in the chain up to and including this block.
Definition: blockindex.h:104
int32_t nSequenceId
(memory only) Sequential id assigned to distinguish order in which blocks are received.
Definition: blockindex.h:98
uint64_t GetChainSize() const
Get the size of all the blocks in the chain so far.
Definition: blockindex.h:159
uint32_t nNonce
Definition: blockindex.h:94
int64_t GetReceivedTimeDiff() const
Definition: blockindex.h:186
int64_t GetBlockTime() const
Definition: blockindex.h:180
int64_t GetMedianTimePast() const
Definition: blockindex.h:192
FlatFilePos GetUndoPos() const EXCLUSIVE_LOCKS_REQUIRED(
Definition: blockindex.h:123
uint32_t nBits
Definition: blockindex.h:93
bool UpdateChainStats()
Update chain tx stats.
Definition: blockindex.cpp:34
CBlockIndex * pskip
pointer to the index of some further predecessor of this block
Definition: blockindex.h:35
int64_t GetBlockTimeMax() const
Definition: blockindex.h:182
unsigned int nTx
Number of transactions in this block.
Definition: blockindex.h:60
CBlockIndex(const CBlockHeader &block)
Definition: blockindex.h:108
bool RaiseValidity(enum BlockValidity nUpTo) EXCLUSIVE_LOCKS_REQUIRED(
Raise the validity level of this block index entry.
Definition: blockindex.h:226
NodeSeconds Time() const
Definition: blockindex.h:176
int32_t nVersion
block header
Definition: blockindex.h:90
CBlockIndex * GetAncestor(int height)
Efficiently find an ancestor of this block.
Definition: blockindex.cpp:78
BlockHash GetBlockHash() const
Definition: blockindex.h:146
unsigned int nSize
Size of this block.
Definition: blockindex.h:65
int nHeight
height of the entry in the chain. The genesis block has height 0
Definition: blockindex.h:38
FlatFilePos GetBlockPos() const EXCLUSIVE_LOCKS_REQUIRED(
Definition: blockindex.h:113
unsigned int nChainTx
(memory only) Number of transactions in the chain up to and including this block.
Definition: blockindex.h:77
int nFile GUARDED_BY(::cs_main)
Which # file this block is stored in (blk?????.dat)
Definition: blockindex.h:41
static constexpr int nMedianTimeSpan
Definition: blockindex.h:190
256-bit unsigned big integer.
256-bit opaque blob.
Definition: uint256.h:129
RecursiveMutex cs_main
Mutex to guard access to validation specific variables, such as reading or changing the chainstate.
Definition: cs_main.cpp:7
A BlockHash is a unqiue identifier for a block.
Definition: blockhash.h:13
int nFile
Definition: flatfile.h:15
unsigned int nPos
Definition: flatfile.h:16
#define EXCLUSIVE_LOCKS_REQUIRED(...)
Definition: threadsafety.h:56
std::chrono::time_point< NodeClock, std::chrono::seconds > NodeSeconds
Definition: time.h:25
AssertLockHeld(pool.cs)
assert(!tx.IsCoinBase())