fix drift in next block viz with mixed template algos
This commit is contained in:
		
							parent
							
								
									0293ed2b41
								
							
						
					
					
						commit
						e8c3273541
					
				@ -33,7 +33,7 @@ class MempoolBlocks {
 | 
			
		||||
    return this.mempoolBlockDeltas;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public updateMempoolBlocks(memPool: { [txid: string]: TransactionExtended }): void {
 | 
			
		||||
  public updateMempoolBlocks(memPool: { [txid: string]: TransactionExtended }, saveResults: boolean = false): MempoolBlockWithTransactions[] {
 | 
			
		||||
    const latestMempool = memPool;
 | 
			
		||||
    const memPoolArray: TransactionExtended[] = [];
 | 
			
		||||
    for (const i in latestMempool) {
 | 
			
		||||
@ -75,12 +75,16 @@ class MempoolBlocks {
 | 
			
		||||
    logger.debug('Mempool blocks calculated in ' + time / 1000 + ' seconds');
 | 
			
		||||
 | 
			
		||||
    const blocks = this.calculateMempoolBlocks(memPoolArray, this.mempoolBlocks);
 | 
			
		||||
    const deltas = this.calculateMempoolDeltas(this.mempoolBlocks, blocks);
 | 
			
		||||
 | 
			
		||||
    if (saveResults) {
 | 
			
		||||
      const deltas = this.calculateMempoolDeltas(this.mempoolBlocks, blocks);
 | 
			
		||||
      this.mempoolBlocks = blocks;
 | 
			
		||||
      this.mempoolBlockDeltas = deltas;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return blocks;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private calculateMempoolBlocks(transactionsSorted: TransactionExtended[], prevBlocks: MempoolBlockWithTransactions[]): MempoolBlockWithTransactions[] {
 | 
			
		||||
    const mempoolBlocks: MempoolBlockWithTransactions[] = [];
 | 
			
		||||
    let blockWeight = 0;
 | 
			
		||||
@ -143,7 +147,7 @@ class MempoolBlocks {
 | 
			
		||||
    return mempoolBlockDeltas;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public async makeBlockTemplates(newMempool: { [txid: string]: TransactionExtended }): Promise<void> {
 | 
			
		||||
  public async makeBlockTemplates(newMempool: { [txid: string]: TransactionExtended }, saveResults: boolean = false): Promise<MempoolBlockWithTransactions[]> {
 | 
			
		||||
    // 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 } = {};
 | 
			
		||||
@ -184,19 +188,21 @@ class MempoolBlocks {
 | 
			
		||||
      this.txSelectionWorker.postMessage({ type: 'set', mempool: strippedMempool });
 | 
			
		||||
      const { blocks, clusters } = await workerResultPromise;
 | 
			
		||||
 | 
			
		||||
      this.processBlockTemplates(newMempool, blocks, clusters);
 | 
			
		||||
 | 
			
		||||
      // clean up thread error listener
 | 
			
		||||
      this.txSelectionWorker?.removeListener('error', threadErrorListener);
 | 
			
		||||
 | 
			
		||||
      return this.processBlockTemplates(newMempool, blocks, clusters, saveResults);
 | 
			
		||||
    } catch (e) {
 | 
			
		||||
      logger.err('makeBlockTemplates failed. ' + (e instanceof Error ? e.message : e));
 | 
			
		||||
    }
 | 
			
		||||
    return this.mempoolBlocks;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public async updateBlockTemplates(newMempool: { [txid: string]: TransactionExtended }, added: TransactionExtended[], removed: string[]): Promise<void> {
 | 
			
		||||
  public async updateBlockTemplates(newMempool: { [txid: string]: TransactionExtended }, added: TransactionExtended[], removed: string[], saveResults: boolean = false): Promise<void> {
 | 
			
		||||
    if (!this.txSelectionWorker) {
 | 
			
		||||
      // need to reset the worker
 | 
			
		||||
      return this.makeBlockTemplates(newMempool);
 | 
			
		||||
      this.makeBlockTemplates(newMempool, saveResults);
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
    // 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
 | 
			
		||||
@ -224,16 +230,16 @@ class MempoolBlocks {
 | 
			
		||||
      this.txSelectionWorker.postMessage({ type: 'update', added: addedStripped, removed });
 | 
			
		||||
      const { blocks, clusters } = await workerResultPromise;
 | 
			
		||||
 | 
			
		||||
      this.processBlockTemplates(newMempool, blocks, clusters);
 | 
			
		||||
 | 
			
		||||
      // clean up thread error listener
 | 
			
		||||
      this.txSelectionWorker?.removeListener('error', threadErrorListener);
 | 
			
		||||
 | 
			
		||||
      this.processBlockTemplates(newMempool, blocks, clusters, saveResults);
 | 
			
		||||
    } catch (e) {
 | 
			
		||||
      logger.err('updateBlockTemplates failed. ' + (e instanceof Error ? e.message : e));
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private processBlockTemplates(mempool, blocks, clusters): void {
 | 
			
		||||
  private processBlockTemplates(mempool, blocks, clusters, saveResults): MempoolBlockWithTransactions[] {
 | 
			
		||||
    // update this thread's mempool with the results
 | 
			
		||||
    blocks.forEach(block => {
 | 
			
		||||
      block.forEach(tx => {
 | 
			
		||||
@ -278,12 +284,15 @@ class MempoolBlocks {
 | 
			
		||||
      }).filter(tx => !!tx), undefined, undefined, blockIndex);
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    if (saveResults) {
 | 
			
		||||
      const deltas = this.calculateMempoolDeltas(this.mempoolBlocks, mempoolBlocks);
 | 
			
		||||
 | 
			
		||||
      this.mempoolBlocks = mempoolBlocks;
 | 
			
		||||
      this.mempoolBlockDeltas = deltas;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return mempoolBlocks;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private dataToMempoolBlocks(transactions: TransactionExtended[],
 | 
			
		||||
    blockSize: number | undefined, blockWeight: number | undefined, blocksIndex: number): MempoolBlockWithTransactions {
 | 
			
		||||
    let totalSize = blockSize || 0;
 | 
			
		||||
 | 
			
		||||
@ -251,9 +251,9 @@ class WebsocketHandler {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (config.MEMPOOL.ADVANCED_GBT_MEMPOOL) {
 | 
			
		||||
      await mempoolBlocks.updateBlockTemplates(newMempool, newTransactions, deletedTransactions.map(tx => tx.txid));
 | 
			
		||||
      await mempoolBlocks.updateBlockTemplates(newMempool, newTransactions, deletedTransactions.map(tx => tx.txid), true);
 | 
			
		||||
    } else {
 | 
			
		||||
      mempoolBlocks.updateMempoolBlocks(newMempool);
 | 
			
		||||
      mempoolBlocks.updateMempoolBlocks(newMempool, true);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const mBlocks = mempoolBlocks.getMempoolBlocks();
 | 
			
		||||
@ -418,16 +418,18 @@ class WebsocketHandler {
 | 
			
		||||
 | 
			
		||||
    const _memPool = memPool.getMempool();
 | 
			
		||||
 | 
			
		||||
    let projectedBlocks;
 | 
			
		||||
    // template calculation functions have mempool side effects, so calculate audits using
 | 
			
		||||
    // a cloned copy of the mempool if we're running a different algorithm for mempool updates
 | 
			
		||||
    const auditMempool = (config.MEMPOOL.ADVANCED_GBT_AUDIT === config.MEMPOOL.ADVANCED_GBT_MEMPOOL) ? _memPool : JSON.parse(JSON.stringify(_memPool));
 | 
			
		||||
    if (config.MEMPOOL.ADVANCED_GBT_AUDIT) {
 | 
			
		||||
      await mempoolBlocks.makeBlockTemplates(_memPool);
 | 
			
		||||
      projectedBlocks = await mempoolBlocks.makeBlockTemplates(auditMempool, false);
 | 
			
		||||
    } else {
 | 
			
		||||
      mempoolBlocks.updateMempoolBlocks(_memPool);
 | 
			
		||||
      projectedBlocks = mempoolBlocks.updateMempoolBlocks(auditMempool, false);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (Common.indexingEnabled() && memPool.isInSync()) {
 | 
			
		||||
      const projectedBlocks = mempoolBlocks.getMempoolBlocksWithTransactions();
 | 
			
		||||
 | 
			
		||||
      const { censored, added, fresh, score } = Audit.auditBlock(transactions, projectedBlocks, _memPool);
 | 
			
		||||
      const { censored, added, fresh, score } = Audit.auditBlock(transactions, projectedBlocks, auditMempool);
 | 
			
		||||
      const matchRate = Math.round(score * 100 * 100) / 100;
 | 
			
		||||
 | 
			
		||||
      const stripped = projectedBlocks[0]?.transactions ? projectedBlocks[0].transactions.map((tx) => {
 | 
			
		||||
@ -471,9 +473,9 @@ class WebsocketHandler {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (config.MEMPOOL.ADVANCED_GBT_MEMPOOL) {
 | 
			
		||||
      await mempoolBlocks.updateBlockTemplates(_memPool, [], removed);
 | 
			
		||||
      await mempoolBlocks.updateBlockTemplates(_memPool, [], removed, true);
 | 
			
		||||
    } else {
 | 
			
		||||
      mempoolBlocks.updateMempoolBlocks(_memPool);
 | 
			
		||||
      mempoolBlocks.updateMempoolBlocks(_memPool, true);
 | 
			
		||||
    }
 | 
			
		||||
    const mBlocks = mempoolBlocks.getMempoolBlocks();
 | 
			
		||||
    const mBlockDeltas = mempoolBlocks.getMempoolBlockDeltas();
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user