Line data Source code
1 : // Copyright (c) 2020-2022 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 <kernel/mempool_entry.h> 6 : #include <policy/fees.h> 7 : #include <policy/fees_args.h> 8 : #include <primitives/transaction.h> 9 : #include <test/fuzz/FuzzedDataProvider.h> 10 : #include <test/fuzz/fuzz.h> 11 : #include <test/fuzz/util.h> 12 : #include <test/fuzz/util/mempool.h> 13 : #include <test/util/setup_common.h> 14 : #include <txmempool.h> 15 : 16 : #include <cstdint> 17 2 : #include <optional> 18 2 : #include <string> 19 : #include <vector> 20 : 21 : namespace { 22 : const BasicTestingSetup* g_setup; 23 : } // namespace 24 : 25 0 : void initialize_policy_estimator() 26 : { 27 0 : static const auto testing_setup = MakeNoLogFileContext<>(); 28 0 : g_setup = testing_setup.get(); 29 0 : } 30 : 31 4 : FUZZ_TARGET(policy_estimator, .init = initialize_policy_estimator) 32 : { 33 0 : FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size()); 34 0 : CBlockPolicyEstimator block_policy_estimator{FeeestPath(*g_setup->m_node.args), DEFAULT_ACCEPT_STALE_FEE_ESTIMATES}; 35 0 : LIMITED_WHILE(fuzzed_data_provider.ConsumeBool(), 10000) { 36 0 : CallOneOf( 37 : fuzzed_data_provider, 38 0 : [&] { 39 0 : const std::optional<CMutableTransaction> mtx = ConsumeDeserializable<CMutableTransaction>(fuzzed_data_provider); 40 0 : if (!mtx) { 41 0 : return; 42 : } 43 0 : const CTransaction tx{*mtx}; 44 0 : block_policy_estimator.processTransaction(ConsumeTxMemPoolEntry(fuzzed_data_provider, tx), fuzzed_data_provider.ConsumeBool()); 45 0 : if (fuzzed_data_provider.ConsumeBool()) { 46 0 : (void)block_policy_estimator.removeTx(tx.GetHash(), /*inBlock=*/fuzzed_data_provider.ConsumeBool()); 47 0 : } 48 0 : }, 49 0 : [&] { 50 0 : std::vector<CTxMemPoolEntry> mempool_entries; 51 0 : LIMITED_WHILE(fuzzed_data_provider.ConsumeBool(), 10000) { 52 0 : const std::optional<CMutableTransaction> mtx = ConsumeDeserializable<CMutableTransaction>(fuzzed_data_provider); 53 0 : if (!mtx) { 54 0 : break; 55 : } 56 0 : const CTransaction tx{*mtx}; 57 0 : mempool_entries.push_back(ConsumeTxMemPoolEntry(fuzzed_data_provider, tx)); 58 0 : } 59 0 : std::vector<const CTxMemPoolEntry*> ptrs; 60 0 : ptrs.reserve(mempool_entries.size()); 61 0 : for (const CTxMemPoolEntry& mempool_entry : mempool_entries) { 62 0 : ptrs.push_back(&mempool_entry); 63 : } 64 0 : block_policy_estimator.processBlock(fuzzed_data_provider.ConsumeIntegral<unsigned int>(), ptrs); 65 0 : }, 66 0 : [&] { 67 0 : (void)block_policy_estimator.removeTx(ConsumeUInt256(fuzzed_data_provider), /*inBlock=*/fuzzed_data_provider.ConsumeBool()); 68 0 : }, 69 0 : [&] { 70 0 : block_policy_estimator.FlushUnconfirmed(); 71 0 : }); 72 0 : (void)block_policy_estimator.estimateFee(fuzzed_data_provider.ConsumeIntegral<int>()); 73 0 : EstimationResult result; 74 2 : (void)block_policy_estimator.estimateRawFee(fuzzed_data_provider.ConsumeIntegral<int>(), fuzzed_data_provider.ConsumeFloatingPoint<double>(), fuzzed_data_provider.PickValueInArray(ALL_FEE_ESTIMATE_HORIZONS), fuzzed_data_provider.ConsumeBool() ? &result : nullptr); 75 0 : FeeCalculation fee_calculation; 76 0 : (void)block_policy_estimator.estimateSmartFee(fuzzed_data_provider.ConsumeIntegral<int>(), fuzzed_data_provider.ConsumeBool() ? &fee_calculation : nullptr, fuzzed_data_provider.ConsumeBool()); 77 0 : (void)block_policy_estimator.HighestTargetTracked(fuzzed_data_provider.PickValueInArray(ALL_FEE_ESTIMATE_HORIZONS)); 78 0 : } 79 : { 80 0 : FuzzedAutoFileProvider fuzzed_auto_file_provider = ConsumeAutoFile(fuzzed_data_provider); 81 0 : AutoFile fuzzed_auto_file{fuzzed_auto_file_provider.open()}; 82 0 : block_policy_estimator.Write(fuzzed_auto_file); 83 0 : block_policy_estimator.Read(fuzzed_auto_file); 84 0 : } 85 0 : }