diff --git a/src/primitives/transaction.cpp b/src/primitives/transaction.cpp index 102a1a33d..510e0b5c5 100644 --- a/src/primitives/transaction.cpp +++ b/src/primitives/transaction.cpp @@ -223,3 +223,31 @@ std::string CTransaction::ToString() const str += " " + vout[i].ToString() + "\n"; return str; } + +// Return a txid which is non-malleable. +// Signature data is cleared before the transaction is serialized and hashed. +uint256 CTransaction::GetTxid() const +{ + // Create a deep copy of this transaction + CMutableTransaction tx(*this); + + // Clear sigscript from all transaction inputs. + for (CTxIn & txIn : tx.vin) { + txIn.scriptSig.clear(); + } + + // Clear joinSplitSig by filling the buffer with zero + tx.joinSplitSig.assign(0); + + // Return double SHA256 hash + return tx.GetHash(); +} + + +// Return a txid which is non-malleable. +uint256 CMutableTransaction::GetTxid() const +{ + CTransaction tx(*this); + return tx.GetTxid(); +} + diff --git a/src/primitives/transaction.h b/src/primitives/transaction.h index a664159b0..0009fcf44 100644 --- a/src/primitives/transaction.h +++ b/src/primitives/transaction.h @@ -373,6 +373,10 @@ public: } std::string ToString() const; + + // Return the txid which is the double SHA256 hash of the transaction. + uint256 GetTxid() const; + }; /** A mutable version of CTransaction. */ @@ -411,6 +415,9 @@ struct CMutableTransaction * fly, as opposed to GetHash() in CTransaction, which uses a cached result. */ uint256 GetHash() const; + + // Compute a non-malleable txid on the fly. + uint256 GetTxid() const; }; #endif // BITCOIN_PRIMITIVES_TRANSACTION_H