|
|
@ -1219,7 +1219,7 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa |
|
|
|
|
|
|
|
// Check against previous transactions
|
|
|
|
// This is done last to help prevent CPU exhaustion denial-of-service attacks.
|
|
|
|
if (!ContextualCheckInputs(tx, state, view, true, STANDARD_SCRIPT_VERIFY_FLAGS, true)) |
|
|
|
if (!ContextualCheckInputs(tx, state, view, true, STANDARD_SCRIPT_VERIFY_FLAGS, true, Params().GetConsensus())) |
|
|
|
{ |
|
|
|
return error("AcceptToMemoryPool: ConnectInputs failed %s", hash.ToString()); |
|
|
|
} |
|
|
@ -1233,7 +1233,7 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa |
|
|
|
// There is a similar check in CreateNewBlock() to prevent creating
|
|
|
|
// invalid blocks, however allowing such transactions into the mempool
|
|
|
|
// can be exploited as a DoS attack.
|
|
|
|
if (!ContextualCheckInputs(tx, state, view, true, MANDATORY_SCRIPT_VERIFY_FLAGS, true)) |
|
|
|
if (!ContextualCheckInputs(tx, state, view, true, MANDATORY_SCRIPT_VERIFY_FLAGS, true, Params().GetConsensus())) |
|
|
|
{ |
|
|
|
return error("AcceptToMemoryPool: BUG! PLEASE REPORT THIS! ConnectInputs failed against MANDATORY but not STANDARD flags %s", hash.ToString()); |
|
|
|
} |
|
|
@ -1604,7 +1604,7 @@ bool CScriptCheck::operator()() { |
|
|
|
return true; |
|
|
|
} |
|
|
|
|
|
|
|
bool NonContextualCheckInputs(const CTransaction& tx, CValidationState &state, const CCoinsViewCache &inputs, bool fScriptChecks, unsigned int flags, bool cacheStore, std::vector<CScriptCheck> *pvChecks) |
|
|
|
bool NonContextualCheckInputs(const CTransaction& tx, CValidationState &state, const CCoinsViewCache &inputs, bool fScriptChecks, unsigned int flags, bool cacheStore, const Consensus::Params& consensusParams, std::vector<CScriptCheck> *pvChecks) |
|
|
|
{ |
|
|
|
if (!tx.IsCoinBase()) |
|
|
|
{ |
|
|
@ -1630,7 +1630,8 @@ bool NonContextualCheckInputs(const CTransaction& tx, CValidationState &state, c |
|
|
|
|
|
|
|
if (coins->IsCoinBase()) { |
|
|
|
// Ensure that coinbases cannot be spent to transparent outputs
|
|
|
|
if (!tx.vout.empty()) { |
|
|
|
// Disabled on regtest
|
|
|
|
if (consensusParams.coinbaseMustBeProtected && !tx.vout.empty()) { |
|
|
|
return state.Invalid( |
|
|
|
error("CheckInputs(): tried to spend coinbase with transparent outputs"), |
|
|
|
REJECT_INVALID, "bad-txns-coinbase-spend-has-transparent-outputs"); |
|
|
@ -1712,7 +1713,7 @@ bool NonContextualCheckInputs(const CTransaction& tx, CValidationState &state, c |
|
|
|
return true; |
|
|
|
} |
|
|
|
|
|
|
|
bool ContextualCheckInputs(const CTransaction& tx, CValidationState &state, const CCoinsViewCache &inputs, bool fScriptChecks, unsigned int flags, bool cacheStore, std::vector<CScriptCheck> *pvChecks) |
|
|
|
bool ContextualCheckInputs(const CTransaction& tx, CValidationState &state, const CCoinsViewCache &inputs, bool fScriptChecks, unsigned int flags, bool cacheStore, const Consensus::Params& consensusParams, std::vector<CScriptCheck> *pvChecks) |
|
|
|
{ |
|
|
|
if (!tx.IsCoinBase()) |
|
|
|
{ |
|
|
@ -1737,7 +1738,7 @@ bool ContextualCheckInputs(const CTransaction& tx, CValidationState &state, cons |
|
|
|
} |
|
|
|
|
|
|
|
return NonContextualCheckInputs( |
|
|
|
tx, state, inputs, fScriptChecks, flags, cacheStore, pvChecks |
|
|
|
tx, state, inputs, fScriptChecks, flags, cacheStore, consensusParams, pvChecks |
|
|
|
); |
|
|
|
} |
|
|
|
|
|
|
@ -2154,7 +2155,7 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin |
|
|
|
nFees += view.GetValueIn(tx)-tx.GetValueOut(); |
|
|
|
|
|
|
|
std::vector<CScriptCheck> vChecks; |
|
|
|
if (!ContextualCheckInputs(tx, state, view, fScriptChecks, flags, false, nScriptCheckThreads ? &vChecks : NULL)) |
|
|
|
if (!ContextualCheckInputs(tx, state, view, fScriptChecks, flags, false, chainparams.GetConsensus(), nScriptCheckThreads ? &vChecks : NULL)) |
|
|
|
return false; |
|
|
|
control.Add(vChecks); |
|
|
|
} |
|
|
|