From 5f6cd008b08ba5196284f67c8cd8f456f4c8ed66 Mon Sep 17 00:00:00 2001 From: Johnson Lau Date: Sun, 30 Jul 2017 17:32:39 +0800 Subject: [PATCH 1/2] [Refactor] Combine scriptPubKey and amount as CTxOut in CScriptCheck --- src/test/script_P2SH_tests.cpp | 3 +-- src/test/transaction_tests.cpp | 3 +-- src/validation.cpp | 8 +++----- src/validation.h | 13 +++++-------- 4 files changed, 10 insertions(+), 17 deletions(-) diff --git a/src/test/script_P2SH_tests.cpp b/src/test/script_P2SH_tests.cpp index d74d75b1ec198..4da87c73ffb82 100644 --- a/src/test/script_P2SH_tests.cpp +++ b/src/test/script_P2SH_tests.cpp @@ -113,8 +113,7 @@ BOOST_AUTO_TEST_CASE(sign) for (int j = 0; j < 8; j++) { CScript sigSave = txTo[i].vin[0].scriptSig; txTo[i].vin[0].scriptSig = txTo[j].vin[0].scriptSig; - const CTxOut& output = txFrom.vout[txTo[i].vin[0].prevout.n]; - bool sigOK = CScriptCheck(output.scriptPubKey, output.nValue, txTo[i], 0, SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_STRICTENC, + bool sigOK = CScriptCheck(txFrom.vout[txTo[i].vin[0].prevout.n], txTo[i], 0, SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_STRICTENC, false, &precomTxData)(); if (i == j) BOOST_CHECK_MESSAGE(sigOK, strprintf("VerifySignature %d %d", i, j)); diff --git a/src/test/transaction_tests.cpp b/src/test/transaction_tests.cpp index 57c719336cdf8..1fa083624885b 100644 --- a/src/test/transaction_tests.cpp +++ b/src/test/transaction_tests.cpp @@ -390,8 +390,7 @@ BOOST_AUTO_TEST_CASE(test_big_witness_transaction) { for(uint32_t i = 0; i < mtx.vin.size(); i++) { std::vector vChecks; - const CTxOut& output = coins[tx.vin[i].prevout.n].out; - CScriptCheck check(output.scriptPubKey, output.nValue, tx, i, SCRIPT_VERIFY_P2SH, false, &precomTxData); + CScriptCheck check(coins[tx.vin[i].prevout.n].out, tx, i, SCRIPT_VERIFY_P2SH, false, &precomTxData); vChecks.emplace_back(); check.swap(vChecks.back()); control.Add(vChecks); diff --git a/src/validation.cpp b/src/validation.cpp index ea320d05c7361..f3bdfe0029a97 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -1071,7 +1071,7 @@ void UpdateCoins(const CTransaction& tx, CCoinsViewCache &inputs, int nHeight, b bool CScriptCheck::operator()() { const CScript& scriptSig = ptxTo->vin[nIn].scriptSig; - return VerifyScript(scriptSig, scriptPubKey, nFlags, CachingTransactionSignatureChecker(ptxTo, nIn, amount, cacheStore, *precomTxData), ptxTo->GetRequiredSigVersion(), &error); + return VerifyScript(scriptSig, out.scriptPubKey, nFlags, CachingTransactionSignatureChecker(ptxTo, nIn, out.nValue, cacheStore, *precomTxData), ptxTo->GetRequiredSigVersion(), &error); } int GetSpendHeight(const CCoinsViewCache& inputs) @@ -1162,11 +1162,9 @@ bool CheckInputs(const CTransaction& tx, CValidationState &state, const CCoinsVi // a sanity check that our caching is not introducing consensus // failures through additional data in, eg, the coins being // spent being checked as a part of CScriptCheck. - const CScript& scriptPubKey = coin.out.scriptPubKey; - const CAmount amount = coin.out.nValue; // Verify signature - CScriptCheck check(scriptPubKey, amount, tx, i, flags, cacheStore, &precomTxData); + CScriptCheck check(coin.out, tx, i, flags, cacheStore, &precomTxData); if (pvChecks) { pvChecks->emplace_back(); check.swap(pvChecks->back()); @@ -1178,7 +1176,7 @@ bool CheckInputs(const CTransaction& tx, CValidationState &state, const CCoinsVi // arguments; if so, don't trigger DoS protection to // avoid splitting the network between upgraded and // non-upgraded nodes. - CScriptCheck check2(scriptPubKey, amount, tx, i, + CScriptCheck check2(coin.out, tx, i, flags & ~STANDARD_NOT_MANDATORY_VERIFY_FLAGS, cacheStore, &precomTxData); if (check2()) return state.Invalid(false, REJECT_NONSTANDARD, strprintf("non-mandatory-script-verify-flag (%s)", ScriptErrorString(check.GetScriptError()))); diff --git a/src/validation.h b/src/validation.h index 46243099ac4a1..07690ea2a3073 100644 --- a/src/validation.h +++ b/src/validation.h @@ -285,8 +285,7 @@ Optional GetUTXOHeight(const COutPoint& outpoint); class CScriptCheck { private: - CScript scriptPubKey; - CAmount amount; + CTxOut out; const CTransaction* ptxTo; unsigned int nIn; unsigned int nFlags; @@ -295,10 +294,9 @@ class CScriptCheck PrecomputedTransactionData *precomTxData; public: - CScriptCheck() : amount(0), ptxTo(0), nIn(0), nFlags(0), cacheStore(false), error(SCRIPT_ERR_UNKNOWN_ERROR), precomTxData(nullptr) {} - CScriptCheck(const CScript& scriptPubKeyIn, const CAmount amountIn, const CTransaction& txToIn, unsigned int nInIn, unsigned int nFlagsIn, bool cacheIn, PrecomputedTransactionData* cachedHashesIn) : - scriptPubKey(scriptPubKeyIn), - amount(amountIn), + CScriptCheck() : ptxTo(0), nIn(0), nFlags(0), cacheStore(false), error(SCRIPT_ERR_UNKNOWN_ERROR), precomTxData(nullptr) {} + CScriptCheck(const CTxOut& outIn, const CTransaction& txToIn, unsigned int nInIn, unsigned int nFlagsIn, bool cacheIn, PrecomputedTransactionData* cachedHashesIn) : + out(outIn), ptxTo(&txToIn), nIn(nInIn), nFlags(nFlagsIn), @@ -310,9 +308,8 @@ class CScriptCheck void swap(CScriptCheck& check) { - scriptPubKey.swap(check.scriptPubKey); std::swap(ptxTo, check.ptxTo); - std::swap(amount, check.amount); + std::swap(out, check.out); std::swap(nIn, check.nIn); std::swap(nFlags, check.nFlags); std::swap(cacheStore, check.cacheStore); From 2af6794fcff6f32a0064f9d9201aa37118c94699 Mon Sep 17 00:00:00 2001 From: Johnson Lau Date: Fri, 22 Sep 2017 14:27:03 +0800 Subject: [PATCH 2/2] Rename out to m_tx_out in CScriptCheck --- src/validation.cpp | 2 +- src/validation.h | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/validation.cpp b/src/validation.cpp index f3bdfe0029a97..78acf5a5f5a71 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -1071,7 +1071,7 @@ void UpdateCoins(const CTransaction& tx, CCoinsViewCache &inputs, int nHeight, b bool CScriptCheck::operator()() { const CScript& scriptSig = ptxTo->vin[nIn].scriptSig; - return VerifyScript(scriptSig, out.scriptPubKey, nFlags, CachingTransactionSignatureChecker(ptxTo, nIn, out.nValue, cacheStore, *precomTxData), ptxTo->GetRequiredSigVersion(), &error); + return VerifyScript(scriptSig, m_tx_out.scriptPubKey, nFlags, CachingTransactionSignatureChecker(ptxTo, nIn, m_tx_out.nValue, cacheStore, *precomTxData), ptxTo->GetRequiredSigVersion(), &error); } int GetSpendHeight(const CCoinsViewCache& inputs) diff --git a/src/validation.h b/src/validation.h index 07690ea2a3073..d653c9f00225d 100644 --- a/src/validation.h +++ b/src/validation.h @@ -285,7 +285,7 @@ Optional GetUTXOHeight(const COutPoint& outpoint); class CScriptCheck { private: - CTxOut out; + CTxOut m_tx_out; const CTransaction* ptxTo; unsigned int nIn; unsigned int nFlags; @@ -296,7 +296,7 @@ class CScriptCheck public: CScriptCheck() : ptxTo(0), nIn(0), nFlags(0), cacheStore(false), error(SCRIPT_ERR_UNKNOWN_ERROR), precomTxData(nullptr) {} CScriptCheck(const CTxOut& outIn, const CTransaction& txToIn, unsigned int nInIn, unsigned int nFlagsIn, bool cacheIn, PrecomputedTransactionData* cachedHashesIn) : - out(outIn), + m_tx_out(outIn), ptxTo(&txToIn), nIn(nInIn), nFlags(nFlagsIn), @@ -309,7 +309,7 @@ class CScriptCheck void swap(CScriptCheck& check) { std::swap(ptxTo, check.ptxTo); - std::swap(out, check.out); + std::swap(m_tx_out, check.m_tx_out); std::swap(nIn, check.nIn); std::swap(nFlags, check.nFlags); std::swap(cacheStore, check.cacheStore);