Browse Source

Optimize mempool by removing unnecessary sprout checks

master
Duke Leto 3 years ago
parent
commit
0a99c80150
  1. 67
      src/txmempool.cpp

67
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<CTransaction>& removed, bool fRecursive)
{
// Remove transaction from memory pool
// Remove transaction from memory pool
void CTxMemPool::remove(const CTransaction &origTx, std::list<CTransaction>& removed, bool fRecursive) {
{
LOCK(cs);
std::deque<uint256> txToRemove;
@ -369,11 +363,8 @@ void CTxMemPool::remove(const CTransaction &origTx, std::list<CTransaction>& 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<CTransaction>
}
}
BOOST_FOREACH(const JSDescription &joinsplit, tx.vjoinsplit) {
BOOST_FOREACH(const uint256 &nf, joinsplit.nullifiers) {
std::map<uint256, const CTransaction*>::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<uint256, const CTransaction*>::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<uint256, SproutMerkleTree, CCoinsKeyHasher> 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<uint256, const CTransaction*>* 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:

Loading…
Cancel
Save