From 8c926243656b42479aa5e3cd13701450a43922a6 Mon Sep 17 00:00:00 2001 From: Fabian Jahr Date: Wed, 5 Feb 2025 17:15:34 +0100 Subject: [PATCH 1/2] fuzz: Fuzz reserved weight option in BlockAssembler --- src/test/fuzz/mini_miner.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/test/fuzz/mini_miner.cpp b/src/test/fuzz/mini_miner.cpp index baa28affcec..36d82b7b348 100644 --- a/src/test/fuzz/mini_miner.cpp +++ b/src/test/fuzz/mini_miner.cpp @@ -129,6 +129,8 @@ FUZZ_TARGET(mini_miner_selection, .init = initialize_miner) // Make a copy to preserve determinism. std::deque available_coins = g_available_coins; std::vector transactions; + // The maximum block template size we expect to produce + const auto block_adjusted_max_weight = MAX_BLOCK_WEIGHT - MINIMUM_BLOCK_RESERVED_WEIGHT; LOCK2(::cs_main, pool.cs); LIMITED_WHILE(fuzzed_data_provider.ConsumeBool(), 100) @@ -158,7 +160,6 @@ FUZZ_TARGET(mini_miner_selection, .init = initialize_miner) } } - const auto block_adjusted_max_weight = MAX_BLOCK_WEIGHT - DEFAULT_BLOCK_RESERVED_WEIGHT; // Stop if pool reaches block_adjusted_max_weight because BlockAssembler will stop when the // block template reaches that, but the MiniMiner will keep going. if (pool.GetTotalTxSize() + GetVirtualTransactionSize(*tx) >= block_adjusted_max_weight) break; @@ -184,6 +185,11 @@ FUZZ_TARGET(mini_miner_selection, .init = initialize_miner) node::BlockAssembler::Options miner_options; miner_options.blockMinFeeRate = target_feerate; miner_options.nBlockMaxWeight = MAX_BLOCK_WEIGHT; + // Only setting reserved weight when necessary based on the template size + const auto reserved_weight = MAX_BLOCK_WEIGHT - pool.GetTotalTxSize(); + if (reserved_weight < DEFAULT_BLOCK_RESERVED_WEIGHT) { + miner_options.block_reserved_weight = reserved_weight; + } miner_options.test_block_validity = false; miner_options.coinbase_output_script = CScript() << OP_0; From a63bae6e281a9d4b0d4d6948550107683cf65d3b Mon Sep 17 00:00:00 2001 From: Fabian Jahr Date: Tue, 4 Mar 2025 15:25:38 +0100 Subject: [PATCH 2/2] fuzz: Increase number of transactions in block in mini_miner test At the current configuration there seems to be almost zero chance to hit the size limit of a block. --- src/test/fuzz/mini_miner.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/fuzz/mini_miner.cpp b/src/test/fuzz/mini_miner.cpp index 36d82b7b348..8e98e47660f 100644 --- a/src/test/fuzz/mini_miner.cpp +++ b/src/test/fuzz/mini_miner.cpp @@ -133,12 +133,12 @@ FUZZ_TARGET(mini_miner_selection, .init = initialize_miner) const auto block_adjusted_max_weight = MAX_BLOCK_WEIGHT - MINIMUM_BLOCK_RESERVED_WEIGHT; LOCK2(::cs_main, pool.cs); - LIMITED_WHILE(fuzzed_data_provider.ConsumeBool(), 100) + LIMITED_WHILE(fuzzed_data_provider.ConsumeBool(), 500) { CMutableTransaction mtx = CMutableTransaction(); assert(!available_coins.empty()); const size_t num_inputs = std::min(size_t{2}, available_coins.size()); - const size_t num_outputs = fuzzed_data_provider.ConsumeIntegralInRange(2, 5); + const size_t num_outputs = fuzzed_data_provider.ConsumeIntegralInRange(2, 50); for (size_t n{0}; n < num_inputs; ++n) { auto prevout = available_coins.at(0); mtx.vin.emplace_back(prevout, CScript());