@aztec/p2p 0.69.0 → 0.69.1-devnet

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/dest/client/p2p_client.d.ts +6 -0
  2. package/dest/client/p2p_client.d.ts.map +1 -1
  3. package/dest/client/p2p_client.js +13 -3
  4. package/dest/mem_pools/attestation_pool/mocks.js +2 -2
  5. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +1 -1
  6. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +65 -49
  7. package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts.map +1 -1
  8. package/dest/mem_pools/tx_pool/memory_tx_pool.js +6 -2
  9. package/dest/mem_pools/tx_pool/priority.d.ts +8 -0
  10. package/dest/mem_pools/tx_pool/priority.d.ts.map +1 -0
  11. package/dest/mem_pools/tx_pool/priority.js +12 -0
  12. package/dest/mem_pools/tx_pool/tx_pool.d.ts +1 -1
  13. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +1 -1
  14. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +19 -3
  15. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +2 -3
  16. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  17. package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +16 -17
  18. package/dest/msg_validators/tx_validator/block_header_validator.d.ts +11 -0
  19. package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -0
  20. package/dest/msg_validators/tx_validator/block_header_validator.js +21 -0
  21. package/dest/msg_validators/tx_validator/data_validator.d.ts +2 -3
  22. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  23. package/dest/msg_validators/tx_validator/data_validator.js +5 -17
  24. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +4 -6
  25. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
  26. package/dest/msg_validators/tx_validator/double_spend_validator.js +16 -45
  27. package/dest/msg_validators/tx_validator/index.d.ts +1 -0
  28. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  29. package/dest/msg_validators/tx_validator/index.js +2 -1
  30. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +2 -3
  31. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  32. package/dest/msg_validators/tx_validator/metadata_validator.js +9 -18
  33. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +2 -3
  34. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
  35. package/dest/msg_validators/tx_validator/tx_proof_validator.js +8 -17
  36. package/dest/services/libp2p/libp2p_service.d.ts +1 -2
  37. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  38. package/dest/services/libp2p/libp2p_service.js +12 -11
  39. package/package.json +7 -7
  40. package/src/client/p2p_client.ts +20 -3
  41. package/src/mem_pools/attestation_pool/mocks.ts +2 -2
  42. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +68 -46
  43. package/src/mem_pools/tx_pool/memory_tx_pool.ts +5 -1
  44. package/src/mem_pools/tx_pool/priority.ts +13 -0
  45. package/src/mem_pools/tx_pool/tx_pool.ts +1 -1
  46. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +27 -5
  47. package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +16 -20
  48. package/src/msg_validators/tx_validator/block_header_validator.ts +25 -0
  49. package/src/msg_validators/tx_validator/data_validator.ts +7 -22
  50. package/src/msg_validators/tx_validator/double_spend_validator.ts +9 -45
  51. package/src/msg_validators/tx_validator/index.ts +1 -0
  52. package/src/msg_validators/tx_validator/metadata_validator.ts +9 -22
  53. package/src/msg_validators/tx_validator/tx_proof_validator.ts +12 -18
  54. package/src/services/libp2p/libp2p_service.ts +14 -11
@@ -1,6 +1,5 @@
1
1
  import { __esDecorate, __runInitializers } from "tslib";
2
- import { BlockAttestation, BlockProposal, EpochProofQuote, MerkleTreeId, PeerErrorSeverity, TopicTypeMap, Tx, TxHash, getTopicTypeForClientType, metricsTopicStrToLabels, } from '@aztec/circuit-types';
3
- import { P2PClientType } from '@aztec/circuit-types';
2
+ import { BlockAttestation, BlockProposal, EpochProofQuote, MerkleTreeId, P2PClientType, PeerErrorSeverity, TopicTypeMap, Tx, TxHash, getTopicTypeForClientType, metricsTopicStrToLabels, } from '@aztec/circuit-types';
4
3
  import { Fr } from '@aztec/circuits.js';
5
4
  import { createLogger } from '@aztec/foundation/log';
6
5
  import { SerialQueue } from '@aztec/foundation/queue';
@@ -406,7 +405,7 @@ let LibP2PService = (() => {
406
405
  this.peerManager.penalizePeer(peerId, PeerErrorSeverity.MidToleranceError);
407
406
  return false;
408
407
  }
409
- if (!validProof) {
408
+ if (validProof.result === 'invalid') {
410
409
  // If the proof is invalid, but the txHash is correct, then this is an active attack and we severly punish
411
410
  this.peerManager.penalizePeer(peerId, PeerErrorSeverity.LowToleranceError);
412
411
  return false;
@@ -516,9 +515,10 @@ let LibP2PService = (() => {
516
515
  },
517
516
  doubleSpendValidator: {
518
517
  validator: new DoubleSpendTxValidator({
519
- getNullifierIndices: (nullifiers) => {
518
+ nullifiersExist: async (nullifiers) => {
520
519
  const merkleTree = this.worldStateSynchronizer.getCommitted();
521
- return merkleTree.findLeafIndices(MerkleTreeId.NULLIFIER_TREE, nullifiers);
520
+ const indices = await merkleTree.findLeafIndices(MerkleTreeId.NULLIFIER_TREE, nullifiers);
521
+ return indices.map(index => index !== undefined);
522
522
  },
523
523
  }),
524
524
  severity: PeerErrorSeverity.HighToleranceError,
@@ -533,8 +533,8 @@ let LibP2PService = (() => {
533
533
  */
534
534
  async runValidations(tx, messageValidators) {
535
535
  const validationPromises = Object.entries(messageValidators).map(async ([name, { validator, severity }]) => {
536
- const isValid = await validator.validateTx(tx);
537
- return { name, isValid, severity };
536
+ const { result } = await validator.validateTx(tx);
537
+ return { name, isValid: result === 'valid', severity };
538
538
  });
539
539
  // A promise that resolves when all validations have been run
540
540
  const allValidations = Promise.all(validationPromises);
@@ -567,13 +567,14 @@ let LibP2PService = (() => {
567
567
  return false;
568
568
  }
569
569
  const snapshotValidator = new DoubleSpendTxValidator({
570
- getNullifierIndices: (nullifiers) => {
570
+ nullifiersExist: async (nullifiers) => {
571
571
  const merkleTree = this.worldStateSynchronizer.getSnapshot(blockNumber - this.config.severePeerPenaltyBlockLength);
572
- return merkleTree.findLeafIndices(MerkleTreeId.NULLIFIER_TREE, nullifiers);
572
+ const indices = await merkleTree.findLeafIndices(MerkleTreeId.NULLIFIER_TREE, nullifiers);
573
+ return indices.map(index => index !== undefined);
573
574
  },
574
575
  });
575
576
  const validSnapshot = await snapshotValidator.validateTx(tx);
576
- if (!validSnapshot) {
577
+ if (validSnapshot.result !== 'valid') {
577
578
  this.peerManager.penalizePeer(peerId, PeerErrorSeverity.LowToleranceError);
578
579
  return false;
579
580
  }
@@ -694,4 +695,4 @@ let LibP2PService = (() => {
694
695
  _a;
695
696
  })();
696
697
  export { LibP2PService };
697
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlicDJwX3NlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvbGlicDJwL2xpYnAycF9zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLGFBQWEsRUFFYixlQUFlLEVBR2YsWUFBWSxFQUNaLGlCQUFpQixFQUdqQixZQUFZLEVBQ1osRUFBRSxFQUNGLE1BQU0sRUFFTix5QkFBeUIsRUFDekIsdUJBQXVCLEdBQ3hCLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUV4QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDckQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUVuRSxPQUFPLEVBQUUsVUFBVSxFQUFFLGtCQUFrQixFQUF3QixVQUFVLEVBQUUsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHdEgsT0FBTyxFQUlMLFNBQVMsR0FDVixNQUFNLDZCQUE2QixDQUFDO0FBQ3JDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ2xHLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNoRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sRUFBNkIsb0JBQW9CLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNwRixPQUFPLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxLQUFLLEVBQUUs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
698
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlicDJwX3NlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvbGlicDJwL2xpYnAycF9zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLGFBQWEsRUFFYixlQUFlLEVBR2YsWUFBWSxFQUNaLGFBQWEsRUFDYixpQkFBaUIsRUFHakIsWUFBWSxFQUNaLEVBQUUsRUFDRixNQUFNLEVBR04seUJBQXlCLEVBQ3pCLHVCQUF1QixHQUN4QixNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUV4QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDckQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUVuRSxPQUFPLEVBQUUsVUFBVSxFQUFFLGtCQUFrQixFQUF3QixVQUFVLEVBQUUsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHdEgsT0FBTyxFQUlMLFNBQVMsR0FDVixNQUFNLDZCQUE2QixDQUFDO0FBQ3JDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ2xHLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNoRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sRUFBNkIsb0JBQW9CLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNwRixPQUFPLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdEMsT0FBTyxFQUFFLEdB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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aztec/p2p",
3
- "version": "0.69.0",
3
+ "version": "0.69.1-devnet",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": "./dest/index.js",
@@ -63,12 +63,12 @@
63
63
  ]
64
64
  },
65
65
  "dependencies": {
66
- "@aztec/circuit-types": "0.69.0",
67
- "@aztec/circuits.js": "0.69.0",
68
- "@aztec/epoch-cache": "0.69.0",
69
- "@aztec/foundation": "0.69.0",
70
- "@aztec/kv-store": "0.69.0",
71
- "@aztec/telemetry-client": "0.69.0",
66
+ "@aztec/circuit-types": "0.69.1-devnet",
67
+ "@aztec/circuits.js": "0.69.1-devnet",
68
+ "@aztec/epoch-cache": "0.69.1-devnet",
69
+ "@aztec/foundation": "0.69.1-devnet",
70
+ "@aztec/kv-store": "0.69.1-devnet",
71
+ "@aztec/telemetry-client": "0.69.1-devnet",
72
72
  "@chainsafe/discv5": "9.0.0",
73
73
  "@chainsafe/enr": "3.0.0",
74
74
  "@chainsafe/libp2p-gossipsub": "13.0.0",
@@ -142,6 +142,12 @@ export type P2P<T extends P2PClientType = P2PClientType.Full> = P2PApi<T> & {
142
142
  */
143
143
  getTxStatus(txHash: TxHash): 'pending' | 'mined' | undefined;
144
144
 
145
+ /** Returns an iterator over pending txs on the mempool. */
146
+ iteratePendingTxs(): Iterable<Tx>;
147
+
148
+ /** Returns the number of pending txs in the mempool. */
149
+ getPendingTxCount(): number;
150
+
145
151
  /**
146
152
  * Starts the p2p client.
147
153
  * @returns A promise signalling the completion of the block sync.
@@ -374,9 +380,6 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
374
380
  this.log.debug(`Block ${syncedLatestBlock} (proven ${syncedProvenBlock}) already beyond current block`);
375
381
  }
376
382
 
377
- // publish any txs in TxPool after its doing initial sync
378
- this.syncPromise = this.syncPromise.then(() => this.publishStoredTxs());
379
-
380
383
  this.blockStream.start();
381
384
  this.log.verbose(`Started block downloader from block ${syncedLatestBlock}`);
382
385
 
@@ -460,6 +463,20 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
460
463
  return Promise.resolve(this.getTxs('pending'));
461
464
  }
462
465
 
466
+ public getPendingTxCount(): number {
467
+ return this.txPool.getPendingTxHashes().length;
468
+ }
469
+
470
+ public *iteratePendingTxs() {
471
+ const pendingTxHashes = this.txPool.getPendingTxHashes();
472
+ for (const txHash of pendingTxHashes) {
473
+ const tx = this.txPool.getTxByHash(txHash);
474
+ if (tx) {
475
+ yield tx;
476
+ }
477
+ }
478
+ }
479
+
463
480
  /**
464
481
  * Returns all transactions in the transaction pool.
465
482
  * @returns An array of Txs.
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  BlockAttestation,
3
3
  ConsensusPayload,
4
- SignatureDomainSeperator,
4
+ SignatureDomainSeparator,
5
5
  TxHash,
6
6
  getHashedSignaturePayloadEthSignedMessage,
7
7
  } from '@aztec/circuit-types';
@@ -37,7 +37,7 @@ export const mockAttestation = (
37
37
  const header = makeHeader(1, 2, slot);
38
38
  const payload = new ConsensusPayload(header, archive, txs);
39
39
 
40
- const hash = getHashedSignaturePayloadEthSignedMessage(payload, SignatureDomainSeperator.blockAttestation);
40
+ const hash = getHashedSignaturePayloadEthSignedMessage(payload, SignatureDomainSeparator.blockAttestation);
41
41
  const signature = signer.sign(hash);
42
42
 
43
43
  return new BlockAttestation(payload, signature);
@@ -1,10 +1,11 @@
1
1
  import { Tx, TxHash } from '@aztec/circuit-types';
2
2
  import { type TxAddedToPoolStats } from '@aztec/circuit-types/stats';
3
3
  import { type Logger, createLogger } from '@aztec/foundation/log';
4
- import { type AztecKVStore, type AztecMap, type AztecSet } from '@aztec/kv-store';
4
+ import { type AztecKVStore, type AztecMap, type AztecMultiMap } from '@aztec/kv-store';
5
5
  import { type TelemetryClient } from '@aztec/telemetry-client';
6
6
 
7
7
  import { PoolInstrumentation, PoolName } from '../instrumentation.js';
8
+ import { getPendingTxPriority } from './priority.js';
8
9
  import { type TxPool } from './tx_pool.js';
9
10
 
10
11
  /**
@@ -16,10 +17,11 @@ export class AztecKVTxPool implements TxPool {
16
17
  /** Our tx pool, stored as a Map, with K: tx hash and V: the transaction. */
17
18
  #txs: AztecMap<string, Buffer>;
18
19
 
19
- /** Index for pending txs. */
20
- #pendingTxs: AztecSet<string>;
21
- /** Index for mined txs. */
22
- #minedTxs: AztecMap<string, number>;
20
+ /** Index from tx hash to the block number in which they were mined, filtered by mined txs. */
21
+ #minedTxHashToBlock: AztecMap<string, number>;
22
+
23
+ /** Index from tx priority (stored as hex) to its tx hash, filtered by pending txs. */
24
+ #pendingTxPriorityToHash: AztecMultiMap<string, string>;
23
25
 
24
26
  #log: Logger;
25
27
 
@@ -32,8 +34,8 @@ export class AztecKVTxPool implements TxPool {
32
34
  */
33
35
  constructor(store: AztecKVStore, telemetry: TelemetryClient, log = createLogger('p2p:tx_pool')) {
34
36
  this.#txs = store.openMap('txs');
35
- this.#minedTxs = store.openMap('minedTxs');
36
- this.#pendingTxs = store.openSet('pendingTxs');
37
+ this.#minedTxHashToBlock = store.openMap('txHashToBlockMined');
38
+ this.#pendingTxPriorityToHash = store.openMultiMap('pendingTxFeeToHash');
37
39
 
38
40
  this.#store = store;
39
41
  this.#log = log;
@@ -41,18 +43,25 @@ export class AztecKVTxPool implements TxPool {
41
43
  }
42
44
 
43
45
  public markAsMined(txHashes: TxHash[], blockNumber: number): Promise<void> {
46
+ if (txHashes.length === 0) {
47
+ return Promise.resolve();
48
+ }
49
+
50
+ let deletedPending = 0;
44
51
  return this.#store.transaction(() => {
45
- let deleted = 0;
46
52
  for (const hash of txHashes) {
47
53
  const key = hash.toString();
48
- void this.#minedTxs.set(key, blockNumber);
49
- if (this.#pendingTxs.has(key)) {
50
- deleted++;
51
- void this.#pendingTxs.delete(key);
54
+ void this.#minedTxHashToBlock.set(key, blockNumber);
55
+
56
+ const tx = this.getTxByHash(hash);
57
+ if (tx) {
58
+ deletedPending++;
59
+ const fee = getPendingTxPriority(tx);
60
+ void this.#pendingTxPriorityToHash.deleteValue(fee, key);
52
61
  }
53
62
  }
54
- this.#metrics.recordRemovedObjects(deleted, 'pending');
55
63
  this.#metrics.recordAddedObjects(txHashes.length, 'mined');
64
+ this.#metrics.recordRemovedObjects(deletedPending, 'pending');
56
65
  });
57
66
  }
58
67
 
@@ -61,33 +70,30 @@ export class AztecKVTxPool implements TxPool {
61
70
  return Promise.resolve();
62
71
  }
63
72
 
73
+ let markedAsPending = 0;
64
74
  return this.#store.transaction(() => {
65
- let deleted = 0;
66
- let added = 0;
67
75
  for (const hash of txHashes) {
68
76
  const key = hash.toString();
69
- if (this.#minedTxs.has(key)) {
70
- deleted++;
71
- void this.#minedTxs.delete(key);
72
- }
77
+ void this.#minedTxHashToBlock.delete(key);
73
78
 
74
- if (this.#txs.has(key)) {
75
- added++;
76
- void this.#pendingTxs.add(key);
79
+ const tx = this.getTxByHash(hash);
80
+ if (tx) {
81
+ void this.#pendingTxPriorityToHash.set(getPendingTxPriority(tx), key);
82
+ markedAsPending++;
77
83
  }
78
84
  }
79
85
 
80
- this.#metrics.recordRemovedObjects(deleted, 'mined');
81
- this.#metrics.recordAddedObjects(added, 'pending');
86
+ this.#metrics.recordAddedObjects(markedAsPending, 'pending');
87
+ this.#metrics.recordRemovedObjects(markedAsPending, 'mined');
82
88
  });
83
89
  }
84
90
 
85
91
  public getPendingTxHashes(): TxHash[] {
86
- return Array.from(this.#pendingTxs.entries()).map(x => TxHash.fromString(x));
92
+ return Array.from(this.#pendingTxPriorityToHash.values({ reverse: true })).map(x => TxHash.fromString(x));
87
93
  }
88
94
 
89
95
  public getMinedTxHashes(): [TxHash, number][] {
90
- return Array.from(this.#minedTxs.entries()).map(([txHash, blockNumber]) => [
96
+ return Array.from(this.#minedTxHashToBlock.entries()).map(([txHash, blockNumber]) => [
91
97
  TxHash.fromString(txHash),
92
98
  blockNumber,
93
99
  ]);
@@ -95,10 +101,10 @@ export class AztecKVTxPool implements TxPool {
95
101
 
96
102
  public getTxStatus(txHash: TxHash): 'pending' | 'mined' | undefined {
97
103
  const key = txHash.toString();
98
- if (this.#pendingTxs.has(key)) {
99
- return 'pending';
100
- } else if (this.#minedTxs.has(key)) {
104
+ if (this.#minedTxHashToBlock.has(key)) {
101
105
  return 'mined';
106
+ } else if (this.#txs.has(key)) {
107
+ return 'pending';
102
108
  } else {
103
109
  return undefined;
104
110
  }
@@ -111,7 +117,12 @@ export class AztecKVTxPool implements TxPool {
111
117
  */
112
118
  public getTxByHash(txHash: TxHash): Tx | undefined {
113
119
  const buffer = this.#txs.get(txHash.toString());
114
- return buffer ? Tx.fromBuffer(buffer) : undefined;
120
+ if (buffer) {
121
+ const tx = Tx.fromBuffer(buffer);
122
+ tx.setTxHash(txHash);
123
+ return tx;
124
+ }
125
+ return undefined;
115
126
  }
116
127
 
117
128
  /**
@@ -120,11 +131,10 @@ export class AztecKVTxPool implements TxPool {
120
131
  * @returns Empty promise.
121
132
  */
122
133
  public addTxs(txs: Tx[]): Promise<void> {
123
- const txHashes = txs.map(tx => tx.getTxHash());
124
134
  return this.#store.transaction(() => {
125
135
  let pendingCount = 0;
126
- for (const [i, tx] of txs.entries()) {
127
- const txHash = txHashes[i];
136
+ for (const tx of txs) {
137
+ const txHash = tx.getTxHash();
128
138
  this.#log.verbose(`Adding tx ${txHash.toString()} to pool`, {
129
139
  eventName: 'tx-added-to-pool',
130
140
  ...tx.getStats(),
@@ -132,10 +142,11 @@ export class AztecKVTxPool implements TxPool {
132
142
 
133
143
  const key = txHash.toString();
134
144
  void this.#txs.set(key, tx.toBuffer());
135
- if (!this.#minedTxs.has(key)) {
145
+
146
+ if (!this.#minedTxHashToBlock.has(key)) {
136
147
  pendingCount++;
137
148
  // REFACTOR: Use an lmdb conditional write to avoid race conditions with this write tx
138
- void this.#pendingTxs.add(key);
149
+ void this.#pendingTxPriorityToHash.set(getPendingTxPriority(tx), key);
139
150
  this.#metrics.recordSize(tx);
140
151
  }
141
152
  }
@@ -150,20 +161,27 @@ export class AztecKVTxPool implements TxPool {
150
161
  * @returns The number of transactions that was deleted from the pool.
151
162
  */
152
163
  public deleteTxs(txHashes: TxHash[]): Promise<void> {
164
+ let pendingDeleted = 0;
165
+ let minedDeleted = 0;
166
+
153
167
  return this.#store.transaction(() => {
154
- let pendingDeleted = 0;
155
- let minedDeleted = 0;
156
168
  for (const hash of txHashes) {
157
169
  const key = hash.toString();
158
- void this.#txs.delete(key);
159
- if (this.#pendingTxs.has(key)) {
160
- pendingDeleted++;
161
- void this.#pendingTxs.delete(key);
162
- }
170
+ const tx = this.getTxByHash(hash);
171
+
172
+ if (tx) {
173
+ const fee = getPendingTxPriority(tx);
174
+ void this.#pendingTxPriorityToHash.deleteValue(fee, key);
163
175
 
164
- if (this.#minedTxs.has(key)) {
165
- minedDeleted++;
166
- void this.#minedTxs.delete(key);
176
+ const isMined = this.#minedTxHashToBlock.has(key);
177
+ if (isMined) {
178
+ minedDeleted++;
179
+ } else {
180
+ pendingDeleted++;
181
+ }
182
+
183
+ void this.#txs.delete(key);
184
+ void this.#minedTxHashToBlock.delete(key);
167
185
  }
168
186
  }
169
187
 
@@ -177,7 +195,11 @@ export class AztecKVTxPool implements TxPool {
177
195
  * @returns Array of tx objects in the order they were added to the pool.
178
196
  */
179
197
  public getAllTxs(): Tx[] {
180
- return Array.from(this.#txs.values()).map(buffer => Tx.fromBuffer(buffer));
198
+ return Array.from(this.#txs.entries()).map(([hash, buffer]) => {
199
+ const tx = Tx.fromBuffer(buffer);
200
+ tx.setTxHash(TxHash.fromString(hash));
201
+ return tx;
202
+ });
181
203
  }
182
204
 
183
205
  /**
@@ -4,6 +4,7 @@ import { createLogger } from '@aztec/foundation/log';
4
4
  import { type TelemetryClient } from '@aztec/telemetry-client';
5
5
 
6
6
  import { PoolInstrumentation, PoolName } from '../instrumentation.js';
7
+ import { getPendingTxPriority } from './priority.js';
7
8
  import { type TxPool } from './tx_pool.js';
8
9
 
9
10
  /**
@@ -68,7 +69,10 @@ export class InMemoryTxPool implements TxPool {
68
69
  }
69
70
 
70
71
  public getPendingTxHashes(): TxHash[] {
71
- return Array.from(this.pendingTxs).map(x => TxHash.fromBigInt(x));
72
+ return this.getAllTxs()
73
+ .sort((tx1, tx2) => -getPendingTxPriority(tx1).localeCompare(getPendingTxPriority(tx2)))
74
+ .map(tx => tx.getTxHash())
75
+ .filter(txHash => this.pendingTxs.has(txHash.toBigInt()));
72
76
  }
73
77
 
74
78
  public getMinedTxHashes(): [TxHash, number][] {
@@ -0,0 +1,13 @@
1
+ import { type Tx } from '@aztec/circuit-types';
2
+ import { Buffer32 } from '@aztec/foundation/buffer';
3
+
4
+ /**
5
+ * Returns a string representing the priority of a tx.
6
+ * Txs with a higher priority value are returned first when retrieving pending tx hashes.
7
+ * We currently use the sum of the priority fees for the tx for this value, represented as hex.
8
+ */
9
+ export function getPendingTxPriority(tx: Tx): string {
10
+ const priorityFees = tx.getGasSettings().maxPriorityFeesPerGas;
11
+ const totalFees = priorityFees.feePerDaGas.toBigInt() + priorityFees.feePerL2Gas.toBigInt();
12
+ return Buffer32.fromBigInt(totalFees).toString();
13
+ }
@@ -49,7 +49,7 @@ export interface TxPool {
49
49
  getAllTxHashes(): TxHash[];
50
50
 
51
51
  /**
52
- * Gets the hashes of pending transactions currently in the tx pool.
52
+ * Gets the hashes of pending transactions currently in the tx pool sorted by priority (see getPendingTxPriority).
53
53
  * @returns An array of pending transaction hashes found in the tx pool.
54
54
  */
55
55
  getPendingTxHashes(): TxHash[];
@@ -1,4 +1,6 @@
1
- import { mockTx } from '@aztec/circuit-types';
1
+ import { type Tx, mockTx } from '@aztec/circuit-types';
2
+ import { GasFees } from '@aztec/circuits.js';
3
+ import { unfreeze } from '@aztec/foundation/types';
2
4
 
3
5
  import { type TxPool } from './tx_pool.js';
4
6
 
@@ -67,10 +69,12 @@ export function describeTxPool(getTxPool: () => TxPool) {
67
69
  await pool.addTxs([tx1]);
68
70
  // this peer knows that tx2 was mined, but it does not have the tx object
69
71
  await pool.markAsMined([tx1.getTxHash(), someTxHashThatThisPeerDidNotSee], 1);
70
- expect(pool.getMinedTxHashes()).toEqual([
71
- [tx1.getTxHash(), 1],
72
- [someTxHashThatThisPeerDidNotSee, 1],
73
- ]);
72
+ expect(new Set(pool.getMinedTxHashes())).toEqual(
73
+ new Set([
74
+ [tx1.getTxHash(), 1],
75
+ [someTxHashThatThisPeerDidNotSee, 1],
76
+ ]),
77
+ );
74
78
 
75
79
  // reorg: both txs should now become available again
76
80
  await pool.markMinedAsPending([tx1.getTxHash(), someTxHashThatThisPeerDidNotSee]);
@@ -101,4 +105,22 @@ export function describeTxPool(getTxPool: () => TxPool) {
101
105
  expect(poolTxHashes).toHaveLength(3);
102
106
  expect(poolTxHashes).toEqual(expect.arrayContaining([tx1.getTxHash(), tx2.getTxHash(), tx3.getTxHash()]));
103
107
  });
108
+
109
+ it('Returns pending tx hashes sorted by priority', async () => {
110
+ const withPriorityFee = (tx: Tx, fee: number) => {
111
+ unfreeze(tx.data.constants.txContext.gasSettings).maxPriorityFeesPerGas = new GasFees(fee, fee);
112
+ return tx;
113
+ };
114
+
115
+ const tx1 = withPriorityFee(mockTx(0), 1000);
116
+ const tx2 = withPriorityFee(mockTx(1), 100);
117
+ const tx3 = withPriorityFee(mockTx(2), 200);
118
+ const tx4 = withPriorityFee(mockTx(3), 3000);
119
+
120
+ await pool.addTxs([tx1, tx2, tx3, tx4]);
121
+
122
+ const poolTxHashes = pool.getPendingTxHashes();
123
+ expect(poolTxHashes).toHaveLength(4);
124
+ expect(poolTxHashes).toEqual([tx4, tx1, tx3, tx2].map(tx => tx.getTxHash()));
125
+ });
104
126
  }