diff --git a/src/test/fuzz/CMakeLists.txt b/src/test/fuzz/CMakeLists.txt --- a/src/test/fuzz/CMakeLists.txt +++ b/src/test/fuzz/CMakeLists.txt @@ -70,6 +70,7 @@ add_regular_fuzz_targets( addrdb + block bloom_filter rolling_bloom_filter cashaddr diff --git a/src/test/fuzz/block.cpp b/src/test/fuzz/block.cpp new file mode 100644 --- /dev/null +++ b/src/test/fuzz/block.cpp @@ -0,0 +1,66 @@ +// Copyright (c) 2019 The Bitcoin Core developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include + +void initialize() { + const static auto verify_handle = std::make_unique(); + SelectParams(CBaseChainParams::REGTEST); +} + +void test_one_input(const std::vector &buffer) { + CDataStream ds(buffer, SER_NETWORK, INIT_PROTO_VERSION); + CBlock block; + try { + int nVersion; + ds >> nVersion; + ds.SetVersion(nVersion); + ds >> block; + } catch (const std::ios_base::failure &) { + return; + } + const Config &config = GetConfig(); + const Consensus::Params &consensus_params = + config.GetChainParams().GetConsensus(); + BlockValidationOptions options(config); + + BlockValidationState validation_state_pow_and_merkle; + const bool valid_incl_pow_and_merkle = CheckBlock( + block, validation_state_pow_and_merkle, consensus_params, options); + BlockValidationState validation_state_pow; + const bool valid_incl_pow = + CheckBlock(block, validation_state_pow, consensus_params, + options.withCheckMerkleRoot(false)); + BlockValidationState validation_state_merkle; + const bool valid_incl_merkle = + CheckBlock(block, validation_state_merkle, consensus_params, + options.withCheckPoW(false)); + BlockValidationState validation_state_none; + const bool valid_incl_none = + CheckBlock(block, validation_state_none, consensus_params, + options.withCheckPoW(false).withCheckMerkleRoot(false)); + if (valid_incl_pow_and_merkle) { + assert(valid_incl_pow && valid_incl_merkle && valid_incl_none); + } else if (valid_incl_merkle || valid_incl_pow) { + assert(valid_incl_none); + } + (void)block.GetHash(); + (void)block.ToString(); + (void)BlockMerkleRoot(block); +}