Limit GBT: fix on-demand CPFP calculation

This commit is contained in:
Mononaut 2024-01-08 00:56:48 +00:00
parent 07c76d084e
commit 8f2e1de578
No known key found for this signature in database
GPG Key ID: A3F058E41374C04E
3 changed files with 13 additions and 13 deletions

View File

@ -1,4 +1,5 @@
import { CpfpInfo, MempoolTransactionExtended } from '../mempool.interfaces'; import { CpfpInfo, MempoolTransactionExtended } from '../mempool.interfaces';
import memPool from './mempool';
const CPFP_UPDATE_INTERVAL = 60_000; // update CPFP info at most once per 60s per transaction const CPFP_UPDATE_INTERVAL = 60_000; // update CPFP info at most once per 60s per transaction
const MAX_GRAPH_SIZE = 50; // the maximum number of in-mempool relatives to consider const MAX_GRAPH_SIZE = 50; // the maximum number of in-mempool relatives to consider
@ -77,8 +78,8 @@ export function calculateCpfp(tx: MempoolTransactionExtended, mempool: { [txid:
function mempoolToGraphTx(tx: MempoolTransactionExtended): GraphTx { function mempoolToGraphTx(tx: MempoolTransactionExtended): GraphTx {
return { return {
...tx, ...tx,
depends: [], depends: tx.vin.map(v => v.txid),
spentby: [], spentby: tx.vout.map((v, i) => memPool.getFromSpendMap(tx.txid, i)).map(tx => tx?.txid).filter(txid => txid != null) as string[],
ancestorMap: new Map(), ancestorMap: new Map(),
fees: { fees: {
base: tx.fee, base: tx.fee,
@ -176,7 +177,7 @@ function calculateCpfpCluster(txid: string, graph: Map<string, GraphTx>): Map<st
let bestCluster = new Map<string, GraphTx>(best?.ancestorMap?.entries() || []); let bestCluster = new Map<string, GraphTx>(best?.ancestorMap?.entries() || []);
while (sortedRelatives.length && best && (best.txid !== tx.txid && !best.ancestorMap.has(tx.txid)) && maxIterations > 0) { while (sortedRelatives.length && best && (best.txid !== tx.txid && !best.ancestorMap.has(tx.txid)) && maxIterations > 0) {
maxIterations--; maxIterations--;
if (bestCluster && bestCluster.has(tx.txid)) { if ((best && best.txid === tx.txid) || (bestCluster && bestCluster.has(tx.txid))) {
break; break;
} else { } else {
// Remove this cluster (it doesn't include our target tx) // Remove this cluster (it doesn't include our target tx)
@ -195,6 +196,8 @@ function calculateCpfpCluster(txid: string, graph: Map<string, GraphTx>): Map<st
} }
} }
bestCluster.set(tx.txid, tx);
return bestCluster; return bestCluster;
} }

View File

@ -420,16 +420,6 @@ class MempoolBlocks {
block: blockIndex, block: blockIndex,
vsize: totalVsize + (mempoolTx.vsize / 2), vsize: totalVsize + (mempoolTx.vsize / 2),
}; };
if (!mempoolTx.cpfpChecked) {
if (mempoolTx.ancestors?.length) {
mempoolTx.ancestors = [];
}
if (mempoolTx.descendants?.length) {
mempoolTx.descendants = [];
}
mempoolTx.bestDescendant = null;
mempoolTx.cpfpChecked = true;
}
const acceleration = accelerations[txid]; const acceleration = accelerations[txid];
if (isAccelerated[txid] || (acceleration && (!accelerationPool || acceleration.pools.includes(accelerationPool)))) { if (isAccelerated[txid] || (acceleration && (!accelerationPool || acceleration.pools.includes(accelerationPool)))) {

View File

@ -91,6 +91,10 @@ class Mempool {
return this.spendMap; return this.spendMap;
} }
public getFromSpendMap(txid, index): MempoolTransactionExtended | void {
return this.spendMap.get(`${txid}:${index}`);
}
public async $setMempool(mempoolData: { [txId: string]: MempoolTransactionExtended }) { public async $setMempool(mempoolData: { [txId: string]: MempoolTransactionExtended }) {
this.mempoolCache = mempoolData; this.mempoolCache = mempoolData;
let count = 0; let count = 0;
@ -113,6 +117,9 @@ class Mempool {
await redisCache.$addTransaction(this.mempoolCache[txid]); await redisCache.$addTransaction(this.mempoolCache[txid]);
} }
this.mempoolCache[txid].flags = Common.getTransactionFlags(this.mempoolCache[txid]); this.mempoolCache[txid].flags = Common.getTransactionFlags(this.mempoolCache[txid]);
this.mempoolCache[txid].cpfpChecked = false;
this.mempoolCache[txid].cpfpDirty = true;
this.mempoolCache[txid].cpfpUpdated = undefined;
} }
if (config.MEMPOOL.CACHE_ENABLED && config.REDIS.ENABLED) { if (config.MEMPOOL.CACHE_ENABLED && config.REDIS.ENABLED) {
await redisCache.$flushTransactions(); await redisCache.$flushTransactions();