handle stale transactions in block templates
This commit is contained in:
		
							parent
							
								
									5681ae3f5c
								
							
						
					
					
						commit
						1fd85b729d
					
				@ -43,7 +43,9 @@ class DiskCache {
 | 
			
		||||
      const mempool = memPool.getMempool();
 | 
			
		||||
      const mempoolArray: TransactionExtended[] = [];
 | 
			
		||||
      for (const tx in mempool) {
 | 
			
		||||
        mempoolArray.push(mempool[tx]);
 | 
			
		||||
        if (mempool[tx] && !mempool[tx].deleteAfter) {
 | 
			
		||||
          mempoolArray.push(mempool[tx]);
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      Common.shuffleArray(mempoolArray);
 | 
			
		||||
 | 
			
		||||
@ -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 {
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user