Bitcoin ABC 0.30.7
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
17struct BlockHash;
18
26public:
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
79private:
83 uint64_t nChainSize{0};
84
85public:
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 int64_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) {
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
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 {
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
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
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
int64_t nTimeReceived
(memory only) block header metadata
Definition: blockindex.h:101
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())