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