diff --git a/src/primitives/transaction.cpp b/src/primitives/transaction.cpp index b433f810f..36d46377b 100644 --- a/src/primitives/transaction.cpp +++ b/src/primitives/transaction.cpp @@ -184,6 +184,14 @@ CTransaction::CTransaction( assert(evilDeveloperFlag); } +CTransaction::CTransaction(CMutableTransaction &&tx) : nVersion(tx.nVersion), fOverwintered(tx.fOverwintered), nVersionGroupId(tx.nVersionGroupId), + vin(std::move(tx.vin)), vout(std::move(tx.vout)), nLockTime(tx.nLockTime), nExpiryHeight(tx.nExpiryHeight), + vjoinsplit(std::move(tx.vjoinsplit)), + joinSplitPubKey(std::move(tx.joinSplitPubKey)), joinSplitSig(std::move(tx.joinSplitSig)) +{ + UpdateHash(); +} + CTransaction& CTransaction::operator=(const CTransaction &tx) { *const_cast(&fOverwintered) = tx.fOverwintered; *const_cast(&nVersion) = tx.nVersion; diff --git a/src/primitives/transaction.h b/src/primitives/transaction.h index 7a4a315e2..683b13543 100644 --- a/src/primitives/transaction.h +++ b/src/primitives/transaction.h @@ -366,6 +366,7 @@ public: /** Convert a CMutableTransaction into a CTransaction. */ CTransaction(const CMutableTransaction &tx); + CTransaction(CMutableTransaction &&tx); CTransaction& operator=(const CTransaction& tx); @@ -411,6 +412,9 @@ public: UpdateHash(); } + template + CTransaction(deserialize_type, Stream& s) : CTransaction(CMutableTransaction(deserialize, s)) {} + bool IsNull() const { return vin.empty() && vout.empty(); } @@ -523,6 +527,11 @@ struct CMutableTransaction } } + template + CMutableTransaction(deserialize_type, Stream& s) { + Unserialize(s); + } + /** Compute the hash of this CMutableTransaction. This is computed on the * fly, as opposed to GetHash() in CTransaction, which uses a cached result. */