Merge pull request #5788 from daira/orchard-nullifier-check

Orchard nullifier and anchor consistency checks
This commit is contained in:
ebfull 2022-04-04 08:20:17 -06:00 committed by GitHub
commit a4cc6ad3d0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 8 additions and 13 deletions

View File

@ -1823,7 +1823,13 @@ bool AcceptToMemoryPool(
if (pool.exists(hash))
return state.Invalid(false, REJECT_ALREADY_KNOWN, "txn-already-in-mempool");
// Check for conflicts with in-memory transactions
// Check for conflicts with in-memory transactions.
// This is redundant with the call to HaveInputs (for non-coinbase transactions)
// below, but we do it here for consistency with Bitcoin and because this check
// doesn't require loading the coins view.
// We don't do the corresponding check for nullifiers, because that would also
// be redundant, and we have no need to avoid semantic conflicts with Bitcoin
// backports in the case of the shielded protocol.
for (unsigned int i = 0; i < tx.vin.size(); i++)
{
COutPoint outpoint = tx.vin[i].prevout;
@ -1833,18 +1839,6 @@ bool AcceptToMemoryPool(
return state.Invalid(false, REJECT_CONFLICT, "txn-mempool-conflict");
}
}
for (const JSDescription &joinsplit : tx.vJoinSplit) {
for (const uint256 &nf : joinsplit.nullifiers) {
if (pool.nullifierExists(nf, SPROUT)) {
return false;
}
}
}
for (const SpendDescription &spendDescription : tx.vShieldedSpend) {
if (pool.nullifierExists(spendDescription.nullifier, SAPLING)) {
return false;
}
}
{
CCoinsView dummy;

View File

@ -652,6 +652,7 @@ void CTxMemPool::check(const CCoinsViewCache *pcoins) const
checkNullifiers(SPROUT);
checkNullifiers(SAPLING);
checkNullifiers(ORCHARD);
assert(totalTxSize == checkTotal);
assert(innerUsage == cachedInnerUsage);