include per-tx pools in /accelerations endpoint
This commit is contained in:
		
							parent
							
								
									ba54bc9d15
								
							
						
					
					
						commit
						6494f890fe
					
				@ -1,6 +1,6 @@
 | 
			
		||||
import { GbtGenerator, GbtResult, ThreadTransaction as RustThreadTransaction } from '../../rust-gbt';
 | 
			
		||||
import logger from '../logger';
 | 
			
		||||
import { MempoolBlock, MempoolTransactionExtended, TransactionStripped, MempoolBlockWithTransactions, MempoolBlockDelta, Ancestor, CompactThreadTransaction, EffectiveFeeStats } from '../mempool.interfaces';
 | 
			
		||||
import { MempoolBlock, MempoolTransactionExtended, TransactionStripped, MempoolBlockWithTransactions, MempoolBlockDelta, Ancestor, CompactThreadTransaction, EffectiveFeeStats, PoolTag } from '../mempool.interfaces';
 | 
			
		||||
import { Common, OnlineFeeStatsCalculator } from './common';
 | 
			
		||||
import config from '../config';
 | 
			
		||||
import { Worker } from 'worker_threads';
 | 
			
		||||
@ -207,7 +207,7 @@ class MempoolBlocks {
 | 
			
		||||
    return mempoolBlockDeltas;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public async $makeBlockTemplates(newMempool: { [txid: string]: MempoolTransactionExtended }, saveResults: boolean = false, useAccelerations: boolean = false): Promise<MempoolBlockWithTransactions[]> {
 | 
			
		||||
  public async $makeBlockTemplates(newMempool: { [txid: string]: MempoolTransactionExtended }, saveResults: boolean = false, useAccelerations: boolean = false, accelerationPool?: number): Promise<MempoolBlockWithTransactions[]> {
 | 
			
		||||
    const start = Date.now();
 | 
			
		||||
 | 
			
		||||
    // reset mempool short ids
 | 
			
		||||
@ -225,7 +225,7 @@ class MempoolBlocks {
 | 
			
		||||
      if (entry.uid !== null && entry.uid !== undefined) {
 | 
			
		||||
        const stripped = {
 | 
			
		||||
          uid: entry.uid,
 | 
			
		||||
          fee: entry.fee + (useAccelerations ? (accelerations[entry.txid] || 0) : 0),
 | 
			
		||||
          fee: entry.fee + (useAccelerations && (!accelerationPool || accelerations[entry.txid]?.pools?.includes(accelerationPool)) ? (accelerations[entry.txid]?.feeDelta || 0) : 0),
 | 
			
		||||
          weight: (entry.adjustedVsize * 4),
 | 
			
		||||
          sigops: entry.sigops,
 | 
			
		||||
          feePerVsize: entry.adjustedFeePerVsize || entry.feePerVsize,
 | 
			
		||||
@ -298,7 +298,7 @@ class MempoolBlocks {
 | 
			
		||||
    const addedStripped: CompactThreadTransaction[] = addedAndChanged.filter(entry => entry.uid != null).map(entry => {
 | 
			
		||||
      return {
 | 
			
		||||
        uid: entry.uid || 0,
 | 
			
		||||
        fee: entry.fee + (useAccelerations ? (accelerations[entry.txid] || 0) : 0),
 | 
			
		||||
        fee: entry.fee + (useAccelerations ? (accelerations[entry.txid]?.feeDelta || 0) : 0),
 | 
			
		||||
        weight: (entry.adjustedVsize * 4),
 | 
			
		||||
        sigops: entry.sigops,
 | 
			
		||||
        feePerVsize: entry.adjustedFeePerVsize || entry.feePerVsize,
 | 
			
		||||
 | 
			
		||||
@ -23,7 +23,7 @@ class Mempool {
 | 
			
		||||
  private $asyncMempoolChangedCallback: ((newMempool: {[txId: string]: MempoolTransactionExtended; }, mempoolSize: number, newTransactions: MempoolTransactionExtended[],
 | 
			
		||||
    deletedTransactions: MempoolTransactionExtended[], accelerationDelta: string[]) => Promise<void>) | undefined;
 | 
			
		||||
 | 
			
		||||
  private accelerations: { [txId: string]: number } = {};
 | 
			
		||||
  private accelerations: { [txId: string]: Acceleration } = {};
 | 
			
		||||
 | 
			
		||||
  private txPerSecondArray: number[] = [];
 | 
			
		||||
  private txPerSecond: number = 0;
 | 
			
		||||
@ -332,7 +332,7 @@ class Mempool {
 | 
			
		||||
    this.clearTimer(timer);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public getAccelerations(): { [txid: string]: number } {
 | 
			
		||||
  public getAccelerations(): { [txid: string]: Acceleration } {
 | 
			
		||||
    return this.accelerations;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@ -346,15 +346,37 @@ class Mempool {
 | 
			
		||||
 | 
			
		||||
      const changed: string[] = [];
 | 
			
		||||
 | 
			
		||||
      const newAccelerationMap: { [txid: string]: number } = {};
 | 
			
		||||
      const newAccelerationMap: { [txid: string]: Acceleration } = {};
 | 
			
		||||
      for (const acceleration of newAccelerations) {
 | 
			
		||||
        newAccelerationMap[acceleration.txid] = acceleration.feeDelta;
 | 
			
		||||
        newAccelerationMap[acceleration.txid] = acceleration;
 | 
			
		||||
        if (this.accelerations[acceleration.txid] == null) {
 | 
			
		||||
          // new acceleration
 | 
			
		||||
          changed.push(acceleration.txid);
 | 
			
		||||
        } else if (this.accelerations[acceleration.txid] !== acceleration.feeDelta) {
 | 
			
		||||
        } else {
 | 
			
		||||
          if (this.accelerations[acceleration.txid].feeDelta !== acceleration.feeDelta) {
 | 
			
		||||
            // feeDelta changed
 | 
			
		||||
            changed.push(acceleration.txid);
 | 
			
		||||
          } else if (this.accelerations[acceleration.txid].pools?.length) {
 | 
			
		||||
            let poolsChanged = false;
 | 
			
		||||
            const pools = new Set();
 | 
			
		||||
            this.accelerations[acceleration.txid].pools.forEach(pool => {
 | 
			
		||||
              pools.add(pool);
 | 
			
		||||
            });
 | 
			
		||||
            acceleration.pools.forEach(pool => {
 | 
			
		||||
              if (!pools.has(pool)) {
 | 
			
		||||
                poolsChanged = true;
 | 
			
		||||
              } else {
 | 
			
		||||
                pools.delete(pool);
 | 
			
		||||
              }
 | 
			
		||||
            });
 | 
			
		||||
            if (pools.size > 0) {
 | 
			
		||||
              poolsChanged = true;
 | 
			
		||||
            }
 | 
			
		||||
            if (poolsChanged) {
 | 
			
		||||
              // pools changed
 | 
			
		||||
              changed.push(acceleration.txid);
 | 
			
		||||
            }
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -5,6 +5,7 @@ import { BlockExtended, PoolTag } from '../../mempool.interfaces';
 | 
			
		||||
export interface Acceleration {
 | 
			
		||||
  txid: string,
 | 
			
		||||
  feeDelta: number,
 | 
			
		||||
  pools: number[],
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class AccelerationApi {
 | 
			
		||||
@ -17,21 +18,12 @@ class AccelerationApi {
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public async $fetchPools(): Promise<PoolTag[]> {
 | 
			
		||||
    if (config.MEMPOOL_SERVICES.ACCELERATIONS) {
 | 
			
		||||
      const response = await query(`${config.MEMPOOL_SERVICES.API}/partners`);
 | 
			
		||||
      return (response as PoolTag[]) || [];
 | 
			
		||||
    } else {
 | 
			
		||||
      return [];
 | 
			
		||||
  public isAcceleratedBlock(block: BlockExtended, accelerations: Acceleration[]): boolean {
 | 
			
		||||
    let anyAccelerated = false;
 | 
			
		||||
    for (let i = 0; i < accelerations.length && !anyAccelerated; i++) {
 | 
			
		||||
      anyAccelerated = anyAccelerated || accelerations[i].pools?.includes(block.extras.pool.id);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public async $isAcceleratedBlock(block: BlockExtended): Promise<boolean> {
 | 
			
		||||
    const pools = await this.$fetchPools();
 | 
			
		||||
    if (block?.extras?.pool?.id == null) {
 | 
			
		||||
      return false;
 | 
			
		||||
    }
 | 
			
		||||
    return pools.reduce((match, tag) => match || tag.uniqueId === block.extras.pool.id, false);
 | 
			
		||||
    return anyAccelerated;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -22,6 +22,7 @@ import { deepClone } from '../utils/clone';
 | 
			
		||||
import priceUpdater from '../tasks/price-updater';
 | 
			
		||||
import { ApiPrice } from '../repositories/PricesRepository';
 | 
			
		||||
import accelerationApi from './services/acceleration';
 | 
			
		||||
import mempool from './mempool';
 | 
			
		||||
 | 
			
		||||
// valid 'want' subscriptions
 | 
			
		||||
const wantable = [
 | 
			
		||||
@ -657,7 +658,7 @@ class WebsocketHandler {
 | 
			
		||||
    if (config.MEMPOOL.AUDIT && memPool.isInSync()) {
 | 
			
		||||
      let projectedBlocks;
 | 
			
		||||
      let auditMempool = _memPool;
 | 
			
		||||
      const isAccelerated = config.MEMPOOL_SERVICES.ACCELERATIONS && await accelerationApi.$isAcceleratedBlock(block);
 | 
			
		||||
      const isAccelerated = config.MEMPOOL_SERVICES.ACCELERATIONS && accelerationApi.isAcceleratedBlock(block, Object.values(mempool.getAccelerations()));
 | 
			
		||||
      // 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 separateAudit = config.MEMPOOL.ADVANCED_GBT_AUDIT !== config.MEMPOOL.ADVANCED_GBT_MEMPOOL;
 | 
			
		||||
@ -667,7 +668,7 @@ class WebsocketHandler {
 | 
			
		||||
          if (config.MEMPOOL.RUST_GBT) {
 | 
			
		||||
            projectedBlocks = await mempoolBlocks.$oneOffRustBlockTemplates(auditMempool);
 | 
			
		||||
          } else {
 | 
			
		||||
            projectedBlocks = await mempoolBlocks.$makeBlockTemplates(auditMempool, false, isAccelerated);
 | 
			
		||||
            projectedBlocks = await mempoolBlocks.$makeBlockTemplates(auditMempool, false, isAccelerated, block.extras.pool.id);
 | 
			
		||||
          }
 | 
			
		||||
        } else {
 | 
			
		||||
          projectedBlocks = mempoolBlocks.updateMempoolBlocks(auditMempool, false);
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user