1 // Copyright (c) 2019-2020 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 <validation.h>
15 #include <version.h>
16 
17 #include <cassert>
18 #include <string>
19 
initialize()20 void initialize()
21 {
22     static const ECCVerifyHandle verify_handle;
23     SelectParams(CBaseChainParams::REGTEST);
24 }
25 
test_one_input(const std::vector<uint8_t> & buffer)26 void test_one_input(const std::vector<uint8_t>& buffer)
27 {
28     CDataStream ds(buffer, SER_NETWORK, INIT_PROTO_VERSION);
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         // TODO: Avoid array index out of bounds error in BlockWitnessMerkleRoot
62         //       when block.vtx.empty().
63         (void)BlockWitnessMerkleRoot(block);
64     }
65     (void)GetBlockWeight(block);
66     (void)GetWitnessCommitmentIndex(block);
67     const size_t raw_memory_size = RecursiveDynamicUsage(block);
68     const size_t raw_memory_size_as_shared_ptr = RecursiveDynamicUsage(std::make_shared<CBlock>(block));
69     assert(raw_memory_size_as_shared_ptr > raw_memory_size);
70     CBlock block_copy = block;
71     block_copy.SetNull();
72     const bool is_null = block_copy.IsNull();
73     assert(is_null);
74 }
75