From 0a99c801506186a997710978844d9e5f94ff1635 Mon Sep 17 00:00:00 2001 From: Duke Leto Date: Sat, 23 Jan 2021 22:51:57 -0500 Subject: [PATCH] Optimize mempool by removing unnecessary sprout checks --- src/txmempool.cpp | 67 ++++------------------------------------------- 1 file changed, 5 insertions(+), 62 deletions(-) diff --git a/src/txmempool.cpp b/src/txmempool.cpp index e3c68dd42..0cc945b0c 100644 --- a/src/txmempool.cpp +++ b/src/txmempool.cpp @@ -127,11 +127,6 @@ bool CTxMemPool::addUnchecked(const uint256& hash, const CTxMemPoolEntry &entry, mapNextTx[tx.vin[i].prevout] = CInPoint(&tx, i); } } - BOOST_FOREACH(const JSDescription &joinsplit, tx.vjoinsplit) { - BOOST_FOREACH(const uint256 &nf, joinsplit.nullifiers) { - mapSproutNullifiers[nf] = &tx; - } - } for (const SpendDescription &spendDescription : tx.vShieldedSpend) { mapSaplingNullifiers[spendDescription.nullifier] = &tx; } @@ -332,9 +327,8 @@ bool CTxMemPool::removeSpentIndex(const uint256 txhash) return true; } -void CTxMemPool::remove(const CTransaction &origTx, std::list& removed, bool fRecursive) -{ - // Remove transaction from memory pool +// Remove transaction from memory pool +void CTxMemPool::remove(const CTransaction &origTx, std::list& removed, bool fRecursive) { { LOCK(cs); std::deque txToRemove; @@ -369,11 +363,8 @@ void CTxMemPool::remove(const CTransaction &origTx, std::list& rem mapRecentlyAddedTx.erase(hash); BOOST_FOREACH(const CTxIn& txin, tx.vin) mapNextTx.erase(txin.prevout); - BOOST_FOREACH(const JSDescription& joinsplit, tx.vjoinsplit) { - BOOST_FOREACH(const uint256& nf, joinsplit.nullifiers) { - mapSproutNullifiers.erase(nf); - } - } + + // remove each Sapling nullifier associated with this shielded spend for (const SpendDescription &spendDescription : tx.vShieldedSpend) { mapSaplingNullifiers.erase(spendDescription.nullifier); } @@ -440,14 +431,6 @@ void CTxMemPool::removeWithAnchor(const uint256 &invalidRoot, ShieldedType type) for (indexed_transaction_set::const_iterator it = mapTx.begin(); it != mapTx.end(); it++) { const CTransaction& tx = it->GetTx(); switch (type) { - case SPROUT: - BOOST_FOREACH(const JSDescription& joinsplit, tx.vjoinsplit) { - if (joinsplit.anchor == invalidRoot) { - transactionsToRemove.push_back(tx); - break; - } - } - break; case SAPLING: BOOST_FOREACH(const SpendDescription& spendDescription, tx.vShieldedSpend) { if (spendDescription.anchor == invalidRoot) { @@ -484,17 +467,7 @@ void CTxMemPool::removeConflicts(const CTransaction &tx, std::list } } - BOOST_FOREACH(const JSDescription &joinsplit, tx.vjoinsplit) { - BOOST_FOREACH(const uint256 &nf, joinsplit.nullifiers) { - std::map::iterator it = mapSproutNullifiers.find(nf); - if (it != mapSproutNullifiers.end()) { - const CTransaction &txConflict = *it->second; - if (txConflict != tx) { - remove(txConflict, removed, true); - } - } - } - } + // remove conflicting Sapling z2z tx's for (const SpendDescription &spendDescription : tx.vShieldedSpend) { std::map::iterator it = mapSaplingNullifiers.find(spendDescription.nullifier); if (it != mapSaplingNullifiers.end()) { @@ -639,30 +612,6 @@ void CTxMemPool::check(const CCoinsViewCache *pcoins) const i++; } - - /* - boost::unordered_map intermediates; - BOOST_FOREACH(const JSDescription &joinsplit, tx.vjoinsplit) { - BOOST_FOREACH(const uint256 &nf, joinsplit.nullifiers) { - assert(!pcoins->GetNullifier(nf, SPROUT)); - } - - SproutMerkleTree tree; - auto it = intermediates.find(joinsplit.anchor); - if (it != intermediates.end()) { - tree = it->second; - } else { - assert(pcoins->GetSproutAnchorAt(joinsplit.anchor, tree)); - } - - BOOST_FOREACH(const uint256& commitment, joinsplit.commitments) - { - tree.append(commitment); - } - - intermediates.insert(std::make_pair(tree.root(), tree)); - } - */ for (const SpendDescription &spendDescription : tx.vShieldedSpend) { SaplingMerkleTree tree; @@ -706,7 +655,6 @@ void CTxMemPool::check(const CCoinsViewCache *pcoins) const assert(it->first == it->second.ptx->vin[it->second.n].prevout); } - checkNullifiers(SPROUT); checkNullifiers(SAPLING); assert(totalTxSize == checkTotal); @@ -717,9 +665,6 @@ void CTxMemPool::checkNullifiers(ShieldedType type) const { const std::map* mapToUse; switch (type) { - case SPROUT: - mapToUse = &mapSproutNullifiers; - break; case SAPLING: mapToUse = &mapSaplingNullifiers; break; @@ -839,8 +784,6 @@ bool CTxMemPool::HasNoInputsOf(const CTransaction &tx) const bool CTxMemPool::nullifierExists(const uint256& nullifier, ShieldedType type) const { switch (type) { - case SPROUT: - return mapSproutNullifiers.count(nullifier); case SAPLING: return mapSaplingNullifiers.count(nullifier); default: