@aztec/p2p 0.42.0 → 0.44.0

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 (59) hide show
  1. package/dest/bootstrap/bootstrap.d.ts +1 -1
  2. package/dest/bootstrap/bootstrap.d.ts.map +1 -1
  3. package/dest/bootstrap/bootstrap.js +8 -4
  4. package/dest/client/index.d.ts.map +1 -1
  5. package/dest/client/index.js +24 -21
  6. package/dest/client/p2p_client.d.ts.map +1 -1
  7. package/dest/client/p2p_client.js +2 -3
  8. package/dest/config.d.ts +9 -22
  9. package/dest/config.d.ts.map +1 -1
  10. package/dest/config.js +8 -9
  11. package/dest/service/discV5_service.d.ts +5 -2
  12. package/dest/service/discV5_service.d.ts.map +1 -1
  13. package/dest/service/discV5_service.js +38 -12
  14. package/dest/service/dummy_service.d.ts +4 -1
  15. package/dest/service/dummy_service.d.ts.map +1 -1
  16. package/dest/service/dummy_service.js +7 -1
  17. package/dest/service/libp2p_service.d.ts +5 -14
  18. package/dest/service/libp2p_service.d.ts.map +1 -1
  19. package/dest/service/libp2p_service.js +56 -97
  20. package/dest/service/peer_manager.d.ts +25 -3
  21. package/dest/service/peer_manager.d.ts.map +1 -1
  22. package/dest/service/peer_manager.js +152 -12
  23. package/dest/service/service.d.ts +12 -6
  24. package/dest/service/service.d.ts.map +1 -1
  25. package/dest/service/service.js +1 -1
  26. package/dest/tx_pool/aztec_kv_tx_pool.d.ts +2 -1
  27. package/dest/tx_pool/aztec_kv_tx_pool.d.ts.map +1 -1
  28. package/dest/tx_pool/aztec_kv_tx_pool.js +11 -6
  29. package/dest/tx_pool/instrumentation.d.ts +23 -0
  30. package/dest/tx_pool/instrumentation.d.ts.map +1 -0
  31. package/dest/tx_pool/instrumentation.js +48 -0
  32. package/dest/tx_pool/memory_tx_pool.d.ts +3 -1
  33. package/dest/tx_pool/memory_tx_pool.d.ts.map +1 -1
  34. package/dest/tx_pool/memory_tx_pool.js +6 -2
  35. package/dest/util.d.ts +21 -0
  36. package/dest/util.d.ts.map +1 -0
  37. package/dest/util.js +59 -0
  38. package/package.json +15 -6
  39. package/src/bootstrap/bootstrap.ts +11 -5
  40. package/src/client/index.ts +28 -21
  41. package/src/client/p2p_client.ts +1 -2
  42. package/src/config.ts +19 -39
  43. package/src/service/discV5_service.ts +45 -15
  44. package/src/service/dummy_service.ts +10 -1
  45. package/src/service/libp2p_service.ts +60 -108
  46. package/src/service/peer_manager.ts +187 -12
  47. package/src/service/service.ts +14 -7
  48. package/src/tx_pool/aztec_kv_tx_pool.ts +12 -3
  49. package/src/tx_pool/instrumentation.ts +58 -0
  50. package/src/tx_pool/memory_tx_pool.ts +8 -1
  51. package/src/util.ts +62 -0
  52. package/dest/service/ip_query.d.ts +0 -2
  53. package/dest/service/ip_query.d.ts.map +0 -1
  54. package/dest/service/ip_query.js +0 -6
  55. package/dest/service/known_txs.d.ts +0 -31
  56. package/dest/service/known_txs.d.ts.map +0 -1
  57. package/dest/service/known_txs.js +0 -52
  58. package/src/service/ip_query.ts +0 -5
  59. package/src/service/known_txs.ts +0 -56
@@ -1,7 +1,8 @@
1
- var _AztecKVTxPool_store, _AztecKVTxPool_txs, _AztecKVTxPool_log;
1
+ var _AztecKVTxPool_store, _AztecKVTxPool_txs, _AztecKVTxPool_log, _AztecKVTxPool_metrics;
2
2
  import { __classPrivateFieldGet, __classPrivateFieldSet } from "tslib";
3
3
  import { Tx, TxHash } from '@aztec/circuit-types';
4
4
  import { createDebugLogger } from '@aztec/foundation/log';
5
+ import { TxPoolInstrumentation } from './instrumentation.js';
5
6
  /**
6
7
  * In-memory implementation of the Transaction Pool.
7
8
  */
@@ -11,16 +12,18 @@ export class AztecKVTxPool {
11
12
  * @param store - A KV store.
12
13
  * @param log - A logger.
13
14
  */
14
- constructor(store, log = createDebugLogger('aztec:tx_pool')) {
15
+ constructor(store, telemetry, log = createDebugLogger('aztec:tx_pool')) {
15
16
  _AztecKVTxPool_store.set(this, void 0);
16
17
  /**
17
18
  * Our tx pool, stored as a Map in-memory, with K: tx hash and V: the transaction.
18
19
  */
19
20
  _AztecKVTxPool_txs.set(this, void 0);
20
21
  _AztecKVTxPool_log.set(this, void 0);
22
+ _AztecKVTxPool_metrics.set(this, void 0);
21
23
  __classPrivateFieldSet(this, _AztecKVTxPool_txs, store.openMap('txs'), "f");
22
24
  __classPrivateFieldSet(this, _AztecKVTxPool_store, store, "f");
23
25
  __classPrivateFieldSet(this, _AztecKVTxPool_log, log, "f");
26
+ __classPrivateFieldSet(this, _AztecKVTxPool_metrics, new TxPoolInstrumentation(telemetry, 'AztecKVTxPool'), "f");
24
27
  }
25
28
  /**
26
29
  * Checks if a transaction exists in the pool and returns it.
@@ -36,8 +39,8 @@ export class AztecKVTxPool {
36
39
  * @param txs - An array of txs to be added to the pool.
37
40
  * @returns Empty promise.
38
41
  */
39
- async addTxs(txs) {
40
- const txHashes = await Promise.all(txs.map(tx => tx.getTxHash()));
42
+ addTxs(txs) {
43
+ const txHashes = txs.map(tx => tx.getTxHash());
41
44
  return __classPrivateFieldGet(this, _AztecKVTxPool_store, "f").transaction(() => {
42
45
  for (const [i, tx] of txs.entries()) {
43
46
  const txHash = txHashes[i];
@@ -47,6 +50,7 @@ export class AztecKVTxPool {
47
50
  });
48
51
  void __classPrivateFieldGet(this, _AztecKVTxPool_txs, "f").set(txHash.toString(), tx.toBuffer());
49
52
  }
53
+ __classPrivateFieldGet(this, _AztecKVTxPool_metrics, "f").recordTxs(txs);
50
54
  });
51
55
  }
52
56
  /**
@@ -59,6 +63,7 @@ export class AztecKVTxPool {
59
63
  for (const hash of txHashes) {
60
64
  void __classPrivateFieldGet(this, _AztecKVTxPool_txs, "f").delete(hash.toString());
61
65
  }
66
+ __classPrivateFieldGet(this, _AztecKVTxPool_metrics, "f").removeTxs(txHashes.length);
62
67
  });
63
68
  }
64
69
  /**
@@ -84,5 +89,5 @@ export class AztecKVTxPool {
84
89
  return __classPrivateFieldGet(this, _AztecKVTxPool_txs, "f").has(txHash.toString());
85
90
  }
86
91
  }
87
- _AztecKVTxPool_store = new WeakMap(), _AztecKVTxPool_txs = new WeakMap(), _AztecKVTxPool_log = new WeakMap();
88
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXp0ZWNfa3ZfdHhfcG9vbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eF9wb29sL2F6dGVjX2t2X3R4X3Bvb2wudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRWxELE9BQU8sRUFBZSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBS3ZFOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGFBQWE7SUFVeEI7Ozs7T0FJRztJQUNILFlBQVksS0FBbUIsRUFBRSxHQUFHLEdBQUcsaUJBQWlCLENBQUMsZUFBZSxDQUFDO1FBZHpFLHVDQUFxQjtRQUVyQjs7V0FFRztRQUNILHFDQUErQjtRQUUvQixxQ0FBYTtRQVFYLHVCQUFBLElBQUksc0JBQVEsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBQSxDQUFDO1FBQ2pDLHVCQUFBLElBQUksd0JBQVUsS0FBSyxNQUFBLENBQUM7UUFDcEIsdUJBQUEsSUFBSSxzQkFBUSxHQUFHLE1BQUEsQ0FBQztJQUNsQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLFdBQVcsQ0FBQyxNQUFjO1FBQy9CLE1BQU0sTUFBTSxHQUFHLHVCQUFBLElBQUksMEJBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDaEQsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUNwRCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBUztRQUMzQixNQUFNLFFBQVEsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDbEUsT0FBTyx1QkFBQSxJQUFJLDRCQUFPLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRTtZQUNsQyxLQUFLLE1BQU0sQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksR0FBRyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7Z0JBQ3BDLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDM0IsdUJBQUEsSUFBSSwwQkFBSyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsTUFBTSxDQUFDLFFBQVEsRUFBRSxFQUFFLEVBQUU7b0JBQ3ZELFNBQVMsRUFBRSxrQkFBa0I7b0JBQzdCLEdBQUcsRUFBRSxDQUFDLFFBQVEsRUFBRTtpQkFDWSxDQUFDLENBQUM7Z0JBRWhDLEtBQUssdUJBQUEsSUFBSSwwQkFBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLEVBQUUsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDdkQsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxTQUFTLENBQUMsUUFBa0I7UUFDakMsT0FBTyx1QkFBQSxJQUFJLDRCQUFPLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRTtZQUNsQyxLQUFLLE1BQU0sSUFBSSxJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUM1QixLQUFLLHVCQUFBLElBQUksMEJBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDekMsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNJLFNBQVM7UUFDZCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsdUJBQUEsSUFBSSwwQkFBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQzdFLENBQUM7SUFFRDs7O09BR0c7SUFDSSxjQUFjO1FBQ25CLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyx1QkFBQSxJQUFJLDBCQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckUsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxLQUFLLENBQUMsTUFBYztRQUN6QixPQUFPLHVCQUFBLElBQUksMEJBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDMUMsQ0FBQztDQUNGIn0=
92
+ _AztecKVTxPool_store = new WeakMap(), _AztecKVTxPool_txs = new WeakMap(), _AztecKVTxPool_log = new WeakMap(), _AztecKVTxPool_metrics = new WeakMap();
93
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXp0ZWNfa3ZfdHhfcG9vbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eF9wb29sL2F6dGVjX2t2X3R4X3Bvb2wudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRWxELE9BQU8sRUFBZSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBSXZFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRzdEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGFBQWE7SUFZeEI7Ozs7T0FJRztJQUNILFlBQVksS0FBbUIsRUFBRSxTQUEwQixFQUFFLEdBQUcsR0FBRyxpQkFBaUIsQ0FBQyxlQUFlLENBQUM7UUFoQnJHLHVDQUFxQjtRQUVyQjs7V0FFRztRQUNILHFDQUErQjtRQUUvQixxQ0FBYTtRQUViLHlDQUFnQztRQVE5Qix1QkFBQSxJQUFJLHNCQUFRLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQUEsQ0FBQztRQUNqQyx1QkFBQSxJQUFJLHdCQUFVLEtBQUssTUFBQSxDQUFDO1FBQ3BCLHVCQUFBLElBQUksc0JBQVEsR0FBRyxNQUFBLENBQUM7UUFDaEIsdUJBQUEsSUFBSSwwQkFBWSxJQUFJLHFCQUFxQixDQUFDLFNBQVMsRUFBRSxlQUFlLENBQUMsTUFBQSxDQUFDO0lBQ3hFLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksV0FBVyxDQUFDLE1BQWM7UUFDL0IsTUFBTSxNQUFNLEdBQUcsdUJBQUEsSUFBSSwwQkFBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUNoRCxPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ3BELENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksTUFBTSxDQUFDLEdBQVM7UUFDckIsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQy9DLE9BQU8sdUJBQUEsSUFBSSw0QkFBTyxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUU7WUFDbEMsS0FBSyxNQUFNLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO2dCQUNwQyxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzNCLHVCQUFBLElBQUksMEJBQUssQ0FBQyxJQUFJLENBQUMscUJBQXFCLE1BQU0sQ0FBQyxRQUFRLEVBQUUsRUFBRSxFQUFFO29CQUN2RCxTQUFTLEVBQUUsa0JBQWtCO29CQUM3QixHQUFHLEVBQUUsQ0FBQyxRQUFRLEVBQUU7aUJBQ1ksQ0FBQyxDQUFDO2dCQUVoQyxLQUFLLHVCQUFBLElBQUksMEJBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxFQUFFLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZELENBQUM7WUFFRCx1QkFBQSxJQUFJLDhCQUFTLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQy9CLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxTQUFTLENBQUMsUUFBa0I7UUFDakMsT0FBTyx1QkFBQSxJQUFJLDRCQUFPLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRTtZQUNsQyxLQUFLLE1BQU0sSUFBSSxJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUM1QixLQUFLLHVCQUFBLElBQUksMEJBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDekMsQ0FBQztZQUVELHVCQUFBLElBQUksOEJBQVMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzNDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNJLFNBQVM7UUFDZCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsdUJBQUEsSUFBSSwwQkFBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQzdFLENBQUM7SUFFRDs7O09BR0c7SUFDSSxjQUFjO1FBQ25CLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyx1QkFBQSxJQUFJLDBCQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckUsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxLQUFLLENBQUMsTUFBYztRQUN6QixPQUFPLHVCQUFBLElBQUksMEJBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDMUMsQ0FBQztDQUNGIn0=
@@ -0,0 +1,23 @@
1
+ import { type Tx } from '@aztec/circuit-types';
2
+ import { type TelemetryClient } from '@aztec/telemetry-client';
3
+ /**
4
+ * Instrumentation class for the TxPool.
5
+ */
6
+ export declare class TxPoolInstrumentation {
7
+ /** The number of txs in the mempool */
8
+ private txInMempool;
9
+ /** Tracks tx size */
10
+ private txSize;
11
+ constructor(telemetry: TelemetryClient, name: string);
12
+ /**
13
+ * Updates the metrics with the new transactions.
14
+ * @param txs - The transactions to record
15
+ */
16
+ recordTxs(txs: Tx[]): void;
17
+ /**
18
+ * Updates the metrics by removing transactions from the mempool.
19
+ * @param count - The number of transactions to remove from the mempool
20
+ */
21
+ removeTxs(count?: number): void;
22
+ }
23
+ //# sourceMappingURL=instrumentation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instrumentation.d.ts","sourceRoot":"","sources":["../../src/tx_pool/instrumentation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAA2B,KAAK,eAAe,EAAsB,MAAM,yBAAyB,CAAC;AAE5G;;GAEG;AACH,qBAAa,qBAAqB;IAChC,uCAAuC;IACvC,OAAO,CAAC,WAAW,CAAgB;IACnC,qBAAqB;IACrB,OAAO,CAAC,MAAM,CAAY;gBAEd,SAAS,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM;IAuBpD;;;OAGG;IACI,SAAS,CAAC,GAAG,EAAE,EAAE,EAAE;IAQ1B;;;OAGG;IACI,SAAS,CAAC,KAAK,SAAI;CAM3B"}
@@ -0,0 +1,48 @@
1
+ import { Metrics } from '@aztec/telemetry-client';
2
+ /**
3
+ * Instrumentation class for the TxPool.
4
+ */
5
+ export class TxPoolInstrumentation {
6
+ constructor(telemetry, name) {
7
+ const meter = telemetry.getMeter(name);
8
+ this.txInMempool = meter.createUpDownCounter(Metrics.MEMPOOL_TX_COUNT, {
9
+ description: 'The current number of transactions in the mempool',
10
+ });
11
+ this.txSize = meter.createHistogram(Metrics.MEMPOOL_TX_SIZE, {
12
+ unit: 'By',
13
+ description: 'The size of transactions in the mempool',
14
+ advice: {
15
+ explicitBucketBoundaries: [
16
+ 5000, // 5KB
17
+ 10000,
18
+ 20000,
19
+ 50000,
20
+ 75000,
21
+ 100000, // 100KB
22
+ 200000,
23
+ ],
24
+ },
25
+ });
26
+ }
27
+ /**
28
+ * Updates the metrics with the new transactions.
29
+ * @param txs - The transactions to record
30
+ */
31
+ recordTxs(txs) {
32
+ for (const tx of txs) {
33
+ this.txSize.record(tx.getSize());
34
+ }
35
+ this.txInMempool.add(txs.length);
36
+ }
37
+ /**
38
+ * Updates the metrics by removing transactions from the mempool.
39
+ * @param count - The number of transactions to remove from the mempool
40
+ */
41
+ removeTxs(count = 1) {
42
+ if (count < 0) {
43
+ throw new Error('Count must be positive');
44
+ }
45
+ this.txInMempool.add(-1 * count);
46
+ }
47
+ }
48
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdHJ1bWVudGF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3R4X3Bvb2wvaW5zdHJ1bWVudGF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBa0IsT0FBTyxFQUE0QyxNQUFNLHlCQUF5QixDQUFDO0FBRTVHOztHQUVHO0FBQ0gsTUFBTSxPQUFPLHFCQUFxQjtJQU1oQyxZQUFZLFNBQTBCLEVBQUUsSUFBWTtRQUNsRCxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRTtZQUNyRSxXQUFXLEVBQUUsbURBQW1EO1NBQ2pFLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsZUFBZSxFQUFFO1lBQzNELElBQUksRUFBRSxJQUFJO1lBQ1YsV0FBVyxFQUFFLHlDQUF5QztZQUN0RCxNQUFNLEVBQUU7Z0JBQ04sd0JBQXdCLEVBQUU7b0JBQ3hCLElBQUssRUFBRSxNQUFNO29CQUNiLEtBQU07b0JBQ04sS0FBTTtvQkFDTixLQUFNO29CQUNOLEtBQU07b0JBQ04sTUFBTyxFQUFFLFFBQVE7b0JBQ2pCLE1BQU87aUJBQ1I7YUFDRjtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSSxTQUFTLENBQUMsR0FBUztRQUN4QixLQUFLLE1BQU0sRUFBRSxJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ25DLENBQUM7UUFFRCxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVEOzs7T0FHRztJQUNJLFNBQVMsQ0FBQyxLQUFLLEdBQUcsQ0FBQztRQUN4QixJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNkLE1BQU0sSUFBSSxLQUFLLENBQUMsd0JBQXdCLENBQUMsQ0FBQztRQUM1QyxDQUFDO1FBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUM7SUFDbkMsQ0FBQztDQUNGIn0=
@@ -1,4 +1,5 @@
1
1
  import { Tx, TxHash } from '@aztec/circuit-types';
2
+ import { type TelemetryClient } from '@aztec/telemetry-client';
2
3
  import { type TxPool } from './tx_pool.js';
3
4
  /**
4
5
  * In-memory implementation of the Transaction Pool.
@@ -9,11 +10,12 @@ export declare class InMemoryTxPool implements TxPool {
9
10
  * Our tx pool, stored as a Map in-memory, with K: tx hash and V: the transaction.
10
11
  */
11
12
  private txs;
13
+ private metrics;
12
14
  /**
13
15
  * Class constructor for in-memory TxPool. Initiates our transaction pool as a JS Map.
14
16
  * @param log - A logger.
15
17
  */
16
- constructor(log?: import("@aztec/foundation/log").Logger);
18
+ constructor(telemetry: TelemetryClient, log?: import("@aztec/foundation/log").Logger);
17
19
  /**
18
20
  * Checks if a transaction exists in the pool and returns it.
19
21
  * @param txHash - The generated tx hash.
@@ -1 +1 @@
1
- {"version":3,"file":"memory_tx_pool.d.ts","sourceRoot":"","sources":["../../src/tx_pool/memory_tx_pool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAIlD,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C;;GAEG;AACH,qBAAa,cAAe,YAAW,MAAM;IAU/B,OAAO,CAAC,GAAG;IATvB;;OAEG;IACH,OAAO,CAAC,GAAG,CAAkB;IAE7B;;;OAGG;gBACiB,GAAG,yCAAqC;IAI5D;;;;OAIG;IACI,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,EAAE,GAAG,SAAS;IAKlD;;;;OAIG;IACI,MAAM,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAYvC;;;;OAIG;IACI,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAOnD;;;OAGG;IACI,SAAS,IAAI,EAAE,EAAE;IAIxB;;;OAGG;IACI,cAAc,IAAI,MAAM,EAAE;IAIjC;;;;OAIG;IACI,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;CAGtC"}
1
+ {"version":3,"file":"memory_tx_pool.d.ts","sourceRoot":"","sources":["../../src/tx_pool/memory_tx_pool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAGlD,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAG/D,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C;;GAEG;AACH,qBAAa,cAAe,YAAW,MAAM;IAYH,OAAO,CAAC,GAAG;IAXnD;;OAEG;IACH,OAAO,CAAC,GAAG,CAAkB;IAE7B,OAAO,CAAC,OAAO,CAAwB;IAEvC;;;OAGG;gBACS,SAAS,EAAE,eAAe,EAAU,GAAG,yCAAqC;IAKxF;;;;OAIG;IACI,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,EAAE,GAAG,SAAS;IAKlD;;;;OAIG;IACI,MAAM,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAavC;;;;OAIG;IACI,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAQnD;;;OAGG;IACI,SAAS,IAAI,EAAE,EAAE;IAIxB;;;OAGG;IACI,cAAc,IAAI,MAAM,EAAE;IAIjC;;;;OAIG;IACI,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;CAGtC"}
@@ -1,5 +1,6 @@
1
1
  import { Tx, TxHash } from '@aztec/circuit-types';
2
2
  import { createDebugLogger } from '@aztec/foundation/log';
3
+ import { TxPoolInstrumentation } from './instrumentation.js';
3
4
  /**
4
5
  * In-memory implementation of the Transaction Pool.
5
6
  */
@@ -8,9 +9,10 @@ export class InMemoryTxPool {
8
9
  * Class constructor for in-memory TxPool. Initiates our transaction pool as a JS Map.
9
10
  * @param log - A logger.
10
11
  */
11
- constructor(log = createDebugLogger('aztec:tx_pool')) {
12
+ constructor(telemetry, log = createDebugLogger('aztec:tx_pool')) {
12
13
  this.log = log;
13
14
  this.txs = new Map();
15
+ this.metrics = new TxPoolInstrumentation(telemetry, 'InMemoryTxPool');
14
16
  }
15
17
  /**
16
18
  * Checks if a transaction exists in the pool and returns it.
@@ -27,6 +29,7 @@ export class InMemoryTxPool {
27
29
  * @returns Empty promise.
28
30
  */
29
31
  addTxs(txs) {
32
+ this.metrics.recordTxs(txs);
30
33
  for (const tx of txs) {
31
34
  const txHash = tx.getTxHash();
32
35
  this.log.debug(`Adding tx with id ${txHash.toString()}`, {
@@ -43,6 +46,7 @@ export class InMemoryTxPool {
43
46
  * @returns The number of transactions that was deleted from the pool.
44
47
  */
45
48
  deleteTxs(txHashes) {
49
+ this.metrics.removeTxs(txHashes.length);
46
50
  for (const txHash of txHashes) {
47
51
  this.txs.delete(txHash.toBigInt());
48
52
  }
@@ -71,4 +75,4 @@ export class InMemoryTxPool {
71
75
  return this.txs.has(txHash.toBigInt());
72
76
  }
73
77
  }
74
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtb3J5X3R4X3Bvb2wuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHhfcG9vbC9tZW1vcnlfdHhfcG9vbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRWxELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBSTFEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGNBQWM7SUFNekI7OztPQUdHO0lBQ0gsWUFBb0IsTUFBTSxpQkFBaUIsQ0FBQyxlQUFlLENBQUM7UUFBeEMsUUFBRyxHQUFILEdBQUcsQ0FBcUM7UUFDMUQsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsRUFBYyxDQUFDO0lBQ25DLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksV0FBVyxDQUFDLE1BQWM7UUFDL0IsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDL0MsT0FBTyxNQUFNLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxNQUFNLENBQUMsR0FBUztRQUNyQixLQUFLLE1BQU0sRUFBRSxJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQ3JCLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUM5QixJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsTUFBTSxDQUFDLFFBQVEsRUFBRSxFQUFFLEVBQUU7Z0JBQ3ZELFNBQVMsRUFBRSxrQkFBa0I7Z0JBQzdCLEdBQUcsRUFBRSxDQUFDLFFBQVEsRUFBRTthQUNZLENBQUMsQ0FBQztZQUNoQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDdEMsQ0FBQztRQUNELE9BQU8sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksU0FBUyxDQUFDLFFBQWtCO1FBQ2pDLEtBQUssTUFBTSxNQUFNLElBQUksUUFBUSxFQUFFLENBQUM7WUFDOUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDckMsQ0FBQztRQUNELE9BQU8sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRDs7O09BR0c7SUFDSSxTQUFTO1FBQ2QsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVEOzs7T0FHRztJQUNJLGNBQWM7UUFDbkIsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxLQUFLLENBQUMsTUFBYztRQUN6QixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7Q0FDRiJ9
78
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtb3J5X3R4X3Bvb2wuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHhfcG9vbC9tZW1vcnlfdHhfcG9vbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRWxELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRzFELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRzdEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGNBQWM7SUFRekI7OztPQUdHO0lBQ0gsWUFBWSxTQUEwQixFQUFVLE1BQU0saUJBQWlCLENBQUMsZUFBZSxDQUFDO1FBQXhDLFFBQUcsR0FBSCxHQUFHLENBQXFDO1FBQ3RGLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEVBQWMsQ0FBQztRQUNqQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUkscUJBQXFCLENBQUMsU0FBUyxFQUFFLGdCQUFnQixDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxXQUFXLENBQUMsTUFBYztRQUMvQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUMvQyxPQUFPLE1BQU0sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLE1BQU0sQ0FBQyxHQUFTO1FBQ3JCLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzVCLEtBQUssTUFBTSxFQUFFLElBQUksR0FBRyxFQUFFLENBQUM7WUFDckIsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQzlCLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLHFCQUFxQixNQUFNLENBQUMsUUFBUSxFQUFFLEVBQUUsRUFBRTtnQkFDdkQsU0FBUyxFQUFFLGtCQUFrQjtnQkFDN0IsR0FBRyxFQUFFLENBQUMsUUFBUSxFQUFFO2FBQ1ksQ0FBQyxDQUFDO1lBQ2hDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN0QyxDQUFDO1FBQ0QsT0FBTyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxTQUFTLENBQUMsUUFBa0I7UUFDakMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3hDLEtBQUssTUFBTSxNQUFNLElBQUksUUFBUSxFQUFFLENBQUM7WUFDOUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDckMsQ0FBQztRQUNELE9BQU8sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRDs7O09BR0c7SUFDSSxTQUFTO1FBQ2QsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVEOzs7T0FHRztJQUNJLGNBQWM7UUFDbkIsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxLQUFLLENBQUMsTUFBYztRQUN6QixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7Q0FDRiJ9
package/dest/util.d.ts ADDED
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Converts an address string to a multiaddr string.
3
+ * Example usage:
4
+ * const tcpAddr = '123.456.7.8:80' -> /ip4/123.456.7.8/tcp/80
5
+ * const udpAddr = '[2001:db8::1]:8080' -> /ip6/2001:db8::1/udp/8080
6
+ * const dnsAddr = 'example.com:443' -> /dns4/example.com/tcp/443
7
+ * @param address - The address string to convert. Has to be in the format <addr>:<port>.
8
+ * @param protocol - The protocol to use in the multiaddr string.
9
+ * @returns A multiaddr compliant string.
10
+ */
11
+ export declare function convertToMultiaddr(address: string, protocol: 'tcp' | 'udp'): string;
12
+ /**
13
+ * Splits an <address>:<port> string into its components.
14
+ * @returns The ip6 or ip4 address & port separately
15
+ */
16
+ export declare function splitAddressPort(address: string, allowEmptyAddress: boolean): [string, string];
17
+ /**
18
+ * Queries the public IP address of the machine.
19
+ */
20
+ export declare function getPublicIp(): Promise<string>;
21
+ //# sourceMappingURL=util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,CAgBnF;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,OAAO,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAoB9F;AAED;;GAEG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,CAInD"}
package/dest/util.js ADDED
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Converts an address string to a multiaddr string.
3
+ * Example usage:
4
+ * const tcpAddr = '123.456.7.8:80' -> /ip4/123.456.7.8/tcp/80
5
+ * const udpAddr = '[2001:db8::1]:8080' -> /ip6/2001:db8::1/udp/8080
6
+ * const dnsAddr = 'example.com:443' -> /dns4/example.com/tcp/443
7
+ * @param address - The address string to convert. Has to be in the format <addr>:<port>.
8
+ * @param protocol - The protocol to use in the multiaddr string.
9
+ * @returns A multiaddr compliant string.
10
+ */
11
+ export function convertToMultiaddr(address, protocol) {
12
+ const [addr, port] = splitAddressPort(address, false);
13
+ let multiaddrPrefix;
14
+ if (addr.includes(':')) {
15
+ // IPv6 address
16
+ multiaddrPrefix = 'ip6';
17
+ }
18
+ else if (addr.match(/^[\d.]+$/)) {
19
+ // IPv4 address
20
+ multiaddrPrefix = 'ip4';
21
+ }
22
+ else {
23
+ throw new Error('Invalid address format. Expected an IPv4 or IPv6 address.');
24
+ }
25
+ return `/${multiaddrPrefix}/${addr}/${protocol}/${port}`;
26
+ }
27
+ /**
28
+ * Splits an <address>:<port> string into its components.
29
+ * @returns The ip6 or ip4 address & port separately
30
+ */
31
+ export function splitAddressPort(address, allowEmptyAddress) {
32
+ let addr;
33
+ let port;
34
+ if (address.startsWith('[')) {
35
+ // IPv6 address enclosed in square brackets
36
+ const match = address.match(/^\[([^\]]+)\]:(\d+)$/);
37
+ if (!match) {
38
+ throw new Error(`Invalid IPv6 address format:${address}. Expected format: [<addr>]:<port>`);
39
+ }
40
+ [, addr, port] = match;
41
+ }
42
+ else {
43
+ // IPv4 address
44
+ [addr, port] = address.split(':');
45
+ if ((!addr && !allowEmptyAddress) || !port) {
46
+ throw new Error(`Invalid address format: ${address}. Expected format: <addr>:<port>`);
47
+ }
48
+ }
49
+ return [addr, port];
50
+ }
51
+ /**
52
+ * Queries the public IP address of the machine.
53
+ */
54
+ export async function getPublicIp() {
55
+ const resp = await fetch('http://checkip.amazonaws.com/');
56
+ const text = await resp.text();
57
+ return text.trim();
58
+ }
59
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxPQUFlLEVBQUUsUUFBdUI7SUFDekUsTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFFdEQsSUFBSSxlQUF1QixDQUFDO0lBRTVCLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3ZCLGVBQWU7UUFDZixlQUFlLEdBQUcsS0FBSyxDQUFDO0lBQzFCLENBQUM7U0FBTSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztRQUNsQyxlQUFlO1FBQ2YsZUFBZSxHQUFHLEtBQUssQ0FBQztJQUMxQixDQUFDO1NBQU0sQ0FBQztRQUNOLE1BQU0sSUFBSSxLQUFLLENBQUMsMkRBQTJELENBQUMsQ0FBQztJQUMvRSxDQUFDO0lBRUQsT0FBTyxJQUFJLGVBQWUsSUFBSSxJQUFJLElBQUksUUFBUSxJQUFJLElBQUksRUFBRSxDQUFDO0FBQzNELENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsT0FBZSxFQUFFLGlCQUEwQjtJQUMxRSxJQUFJLElBQVksQ0FBQztJQUNqQixJQUFJLElBQVksQ0FBQztJQUVqQixJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUM1QiwyQ0FBMkM7UUFDM0MsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNYLE1BQU0sSUFBSSxLQUFLLENBQUMsK0JBQStCLE9BQU8sb0NBQW9DLENBQUMsQ0FBQztRQUM5RixDQUFDO1FBQ0QsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDekIsQ0FBQztTQUFNLENBQUM7UUFDTixlQUFlO1FBQ2YsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNsQyxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDM0MsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsT0FBTyxrQ0FBa0MsQ0FBQyxDQUFDO1FBQ3hGLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztBQUN0QixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLFdBQVc7SUFDL0IsTUFBTSxJQUFJLEdBQUcsTUFBTSxLQUFLLENBQUMsK0JBQStCLENBQUMsQ0FBQztJQUMxRCxNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUMvQixPQUFPLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUNyQixDQUFDIn0=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aztec/p2p",
3
- "version": "0.42.0",
3
+ "version": "0.44.0",
4
4
  "type": "module",
5
5
  "exports": "./dest/index.js",
6
6
  "typedocOptions": {
@@ -31,7 +31,15 @@
31
31
  "rootDir": "./src",
32
32
  "transform": {
33
33
  "^.+\\.tsx?$": [
34
- "@swc/jest"
34
+ "@swc/jest",
35
+ {
36
+ "jsc": {
37
+ "parser": {
38
+ "syntax": "typescript",
39
+ "decorators": true
40
+ }
41
+ }
42
+ }
35
43
  ]
36
44
  },
37
45
  "extensionsToTreatAsEsm": [
@@ -48,10 +56,11 @@
48
56
  "testTimeout": 15000
49
57
  },
50
58
  "dependencies": {
51
- "@aztec/circuit-types": "0.42.0",
52
- "@aztec/circuits.js": "0.42.0",
53
- "@aztec/foundation": "0.42.0",
54
- "@aztec/kv-store": "0.42.0",
59
+ "@aztec/circuit-types": "0.44.0",
60
+ "@aztec/circuits.js": "0.44.0",
61
+ "@aztec/foundation": "0.44.0",
62
+ "@aztec/kv-store": "0.44.0",
63
+ "@aztec/telemetry-client": "0.44.0",
55
64
  "@chainsafe/discv5": "9.0.0",
56
65
  "@chainsafe/enr": "3.0.0",
57
66
  "@chainsafe/libp2p-gossipsub": "13.0.0",
@@ -8,13 +8,14 @@ import { type Multiaddr, multiaddr } from '@multiformats/multiaddr';
8
8
  import { type P2PConfig } from '../config.js';
9
9
  import { AZTEC_ENR_KEY, AZTEC_NET } from '../service/discV5_service.js';
10
10
  import { createLibP2PPeerId } from '../service/index.js';
11
+ import { convertToMultiaddr } from '../util.js';
11
12
 
12
13
  /**
13
14
  * Required P2P config values for a bootstrap node.
14
15
  */
15
16
  export type BootNodeConfig = Partial<P2PConfig> &
16
- Pick<P2PConfig, 'announceUdpHostname' | 'announcePort'> &
17
- Required<Pick<P2PConfig, 'udpListenIp' | 'udpListenPort'>>;
17
+ Pick<P2PConfig, 'udpAnnounceAddress'> &
18
+ Required<Pick<P2PConfig, 'udpListenAddress'>>;
18
19
 
19
20
  /**
20
21
  * Encapsulates a 'Bootstrap' node, used for the purpose of assisting new joiners in acquiring peers.
@@ -31,13 +32,18 @@ export class BootstrapNode {
31
32
  * @returns An empty promise.
32
33
  */
33
34
  public async start(config: BootNodeConfig) {
34
- const { peerIdPrivateKey, udpListenIp, udpListenPort, announceUdpHostname, announcePort } = config;
35
+ const { peerIdPrivateKey, udpListenAddress, udpAnnounceAddress } = config;
35
36
  const peerId = await createLibP2PPeerId(peerIdPrivateKey);
36
37
  this.peerId = peerId;
37
38
  const enr = SignableENR.createFromPeerId(peerId);
38
39
 
39
- const listenAddrUdp = multiaddr(`/ip4/${udpListenIp}/udp/${udpListenPort}`);
40
- const publicAddr = multiaddr(`${announceUdpHostname}/udp/${announcePort}`);
40
+ const listenAddrUdp = multiaddr(convertToMultiaddr(udpListenAddress, 'udp'));
41
+
42
+ if (!udpAnnounceAddress) {
43
+ throw new Error('You need to provide a UDP announce address.');
44
+ }
45
+
46
+ const publicAddr = multiaddr(convertToMultiaddr(udpAnnounceAddress, 'udp'));
41
47
  enr.setLocationMultiaddr(publicAddr);
42
48
  enr.set(AZTEC_ENR_KEY, Uint8Array.from([AZTEC_NET]));
43
49
 
@@ -4,10 +4,10 @@ import { type AztecKVStore } from '@aztec/kv-store';
4
4
  import { P2PClient } from '../client/p2p_client.js';
5
5
  import { type P2PConfig } from '../config.js';
6
6
  import { DiscV5Service } from '../service/discV5_service.js';
7
- import { DummyP2PService, DummyPeerDiscoveryService } from '../service/dummy_service.js';
7
+ import { DummyP2PService } from '../service/dummy_service.js';
8
8
  import { LibP2PService, createLibP2PPeerId } from '../service/index.js';
9
- import { getPublicIp } from '../service/ip_query.js';
10
9
  import { type TxPool } from '../tx_pool/index.js';
10
+ import { getPublicIp, splitAddressPort } from '../util.js';
11
11
 
12
12
  export * from './p2p_client.js';
13
13
 
@@ -17,44 +17,51 @@ export const createP2PClient = async (
17
17
  txPool: TxPool,
18
18
  l2BlockSource: L2BlockSource,
19
19
  ) => {
20
- let discv5Service;
21
20
  let p2pService;
22
21
 
23
22
  if (config.p2pEnabled) {
24
- // If announceTcpHostname or announceUdpHostname are not provided, query for public IP if config allows
23
+ // If announceTcpAddress or announceUdpAddress are not provided, query for public IP if config allows
25
24
  const {
26
- announceTcpHostname: configAnnounceTcpHostname,
27
- announceUdpHostname: configAnnounceUdpHostname,
25
+ tcpAnnounceAddress: configTcpAnnounceAddress,
26
+ udpAnnounceAddress: configUdpAnnounceAddress,
28
27
  queryForIp,
29
28
  } = config;
30
- if (!configAnnounceTcpHostname) {
29
+
30
+ // create variable for re-use if needed
31
+ let publicIp;
32
+
33
+ // check if no announce IP was provided
34
+ const splitTcpAnnounceAddress = splitAddressPort(configTcpAnnounceAddress || '', true);
35
+ if (splitTcpAnnounceAddress.length == 2 && splitTcpAnnounceAddress[0] === '') {
31
36
  if (queryForIp) {
32
- const publicIp = await getPublicIp();
33
- const announceHostname = `/ip4/${publicIp}`;
34
- config.announceTcpHostname = announceHostname;
37
+ publicIp = await getPublicIp();
38
+ const tcpAnnounceAddress = `${publicIp}:${splitTcpAnnounceAddress[1]}`;
39
+ config.tcpAnnounceAddress = tcpAnnounceAddress;
35
40
  } else {
36
- throw new Error('No announceTcpHostname provided');
41
+ throw new Error(
42
+ `Invalid announceTcpAddress provided: ${configTcpAnnounceAddress}. Expected format: <addr>:<port>`,
43
+ );
37
44
  }
38
45
  }
39
46
 
40
- if (!configAnnounceUdpHostname) {
41
- // If announceUdpHostname is not provided, use announceTcpHostname
42
- if (!queryForIp && config.announceTcpHostname) {
43
- config.announceUdpHostname = config.announceTcpHostname;
47
+ const splitUdpAnnounceAddress = splitAddressPort(configUdpAnnounceAddress || '', true);
48
+ if (splitUdpAnnounceAddress.length == 2 && splitUdpAnnounceAddress[0] === '') {
49
+ // If announceUdpAddress is not provided, use announceTcpAddress
50
+ if (!queryForIp && config.tcpAnnounceAddress) {
51
+ config.udpAnnounceAddress = config.tcpAnnounceAddress;
44
52
  } else if (queryForIp) {
45
- const publicIp = await getPublicIp();
46
- const announceHostname = `/ip4/${publicIp}`;
47
- config.announceUdpHostname = announceHostname;
53
+ const udpPublicIp = publicIp || (await getPublicIp());
54
+ const udpAnnounceAddress = `${udpPublicIp}:${splitUdpAnnounceAddress[1]}`;
55
+ config.udpAnnounceAddress = udpAnnounceAddress;
48
56
  }
49
57
  }
50
58
 
51
59
  // Create peer discovery service
52
60
  const peerId = await createLibP2PPeerId(config.peerIdPrivateKey);
53
- discv5Service = new DiscV5Service(peerId, config);
54
- p2pService = await LibP2PService.new(config, discv5Service, peerId, txPool, store);
61
+ const discoveryService = new DiscV5Service(peerId, config);
62
+ p2pService = await LibP2PService.new(config, discoveryService, peerId, txPool, store);
55
63
  } else {
56
64
  p2pService = new DummyP2PService();
57
- discv5Service = new DummyPeerDiscoveryService();
58
65
  }
59
66
  return new P2PClient(store, l2BlockSource, txPool, p2pService);
60
67
  };
@@ -194,7 +194,7 @@ export class P2PClient implements P2P {
194
194
  this.log.debug('Stopped block downloader');
195
195
  await this.runningPromise;
196
196
  this.setCurrentState(P2PClientState.STOPPED);
197
- this.log.info('P2P client stopped...');
197
+ this.log.info('P2P client stopped.');
198
198
  }
199
199
 
200
200
  /**
@@ -278,7 +278,6 @@ export class P2PClient implements P2P {
278
278
  for (const block of blocks) {
279
279
  const txHashes = block.body.txEffects.map(txEffect => txEffect.txHash);
280
280
  await this.txPool.deleteTxs(txHashes);
281
- this.p2pService.settledTxs(txHashes);
282
281
  }
283
282
  }
284
283
 
package/src/config.ts CHANGED
@@ -25,24 +25,24 @@ export interface P2PConfig {
25
25
  p2pL2QueueSize: number;
26
26
 
27
27
  /**
28
- * The tcp port on which the P2P service should listen for connections.
28
+ * The announce address for TCP.
29
29
  */
30
- tcpListenPort: number;
30
+ tcpAnnounceAddress?: string;
31
31
 
32
32
  /**
33
- * The tcp IP on which the P2P service should listen for connections.
33
+ * The announce address for UDP.
34
34
  */
35
- tcpListenIp: string;
35
+ udpAnnounceAddress?: string;
36
36
 
37
37
  /**
38
- * The udp port on which the P2P service should listen for connections. Used for Discv5 peer discovery.
38
+ * The listen address for TCP.
39
39
  */
40
- udpListenPort: number;
40
+ tcpListenAddress: string;
41
41
 
42
42
  /**
43
- * The udp IP on which the P2P service should listen for connections. Used for Discv5 peer discovery.
43
+ * The listen address for UDP.
44
44
  */
45
- udpListenIp: string;
45
+ udpListenAddress: string;
46
46
 
47
47
  /**
48
48
  * An optional peer id private key. If blank, will generate a random key.
@@ -59,22 +59,6 @@ export interface P2PConfig {
59
59
  */
60
60
  transactionProtocol: string;
61
61
 
62
- /**
63
- * TCP Hostname to announce.
64
- */
65
- announceTcpHostname?: string;
66
-
67
- /**
68
- * UDP Hostname to announce.
69
- * If not provided, will use the same hostname as TCP.
70
- */
71
- announceUdpHostname?: string;
72
-
73
- /**
74
- * Port to announce.
75
- */
76
- announcePort?: number;
77
-
78
62
  /**
79
63
  * Whether to enable NAT from libp2p (ignored for bootstrap node).
80
64
  */
@@ -101,7 +85,7 @@ export interface P2PConfig {
101
85
  txGossipVersion: SemVer;
102
86
 
103
87
  /**
104
- * If announceUdpHostname or announceTcpHostname are not provided, query for the IP address of the machine. Default is false.
88
+ * If announceUdpAddress or announceTcpAddress are not provided, query for the IP address of the machine. Default is false.
105
89
  */
106
90
  queryForIp: boolean;
107
91
  }
@@ -116,15 +100,12 @@ export function getP2PConfigEnvVars(): P2PConfig {
116
100
  P2P_BLOCK_CHECK_INTERVAL_MS,
117
101
  P2P_PEER_CHECK_INTERVAL_MS,
118
102
  P2P_L2_BLOCK_QUEUE_SIZE,
119
- P2P_TCP_LISTEN_PORT,
120
- P2P_TCP_LISTEN_IP,
121
- P2P_UDP_LISTEN_PORT,
122
- P2P_UDP_LISTEN_IP,
103
+ P2P_TCP_LISTEN_ADDR,
104
+ P2P_UDP_LISTEN_ADDR,
105
+ P2P_TCP_ANNOUNCE_ADDR,
106
+ P2P_UDP_ANNOUNCE_ADDR,
123
107
  PEER_ID_PRIVATE_KEY,
124
108
  BOOTSTRAP_NODES,
125
- P2P_ANNOUNCE_TCP_HOSTNAME,
126
- P2P_ANNOUNCE_UDP_HOSTNAME,
127
- P2P_ANNOUNCE_PORT,
128
109
  P2P_NAT_ENABLED,
129
110
  P2P_MIN_PEERS,
130
111
  P2P_MAX_PEERS,
@@ -133,21 +114,20 @@ export function getP2PConfigEnvVars(): P2PConfig {
133
114
  P2P_TX_PROTOCOL,
134
115
  P2P_QUERY_FOR_IP,
135
116
  } = process.env;
117
+ // P2P listen & announce addresses passed in format: <IP_ADDRESS>:<PORT>
118
+ // P2P announce multiaddrs passed in format: /ip4/<IP_ADDRESS>/<protocol>/<PORT>
136
119
  const envVars: P2PConfig = {
120
+ tcpAnnounceAddress: P2P_TCP_ANNOUNCE_ADDR,
121
+ udpAnnounceAddress: P2P_UDP_ANNOUNCE_ADDR,
122
+ tcpListenAddress: P2P_TCP_LISTEN_ADDR || '0.0.0.0:40400',
123
+ udpListenAddress: P2P_UDP_LISTEN_ADDR || '0.0.0.0:40400',
137
124
  p2pEnabled: P2P_ENABLED === 'true',
138
125
  p2pBlockCheckIntervalMS: P2P_BLOCK_CHECK_INTERVAL_MS ? +P2P_BLOCK_CHECK_INTERVAL_MS : 100,
139
126
  p2pPeerCheckIntervalMS: P2P_PEER_CHECK_INTERVAL_MS ? +P2P_PEER_CHECK_INTERVAL_MS : 1000,
140
127
  p2pL2QueueSize: P2P_L2_BLOCK_QUEUE_SIZE ? +P2P_L2_BLOCK_QUEUE_SIZE : 1000,
141
- tcpListenPort: P2P_TCP_LISTEN_PORT ? +P2P_TCP_LISTEN_PORT : 40400,
142
- tcpListenIp: P2P_TCP_LISTEN_IP ? P2P_TCP_LISTEN_IP : '0.0.0.0',
143
- udpListenPort: P2P_UDP_LISTEN_PORT ? +P2P_UDP_LISTEN_PORT : 40400,
144
- udpListenIp: P2P_UDP_LISTEN_IP ? P2P_UDP_LISTEN_IP : '0.0.0.0',
145
128
  peerIdPrivateKey: PEER_ID_PRIVATE_KEY,
146
129
  bootstrapNodes: BOOTSTRAP_NODES ? BOOTSTRAP_NODES.split(',') : [],
147
130
  transactionProtocol: P2P_TX_PROTOCOL ? P2P_TX_PROTOCOL : '/aztec/0.1.0',
148
- announceTcpHostname: P2P_ANNOUNCE_TCP_HOSTNAME,
149
- announceUdpHostname: P2P_ANNOUNCE_UDP_HOSTNAME,
150
- announcePort: P2P_ANNOUNCE_PORT ? +P2P_ANNOUNCE_PORT : undefined,
151
131
  enableNat: P2P_NAT_ENABLED === 'true',
152
132
  minPeerCount: P2P_MIN_PEERS ? +P2P_MIN_PEERS : 10,
153
133
  maxPeerCount: P2P_MAX_PEERS ? +P2P_MAX_PEERS : 100,