Branch data Line data Source code
1 : : // Copyright (c) 2019-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 <chainparams.h>
6 : : #include <coins.h>
7 : : #include <consensus/tx_check.h>
8 : : #include <consensus/tx_verify.h>
9 : : #include <consensus/validation.h>
10 : : #include <core_io.h>
11 : : #include <core_memusage.h>
12 : : #include <policy/policy.h>
13 : : #include <policy/settings.h>
14 : : #include <primitives/transaction.h>
15 : : #include <streams.h>
16 : : #include <test/fuzz/fuzz.h>
17 : : #include <univalue.h>
18 : : #include <util/chaintype.h>
19 : : #include <util/rbf.h>
20 : : #include <validation.h>
21 : :
22 : : #include <cassert>
23 : :
24 : 1 : void initialize_transaction()
25 : : {
26 : 1 : SelectParams(ChainType::REGTEST);
27 : 1 : }
28 : :
29 [ + - ]: 1340 : FUZZ_TARGET(transaction, .init = initialize_transaction)
30 : : {
31 : 928 : DataStream ds{buffer};
32 : 928 : bool valid_tx = true;
33 : 1856 : const CTransaction tx = [&] {
34 : 928 : try {
35 [ + + ]: 928 : return CTransaction(deserialize, TX_WITH_WITNESS, ds);
36 [ - + ]: 46 : } catch (const std::ios_base::failure&) {
37 : 46 : valid_tx = false;
38 [ + - + - ]: 46 : return CTransaction{CMutableTransaction{}};
39 : 46 : }
40 [ + - ]: 928 : }();
41 : 928 : bool valid_mutable_tx = true;
42 [ + - ]: 928 : DataStream ds_mtx{buffer};
43 [ + - ]: 928 : CMutableTransaction mutable_tx;
44 : 928 : try {
45 [ + + ]: 928 : ds_mtx >> TX_WITH_WITNESS(mutable_tx);
46 [ - + ]: 46 : } catch (const std::ios_base::failure&) {
47 : 46 : valid_mutable_tx = false;
48 : 46 : }
49 [ - + ]: 928 : assert(valid_tx == valid_mutable_tx);
50 [ + + ]: 928 : if (!valid_tx) {
51 : 46 : return;
52 : : }
53 : :
54 : 882 : {
55 [ + - ]: 882 : TxValidationState state_with_dupe_check;
56 [ + - ]: 882 : const bool res{CheckTransaction(tx, state_with_dupe_check)};
57 [ + - ]: 882 : Assert(res == state_with_dupe_check.IsValid());
58 : 0 : }
59 : :
60 [ + - ]: 882 : const CFeeRate dust_relay_fee{DUST_RELAY_TX_FEE};
61 [ + - ]: 882 : std::string reason;
62 [ + - ]: 882 : const bool is_standard_with_permit_bare_multisig = IsStandardTx(tx, std::nullopt, /* permit_bare_multisig= */ true, dust_relay_fee, reason);
63 [ + - ]: 882 : const bool is_standard_without_permit_bare_multisig = IsStandardTx(tx, std::nullopt, /* permit_bare_multisig= */ false, dust_relay_fee, reason);
64 [ + + ]: 882 : if (is_standard_without_permit_bare_multisig) {
65 [ - + ]: 21 : assert(is_standard_with_permit_bare_multisig);
66 : : }
67 : :
68 : 882 : (void)tx.GetHash();
69 [ + - ]: 882 : (void)tx.GetTotalSize();
70 : 882 : try {
71 [ + + ]: 882 : (void)tx.GetValueOut();
72 [ - + ]: 659 : } catch (const std::runtime_error&) {
73 : 659 : }
74 : 882 : (void)tx.GetWitnessHash();
75 : 882 : (void)tx.HasWitness();
76 : 882 : (void)tx.IsCoinBase();
77 : 882 : (void)tx.IsNull();
78 [ + - ]: 882 : (void)tx.ToString();
79 : :
80 [ + - ]: 882 : (void)EncodeHexTx(tx);
81 [ + - ]: 882 : (void)GetLegacySigOpCount(tx);
82 : 882 : (void)GetTransactionWeight(tx);
83 [ + - ]: 882 : (void)GetVirtualTransactionSize(tx);
84 [ + - ]: 882 : (void)IsFinalTx(tx, /* nBlockHeight= */ 1024, /* nBlockTime= */ 1024);
85 : 882 : (void)RecursiveDynamicUsage(tx);
86 [ + - ]: 882 : (void)SignalsOptInRBF(tx);
87 : :
88 : 882 : CCoinsView coins_view;
89 [ + - ]: 882 : const CCoinsViewCache coins_view_cache(&coins_view);
90 [ + - ]: 882 : (void)AreInputsStandard(tx, coins_view_cache);
91 [ + - ]: 882 : (void)IsWitnessStandard(tx, coins_view_cache);
92 : :
93 [ + - + + ]: 882 : if (tx.GetTotalSize() < 250'000) { // Avoid high memory usage (with msan) due to json encoding
94 : 831 : {
95 : 831 : UniValue u{UniValue::VOBJ};
96 [ + - ]: 831 : TxToUniv(tx, /*block_hash=*/uint256::ZERO, /*entry=*/u);
97 : 831 : }
98 : 831 : {
99 : 831 : UniValue u{UniValue::VOBJ};
100 [ + - ]: 831 : TxToUniv(tx, /*block_hash=*/uint256::ONE, /*entry=*/u);
101 : 831 : }
102 : : }
103 : 2738 : }
|