Bitcoin Core 30.99.0
P2P Digital Currency
chain.h
Go to the documentation of this file.
1// Copyright (c) 2009-2010 Satoshi Nakamoto
2// Copyright (c) 2009-2022 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 <kernel/cs_main.h>
13#include <primitives/block.h>
14#include <serialize.h>
15#include <sync.h>
16#include <uint256.h>
17#include <util/time.h>
18
19#include <algorithm>
20#include <cassert>
21#include <cstdint>
22#include <string>
23#include <vector>
24
29static constexpr int64_t MAX_FUTURE_BLOCK_TIME = 2 * 60 * 60;
30
37static constexpr int64_t TIMESTAMP_WINDOW = MAX_FUTURE_BLOCK_TIME;
39static constexpr int32_t SEQ_ID_BEST_CHAIN_FROM_DISK = 0;
40static constexpr int32_t SEQ_ID_INIT_FROM_DISK = 1;
41
48static constexpr int64_t MAX_BLOCK_TIME_GAP = 90 * 60;
49
51{
52public:
53 unsigned int nBlocks{};
54 unsigned int nSize{};
55 unsigned int nUndoSize{};
56 unsigned int nHeightFirst{};
57 unsigned int nHeightLast{};
58 uint64_t nTimeFirst{};
59 uint64_t nTimeLast{};
60
62 {
63 READWRITE(VARINT(obj.nBlocks));
64 READWRITE(VARINT(obj.nSize));
65 READWRITE(VARINT(obj.nUndoSize));
66 READWRITE(VARINT(obj.nHeightFirst));
67 READWRITE(VARINT(obj.nHeightLast));
68 READWRITE(VARINT(obj.nTimeFirst));
69 READWRITE(VARINT(obj.nTimeLast));
70 }
71
72 CBlockFileInfo() = default;
73
74 std::string ToString() const;
75
77 void AddBlock(unsigned int nHeightIn, uint64_t nTimeIn)
78 {
79 if (nBlocks == 0 || nHeightFirst > nHeightIn)
80 nHeightFirst = nHeightIn;
81 if (nBlocks == 0 || nTimeFirst > nTimeIn)
82 nTimeFirst = nTimeIn;
83 nBlocks++;
84 if (nHeightIn > nHeightLast)
85 nHeightLast = nHeightIn;
86 if (nTimeIn > nTimeLast)
87 nTimeLast = nTimeIn;
88 }
89};
90
91enum BlockStatus : uint32_t {
94
97
101
111
115
119
123
127
131
133
136};
137
144{
145public:
147 const uint256* phashBlock{nullptr};
148
151
154
156 int nHeight{0};
157
159 int nFile GUARDED_BY(::cs_main){0};
160
162 unsigned int nDataPos GUARDED_BY(::cs_main){0};
163
165 unsigned int nUndoPos GUARDED_BY(::cs_main){0};
166
169
173 unsigned int nTx{0};
174
179 uint64_t m_chain_tx_count{0};
180
187 uint32_t nStatus GUARDED_BY(::cs_main){0};
188
190 int32_t nVersion{0};
192 uint32_t nTime{0};
193 uint32_t nBits{0};
194 uint32_t nNonce{0};
195
200
202 unsigned int nTimeMax{0};
203
204 explicit CBlockIndex(const CBlockHeader& block)
205 : nVersion{block.nVersion},
207 nTime{block.nTime},
208 nBits{block.nBits},
209 nNonce{block.nNonce}
210 {
211 }
212
214 {
217 if (nStatus & BLOCK_HAVE_DATA) {
218 ret.nFile = nFile;
219 ret.nPos = nDataPos;
220 }
221 return ret;
222 }
223
225 {
228 if (nStatus & BLOCK_HAVE_UNDO) {
229 ret.nFile = nFile;
230 ret.nPos = nUndoPos;
231 }
232 return ret;
233 }
234
236 {
237 CBlockHeader block;
238 block.nVersion = nVersion;
239 if (pprev)
242 block.nTime = nTime;
243 block.nBits = nBits;
244 block.nNonce = nNonce;
245 return block;
246 }
247
249 {
250 assert(phashBlock != nullptr);
251 return *phashBlock;
252 }
253
264 bool HaveNumChainTxs() const { return m_chain_tx_count != 0; }
265
267 {
268 return NodeSeconds{std::chrono::seconds{nTime}};
269 }
270
271 int64_t GetBlockTime() const
272 {
273 return (int64_t)nTime;
274 }
275
276 int64_t GetBlockTimeMax() const
277 {
278 return (int64_t)nTimeMax;
279 }
280
281 static constexpr int nMedianTimeSpan = 11;
282
283 int64_t GetMedianTimePast() const
284 {
285 int64_t pmedian[nMedianTimeSpan];
286 int64_t* pbegin = &pmedian[nMedianTimeSpan];
287 int64_t* pend = &pmedian[nMedianTimeSpan];
288
289 const CBlockIndex* pindex = this;
290 for (int i = 0; i < nMedianTimeSpan && pindex; i++, pindex = pindex->pprev)
291 *(--pbegin) = pindex->GetBlockTime();
292
293 std::sort(pbegin, pend);
294 return pbegin[(pend - pbegin) / 2];
295 }
296
297 std::string ToString() const;
298
300 bool IsValid(enum BlockStatus nUpTo) const
302 {
304 assert(!(nUpTo & ~BLOCK_VALID_MASK)); // Only validity flags allowed.
305 if (nStatus & BLOCK_FAILED_MASK)
306 return false;
307 return ((nStatus & BLOCK_VALID_MASK) >= nUpTo);
308 }
309
313 {
315 assert(!(nUpTo & ~BLOCK_VALID_MASK)); // Only validity flags allowed.
316 if (nStatus & BLOCK_FAILED_MASK) return false;
317
318 if ((nStatus & BLOCK_VALID_MASK) < nUpTo) {
319 nStatus = (nStatus & ~BLOCK_VALID_MASK) | nUpTo;
320 return true;
321 }
322 return false;
323 }
324
326 void BuildSkip();
327
329 CBlockIndex* GetAncestor(int height);
330 const CBlockIndex* GetAncestor(int height) const;
331
332 CBlockIndex() = default;
333 ~CBlockIndex() = default;
334
335protected:
345 CBlockIndex(const CBlockIndex&) = default;
349};
350
353int64_t GetBlockProofEquivalentTime(const CBlockIndex& to, const CBlockIndex& from, const CBlockIndex& tip, const Consensus::Params&);
355const CBlockIndex* LastCommonAncestor(const CBlockIndex* pa, const CBlockIndex* pb);
356
357
360{
367 static constexpr int DUMMY_VERSION = 259900;
368
369public:
371
373 {
374 hashPrev = uint256();
375 }
376
377 explicit CDiskBlockIndex(const CBlockIndex* pindex) : CBlockIndex(*pindex)
378 {
380 }
381
383 {
385 int _nVersion = DUMMY_VERSION;
387
389 READWRITE(VARINT(obj.nStatus));
390 READWRITE(VARINT(obj.nTx));
392 if (obj.nStatus & BLOCK_HAVE_DATA) READWRITE(VARINT(obj.nDataPos));
393 if (obj.nStatus & BLOCK_HAVE_UNDO) READWRITE(VARINT(obj.nUndoPos));
394
395 // block header
396 READWRITE(obj.nVersion);
397 READWRITE(obj.hashPrev);
398 READWRITE(obj.hashMerkleRoot);
399 READWRITE(obj.nTime);
400 READWRITE(obj.nBits);
401 READWRITE(obj.nNonce);
402 }
403
405 {
406 CBlockHeader block;
407 block.nVersion = nVersion;
408 block.hashPrevBlock = hashPrev;
410 block.nTime = nTime;
411 block.nBits = nBits;
412 block.nNonce = nNonce;
413 return block.GetHash();
414 }
415
417 std::string ToString() = delete;
418};
419
422{
423private:
424 std::vector<CBlockIndex*> vChain;
425
426public:
427 CChain() = default;
428 CChain(const CChain&) = delete;
429 CChain& operator=(const CChain&) = delete;
430
433 {
434 return vChain.size() > 0 ? vChain[0] : nullptr;
435 }
436
439 {
440 return vChain.size() > 0 ? vChain[vChain.size() - 1] : nullptr;
441 }
442
445 {
446 if (nHeight < 0 || nHeight >= (int)vChain.size())
447 return nullptr;
448 return vChain[nHeight];
449 }
450
452 bool Contains(const CBlockIndex* pindex) const
453 {
454 return (*this)[pindex->nHeight] == pindex;
455 }
456
458 CBlockIndex* Next(const CBlockIndex* pindex) const
459 {
460 if (Contains(pindex))
461 return (*this)[pindex->nHeight + 1];
462 else
463 return nullptr;
464 }
465
467 int Height() const
468 {
469 return int(vChain.size()) - 1;
470 }
471
473 void SetTip(CBlockIndex& block);
474
476 const CBlockIndex* FindFork(const CBlockIndex* pindex) const;
477
479 CBlockIndex* FindEarliestAtLeast(int64_t nTime, int height) const;
480};
481
484
486std::vector<uint256> LocatorEntries(const CBlockIndex* index);
487
488#endif // BITCOIN_CHAIN_H
int ret
BlockStatus
Definition: chain.h:91
@ BLOCK_VALID_CHAIN
Outputs do not overspend inputs, no double spends, coinbase output ok, no immature coinbase spends,...
Definition: chain.h:114
@ BLOCK_VALID_MASK
All validity bits.
Definition: chain.h:121
@ BLOCK_VALID_TRANSACTIONS
Only first tx is coinbase, 2 <= coinbase input script length <= 100, transactions valid,...
Definition: chain.h:110
@ BLOCK_VALID_SCRIPTS
Scripts & signatures ok.
Definition: chain.h:118
@ BLOCK_VALID_RESERVED
Reserved (was BLOCK_VALID_HEADER).
Definition: chain.h:96
@ BLOCK_STATUS_RESERVED
Unused flag that was previously set on assumeutxo snapshot blocks and their ancestors before they wer...
Definition: chain.h:134
@ BLOCK_VALID_TREE
All parent headers found, difficulty matches, timestamp >= median previous.
Definition: chain.h:100
@ BLOCK_HAVE_UNDO
undo data available in rev*.dat
Definition: chain.h:125
@ BLOCK_HAVE_DATA
full block available in blk*.dat
Definition: chain.h:124
@ BLOCK_FAILED_CHILD
descends from failed block
Definition: chain.h:129
@ BLOCK_FAILED_MASK
Definition: chain.h:130
@ BLOCK_FAILED_VALID
stage after last reached validness failed
Definition: chain.h:128
@ BLOCK_OPT_WITNESS
block data in blk*.dat was received with a witness-enforcing client
Definition: chain.h:132
@ BLOCK_HAVE_MASK
Definition: chain.h:126
@ BLOCK_VALID_UNKNOWN
Unused.
Definition: chain.h:93
static constexpr int32_t SEQ_ID_BEST_CHAIN_FROM_DISK
Init values for CBlockIndex nSequenceId when loaded from disk.
Definition: chain.h:39
arith_uint256 GetBlockProof(const CBlockIndex &block)
Definition: chain.cpp:127
std::vector< uint256 > LocatorEntries(const CBlockIndex *index)
Construct a list of hash entries to put in a locator.
Definition: chain.cpp:32
static constexpr int32_t SEQ_ID_INIT_FROM_DISK
Definition: chain.h:40
CBlockLocator GetLocator(const CBlockIndex *index)
Get a locator for a block index entry.
Definition: chain.cpp:51
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:142
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:48
static constexpr int64_t MAX_FUTURE_BLOCK_TIME
Maximum amount of time that a block timestamp is allowed to exceed the current time before the block ...
Definition: chain.h:29
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:37
const CBlockIndex * LastCommonAncestor(const CBlockIndex *pa, const CBlockIndex *pb)
Find the forking point between two chain tips.
Definition: chain.cpp:161
uint64_t nTimeFirst
earliest time of block in file
Definition: chain.h:58
uint64_t nTimeLast
latest time of block in file
Definition: chain.h:59
std::string ToString() const
Definition: chain.cpp:11
void AddBlock(unsigned int nHeightIn, uint64_t nTimeIn)
update statistics (does not update nSize)
Definition: chain.h:77
unsigned int nHeightFirst
lowest height of block in file
Definition: chain.h:56
CBlockFileInfo()=default
unsigned int nHeightLast
highest height of block in file
Definition: chain.h:57
unsigned int nUndoSize
number of used bytes in the undo file
Definition: chain.h:55
unsigned int nBlocks
number of blocks stored in file
Definition: chain.h:53
SERIALIZE_METHODS(CBlockFileInfo, obj)
Definition: chain.h:61
unsigned int nSize
number of used bytes of block file
Definition: chain.h:54
Nodes collect new transactions into a block, hash them into a hash tree, and scan through nonce value...
Definition: block.h:22
uint32_t nNonce
Definition: block.h:30
uint32_t nBits
Definition: block.h:29
uint32_t nTime
Definition: block.h:28
int32_t nVersion
Definition: block.h:25
uint256 hashPrevBlock
Definition: block.h:26
uint256 hashMerkleRoot
Definition: block.h:27
uint256 GetHash() const
Definition: block.cpp:11
The block chain is a tree shaped structure starting with the genesis block at the root,...
Definition: chain.h:144
uint256 hashMerkleRoot
Definition: chain.h:191
bool IsValid(enum BlockStatus nUpTo) const EXCLUSIVE_LOCKS_REQUIRED(
Check whether this block index entry is valid up to the passed validity level.
Definition: chain.h:300
uint32_t nStatus GUARDED_BY(::cs_main)
Verification status of this block.
Definition: chain.h:187
std::string ToString() const
Definition: chain.cpp:16
CBlockIndex * pprev
pointer to the index of the predecessor of this block
Definition: chain.h:150
uint64_t m_chain_tx_count
(memory only) Number of transactions in the chain up to and including this block.
Definition: chain.h:179
void BuildSkip()
Build the skiplist pointer for this entry.
Definition: chain.cpp:121
CBlockHeader GetBlockHeader() const
Definition: chain.h:235
arith_uint256 nChainWork
(memory only) Total amount of work (expected number of hashes) in the chain up to and including this ...
Definition: chain.h:168
CBlockIndex()=default
CBlockIndex & operator=(const CBlockIndex &)=delete
unsigned int nDataPos GUARDED_BY(::cs_main)
Byte offset within blk?????.dat where this block's data is stored.
Definition: chain.h:162
unsigned int nUndoPos GUARDED_BY(::cs_main)
Byte offset within rev?????.dat where this block's undo data is stored.
Definition: chain.h:165
CBlockIndex & operator=(CBlockIndex &&)=delete
bool HaveNumChainTxs() const
Check whether this block and all previous blocks back to the genesis block or an assumeutxo snapshot ...
Definition: chain.h:264
uint32_t nTime
Definition: chain.h:192
unsigned int nTimeMax
(memory only) Maximum nTime in the chain up to and including this block.
Definition: chain.h:202
int32_t nSequenceId
(memory only) Sequential id assigned to distinguish order in which blocks are received.
Definition: chain.h:199
uint32_t nNonce
Definition: chain.h:194
uint256 GetBlockHash() const
Definition: chain.h:248
~CBlockIndex()=default
int64_t GetBlockTime() const
Definition: chain.h:271
int64_t GetMedianTimePast() const
Definition: chain.h:283
FlatFilePos GetUndoPos() const EXCLUSIVE_LOCKS_REQUIRED(
Definition: chain.h:224
uint32_t nBits
Definition: chain.h:193
bool RaiseValidity(enum BlockStatus nUpTo) EXCLUSIVE_LOCKS_REQUIRED(
Raise the validity level of this block index entry.
Definition: chain.h:312
CBlockIndex * pskip
pointer to the index of some further predecessor of this block
Definition: chain.h:153
int64_t GetBlockTimeMax() const
Definition: chain.h:276
CBlockIndex(CBlockIndex &&)=delete
unsigned int nTx
Number of transactions in this block.
Definition: chain.h:173
CBlockIndex(const CBlockHeader &block)
Definition: chain.h:204
NodeSeconds Time() const
Definition: chain.h:266
int32_t nVersion
block header
Definition: chain.h:190
CBlockIndex(const CBlockIndex &)=default
CBlockIndex should not allow public copy construction because equality comparison via pointer is very...
CBlockIndex * GetAncestor(int height)
Efficiently find an ancestor of this block.
Definition: chain.cpp:116
int nHeight
height of the entry in the chain. The genesis block has height 0
Definition: chain.h:156
FlatFilePos GetBlockPos() const EXCLUSIVE_LOCKS_REQUIRED(
Definition: chain.h:213
int nFile GUARDED_BY(::cs_main)
Which # file this block is stored in (blk?????.dat)
Definition: chain.h:159
static constexpr int nMedianTimeSpan
Definition: chain.h:281
const uint256 * phashBlock
pointer to the hash of the block, if any. Memory is owned by this CBlockIndex
Definition: chain.h:147
An in-memory indexed chain of blocks.
Definition: chain.h:422
CBlockIndex * Tip() const
Returns the index entry for the tip of this chain, or nullptr if none.
Definition: chain.h:438
CChain(const CChain &)=delete
CChain & operator=(const CChain &)=delete
void SetTip(CBlockIndex &block)
Set/initialize a chain with a given tip.
Definition: chain.cpp:22
CBlockIndex * Genesis() const
Returns the index entry for the genesis block of this chain, or nullptr if none.
Definition: chain.h:432
CChain()=default
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:444
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:458
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:67
int Height() const
Return the maximal height in the chain.
Definition: chain.h:467
const CBlockIndex * FindFork(const CBlockIndex *pindex) const
Find the last common block between this chain and a block index entry.
Definition: chain.cpp:56
std::vector< CBlockIndex * > vChain
Definition: chain.h:424
bool Contains(const CBlockIndex *pindex) const
Efficiently check whether a block is present in this chain.
Definition: chain.h:452
Used to marshal pointers into hashes for db storage.
Definition: chain.h:360
std::string ToString()=delete
static constexpr int DUMMY_VERSION
Historically CBlockLocator's version field has been written to disk streams as the client version,...
Definition: chain.h:367
uint256 hashPrev
Definition: chain.h:370
uint256 GetBlockHash()=delete
uint256 ConstructBlockHash() const
Definition: chain.h:404
SERIALIZE_METHODS(CDiskBlockIndex, obj)
Definition: chain.h:382
CDiskBlockIndex()
Definition: chain.h:372
CDiskBlockIndex(const CBlockIndex *pindex)
Definition: chain.h:377
256-bit unsigned big integer.
256-bit opaque blob.
Definition: uint256.h:196
RecursiveMutex cs_main
Mutex to guard access to validation specific variables, such as reading or changing the chainstate.
Definition: cs_main.cpp:8
unsigned int nHeight
#define VARINT(obj)
Definition: serialize.h:491
#define VARINT_MODE(obj, mode)
Definition: serialize.h:490
@ NONNEGATIVE_SIGNED
#define READWRITE(...)
Definition: serialize.h:145
Describes a place in the block chain to another node such that if the other node doesn't have the sam...
Definition: block.h:124
Parameters that influence chain consensus.
Definition: params.h:84
#define LOCK(cs)
Definition: sync.h:259
#define EXCLUSIVE_LOCKS_REQUIRED(...)
Definition: threadsafety.h:51
std::chrono::time_point< NodeClock, std::chrono::seconds > NodeSeconds
Definition: time.h:25
AssertLockHeld(pool.cs)
assert(!tx.IsCoinBase())