Bitcoin Core 31.99.0
P2P Digital Currency
policy_estimator.cpp
Go to the documentation of this file.
1// Copyright (c) 2020-present 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
9#include <streams.h>
11#include <test/fuzz/fuzz.h>
12#include <test/fuzz/util.h>
15
16#include <memory>
17#include <optional>
18#include <vector>
19
20namespace {
22} // namespace
23
25{
26 static const auto testing_setup = MakeNoLogFileContext<>();
27 g_setup = testing_setup.get();
28}
29
31{
32 FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size());
33 bool good_data{true};
34
36
37 uint32_t current_height{0};
38 const auto advance_height{
40 };
41 advance_height();
42 LIMITED_WHILE (good_data && fuzzed_data_provider.ConsumeBool(), 10'000) {
45 [&] {
46 const std::optional<CMutableTransaction> mtx = ConsumeDeserializable<CMutableTransaction>(fuzzed_data_provider, TX_WITH_WITNESS);
47 if (!mtx) {
48 good_data = false;
49 return;
50 }
51 const CTransaction tx{*mtx};
53 const auto tx_submitted_in_package = fuzzed_data_provider.ConsumeBool();
54 const auto tx_has_mempool_parents = fuzzed_data_provider.ConsumeBool();
55 const auto tx_info = NewMempoolTransactionInfo(entry.GetSharedTx(), entry.GetFee(),
56 entry.GetTxSize(), entry.GetHeight(),
57 /*mempool_limit_bypassed=*/false,
58 tx_submitted_in_package,
59 /*chainstate_is_current=*/true,
60 tx_has_mempool_parents);
61 block_policy_estimator.processTransaction(tx_info);
63 (void)block_policy_estimator.removeTx(tx.GetHash());
64 }
65 },
66 [&] {
67 std::list<CTxMemPoolEntry> mempool_entries;
69 const std::optional<CMutableTransaction> mtx = ConsumeDeserializable<CMutableTransaction>(fuzzed_data_provider, TX_WITH_WITNESS);
70 if (!mtx) {
71 good_data = false;
72 break;
73 }
74 const CTransaction tx{*mtx};
75 mempool_entries.push_back(ConsumeTxMemPoolEntry(fuzzed_data_provider, tx, current_height));
76 }
77 std::vector<RemovedMempoolTransactionInfo> txs;
78 txs.reserve(mempool_entries.size());
79 for (const CTxMemPoolEntry& mempool_entry : mempool_entries) {
80 txs.emplace_back(mempool_entry);
81 }
82 advance_height();
83 block_policy_estimator.processBlock(txs, current_height);
84 },
85 [&] {
86 (void)block_policy_estimator.removeTx(Txid::FromUint256(ConsumeUInt256(fuzzed_data_provider)));
87 },
88 [&] {
89 block_policy_estimator.FlushUnconfirmed();
90 });
91 (void)block_policy_estimator.estimateFee(fuzzed_data_provider.ConsumeIntegral<int>());
92 EstimationResult result;
93 auto conf_target = fuzzed_data_provider.ConsumeIntegral<int>();
94 auto success_threshold = fuzzed_data_provider.ConsumeFloatingPoint<double>();
96 auto* result_ptr = fuzzed_data_provider.ConsumeBool() ? &result : nullptr;
97 (void)block_policy_estimator.estimateRawFee(conf_target, success_threshold, horizon, result_ptr);
98
99 FeeCalculation fee_calculation;
100 conf_target = fuzzed_data_provider.ConsumeIntegral<int>();
101 auto* fee_calc_ptr = fuzzed_data_provider.ConsumeBool() ? &fee_calculation : nullptr;
102 auto conservative = fuzzed_data_provider.ConsumeBool();
103 (void)block_policy_estimator.estimateSmartFee(conf_target, fee_calc_ptr, conservative);
104
105 (void)block_policy_estimator.HighestTargetTracked(fuzzed_data_provider.PickValueInArray(ALL_FEE_ESTIMATE_HORIZONS));
106 }
107 {
108 FuzzedFileProvider fuzzed_file_provider{fuzzed_data_provider};
109 AutoFile fuzzed_auto_file{fuzzed_file_provider.open()};
110 block_policy_estimator.Write(fuzzed_auto_file);
111 block_policy_estimator.Read(fuzzed_auto_file);
112 (void)fuzzed_auto_file.fclose();
113 }
114}
const TestingSetup * g_setup
static constexpr bool DEFAULT_ACCEPT_STALE_FEE_ESTIMATES
static constexpr auto ALL_FEE_ESTIMATE_HORIZONS
fs::path FeeestPath(const ArgsManager &argsman)
Non-refcounted RAII wrapper for FILE*.
Definition: streams.h:395
int fclose()
Definition: streams.h:429
The BlockPolicyEstimator is used for estimating the feerate needed for a transaction to be included i...
The basic transaction that is broadcasted on the network and contained in blocks.
Definition: transaction.h:281
CTxMemPoolEntry stores data about the corresponding transaction, as well as data about all in-mempool...
Definition: mempool_entry.h:66
T ConsumeIntegralInRange(T min, T max)
T PickValueInArray(const T(&array)[size])
static transaction_identifier FromUint256(const uint256 &id)
uint32_t current_height
Current height in the simulation.
LIMITED_WHILE(provider.remaining_bytes(), 10000)
Definition: basic.cpp:8
void initialize_policy_estimator()
FUZZ_TARGET(policy_estimator,.init=initialize_policy_estimator)
static constexpr TransactionSerParams TX_WITH_WITNESS
Definition: transaction.h:180
Basic testing setup.
Definition: setup_common.h:58
node::NodeContext m_node
Definition: setup_common.h:60
ArgsManager * args
Definition: context.h:78
CTxMemPoolEntry ConsumeTxMemPoolEntry(FuzzedDataProvider &fuzzed_data_provider, const CTransaction &tx, uint32_t max_height) noexcept
Definition: mempool.cpp:17
uint256 ConsumeUInt256(FuzzedDataProvider &fuzzed_data_provider) noexcept
Definition: util.h:195
size_t CallOneOf(FuzzedDataProvider &fuzzed_data_provider, Callables... callables)
Definition: util.h:37
FuzzedDataProvider & fuzzed_data_provider
Definition: fees.cpp:39