Skip to content

Commit 5b1fffd

Browse files
authored
fix: keep a table of pox tx counts (#2462)
* fix: optimize pox tx counts * fix: use table in read query
1 parent 4d86cce commit 5b1fffd

3 files changed

Lines changed: 68 additions & 6 deletions

File tree

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/** @param { import("node-pg-migrate").MigrationBuilder } pgm */
2+
exports.up = pgm => {
3+
pgm.createTable('burn_block_pox_tx_counts', {
4+
recipient: {
5+
type: 'text',
6+
notNull: true,
7+
primaryKey: true,
8+
},
9+
count: {
10+
type: 'integer',
11+
notNull: true,
12+
default: 0,
13+
},
14+
});
15+
pgm.sql(`
16+
INSERT INTO burn_block_pox_tx_counts (recipient, count)
17+
(SELECT recipient, COUNT(*) AS count FROM burn_block_pox_txs WHERE canonical = true GROUP BY recipient)
18+
`);
19+
};
20+
21+
exports.down = pgm => {
22+
pgm.dropTable('burn_block_pox_tx_counts');
23+
};

src/datastore/pg-store-v2.ts

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -230,8 +230,23 @@ export class PgStoreV2 extends BasePgStoreModule {
230230
: sql`burn_block_height = ${args.block.height}`
231231
: sql`TRUE`;
232232
const recipientFilter = args.recipient ? sql`recipient = ${args.recipient}` : sql`TRUE`;
233+
const countQuery =
234+
args.recipient && !args.block
235+
? sql`
236+
SELECT COALESCE(count, 0)::int AS count
237+
FROM burn_block_pox_tx_counts
238+
WHERE recipient = ${args.recipient}
239+
`
240+
: sql`
241+
SELECT COUNT(*)::int AS count
242+
FROM burn_block_pox_txs
243+
WHERE ${blockFilter} AND ${recipientFilter}
244+
`;
233245
const results = await sql<(DbBurnBlockPoxTx & { total: number })[]>`
234-
SELECT *, COUNT(*) OVER()::int AS total
246+
WITH total_count AS (
247+
${countQuery}
248+
)
249+
SELECT *, (SELECT count FROM total_count) AS total
235250
FROM burn_block_pox_txs
236251
WHERE ${blockFilter} AND ${recipientFilter}
237252
ORDER BY burn_block_height DESC, tx_id ASC

src/datastore/pg-write-store.ts

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -657,8 +657,20 @@ export class PgWriteStore extends PgStore {
657657
async updateBurnBlockPoxTxs(args: { burnBlockPoxTxs: DbBurnBlockPoxTx[] }): Promise<void> {
658658
if (args.burnBlockPoxTxs.length === 0) return;
659659
await this.sql`
660-
INSERT INTO burn_block_pox_txs ${this.sql(args.burnBlockPoxTxs)}
661-
ON CONFLICT ON CONSTRAINT burn_block_pox_txs_unique_idx DO NOTHING
660+
WITH inserts AS (
661+
INSERT INTO burn_block_pox_txs ${this.sql(args.burnBlockPoxTxs)}
662+
ON CONFLICT ON CONSTRAINT burn_block_pox_txs_unique_idx DO NOTHING
663+
RETURNING recipient, canonical
664+
),
665+
count_deltas AS (
666+
SELECT recipient, COUNT(*) AS count
667+
FROM inserts
668+
WHERE canonical = true
669+
GROUP BY recipient
670+
)
671+
INSERT INTO burn_block_pox_tx_counts (recipient, count)
672+
(SELECT recipient, count FROM count_deltas)
673+
ON CONFLICT (recipient) DO UPDATE SET count = burn_block_pox_tx_counts.count + EXCLUDED.count
662674
`;
663675
}
664676

@@ -3716,9 +3728,21 @@ export class PgWriteStore extends PgStore {
37163728
});
37173729
q.enqueue(async () => {
37183730
await sql`
3719-
UPDATE burn_block_pox_txs
3720-
SET canonical = ${canonical}
3721-
WHERE burn_block_hash = ${burnBlockHash} AND canonical != ${canonical}
3731+
WITH updates AS (
3732+
UPDATE burn_block_pox_txs
3733+
SET canonical = ${canonical}
3734+
WHERE burn_block_hash = ${burnBlockHash} AND canonical != ${canonical}
3735+
RETURNING recipient
3736+
),
3737+
count_deltas AS (
3738+
SELECT recipient, COUNT(*) AS count
3739+
FROM updates
3740+
GROUP BY recipient
3741+
)
3742+
UPDATE burn_block_pox_tx_counts AS pc
3743+
SET count = ${canonical ? sql`pc.count + cd.count` : sql`pc.count - cd.count`}
3744+
FROM count_deltas AS cd
3745+
WHERE pc.recipient = cd.recipient
37223746
`;
37233747
});
37243748

0 commit comments

Comments
 (0)