Bitcoin ABC 0.33.12
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
55 unsigned int nTx{0};
56
60 unsigned int nSize{0};
61
67 uint64_t m_chain_tx_count{0};
68
71
73 int32_t nVersion{0};
75 uint32_t nTime{0};
76 uint32_t nBits{0};
77 uint32_t nNonce{0};
78
81 int32_t nSequenceId{0};
82
84 int64_t nTimeReceived{0};
85
87 unsigned int nTimeMax{0};
88
89 explicit CBlockIndex() = default;
90
91 explicit CBlockIndex(const CBlockHeader &block)
93 nTime{block.nTime}, nBits{block.nBits}, nNonce{block.nNonce},
94 nTimeReceived{0} {}
95
98 FlatFilePos ret;
99 if (nStatus.hasData()) {
100 ret.nFile = nFile;
101 ret.nPos = nDataPos;
102 }
103 return ret;
104 }
105
108 FlatFilePos ret;
109 if (nStatus.hasUndo()) {
110 ret.nFile = nFile;
111 ret.nPos = nUndoPos;
112 }
113 return ret;
114 }
115
117 CBlockHeader block;
118 block.nVersion = nVersion;
119 if (pprev) {
121 }
123 block.nTime = nTime;
124 block.nBits = nBits;
125 block.nNonce = nNonce;
126 return block;
127 }
128
130 assert(phashBlock != nullptr);
131 return *phashBlock;
132 }
133
137 uint64_t GetChainTxCount() const { return m_chain_tx_count; }
138
153 bool HaveNumChainTxs() const { return GetChainTxCount() != 0; }
154
156 return NodeSeconds{std::chrono::seconds{nTime}};
157 }
158
159 int64_t GetBlockTime() const { return int64_t(nTime); }
160
161 int64_t GetBlockTimeMax() const { return int64_t(nTimeMax); }
162
163 int64_t GetHeaderReceivedTime() const { return nTimeReceived; }
164
165 int64_t GetReceivedTimeDiff() const {
167 }
168
169 static constexpr int nMedianTimeSpan = 11;
170
171 int64_t GetMedianTimePast() const {
172 int64_t pmedian[nMedianTimeSpan];
173 int64_t *pbegin = &pmedian[nMedianTimeSpan];
174 int64_t *pend = &pmedian[nMedianTimeSpan];
175
176 const CBlockIndex *pindex = this;
177 for (int i = 0; i < nMedianTimeSpan && pindex;
178 i++, pindex = pindex->pprev) {
179 *(--pbegin) = pindex->GetBlockTime();
180 }
181
182 std::sort(pbegin, pend);
183 return pbegin[(pend - pbegin) / 2];
184 }
185
186 std::string ToString() const;
187
193 return nStatus.isValid(nUpTo);
194 }
195
201 // Only validity flags allowed.
202 if (nStatus.isInvalid()) {
203 return false;
204 }
205
206 if (nStatus.getValidity() >= nUpTo) {
207 return false;
208 }
209
210 nStatus = nStatus.withValidity(nUpTo);
211 return true;
212 }
213
215 void BuildSkip();
216
218 CBlockIndex *GetAncestor(int height);
219 const CBlockIndex *GetAncestor(int height) const;
220};
221
222#endif // BITCOIN_BLOCKINDEX_H
BlockValidity
Definition: blockvalidity.h:10
@ TRANSACTIONS
Only first tx is coinbase, 2 <= coinbase input script length <= 100, transactions valid,...
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:190
uint256 hashMerkleRoot
Definition: blockindex.h:74
std::string ToString() const
Definition: blockindex.cpp:30
CBlockIndex * pprev
pointer to the index of the predecessor of this block
Definition: blockindex.h:32
uint64_t m_chain_tx_count
(memory only) Number of transactions in the chain up to and including this block.
Definition: blockindex.h:67
void BuildSkip()
Build the skiplist pointer for this entry.
Definition: blockindex.cpp:67
int64_t GetHeaderReceivedTime() const
Definition: blockindex.h:163
CBlockHeader GetBlockHeader() const
Definition: blockindex.h:116
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
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:70
bool HaveNumChainTxs() const
Check whether this block and all previous blocks back to the genesis block or an assumeutxo snapshot ...
Definition: blockindex.h:153
uint32_t nTime
Definition: blockindex.h:75
unsigned int nTimeMax
(memory only) Maximum nTime in the chain up to and including this block.
Definition: blockindex.h:87
int32_t nSequenceId
(memory only) Sequential id assigned to distinguish order in which blocks are received.
Definition: blockindex.h:81
uint64_t GetChainTxCount() const
Get the number of transaction in the chain so far.
Definition: blockindex.h:137
uint32_t nNonce
Definition: blockindex.h:77
int64_t GetReceivedTimeDiff() const
Definition: blockindex.h:165
int64_t GetBlockTime() const
Definition: blockindex.h:159
int64_t GetMedianTimePast() const
Definition: blockindex.h:171
FlatFilePos GetUndoPos() const EXCLUSIVE_LOCKS_REQUIRED(
Definition: blockindex.h:106
uint32_t nBits
Definition: blockindex.h:76
CBlockIndex * pskip
pointer to the index of some further predecessor of this block
Definition: blockindex.h:35
int64_t GetBlockTimeMax() const
Definition: blockindex.h:161
unsigned int nTx
Number of transactions in this block.
Definition: blockindex.h:55
CBlockIndex(const CBlockHeader &block)
Definition: blockindex.h:91
bool RaiseValidity(enum BlockValidity nUpTo) EXCLUSIVE_LOCKS_REQUIRED(
Raise the validity level of this block index entry.
Definition: blockindex.h:198
NodeSeconds Time() const
Definition: blockindex.h:155
int32_t nVersion
block header
Definition: blockindex.h:73
int64_t nTimeReceived
(memory only) block header metadata
Definition: blockindex.h:84
CBlockIndex * GetAncestor(int height)
Efficiently find an ancestor of this block.
Definition: blockindex.cpp:62
BlockHash GetBlockHash() const
Definition: blockindex.h:129
unsigned int nSize
Size of this block.
Definition: blockindex.h:60
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:96
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:169
256-bit unsigned big integer.
256-bit opaque blob.
Definition: uint256.h:127
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:27
AssertLockHeld(pool.cs)
assert(!tx.IsCoinBase())