LCOV - code coverage report
Current view: top level - src/primitives - transaction.cpp (source / functions) Hit Total Coverage
Test: fuzz_coverage.info Lines: 11 75 14.7 %
Date: 2024-01-03 14:57:27 Functions: 6 18 33.3 %
Branches: 4 136 2.9 %

           Branch data     Line data    Source code
       1                 :            : // Copyright (c) 2009-2010 Satoshi Nakamoto
       2                 :            : // Copyright (c) 2009-2022 The Bitcoin Core developers
       3                 :            : // Distributed under the MIT software license, see the accompanying
       4                 :            : // file COPYING or http://www.opensource.org/licenses/mit-license.php.
       5                 :            : 
       6                 :            : #include <primitives/transaction.h>
       7                 :            : 
       8                 :            : #include <consensus/amount.h>
       9                 :            : #include <hash.h>
      10                 :            : #include <script/script.h>
      11                 :            : #include <serialize.h>
      12                 :            : #include <tinyformat.h>
      13                 :            : #include <uint256.h>
      14                 :            : #include <util/strencodings.h>
      15                 :            : #include <util/transaction_identifier.h>
      16                 :            : 
      17                 :            : #include <algorithm>
      18                 :            : #include <cassert>
      19                 :            : #include <stdexcept>
      20                 :            : 
      21                 :          0 : std::string COutPoint::ToString() const
      22                 :            : {
      23 [ #  # ][ #  # ]:          0 :     return strprintf("COutPoint(%s, %u)", hash.ToString().substr(0,10), n);
      24                 :          0 : }
      25                 :            : 
      26         [ #  # ]:          0 : CTxIn::CTxIn(COutPoint prevoutIn, CScript scriptSigIn, uint32_t nSequenceIn)
      27                 :            : {
      28                 :          0 :     prevout = prevoutIn;
      29         [ #  # ]:          0 :     scriptSig = scriptSigIn;
      30                 :          0 :     nSequence = nSequenceIn;
      31                 :          0 : }
      32                 :            : 
      33         [ #  # ]:          0 : CTxIn::CTxIn(Txid hashPrevTx, uint32_t nOut, CScript scriptSigIn, uint32_t nSequenceIn)
      34                 :            : {
      35         [ #  # ]:          0 :     prevout = COutPoint(hashPrevTx, nOut);
      36         [ #  # ]:          0 :     scriptSig = scriptSigIn;
      37                 :          0 :     nSequence = nSequenceIn;
      38                 :          0 : }
      39                 :            : 
      40                 :          0 : std::string CTxIn::ToString() const
      41                 :            : {
      42                 :          0 :     std::string str;
      43         [ #  # ]:          0 :     str += "CTxIn(";
      44 [ #  # ][ #  # ]:          0 :     str += prevout.ToString();
      45 [ #  # ][ #  # ]:          0 :     if (prevout.IsNull())
      46 [ #  # ][ #  # ]:          0 :         str += strprintf(", coinbase %s", HexStr(scriptSig));
         [ #  # ][ #  # ]
      47                 :            :     else
      48 [ #  # ][ #  # ]:          0 :         str += strprintf(", scriptSig=%s", HexStr(scriptSig).substr(0, 24));
         [ #  # ][ #  # ]
                 [ #  # ]
      49         [ #  # ]:          0 :     if (nSequence != SEQUENCE_FINAL)
      50 [ #  # ][ #  # ]:          0 :         str += strprintf(", nSequence=%u", nSequence);
      51         [ #  # ]:          0 :     str += ")";
      52                 :          0 :     return str;
      53         [ #  # ]:          0 : }
      54                 :            : 
      55                 :          0 : CTxOut::CTxOut(const CAmount& nValueIn, CScript scriptPubKeyIn)
      56                 :            : {
      57                 :          0 :     nValue = nValueIn;
      58         [ #  # ]:          0 :     scriptPubKey = scriptPubKeyIn;
      59                 :          0 : }
      60                 :            : 
      61                 :          0 : std::string CTxOut::ToString() const
      62                 :            : {
      63 [ #  # ][ #  # ]:          0 :     return strprintf("CTxOut(nValue=%d.%08d, scriptPubKey=%s)", nValue / COIN, nValue % COIN, HexStr(scriptPubKey).substr(0, 30));
      64                 :          0 : }
      65                 :            : 
      66                 :          1 : CMutableTransaction::CMutableTransaction() : nVersion(CTransaction::CURRENT_VERSION), nLockTime(0) {}
      67         [ #  # ]:          0 : CMutableTransaction::CMutableTransaction(const CTransaction& tx) : vin(tx.vin), vout(tx.vout), nVersion(tx.nVersion), nLockTime(tx.nLockTime) {}
      68                 :            : 
      69                 :          0 : Txid CMutableTransaction::GetHash() const
      70                 :            : {
      71                 :          0 :     return Txid::FromUint256((HashWriter{} << TX_NO_WITNESS(*this)).GetHash());
      72                 :            : }
      73                 :            : 
      74                 :          1 : bool CTransaction::ComputeHasWitness() const
      75                 :            : {
      76                 :          2 :     return std::any_of(vin.begin(), vin.end(), [](const auto& input) {
      77                 :          1 :         return !input.scriptWitness.IsNull();
      78                 :            :     });
      79                 :            : }
      80                 :            : 
      81                 :          1 : Txid CTransaction::ComputeHash() const
      82                 :            : {
      83                 :          1 :     return Txid::FromUint256((HashWriter{} << TX_NO_WITNESS(*this)).GetHash());
      84                 :            : }
      85                 :            : 
      86                 :          1 : Wtxid CTransaction::ComputeWitnessHash() const
      87                 :            : {
      88         [ +  - ]:          1 :     if (!HasWitness()) {
      89                 :          1 :         return Wtxid::FromUint256(hash.ToUint256());
      90                 :            :     }
      91                 :            : 
      92                 :          0 :     return Wtxid::FromUint256((HashWriter{} << TX_WITH_WITNESS(*this)).GetHash());
      93                 :          1 : }
      94                 :            : 
      95 [ #  # ][ #  # ]:          0 : CTransaction::CTransaction(const CMutableTransaction& tx) : vin(tx.vin), vout(tx.vout), nVersion(tx.nVersion), nLockTime(tx.nLockTime), m_has_witness{ComputeHasWitness()}, hash{ComputeHash()}, m_witness_hash{ComputeWitnessHash()} {}
         [ #  # ][ #  # ]
      96 [ +  - ][ +  - ]:          1 : CTransaction::CTransaction(CMutableTransaction&& tx) : vin(std::move(tx.vin)), vout(std::move(tx.vout)), nVersion(tx.nVersion), nLockTime(tx.nLockTime), m_has_witness{ComputeHasWitness()}, hash{ComputeHash()}, m_witness_hash{ComputeWitnessHash()} {}
                 [ +  - ]
      97                 :            : 
      98                 :          0 : CAmount CTransaction::GetValueOut() const
      99                 :            : {
     100                 :          0 :     CAmount nValueOut = 0;
     101         [ #  # ]:          0 :     for (const auto& tx_out : vout) {
     102 [ #  # ][ #  # ]:          0 :         if (!MoneyRange(tx_out.nValue) || !MoneyRange(nValueOut + tx_out.nValue))
     103 [ #  # ][ #  # ]:          0 :             throw std::runtime_error(std::string(__func__) + ": value out of range");
         [ #  # ][ #  # ]
                 [ #  # ]
     104                 :          0 :         nValueOut += tx_out.nValue;
     105                 :            :     }
     106         [ #  # ]:          0 :     assert(MoneyRange(nValueOut));
     107                 :          0 :     return nValueOut;
     108                 :          0 : }
     109                 :            : 
     110                 :          0 : unsigned int CTransaction::GetTotalSize() const
     111                 :            : {
     112                 :          0 :     return ::GetSerializeSize(TX_WITH_WITNESS(*this));
     113                 :            : }
     114                 :            : 
     115                 :          0 : std::string CTransaction::ToString() const
     116                 :            : {
     117                 :          0 :     std::string str;
     118 [ #  # ][ #  # ]:          0 :     str += strprintf("CTransaction(hash=%s, ver=%d, vin.size=%u, vout.size=%u, nLockTime=%u)\n",
     119 [ #  # ][ #  # ]:          0 :         GetHash().ToString().substr(0,10),
                 [ #  # ]
     120                 :          0 :         nVersion,
     121                 :          0 :         vin.size(),
     122                 :          0 :         vout.size(),
     123                 :          0 :         nLockTime);
     124         [ #  # ]:          0 :     for (const auto& tx_in : vin)
     125 [ #  # ][ #  # ]:          0 :         str += "    " + tx_in.ToString() + "\n";
         [ #  # ][ #  # ]
     126         [ #  # ]:          0 :     for (const auto& tx_in : vin)
     127 [ #  # ][ #  # ]:          0 :         str += "    " + tx_in.scriptWitness.ToString() + "\n";
         [ #  # ][ #  # ]
     128         [ #  # ]:          0 :     for (const auto& tx_out : vout)
     129 [ #  # ][ #  # ]:          0 :         str += "    " + tx_out.ToString() + "\n";
         [ #  # ][ #  # ]
     130                 :          0 :     return str;
     131         [ #  # ]:          0 : }

Generated by: LCOV version 1.14