Bitcoin Core 28.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;
38
45static constexpr int64_t MAX_BLOCK_TIME_GAP = 90 * 60;
46
48{
49public:
50 unsigned int nBlocks{};
51 unsigned int nSize{};
52 unsigned int nUndoSize{};
53 unsigned int nHeightFirst{};
54 unsigned int nHeightLast{};
55 uint64_t nTimeFirst{};
56 uint64_t nTimeLast{};
57
59 {
60 READWRITE(VARINT(obj.nBlocks));
61 READWRITE(VARINT(obj.nSize));
62 READWRITE(VARINT(obj.nUndoSize));
63 READWRITE(VARINT(obj.nHeightFirst));
64 READWRITE(VARINT(obj.nHeightLast));
65 READWRITE(VARINT(obj.nTimeFirst));
66 READWRITE(VARINT(obj.nTimeLast));
67 }
68
69 CBlockFileInfo() = default;
70
71 std::string ToString() const;
72
74 void AddBlock(unsigned int nHeightIn, uint64_t nTimeIn)
75 {
76 if (nBlocks == 0 || nHeightFirst > nHeightIn)
77 nHeightFirst = nHeightIn;
78 if (nBlocks == 0 || nTimeFirst > nTimeIn)
79 nTimeFirst = nTimeIn;
80 nBlocks++;
81 if (nHeightIn > nHeightLast)
82 nHeightLast = nHeightIn;
83 if (nTimeIn > nTimeLast)
84 nTimeLast = nTimeIn;
85 }
86};
87
88enum BlockStatus : uint32_t {
91
94
98
108
112
116
120
124
128
130
133};
134
141{
142public:
144 const uint256* phashBlock{nullptr};
145
148
151
153 int nHeight{0};
154
156 int nFile GUARDED_BY(::cs_main){0};
157
159 unsigned int nDataPos GUARDED_BY(::cs_main){0};
160
162 unsigned int nUndoPos GUARDED_BY(::cs_main){0};
163
166
170 unsigned int nTx{0};
171
176 uint64_t m_chain_tx_count{0};
177
184 uint32_t nStatus GUARDED_BY(::cs_main){0};
185
187 int32_t nVersion{0};
189 uint32_t nTime{0};
190 uint32_t nBits{0};
191 uint32_t nNonce{0};
192
194 int32_t nSequenceId{0};
195
197 unsigned int nTimeMax{0};
198
199 explicit CBlockIndex(const CBlockHeader& block)
200 : nVersion{block.nVersion},
202 nTime{block.nTime},
203 nBits{block.nBits},
204 nNonce{block.nNonce}
205 {
206 }
207
209 {
212 if (nStatus & BLOCK_HAVE_DATA) {
213 ret.nFile = nFile;
214 ret.nPos = nDataPos;
215 }
216 return ret;
217 }
218
220 {
223 if (nStatus & BLOCK_HAVE_UNDO) {
224 ret.nFile = nFile;
225 ret.nPos = nUndoPos;
226 }
227 return ret;
228 }
229
231 {
232 CBlockHeader block;
233 block.nVersion = nVersion;
234 if (pprev)
237 block.nTime = nTime;
238 block.nBits = nBits;
239 block.nNonce = nNonce;
240 return block;
241 }
242
244 {
245 assert(phashBlock != nullptr);
246 return *phashBlock;
247 }
248
259 bool HaveNumChainTxs() const { return m_chain_tx_count != 0; }
260
262 {
263 return NodeSeconds{std::chrono::seconds{nTime}};
264 }
265
266 int64_t GetBlockTime() const
267 {
268 return (int64_t)nTime;
269 }
270
271 int64_t GetBlockTimeMax() const
272 {
273 return (int64_t)nTimeMax;
274 }
275
276 static constexpr int nMedianTimeSpan = 11;
277
278 int64_t GetMedianTimePast() const
279 {
280 int64_t pmedian[nMedianTimeSpan];
281 int64_t* pbegin = &pmedian[nMedianTimeSpan];
282 int64_t* pend = &pmedian[nMedianTimeSpan];
283
284 const CBlockIndex* pindex = this;
285 for (int i = 0; i < nMedianTimeSpan && pindex; i++, pindex = pindex->pprev)
286 *(--pbegin) = pindex->GetBlockTime();
287
288 std::sort(pbegin, pend);
289 return pbegin[(pend - pbegin) / 2];
290 }
291
292 std::string ToString() const;
293
297 {
299 assert(!(nUpTo & ~BLOCK_VALID_MASK)); // Only validity flags allowed.
300 if (nStatus & BLOCK_FAILED_MASK)
301 return false;
302 return ((nStatus & BLOCK_VALID_MASK) >= nUpTo);
303 }
304
308 {
310 assert(!(nUpTo & ~BLOCK_VALID_MASK)); // Only validity flags allowed.
311 if (nStatus & BLOCK_FAILED_MASK) return false;
312
313 if ((nStatus & BLOCK_VALID_MASK) < nUpTo) {
314 nStatus = (nStatus & ~BLOCK_VALID_MASK) | nUpTo;
315 return true;
316 }
317 return false;
318 }
319
321 void BuildSkip();
322
324 CBlockIndex* GetAncestor(int height);
325 const CBlockIndex* GetAncestor(int height) const;
326
327 CBlockIndex() = default;
328 ~CBlockIndex() = default;
329
330protected:
340 CBlockIndex(const CBlockIndex&) = default;
344};
345
348int64_t GetBlockProofEquivalentTime(const CBlockIndex& to, const CBlockIndex& from, const CBlockIndex& tip, const Consensus::Params&);
350const CBlockIndex* LastCommonAncestor(const CBlockIndex* pa, const CBlockIndex* pb);
351
352
355{
362 static constexpr int DUMMY_VERSION = 259900;
363
364public:
366
368 {
369 hashPrev = uint256();
370 }
371
372 explicit CDiskBlockIndex(const CBlockIndex* pindex) : CBlockIndex(*pindex)
373 {
375 }
376
378 {
380 int _nVersion = DUMMY_VERSION;
382
384 READWRITE(VARINT(obj.nStatus));
385 READWRITE(VARINT(obj.nTx));
387 if (obj.nStatus & BLOCK_HAVE_DATA) READWRITE(VARINT(obj.nDataPos));
388 if (obj.nStatus & BLOCK_HAVE_UNDO) READWRITE(VARINT(obj.nUndoPos));
389
390 // block header
391 READWRITE(obj.nVersion);
392 READWRITE(obj.hashPrev);
393 READWRITE(obj.hashMerkleRoot);
394 READWRITE(obj.nTime);
395 READWRITE(obj.nBits);
396 READWRITE(obj.nNonce);
397 }
398
400 {
401 CBlockHeader block;
402 block.nVersion = nVersion;
403 block.hashPrevBlock = hashPrev;
405 block.nTime = nTime;
406 block.nBits = nBits;
407 block.nNonce = nNonce;
408 return block.GetHash();
409 }
410
412 std::string ToString() = delete;
413};
414
417{
418private:
419 std::vector<CBlockIndex*> vChain;
420
421public:
422 CChain() = default;
423 CChain(const CChain&) = delete;
424 CChain& operator=(const CChain&) = delete;
425
428 {
429 return vChain.size() > 0 ? vChain[0] : nullptr;
430 }
431
434 {
435 return vChain.size() > 0 ? vChain[vChain.size() - 1] : nullptr;
436 }
437
440 {
441 if (nHeight < 0 || nHeight >= (int)vChain.size())
442 return nullptr;
443 return vChain[nHeight];
444 }
445
447 bool Contains(const CBlockIndex* pindex) const
448 {
449 return (*this)[pindex->nHeight] == pindex;
450 }
451
453 CBlockIndex* Next(const CBlockIndex* pindex) const
454 {
455 if (Contains(pindex))
456 return (*this)[pindex->nHeight + 1];
457 else
458 return nullptr;
459 }
460
462 int Height() const
463 {
464 return int(vChain.size()) - 1;
465 }
466
468 void SetTip(CBlockIndex& block);
469
472
474 const CBlockIndex* FindFork(const CBlockIndex* pindex) const;
475
477 CBlockIndex* FindEarliestAtLeast(int64_t nTime, int height) const;
478};
479
482
484std::vector<uint256> LocatorEntries(const CBlockIndex* index);
485
486#endif // BITCOIN_CHAIN_H
int ret
BlockStatus
Definition: chain.h:88
@ BLOCK_VALID_CHAIN
Outputs do not overspend inputs, no double spends, coinbase output ok, no immature coinbase spends,...
Definition: chain.h:111
@ BLOCK_VALID_MASK
All validity bits.
Definition: chain.h:118
@ BLOCK_VALID_TRANSACTIONS
Only first tx is coinbase, 2 <= coinbase input script length <= 100, transactions valid,...
Definition: chain.h:107
@ BLOCK_VALID_SCRIPTS
Scripts & signatures ok.
Definition: chain.h:115
@ BLOCK_VALID_RESERVED
Reserved (was BLOCK_VALID_HEADER).
Definition: chain.h:93
@ BLOCK_STATUS_RESERVED
Unused flag that was previously set on assumeutxo snapshot blocks and their ancestors before they wer...
Definition: chain.h:131
@ BLOCK_VALID_TREE
All parent headers found, difficulty matches, timestamp >= median previous, checkpoint.
Definition: chain.h:97
@ BLOCK_HAVE_UNDO
undo data available in rev*.dat
Definition: chain.h:122
@ BLOCK_HAVE_DATA
full block available in blk*.dat
Definition: chain.h:121
@ BLOCK_FAILED_CHILD
descends from failed block
Definition: chain.h:126
@ BLOCK_FAILED_MASK
Definition: chain.h:127
@ BLOCK_FAILED_VALID
stage after last reached validness failed
Definition: chain.h:125
@ BLOCK_OPT_WITNESS
block data in blk*.dat was received with a witness-enforcing client
Definition: chain.h:129
@ BLOCK_HAVE_MASK
Definition: chain.h:123
@ BLOCK_VALID_UNKNOWN
Unused.
Definition: chain.h:90
arith_uint256 GetBlockProof(const CBlockIndex &block)
Definition: chain.cpp:131
std::vector< uint256 > LocatorEntries(const CBlockIndex *index)
Construct a list of hash entries to put in a locator.
Definition: chain.cpp:31
CBlockLocator GetLocator(const CBlockIndex *index)
Get a locator for a block index entry.
Definition: chain.cpp:50
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:146
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:45
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:165
uint64_t nTimeFirst
earliest time of block in file
Definition: chain.h:55
uint64_t nTimeLast
latest time of block in file
Definition: chain.h:56
std::string ToString() const
Definition: chain.cpp:10
void AddBlock(unsigned int nHeightIn, uint64_t nTimeIn)
update statistics (does not update nSize)
Definition: chain.h:74
unsigned int nHeightFirst
lowest height of block in file
Definition: chain.h:53
CBlockFileInfo()=default
unsigned int nHeightLast
highest height of block in file
Definition: chain.h:54
unsigned int nUndoSize
number of used bytes in the undo file
Definition: chain.h:52
unsigned int nBlocks
number of blocks stored in file
Definition: chain.h:50
SERIALIZE_METHODS(CBlockFileInfo, obj)
Definition: chain.h:58
unsigned int nSize
number of used bytes of block file
Definition: chain.h:51
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:141
uint256 hashMerkleRoot
Definition: chain.h:188
uint32_t nStatus GUARDED_BY(::cs_main)
Verification status of this block.
Definition: chain.h:184
std::string ToString() const
Definition: chain.cpp:15
CBlockIndex * pprev
pointer to the index of the predecessor of this block
Definition: chain.h:147
uint64_t m_chain_tx_count
(memory only) Number of transactions in the chain up to and including this block.
Definition: chain.h:176
void BuildSkip()
Build the skiplist pointer for this entry.
Definition: chain.cpp:125
CBlockHeader GetBlockHeader() const
Definition: chain.h:230
arith_uint256 nChainWork
(memory only) Total amount of work (expected number of hashes) in the chain up to and including this ...
Definition: chain.h:165
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:159
unsigned int nUndoPos GUARDED_BY(::cs_main)
Byte offset within rev?????.dat where this block's undo data is stored.
Definition: chain.h:162
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:259
uint32_t nTime
Definition: chain.h:189
unsigned int nTimeMax
(memory only) Maximum nTime in the chain up to and including this block.
Definition: chain.h:197
int32_t nSequenceId
(memory only) Sequential id assigned to distinguish order in which blocks are received.
Definition: chain.h:194
uint32_t nNonce
Definition: chain.h:191
uint256 GetBlockHash() const
Definition: chain.h:243
~CBlockIndex()=default
int64_t GetBlockTime() const
Definition: chain.h:266
int64_t GetMedianTimePast() const
Definition: chain.h:278
FlatFilePos GetUndoPos() const EXCLUSIVE_LOCKS_REQUIRED(
Definition: chain.h:219
uint32_t nBits
Definition: chain.h:190
bool RaiseValidity(enum BlockStatus nUpTo) EXCLUSIVE_LOCKS_REQUIRED(
Raise the validity level of this block index entry.
Definition: chain.h:307
CBlockIndex * pskip
pointer to the index of some further predecessor of this block
Definition: chain.h:150
int64_t GetBlockTimeMax() const
Definition: chain.h:271
CBlockIndex(CBlockIndex &&)=delete
unsigned int nTx
Number of transactions in this block.
Definition: chain.h:170
CBlockIndex(const CBlockHeader &block)
Definition: chain.h:199
bool IsValid(enum BlockStatus nUpTo=BLOCK_VALID_TRANSACTIONS) const EXCLUSIVE_LOCKS_REQUIRED(
Check whether this block index entry is valid up to the passed validity level.
Definition: chain.h:295
NodeSeconds Time() const
Definition: chain.h:261
int32_t nVersion
block header
Definition: chain.h:187
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:120
int nHeight
height of the entry in the chain. The genesis block has height 0
Definition: chain.h:153
FlatFilePos GetBlockPos() const EXCLUSIVE_LOCKS_REQUIRED(
Definition: chain.h:208
int nFile GUARDED_BY(::cs_main)
Which # file this block is stored in (blk?????.dat)
Definition: chain.h:156
static constexpr int nMedianTimeSpan
Definition: chain.h:276
const uint256 * phashBlock
pointer to the hash of the block, if any. Memory is owned by this CBlockIndex
Definition: chain.h:144
An in-memory indexed chain of blocks.
Definition: chain.h:417
CBlockIndex * Tip() const
Returns the index entry for the tip of this chain, or nullptr if none.
Definition: chain.h:433
CChain(const CChain &)=delete
CChain & operator=(const CChain &)=delete
void SetTip(CBlockIndex &block)
Set/initialize a chain with a given tip.
Definition: chain.cpp:21
CBlockIndex * Genesis() const
Returns the index entry for the genesis block of this chain, or nullptr if none.
Definition: chain.h:427
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:439
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:453
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:71
int Height() const
Return the maximal height in the chain.
Definition: chain.h:462
const CBlockIndex * FindFork(const CBlockIndex *pindex) const
Find the last common block between this chain and a block index entry.
Definition: chain.cpp:60
std::vector< CBlockIndex * > vChain
Definition: chain.h:419
bool Contains(const CBlockIndex *pindex) const
Efficiently check whether a block is present in this chain.
Definition: chain.h:447
CBlockLocator GetLocator() const
Return a CBlockLocator that refers to the tip in of this chain.
Definition: chain.cpp:55
Used to marshal pointers into hashes for db storage.
Definition: chain.h:355
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:362
uint256 hashPrev
Definition: chain.h:365
uint256 GetBlockHash()=delete
uint256 ConstructBlockHash() const
Definition: chain.h:399
SERIALIZE_METHODS(CDiskBlockIndex, obj)
Definition: chain.h:377
CDiskBlockIndex()
Definition: chain.h:367
CDiskBlockIndex(const CBlockIndex *pindex)
Definition: chain.h:372
256-bit unsigned big integer.
256-bit opaque blob.
Definition: uint256.h:190
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:498
#define VARINT_MODE(obj, mode)
Definition: serialize.h:497
@ NONNEGATIVE_SIGNED
#define READWRITE(...)
Definition: serialize.h:156
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:74
#define LOCK(cs)
Definition: sync.h:257
#define EXCLUSIVE_LOCKS_REQUIRED(...)
Definition: threadsafety.h:49
std::chrono::time_point< NodeClock, std::chrono::seconds > NodeSeconds
Definition: time.h:25
AssertLockHeld(pool.cs)
assert(!tx.IsCoinBase())