Bitcoin Core  26.1.0
P2P Digital Currency
block.cpp
Go to the documentation of this file.
1 // Copyright (c) 2019-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 <chainparams.h>
6 #include <consensus/merkle.h>
7 #include <consensus/validation.h>
8 #include <core_io.h>
9 #include <core_memusage.h>
10 #include <primitives/block.h>
11 #include <pubkey.h>
12 #include <streams.h>
13 #include <test/fuzz/fuzz.h>
14 #include <util/chaintype.h>
15 #include <validation.h>
16 #include <version.h>
17 
18 #include <cassert>
19 #include <string>
20 
22 {
24 }
25 
27 {
29  CBlock block;
30  try {
31  int nVersion;
32  ds >> nVersion;
33  ds.SetVersion(nVersion);
34  ds >> block;
35  } catch (const std::ios_base::failure&) {
36  return;
37  }
38  const Consensus::Params& consensus_params = Params().GetConsensus();
39  BlockValidationState validation_state_pow_and_merkle;
40  const bool valid_incl_pow_and_merkle = CheckBlock(block, validation_state_pow_and_merkle, consensus_params, /* fCheckPOW= */ true, /* fCheckMerkleRoot= */ true);
41  assert(validation_state_pow_and_merkle.IsValid() || validation_state_pow_and_merkle.IsInvalid() || validation_state_pow_and_merkle.IsError());
42  (void)validation_state_pow_and_merkle.Error("");
43  BlockValidationState validation_state_pow;
44  const bool valid_incl_pow = CheckBlock(block, validation_state_pow, consensus_params, /* fCheckPOW= */ true, /* fCheckMerkleRoot= */ false);
45  assert(validation_state_pow.IsValid() || validation_state_pow.IsInvalid() || validation_state_pow.IsError());
46  BlockValidationState validation_state_merkle;
47  const bool valid_incl_merkle = CheckBlock(block, validation_state_merkle, consensus_params, /* fCheckPOW= */ false, /* fCheckMerkleRoot= */ true);
48  assert(validation_state_merkle.IsValid() || validation_state_merkle.IsInvalid() || validation_state_merkle.IsError());
49  BlockValidationState validation_state_none;
50  const bool valid_incl_none = CheckBlock(block, validation_state_none, consensus_params, /* fCheckPOW= */ false, /* fCheckMerkleRoot= */ false);
51  assert(validation_state_none.IsValid() || validation_state_none.IsInvalid() || validation_state_none.IsError());
52  if (valid_incl_pow_and_merkle) {
53  assert(valid_incl_pow && valid_incl_merkle && valid_incl_none);
54  } else if (valid_incl_merkle || valid_incl_pow) {
55  assert(valid_incl_none);
56  }
57  (void)block.GetHash();
58  (void)block.ToString();
59  (void)BlockMerkleRoot(block);
60  if (!block.vtx.empty()) {
61  (void)BlockWitnessMerkleRoot(block);
62  }
63  (void)GetBlockWeight(block);
64  (void)GetWitnessCommitmentIndex(block);
65  const size_t raw_memory_size = RecursiveDynamicUsage(block);
66  const size_t raw_memory_size_as_shared_ptr = RecursiveDynamicUsage(std::make_shared<CBlock>(block));
67  assert(raw_memory_size_as_shared_ptr > raw_memory_size);
68  CBlock block_copy = block;
69  block_copy.SetNull();
70  const bool is_null = block_copy.IsNull();
71  assert(is_null);
72 }
bool Error(const std::string &reject_reason)
Definition: validation.h:114
assert(!tx.IsCoinBase())
Definition: block.h:68
std::string ToString() const
Definition: block.cpp:16
uint256 BlockWitnessMerkleRoot(const CBlock &block, bool *mutated)
Definition: merkle.cpp:75
bool IsValid() const
Definition: validation.h:121
FUZZ_TARGET(block,.init=initialize_block)
Definition: block.cpp:26
static const int INIT_PROTO_VERSION
initial proto version, to be increased after version/verack negotiation
Definition: version.h:15
uint256 BlockMerkleRoot(const CBlock &block, bool *mutated)
Definition: merkle.cpp:65
bool CheckBlock(const CBlock &block, BlockValidationState &state, const Consensus::Params &consensusParams, bool fCheckPOW, bool fCheckMerkleRoot)
Functions for validating blocks and updating the block tree.
Parameters that influence chain consensus.
Definition: params.h:74
uint256 GetHash() const
Definition: block.cpp:11
std::vector< CTransactionRef > vtx
Definition: block.h:72
void SetNull()
Definition: block.h:95
const CChainParams & Params()
Return the currently selected parameters.
bool IsNull() const
Definition: block.h:49
bool IsInvalid() const
Definition: validation.h:122
void initialize_block()
Definition: block.cpp:21
static size_t RecursiveDynamicUsage(const CScript &script)
Definition: core_memusage.h:12
const Consensus::Params & GetConsensus() const
Definition: chainparams.h:93
int GetWitnessCommitmentIndex(const CBlock &block)
Compute at which vout of the block&#39;s coinbase transaction the witness commitment occurs, or -1 if not found.
Definition: validation.h:163
void SetVersion(int n)
Definition: streams.h:346
static int64_t GetBlockWeight(const CBlock &block)
Definition: validation.h:152
void SelectParams(const ChainType chain)
Sets the params returned by Params() to those for the given chain type.
bool IsError() const
Definition: validation.h:123