tighten sanity checks in block audit

This commit is contained in:
Mononaut 2023-03-24 09:49:02 +09:00
parent 28de93d0ff
commit 61f24562fd
No known key found for this signature in database
GPG Key ID: A3F058E41374C04E

View File

@ -39,17 +39,19 @@ class Audit {
} else { } else {
isCensored[txid] = true; isCensored[txid] = true;
} }
displacedWeight += mempool[txid].weight; displacedWeight += mempool[txid]?.weight || 0;
} else { } else {
matchedWeight += mempool[txid].weight; matchedWeight += mempool[txid]?.weight || 0;
} }
projectedWeight += mempool[txid].weight; projectedWeight += mempool[txid]?.weight || 0;
inTemplate[txid] = true; inTemplate[txid] = true;
} }
displacedWeight += (4000 - transactions[0].weight); if (transactions[0]) {
projectedWeight += transactions[0].weight; displacedWeight += (4000 - transactions[0].weight);
matchedWeight += transactions[0].weight; projectedWeight += transactions[0].weight;
matchedWeight += transactions[0].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
@ -59,19 +61,22 @@ class Audit {
let failures = 0; let failures = 0;
while (projectedBlocks[1] && index < projectedBlocks[1].transactionIds.length && failures < 500) { while (projectedBlocks[1] && index < projectedBlocks[1].transactionIds.length && failures < 500) {
const txid = projectedBlocks[1].transactionIds[index]; const txid = projectedBlocks[1].transactionIds[index];
const fits = (mempool[txid].weight - displacedWeightRemaining) < 4000; const tx = mempool[txid];
const feeMatches = mempool[txid].effectiveFeePerVsize >= lastFeeRate; if (tx) {
if (fits || feeMatches) { const fits = (tx.weight - displacedWeightRemaining) < 4000;
isDisplaced[txid] = true; const feeMatches = tx.effectiveFeePerVsize >= lastFeeRate;
if (fits) { if (fits || feeMatches) {
lastFeeRate = Math.min(lastFeeRate, mempool[txid].effectiveFeePerVsize); isDisplaced[txid] = true;
if (fits) {
lastFeeRate = Math.min(lastFeeRate, tx.effectiveFeePerVsize);
}
if (tx.firstSeen == null || (now - (tx?.firstSeen || 0)) > PROPAGATION_MARGIN) {
displacedWeightRemaining -= tx.weight;
}
failures = 0;
} else {
failures++;
} }
if (mempool[txid].firstSeen == null || (now - (mempool[txid]?.firstSeen || 0)) > PROPAGATION_MARGIN) {
displacedWeightRemaining -= mempool[txid].weight;
}
failures = 0;
} else {
failures++;
} }
index++; index++;
} }
@ -108,20 +113,23 @@ class Audit {
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];
if (overflowWeightRemaining > 0) { const tx = mempool[txid];
if (isCensored[txid]) { if (tx) {
delete isCensored[txid]; if (overflowWeightRemaining > 0) {
} if (isCensored[txid]) {
if (mempool[txid].effectiveFeePerVsize > maxOverflowRate) { delete isCensored[txid];
maxOverflowRate = mempool[txid].effectiveFeePerVsize; }
rateThreshold = (Math.ceil(maxOverflowRate * 100) / 100) + 0.005; if (tx.effectiveFeePerVsize > maxOverflowRate) {
} maxOverflowRate = tx.effectiveFeePerVsize;
} else if (mempool[txid].effectiveFeePerVsize <= rateThreshold) { // tolerance of 0.01 sat/vb + rounding rateThreshold = (Math.ceil(maxOverflowRate * 100) / 100) + 0.005;
if (isCensored[txid]) { }
delete isCensored[txid]; } else if (tx.effectiveFeePerVsize <= rateThreshold) { // tolerance of 0.01 sat/vb + rounding
if (isCensored[txid]) {
delete isCensored[txid];
}
} }
overflowWeightRemaining -= (mempool[txid]?.weight || 0);
} }
overflowWeightRemaining -= (mempool[txid]?.weight || 0);
index--; index--;
} }