Branch data 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 [ + - ]: 173 : #include <optional> 18 [ + - ]: 173 : #include <string> 19 : : #include <vector> 20 : : 21 : : namespace { 22 : : const BasicTestingSetup* g_setup; 23 : : } // namespace 24 : : 25 : 1 : void initialize_policy_estimator() 26 : : { 27 [ + - - + : 1 : static const auto testing_setup = MakeNoLogFileContext<>(); + - ] 28 : 1 : g_setup = testing_setup.get(); 29 : 1 : } 30 : : 31 [ + - - + ]: 866 : FUZZ_TARGET(policy_estimator, .init = initialize_policy_estimator) 32 : : { 33 : 520 : FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size()); 34 [ + - ]: 520 : CBlockPolicyEstimator block_policy_estimator{FeeestPath(*g_setup->m_node.args), DEFAULT_ACCEPT_STALE_FEE_ESTIMATES}; 35 [ + - + + : 38430 : LIMITED_WHILE(fuzzed_data_provider.ConsumeBool(), 10000) { + + ] 36 [ + - ]: 37910 : CallOneOf( 37 : : fuzzed_data_provider, 38 : 42576 : [&] { 39 : 4666 : const std::optional<CMutableTransaction> mtx = ConsumeDeserializable<CMutableTransaction>(fuzzed_data_provider); 40 [ + + ]: 4666 : if (!mtx) { 41 : 851 : return; 42 : : } 43 [ + - + - ]: 3815 : const CTransaction tx{*mtx}; 44 [ + - + - ]: 3815 : block_policy_estimator.processTransaction(ConsumeTxMemPoolEntry(fuzzed_data_provider, tx), fuzzed_data_provider.ConsumeBool()); 45 [ + - + + ]: 3815 : if (fuzzed_data_provider.ConsumeBool()) { 46 [ + - + - : 157 : (void)block_policy_estimator.removeTx(tx.GetHash(), /*inBlock=*/fuzzed_data_provider.ConsumeBool()); + - ] 47 : 157 : } 48 [ - + ]: 4666 : }, 49 : 49408 : [&] { 50 : 11498 : std::vector<CTxMemPoolEntry> mempool_entries; 51 [ + - + + : 43567 : LIMITED_WHILE(fuzzed_data_provider.ConsumeBool(), 10000) { + + ] 52 : 42936 : const std::optional<CMutableTransaction> mtx = ConsumeDeserializable<CMutableTransaction>(fuzzed_data_provider); 53 [ + + ]: 42936 : if (!mtx) { 54 : 10867 : break; 55 : : } 56 [ + - ]: 32069 : const CTransaction tx{*mtx}; 57 [ + - ]: 32069 : mempool_entries.push_back(ConsumeTxMemPoolEntry(fuzzed_data_provider, tx)); 58 [ - + + ]: 42936 : } 59 : 11498 : std::vector<const CTxMemPoolEntry*> ptrs; 60 [ + - ]: 11498 : ptrs.reserve(mempool_entries.size()); 61 [ + + ]: 43567 : for (const CTxMemPoolEntry& mempool_entry : mempool_entries) { 62 [ + - ]: 32069 : ptrs.push_back(&mempool_entry); 63 : : } 64 [ + - + - ]: 11498 : block_policy_estimator.processBlock(fuzzed_data_provider.ConsumeIntegral<unsigned int>(), ptrs); 65 : 11498 : }, 66 : 38139 : [&] { 67 : 229 : (void)block_policy_estimator.removeTx(ConsumeUInt256(fuzzed_data_provider), /*inBlock=*/fuzzed_data_provider.ConsumeBool()); 68 : 229 : }, 69 : 59427 : [&] { 70 : 21517 : block_policy_estimator.FlushUnconfirmed(); 71 : 21517 : }); 72 [ + - + - ]: 37910 : (void)block_policy_estimator.estimateFee(fuzzed_data_provider.ConsumeIntegral<int>()); 73 : 37910 : EstimationResult result; 74 [ + - + - : 38083 : (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 : 37910 : FeeCalculation fee_calculation; 76 [ + - + - : 37910 : (void)block_policy_estimator.estimateSmartFee(fuzzed_data_provider.ConsumeIntegral<int>(), fuzzed_data_provider.ConsumeBool() ? &fee_calculation : nullptr, fuzzed_data_provider.ConsumeBool()); + + + - + - ] 77 [ + - + - ]: 37910 : (void)block_policy_estimator.HighestTargetTracked(fuzzed_data_provider.PickValueInArray(ALL_FEE_ESTIMATE_HORIZONS)); 78 : 37910 : } 79 : : { 80 : 520 : FuzzedAutoFileProvider fuzzed_auto_file_provider = ConsumeAutoFile(fuzzed_data_provider); 81 [ + - ]: 520 : AutoFile fuzzed_auto_file{fuzzed_auto_file_provider.open()}; 82 [ + - ]: 520 : block_policy_estimator.Write(fuzzed_auto_file); 83 [ + - ]: 520 : block_policy_estimator.Read(fuzzed_auto_file); 84 : 520 : } 85 : 520 : }