|
|
@ -1751,7 +1751,31 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa |
|
|
|
{ |
|
|
|
return error("AcceptToMemoryPool: CheckTransaction failed"); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Reject duplicate output proofs in a single ztx in mempool
|
|
|
|
// Migrate this to CheckTransaction() to make it a consensus requirement
|
|
|
|
{ |
|
|
|
set<libzcash::GrothProof> vSaplingOutputProof; |
|
|
|
BOOST_FOREACH(const OutputDescription& output, tx.vShieldedOutput) |
|
|
|
{ |
|
|
|
if (vSaplingOutputProof.count(output.zkproof)) |
|
|
|
return state.Invalid(error("AcceptToMemoryPool: duplicate output proof"),REJECT_DUPLICATE_OUTPUT_PROOF, "bad-txns-duplicate-output-proof"); |
|
|
|
vSaplingOutputProof.insert(output.zkproof); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// Reject duplicate spend proofs in a single ztx in mempool
|
|
|
|
// Migrate this to CheckTransaction() to make it a consensus requirement
|
|
|
|
{ |
|
|
|
set<libzcash::GrothProof> vSaplingSpendProof; |
|
|
|
BOOST_FOREACH(const SpendDescription& spend, tx.vShieldedSpend) |
|
|
|
{ |
|
|
|
if (vSaplingSpendProof.count(spend.zkproof)) |
|
|
|
return state.Invalid(error("AcceptToMemoryPool: duplicate spend proof"),REJECT_DUPLICATE_SPEND_PROOF, "bad-txns-duplicate-spend-proof"); |
|
|
|
vSaplingSpendProof.insert(spend.zkproof); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// DoS level set to 10 to be more forgiving.
|
|
|
|
// Check transaction contextually against the set of consensus rules which apply in the next block to be mined.
|
|
|
|
if (!ContextualCheckTransaction(0,0,0,tx, state, nextBlockHeight, (dosLevel == -1) ? 10 : dosLevel)) |
|
|
|