handle stale transactions in block templates

This commit is contained in:
Mononaut 2023-03-24 09:47:08 +09:00
parent 5681ae3f5c
commit 1fd85b729d
No known key found for this signature in database
GPG Key ID: A3F058E41374C04E
2 changed files with 14 additions and 5 deletions

View File

@ -43,8 +43,10 @@ class DiskCache {
const mempool = memPool.getMempool();
const mempoolArray: TransactionExtended[] = [];
for (const tx in mempool) {
if (mempool[tx] && !mempool[tx].deleteAfter) {
mempoolArray.push(mempool[tx]);
}
}
Common.shuffleArray(mempoolArray);

View File

@ -151,7 +151,7 @@ class MempoolBlocks {
// prepare a stripped down version of the mempool with only the minimum necessary data
// to reduce the overhead of passing this data to the worker thread
const strippedMempool: { [txid: string]: ThreadTransaction } = {};
Object.values(newMempool).forEach(entry => {
Object.values(newMempool).filter(tx => !tx.deleteAfter).forEach(entry => {
strippedMempool[entry.txid] = {
txid: entry.txid,
fee: entry.fee,
@ -186,7 +186,9 @@ class MempoolBlocks {
this.txSelectionWorker?.once('error', reject);
});
this.txSelectionWorker.postMessage({ type: 'set', mempool: strippedMempool });
const { blocks, clusters } = await workerResultPromise;
let { blocks, clusters } = await workerResultPromise;
// filter out stale transactions
blocks = blocks.map(block => block.filter(tx => (tx.txid && tx.txid in newMempool)));
// clean up thread error listener
this.txSelectionWorker?.removeListener('error', threadErrorListener);
@ -228,7 +230,9 @@ class MempoolBlocks {
this.txSelectionWorker?.once('error', reject);
});
this.txSelectionWorker.postMessage({ type: 'update', added: addedStripped, removed });
const { blocks, clusters } = await workerResultPromise;
let { blocks, clusters } = await workerResultPromise;
// filter out stale transactions
blocks = blocks.map(block => block.filter(tx => (tx.txid && tx.txid in newMempool)));
// clean up thread error listener
this.txSelectionWorker?.removeListener('error', threadErrorListener);
@ -243,7 +247,7 @@ class MempoolBlocks {
// update this thread's mempool with the results
blocks.forEach(block => {
block.forEach(tx => {
if (tx.txid in mempool) {
if (tx.txid && tx.txid in mempool) {
if (tx.effectiveFeePerVsize != null) {
mempool[tx.txid].effectiveFeePerVsize = tx.effectiveFeePerVsize;
}
@ -253,6 +257,9 @@ class MempoolBlocks {
const cluster = clusters[tx.cpfpRoot];
let matched = false;
cluster.forEach(txid => {
if (!txid || !mempool[txid]) {
return;
}
if (txid === tx.txid) {
matched = true;
} else {