Bitcoin Core  22.99.0
P2P Digital Currency
chain.cpp
Go to the documentation of this file.
1 // Copyright (c) 2020-2021 The Bitcoin Core 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 #include <chain.h>
7 #include <test/fuzz/fuzz.h>
8 #include <test/fuzz/util.h>
9 
10 #include <cstdint>
11 #include <optional>
12 #include <vector>
13 
15 {
16  FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size());
17  std::optional<CDiskBlockIndex> disk_block_index = ConsumeDeserializable<CDiskBlockIndex>(fuzzed_data_provider);
18  if (!disk_block_index) {
19  return;
20  }
21 
22  const uint256 zero{};
23  disk_block_index->phashBlock = &zero;
24  {
25  LOCK(::cs_main);
26  (void)disk_block_index->GetBlockHash();
27  (void)disk_block_index->GetBlockPos();
28  (void)disk_block_index->GetBlockTime();
29  (void)disk_block_index->GetBlockTimeMax();
30  (void)disk_block_index->GetMedianTimePast();
31  (void)disk_block_index->GetUndoPos();
32  (void)disk_block_index->HaveTxsDownloaded();
33  (void)disk_block_index->IsValid();
34  (void)disk_block_index->ToString();
35  }
36 
37  const CBlockHeader block_header = disk_block_index->GetBlockHeader();
38  (void)CDiskBlockIndex{*disk_block_index};
39  (void)disk_block_index->BuildSkip();
40 
41  LIMITED_WHILE(fuzzed_data_provider.ConsumeBool(), 10000) {
42  const BlockStatus block_status = fuzzed_data_provider.PickValueInArray({
57  });
58  if (block_status & ~BLOCK_VALID_MASK) {
59  continue;
60  }
61  WITH_LOCK(::cs_main, (void)disk_block_index->RaiseValidity(block_status));
62  }
63 
64  CBlockIndex block_index{block_header};
65  block_index.phashBlock = &zero;
66  (void)block_index.GetBlockHash();
67  (void)block_index.ToString();
68 }
BLOCK_FAILED_MASK
@ BLOCK_FAILED_MASK
Definition: chain.h:133
BLOCK_VALID_UNKNOWN
@ BLOCK_VALID_UNKNOWN
Unused.
Definition: chain.h:100
CBlockHeader
Nodes collect new transactions into a block, hash them into a hash tree, and scan through nonce value...
Definition: block.h:20
FUZZ_TARGET
FUZZ_TARGET(chain)
Definition: chain.cpp:14
BLOCK_VALID_TREE
@ BLOCK_VALID_TREE
All parent headers found, difficulty matches, timestamp >= median previous, checkpoint.
Definition: chain.h:107
util.h
BLOCK_VALID_RESERVED
@ BLOCK_VALID_RESERVED
Reserved (was BLOCK_VALID_HEADER).
Definition: chain.h:103
FuzzedDataProvider::PickValueInArray
T PickValueInArray(const T(&array)[size])
Definition: FuzzedDataProvider.h:303
WITH_LOCK
#define WITH_LOCK(cs, code)
Run code while locking a mutex.
Definition: sync.h:270
CDiskBlockIndex
Used to marshal pointers into hashes for db storage.
Definition: chain.h:368
BLOCK_FAILED_VALID
@ BLOCK_FAILED_VALID
stage after last reached validness failed
Definition: chain.h:131
BLOCK_VALID_SCRIPTS
@ BLOCK_VALID_SCRIPTS
Scripts & signatures ok. Implies all parents are also at least SCRIPTS.
Definition: chain.h:121
BLOCK_VALID_TRANSACTIONS
@ BLOCK_VALID_TRANSACTIONS
Only first tx is coinbase, 2 <= coinbase input script length <= 100, transactions valid,...
Definition: chain.h:114
FuzzedDataProvider.h
uint256
256-bit opaque blob.
Definition: uint256.h:126
LIMITED_WHILE
#define LIMITED_WHILE(condition, limit)
Can be used to limit a theoretically unbounded loop.
Definition: fuzz.h:18
BLOCK_VALID_MASK
@ BLOCK_VALID_MASK
All validity bits.
Definition: chain.h:124
fuzz.h
LOCK
#define LOCK(cs)
Definition: sync.h:226
FuzzedDataProvider
Definition: FuzzedDataProvider.h:31
CBlockIndex::BuildSkip
void BuildSkip()
Build the skiplist pointer for this entry.
Definition: chain.cpp:119
BLOCK_HAVE_UNDO
@ BLOCK_HAVE_UNDO
undo data available in rev*.dat
Definition: chain.h:128
BlockStatus
BlockStatus
Definition: chain.h:98
BLOCK_VALID_CHAIN
@ BLOCK_VALID_CHAIN
Outputs do not overspend inputs, no double spends, coinbase output ok, no immature coinbase spends,...
Definition: chain.h:118
FuzzedDataProvider::ConsumeBool
bool ConsumeBool()
Definition: FuzzedDataProvider.h:288
BLOCK_OPT_WITNESS
@ BLOCK_OPT_WITNESS
block data in blk*.dat was received with a witness-enforcing client
Definition: chain.h:135
BLOCK_HAVE_DATA
@ BLOCK_HAVE_DATA
full block available in blk*.dat
Definition: chain.h:127
cs_main
RecursiveMutex cs_main
Mutex to guard access to validation specific variables, such as reading or changing the chainstate.
Definition: validation.cpp:138
CBlockIndex
The block chain is a tree shaped structure starting with the genesis block at the root,...
Definition: chain.h:151
BLOCK_HAVE_MASK
@ BLOCK_HAVE_MASK
Definition: chain.h:129
BLOCK_FAILED_CHILD
@ BLOCK_FAILED_CHILD
descends from failed block
Definition: chain.h:132