Avoid repeated tx classification work

This commit is contained in:
Mononaut 2023-12-17 09:57:15 +00:00
parent 472a86ffd4
commit c2f52ac1f3
No known key found for this signature in database
GPG Key ID: A3F058E41374C04E
2 changed files with 22 additions and 10 deletions

View File

@ -222,7 +222,25 @@ export class Common {
}
static getTransactionFlags(tx: TransactionExtended): number {
let flags = 0n;
let flags = tx.flags ? BigInt(tx.flags) : 0n;
// Update variable flags (CPFP, RBF)
if (tx.ancestors?.length) {
flags |= TransactionFlags.cpfp_child;
}
if (tx.descendants?.length) {
flags |= TransactionFlags.cpfp_parent;
}
if (rbfCache.getRbfTree(tx.txid)) {
flags |= TransactionFlags.replacement;
}
// Already processed static flags, no need to do it again
if (tx.flags) {
return Number(flags);
}
// Process static flags
if (tx.version === 1) {
flags |= TransactionFlags.v1;
} else if (tx.version === 2) {
@ -306,15 +324,7 @@ export class Common {
if (hasFakePubkey) {
flags |= TransactionFlags.fake_pubkey;
}
if (tx.ancestors?.length) {
flags |= TransactionFlags.cpfp_child;
}
if (tx.descendants?.length) {
flags |= TransactionFlags.cpfp_parent;
}
if (rbfCache.getRbfTree(tx.txid)) {
flags |= TransactionFlags.replacement;
}
// fast but bad heuristic to detect possible coinjoins
// (at least 5 inputs and 5 outputs, less than half of which are unique amounts, with no address reuse)
const addressReuse = Object.values(reusedAddresses).reduce((acc, count) => Math.max(acc, count), 0) > 1;
@ -335,6 +345,7 @@ export class Common {
static classifyTransaction(tx: TransactionExtended): TransactionClassified {
const flags = this.getTransactionFlags(tx);
tx.flags = flags;
return {
...this.stripTransaction(tx),
flags,

View File

@ -95,6 +95,7 @@ export interface TransactionExtended extends IEsploraApi.Transaction {
};
acceleration?: boolean;
uid?: number;
flags?: number;
}
export interface MempoolTransactionExtended extends TransactionExtended {