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