Tweak block audit algo to reduce false positives

This commit is contained in:
Mononaut 2022-10-31 08:14:23 -06:00
parent 88fa6bffb5
commit 29f7c89c53
No known key found for this signature in database
GPG Key ID: A3F058E41374C04E

View File

@ -1,4 +1,4 @@
import logger from '../logger'; import config from '../config';
import { BlockExtended, TransactionExtended, MempoolBlockWithTransactions } from '../mempool.interfaces'; import { BlockExtended, TransactionExtended, MempoolBlockWithTransactions } from '../mempool.interfaces';
const PROPAGATION_MARGIN = 180; // in seconds, time since a transaction is first seen after which it is assumed to have propagated to all miners const PROPAGATION_MARGIN = 180; // in seconds, time since a transaction is first seen after which it is assumed to have propagated to all miners
@ -44,8 +44,6 @@ class Audit {
displacedWeight += (4000 - transactions[0].weight); displacedWeight += (4000 - transactions[0].weight);
logger.warn(`${fresh.length} fresh, ${Object.keys(isCensored).length} possibly censored, ${displacedWeight} displaced weight`);
// we can expect an honest miner to include 'displaced' transactions in place of recent arrivals and censored txs // we can expect an honest miner to include 'displaced' transactions in place of recent arrivals and censored txs
// these displaced transactions should occupy the first N weight units of the next projected block // these displaced transactions should occupy the first N weight units of the next projected block
let displacedWeightRemaining = displacedWeight; let displacedWeightRemaining = displacedWeight;
@ -73,6 +71,7 @@ class Audit {
// mark unexpected transactions in the mined block as 'added' // mark unexpected transactions in the mined block as 'added'
let overflowWeight = 0; let overflowWeight = 0;
let totalWeight = 0;
for (const tx of transactions) { for (const tx of transactions) {
if (inTemplate[tx.txid]) { if (inTemplate[tx.txid]) {
matches.push(tx.txid); matches.push(tx.txid);
@ -82,11 +81,13 @@ class Audit {
} }
overflowWeight += tx.weight; overflowWeight += tx.weight;
} }
totalWeight += tx.weight
} }
// transactions missing from near the end of our template are probably not being censored // transactions missing from near the end of our template are probably not being censored
let overflowWeightRemaining = overflowWeight; let overflowWeightRemaining = overflowWeight - (config.MEMPOOL.BLOCK_WEIGHT_UNITS - totalWeight);
let lastOverflowRate = 1.00; let maxOverflowRate = 0;
let rateThreshold = 0;
index = projectedBlocks[0].transactionIds.length - 1; index = projectedBlocks[0].transactionIds.length - 1;
while (index >= 0) { while (index >= 0) {
const txid = projectedBlocks[0].transactionIds[index]; const txid = projectedBlocks[0].transactionIds[index];
@ -94,8 +95,11 @@ class Audit {
if (isCensored[txid]) { if (isCensored[txid]) {
delete isCensored[txid]; delete isCensored[txid];
} }
lastOverflowRate = mempool[txid].effectiveFeePerVsize; if (mempool[txid].effectiveFeePerVsize > maxOverflowRate) {
} else if (Math.floor(mempool[txid].effectiveFeePerVsize * 100) <= Math.ceil(lastOverflowRate * 100)) { // tolerance of 0.01 sat/vb maxOverflowRate = mempool[txid].effectiveFeePerVsize;
rateThreshold = (Math.ceil(maxOverflowRate * 100) / 100) + 0.005
}
} else if (mempool[txid].effectiveFeePerVsize <= rateThreshold) { // tolerance of 0.01 sat/vb + rounding
if (isCensored[txid]) { if (isCensored[txid]) {
delete isCensored[txid]; delete isCensored[txid];
} }