Skip to content

Commit faab55f

Browse files
author
MarcoFalke
committed
Make CMutableTransaction constructor explicit
Silently converting to a CMutableTransaction will drop all caches and should thus be done explicitly
1 parent f82e1c9 commit faab55f

File tree

7 files changed

+12
-12
lines changed

7 files changed

+12
-12
lines changed

src/bitcoin-tx.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -548,7 +548,7 @@ static void MutateTxSign(CMutableTransaction& tx, const std::string& flagStr)
548548
// mergedTx will end up with all the signatures; it
549549
// starts as a clone of the raw tx:
550550
CMutableTransaction mergedTx{tx};
551-
const CTransaction txv{tx};
551+
const CMutableTransaction txv{tx};
552552
CCoinsView viewDummy;
553553
CCoinsViewCache view(&viewDummy);
554554

src/primitives/transaction.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -367,7 +367,7 @@ struct CMutableTransaction
367367
uint32_t nLockTime;
368368

369369
CMutableTransaction();
370-
CMutableTransaction(const CTransaction& tx);
370+
explicit CMutableTransaction(const CTransaction& tx);
371371

372372
template <typename Stream>
373373
inline void Serialize(Stream& s) const {

src/test/coins_tests.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -312,7 +312,7 @@ BOOST_AUTO_TEST_CASE(updatecoins_simulation_test)
312312
if (InsecureRandRange(10) == 0 && coinbase_coins.size()) {
313313
auto utxod = FindRandomFrom(coinbase_coins);
314314
// Reuse the exact same coinbase
315-
tx = std::get<0>(utxod->second);
315+
tx = CMutableTransaction{std::get<0>(utxod->second)};
316316
// shouldn't be available for reconnection if it's been duplicated
317317
disconnected_coins.erase(utxod->first);
318318

@@ -331,7 +331,7 @@ BOOST_AUTO_TEST_CASE(updatecoins_simulation_test)
331331
// 1/20 times reconnect a previously disconnected tx
332332
if (randiter % 20 == 2 && disconnected_coins.size()) {
333333
auto utxod = FindRandomFrom(disconnected_coins);
334-
tx = std::get<0>(utxod->second);
334+
tx = CMutableTransaction{std::get<0>(utxod->second)};
335335
prevout = tx.vin[0].prevout;
336336
if (!CTransaction(tx).IsCoinBase() && !utxoset.count(prevout)) {
337337
disconnected_coins.erase(utxod->first);

src/test/script_tests.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ CMutableTransaction BuildCreditingTransaction(const CScript& scriptPubKey, int n
135135
return txCredit;
136136
}
137137

138-
CMutableTransaction BuildSpendingTransaction(const CScript& scriptSig, const CScriptWitness& scriptWitness, const CMutableTransaction& txCredit)
138+
CMutableTransaction BuildSpendingTransaction(const CScript& scriptSig, const CScriptWitness& scriptWitness, const CTransaction& txCredit)
139139
{
140140
CMutableTransaction txSpend;
141141
txSpend.nVersion = 1;
@@ -161,7 +161,7 @@ void DoTest(const CScript& scriptPubKey, const CScript& scriptSig, const CScript
161161
flags |= SCRIPT_VERIFY_WITNESS;
162162
}
163163
ScriptError err;
164-
CMutableTransaction txCredit = BuildCreditingTransaction(scriptPubKey, nValue);
164+
const CTransaction txCredit{BuildCreditingTransaction(scriptPubKey, nValue)};
165165
CMutableTransaction tx = BuildSpendingTransaction(scriptSig, scriptWitness, txCredit);
166166
CMutableTransaction tx2 = tx;
167167
BOOST_CHECK_MESSAGE(VerifyScript(scriptSig, scriptPubKey, &scriptWitness, flags, MutableTransactionSignatureChecker(&tx, 0, txCredit.vout[0].nValue), &err) == expect, message);
@@ -1071,7 +1071,7 @@ BOOST_AUTO_TEST_CASE(script_CHECKMULTISIG12)
10711071
CScript scriptPubKey12;
10721072
scriptPubKey12 << OP_1 << ToByteVector(key1.GetPubKey()) << ToByteVector(key2.GetPubKey()) << OP_2 << OP_CHECKMULTISIG;
10731073

1074-
CMutableTransaction txFrom12 = BuildCreditingTransaction(scriptPubKey12);
1074+
const CTransaction txFrom12{BuildCreditingTransaction(scriptPubKey12)};
10751075
CMutableTransaction txTo12 = BuildSpendingTransaction(CScript(), CScriptWitness(), txFrom12);
10761076

10771077
CScript goodsig1 = sign_multisig(scriptPubKey12, key1, txTo12);
@@ -1102,7 +1102,7 @@ BOOST_AUTO_TEST_CASE(script_CHECKMULTISIG23)
11021102
CScript scriptPubKey23;
11031103
scriptPubKey23 << OP_2 << ToByteVector(key1.GetPubKey()) << ToByteVector(key2.GetPubKey()) << ToByteVector(key3.GetPubKey()) << OP_3 << OP_CHECKMULTISIG;
11041104

1105-
CMutableTransaction txFrom23 = BuildCreditingTransaction(scriptPubKey23);
1105+
const CTransaction txFrom23{BuildCreditingTransaction(scriptPubKey23)};
11061106
CMutableTransaction txTo23 = BuildSpendingTransaction(CScript(), CScriptWitness(), txFrom23);
11071107

11081108
std::vector<CKey> keys;

src/test/txvalidationcache_tests.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ bool CheckInputs(const CTransaction& tx, CValidationState &state, const CCoinsVi
2424
BOOST_AUTO_TEST_SUITE(tx_validationcache_tests)
2525

2626
static bool
27-
ToMemPool(CMutableTransaction& tx)
27+
ToMemPool(const CMutableTransaction& tx)
2828
{
2929
LOCK(cs_main);
3030

src/wallet/feebumper.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ Result CreateTransaction(const CWallet* wallet, const uint256& txid, const CCoin
185185
// If the output is not large enough to pay the fee, fail.
186186
CAmount nDelta = new_fee - old_fee;
187187
assert(nDelta > 0);
188-
mtx = *wtx.tx;
188+
mtx = CMutableTransaction{*wtx.tx};
189189
CTxOut* poutput = &(mtx.vout[nOutput]);
190190
if (poutput->nValue < nDelta) {
191191
errors.push_back("Change output is too small to bump the fee");

src/wallet/wallet.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2065,8 +2065,8 @@ bool CWalletTx::IsTrusted() const
20652065

20662066
bool CWalletTx::IsEquivalentTo(const CWalletTx& _tx) const
20672067
{
2068-
CMutableTransaction tx1 = *this->tx;
2069-
CMutableTransaction tx2 = *_tx.tx;
2068+
CMutableTransaction tx1 {*this->tx};
2069+
CMutableTransaction tx2 {*_tx.tx};
20702070
for (auto& txin : tx1.vin) txin.scriptSig = CScript();
20712071
for (auto& txin : tx2.vin) txin.scriptSig = CScript();
20722072
return CTransaction(tx1) == CTransaction(tx2);

0 commit comments

Comments
 (0)