@aztec/p2p 0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2 → 0.76.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 (262) hide show
  1. package/dest/bootstrap/bootstrap.d.ts +38 -0
  2. package/dest/bootstrap/bootstrap.d.ts.map +1 -0
  3. package/dest/bootstrap/bootstrap.js +31 -38
  4. package/dest/client/factory.d.ts +21 -0
  5. package/dest/client/factory.d.ts.map +1 -0
  6. package/dest/client/factory.js +13 -11
  7. package/dest/client/index.d.ts +3 -0
  8. package/dest/client/index.d.ts.map +1 -0
  9. package/dest/client/index.js +1 -0
  10. package/dest/client/p2p_client.d.ts +332 -0
  11. package/dest/client/p2p_client.d.ts.map +1 -0
  12. package/dest/client/p2p_client.js +535 -513
  13. package/dest/config.d.ts +187 -0
  14. package/dest/config.d.ts.map +1 -0
  15. package/dest/config.js +64 -53
  16. package/dest/errors/reqresp.error.d.ts +28 -0
  17. package/dest/errors/reqresp.error.d.ts.map +1 -0
  18. package/dest/errors/reqresp.error.js +10 -6
  19. package/dest/index.d.ts +9 -0
  20. package/dest/index.d.ts.map +1 -0
  21. package/dest/index.js +1 -0
  22. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +57 -0
  23. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -0
  24. package/dest/mem_pools/attestation_pool/attestation_pool.js +2 -6
  25. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +3 -0
  26. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -0
  27. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +32 -64
  28. package/dest/mem_pools/attestation_pool/index.d.ts +3 -0
  29. package/dest/mem_pools/attestation_pool/index.d.ts.map +1 -0
  30. package/dest/mem_pools/attestation_pool/index.js +1 -0
  31. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +22 -0
  32. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +1 -0
  33. package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +19 -22
  34. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +17 -0
  35. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +1 -0
  36. package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +26 -22
  37. package/dest/mem_pools/attestation_pool/mocks.d.ts +18 -0
  38. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -0
  39. package/dest/mem_pools/attestation_pool/mocks.js +6 -10
  40. package/dest/mem_pools/epoch_proof_quote_pool/epoch_proof_quote_pool.d.ts +7 -0
  41. package/dest/mem_pools/epoch_proof_quote_pool/epoch_proof_quote_pool.d.ts.map +1 -0
  42. package/dest/mem_pools/epoch_proof_quote_pool/epoch_proof_quote_pool.js +2 -1
  43. package/dest/mem_pools/epoch_proof_quote_pool/index.d.ts +4 -0
  44. package/dest/mem_pools/epoch_proof_quote_pool/index.d.ts.map +1 -0
  45. package/dest/mem_pools/epoch_proof_quote_pool/index.js +1 -0
  46. package/dest/mem_pools/epoch_proof_quote_pool/memory_epoch_proof_quote_pool.d.ts +12 -0
  47. package/dest/mem_pools/epoch_proof_quote_pool/memory_epoch_proof_quote_pool.d.ts.map +1 -0
  48. package/dest/mem_pools/epoch_proof_quote_pool/memory_epoch_proof_quote_pool.js +4 -5
  49. package/dest/mem_pools/epoch_proof_quote_pool/test_utils.d.ts +8 -0
  50. package/dest/mem_pools/epoch_proof_quote_pool/test_utils.d.ts.map +1 -0
  51. package/dest/mem_pools/epoch_proof_quote_pool/test_utils.js +3 -2
  52. package/dest/mem_pools/index.d.ts +5 -0
  53. package/dest/mem_pools/index.d.ts.map +1 -0
  54. package/dest/mem_pools/index.js +2 -1
  55. package/dest/mem_pools/instrumentation.d.ts +31 -0
  56. package/dest/mem_pools/instrumentation.d.ts.map +1 -0
  57. package/dest/mem_pools/instrumentation.js +42 -37
  58. package/dest/mem_pools/interface.d.ts +13 -0
  59. package/dest/mem_pools/interface.d.ts.map +1 -0
  60. package/dest/mem_pools/interface.js +2 -3
  61. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +66 -0
  62. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +1 -0
  63. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +134 -127
  64. package/dest/mem_pools/tx_pool/index.d.ts +4 -0
  65. package/dest/mem_pools/tx_pool/index.d.ts.map +1 -0
  66. package/dest/mem_pools/tx_pool/index.js +1 -0
  67. package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts +56 -0
  68. package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts.map +1 -0
  69. package/dest/mem_pools/tx_pool/memory_tx_pool.js +43 -45
  70. package/dest/mem_pools/tx_pool/priority.d.ts +8 -0
  71. package/dest/mem_pools/tx_pool/priority.d.ts.map +1 -0
  72. package/dest/mem_pools/tx_pool/priority.js +3 -1
  73. package/dest/mem_pools/tx_pool/tx_pool.d.ts +66 -0
  74. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +1 -0
  75. package/dest/mem_pools/tx_pool/tx_pool.js +2 -3
  76. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +7 -0
  77. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +1 -0
  78. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +37 -107
  79. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +8 -0
  80. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -0
  81. package/dest/msg_validators/attestation_validator/attestation_validator.js +3 -3
  82. package/dest/msg_validators/attestation_validator/index.d.ts +2 -0
  83. package/dest/msg_validators/attestation_validator/index.d.ts.map +1 -0
  84. package/dest/msg_validators/attestation_validator/index.js +1 -0
  85. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts +8 -0
  86. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts.map +1 -0
  87. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.js +2 -2
  88. package/dest/msg_validators/block_proposal_validator/index.d.ts +2 -0
  89. package/dest/msg_validators/block_proposal_validator/index.d.ts.map +1 -0
  90. package/dest/msg_validators/block_proposal_validator/index.js +1 -0
  91. package/dest/msg_validators/epoch_proof_quote_validator/epoch_proof_quote_validator.d.ts +8 -0
  92. package/dest/msg_validators/epoch_proof_quote_validator/epoch_proof_quote_validator.d.ts.map +1 -0
  93. package/dest/msg_validators/epoch_proof_quote_validator/epoch_proof_quote_validator.js +2 -2
  94. package/dest/msg_validators/epoch_proof_quote_validator/index.d.ts +2 -0
  95. package/dest/msg_validators/epoch_proof_quote_validator/index.d.ts.map +1 -0
  96. package/dest/msg_validators/epoch_proof_quote_validator/index.js +1 -0
  97. package/dest/msg_validators/index.d.ts +4 -0
  98. package/dest/msg_validators/index.d.ts.map +1 -0
  99. package/dest/msg_validators/index.js +1 -0
  100. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +7 -0
  101. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -0
  102. package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +11 -9
  103. package/dest/msg_validators/tx_validator/block_header_validator.d.ts +11 -0
  104. package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -0
  105. package/dest/msg_validators/tx_validator/block_header_validator.js +12 -17
  106. package/dest/msg_validators/tx_validator/data_validator.d.ts +6 -0
  107. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -0
  108. package/dest/msg_validators/tx_validator/data_validator.js +32 -41
  109. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +12 -0
  110. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -0
  111. package/dest/msg_validators/tx_validator/double_spend_validator.js +14 -22
  112. package/dest/msg_validators/tx_validator/index.d.ts +7 -0
  113. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -0
  114. package/dest/msg_validators/tx_validator/index.js +1 -0
  115. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +10 -0
  116. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -0
  117. package/dest/msg_validators/tx_validator/metadata_validator.js +26 -29
  118. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +8 -0
  119. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -0
  120. package/dest/msg_validators/tx_validator/tx_proof_validator.js +12 -17
  121. package/dest/services/data_store.d.ts +27 -0
  122. package/dest/services/data_store.d.ts.map +1 -0
  123. package/dest/services/data_store.js +57 -57
  124. package/dest/services/discv5/discV5_service.d.ts +40 -0
  125. package/dest/services/discv5/discV5_service.d.ts.map +1 -0
  126. package/dest/services/discv5/discV5_service.js +82 -43
  127. package/dest/services/dummy_service.d.ts +83 -0
  128. package/dest/services/dummy_service.d.ts.map +1 -0
  129. package/dest/services/dummy_service.js +59 -40
  130. package/dest/services/encoding.d.ts +31 -0
  131. package/dest/services/encoding.d.ts.map +1 -0
  132. package/dest/services/encoding.js +9 -10
  133. package/dest/services/index.d.ts +3 -0
  134. package/dest/services/index.d.ts.map +1 -0
  135. package/dest/services/index.js +1 -0
  136. package/dest/services/libp2p/libp2p_logger.d.ts +7 -0
  137. package/dest/services/libp2p/libp2p_logger.d.ts.map +1 -0
  138. package/dest/services/libp2p/libp2p_logger.js +67 -0
  139. package/dest/services/libp2p/libp2p_service.d.ts +225 -0
  140. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -0
  141. package/dest/services/libp2p/libp2p_service.js +727 -709
  142. package/dest/services/peer-manager/metrics.d.ts +12 -0
  143. package/dest/services/peer-manager/metrics.d.ts.map +1 -0
  144. package/dest/services/peer-manager/metrics.js +7 -14
  145. package/dest/services/peer-manager/peer_manager.d.ts +76 -0
  146. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -0
  147. package/dest/services/peer-manager/peer_manager.js +342 -340
  148. package/dest/services/peer-manager/peer_scoring.d.ts +28 -0
  149. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -0
  150. package/dest/services/peer-manager/peer_scoring.js +18 -20
  151. package/dest/services/reqresp/config.d.ts +16 -0
  152. package/dest/services/reqresp/config.d.ts.map +1 -0
  153. package/dest/services/reqresp/config.js +5 -4
  154. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +45 -0
  155. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +1 -0
  156. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +28 -35
  157. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +61 -0
  158. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -0
  159. package/dest/services/reqresp/connection-sampler/connection_sampler.js +59 -60
  160. package/dest/services/reqresp/index.d.ts +6 -0
  161. package/dest/services/reqresp/index.d.ts.map +1 -0
  162. package/dest/services/reqresp/index.js +3 -1
  163. package/dest/services/reqresp/interface.d.ts +116 -0
  164. package/dest/services/reqresp/interface.d.ts.map +1 -0
  165. package/dest/services/reqresp/interface.js +30 -25
  166. package/dest/services/reqresp/metrics.d.ts +15 -0
  167. package/dest/services/reqresp/metrics.d.ts.map +1 -0
  168. package/dest/services/reqresp/metrics.js +10 -23
  169. package/dest/services/reqresp/protocols/block.d.ts +4 -0
  170. package/dest/services/reqresp/protocols/block.d.ts.map +1 -0
  171. package/dest/services/reqresp/protocols/block.js +2 -1
  172. package/dest/services/reqresp/protocols/goodbye.d.ts +51 -0
  173. package/dest/services/reqresp/protocols/goodbye.d.ts.map +1 -0
  174. package/dest/services/reqresp/protocols/goodbye.js +41 -36
  175. package/dest/services/reqresp/protocols/index.d.ts +9 -0
  176. package/dest/services/reqresp/protocols/index.d.ts.map +1 -0
  177. package/dest/services/reqresp/protocols/index.js +3 -1
  178. package/dest/services/reqresp/protocols/ping.d.ts +9 -0
  179. package/dest/services/reqresp/protocols/ping.d.ts.map +1 -0
  180. package/dest/services/reqresp/protocols/ping.js +3 -1
  181. package/dest/services/reqresp/protocols/status.d.ts +9 -0
  182. package/dest/services/reqresp/protocols/status.d.ts.map +1 -0
  183. package/dest/services/reqresp/protocols/status.js +3 -1
  184. package/dest/services/reqresp/protocols/tx.d.ts +13 -0
  185. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -0
  186. package/dest/services/reqresp/protocols/tx.js +8 -5
  187. package/dest/services/reqresp/rate-limiter/index.d.ts +2 -0
  188. package/dest/services/reqresp/rate-limiter/index.d.ts.map +1 -0
  189. package/dest/services/reqresp/rate-limiter/index.js +1 -0
  190. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +102 -0
  191. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -0
  192. package/dest/services/reqresp/rate-limiter/rate_limiter.js +35 -39
  193. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +3 -0
  194. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -0
  195. package/dest/services/reqresp/rate-limiter/rate_limits.js +17 -16
  196. package/dest/services/reqresp/reqresp.d.ts +166 -0
  197. package/dest/services/reqresp/reqresp.d.ts.map +1 -0
  198. package/dest/services/reqresp/reqresp.js +463 -460
  199. package/dest/services/reqresp/status.d.ts +31 -0
  200. package/dest/services/reqresp/status.d.ts.map +1 -0
  201. package/dest/services/reqresp/status.js +17 -16
  202. package/dest/services/service.d.ts +86 -0
  203. package/dest/services/service.d.ts.map +1 -0
  204. package/dest/services/service.js +4 -3
  205. package/dest/services/types.d.ts +32 -0
  206. package/dest/services/types.d.ts.map +1 -0
  207. package/dest/services/types.js +19 -20
  208. package/dest/test-helpers/generate-peer-id-private-keys.d.ts +7 -0
  209. package/dest/test-helpers/generate-peer-id-private-keys.d.ts.map +1 -0
  210. package/dest/test-helpers/generate-peer-id-private-keys.js +15 -0
  211. package/dest/test-helpers/get-ports.d.ts +7 -0
  212. package/dest/test-helpers/get-ports.d.ts.map +1 -0
  213. package/dest/test-helpers/get-ports.js +8 -0
  214. package/dest/test-helpers/index.d.ts +6 -0
  215. package/dest/test-helpers/index.d.ts.map +1 -0
  216. package/dest/test-helpers/index.js +6 -0
  217. package/dest/test-helpers/make-enrs.d.ts +16 -0
  218. package/dest/test-helpers/make-enrs.d.ts.map +1 -0
  219. package/dest/test-helpers/make-enrs.js +35 -0
  220. package/dest/test-helpers/make-test-p2p-clients.d.ts +37 -0
  221. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -0
  222. package/dest/test-helpers/make-test-p2p-clients.js +71 -0
  223. package/dest/test-helpers/reqresp-nodes.d.ts +55 -0
  224. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -0
  225. package/dest/test-helpers/reqresp-nodes.js +183 -0
  226. package/dest/testbench/p2p_client_testbench_worker.d.ts +2 -0
  227. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -0
  228. package/dest/testbench/p2p_client_testbench_worker.js +125 -0
  229. package/dest/util.d.ts +53 -0
  230. package/dest/util.d.ts.map +1 -0
  231. package/dest/util.js +34 -23
  232. package/dest/versioning.d.ts +12 -0
  233. package/dest/versioning.d.ts.map +1 -0
  234. package/dest/versioning.js +38 -0
  235. package/package.json +11 -9
  236. package/src/bootstrap/bootstrap.ts +9 -3
  237. package/src/client/factory.ts +12 -5
  238. package/src/config.ts +56 -29
  239. package/src/mem_pools/index.ts +3 -3
  240. package/src/mem_pools/instrumentation.ts +2 -3
  241. package/src/msg_validators/attestation_validator/attestation_validator.ts +3 -3
  242. package/src/msg_validators/block_proposal_validator/block_proposal_validator.ts +3 -3
  243. package/src/msg_validators/epoch_proof_quote_validator/epoch_proof_quote_validator.ts +3 -3
  244. package/src/services/discv5/discV5_service.ts +67 -18
  245. package/src/services/dummy_service.ts +2 -0
  246. package/src/services/libp2p/libp2p_logger.ts +78 -0
  247. package/src/services/libp2p/libp2p_service.ts +47 -10
  248. package/src/services/reqresp/protocols/goodbye.ts +1 -1
  249. package/src/services/reqresp/reqresp.ts +9 -1
  250. package/src/services/service.ts +2 -0
  251. package/src/services/types.ts +2 -10
  252. package/src/test-helpers/generate-peer-id-private-keys.ts +15 -0
  253. package/src/test-helpers/get-ports.ts +8 -0
  254. package/src/test-helpers/index.ts +5 -0
  255. package/src/test-helpers/make-enrs.ts +44 -0
  256. package/src/test-helpers/make-test-p2p-clients.ts +124 -0
  257. package/src/{mocks/index.ts → test-helpers/reqresp-nodes.ts} +10 -5
  258. package/src/testbench/README.md +20 -0
  259. package/src/testbench/p2p_client_testbench_worker.ts +156 -0
  260. package/src/testbench/scripts/run_testbench.sh +7 -0
  261. package/src/versioning.ts +50 -0
  262. package/dest/mocks/index.js +0 -190
@@ -9,8 +9,8 @@ import type { PeerId } from '@libp2p/interface';
9
9
  import { type Multiaddr, multiaddr } from '@multiformats/multiaddr';
10
10
 
11
11
  import type { BootnodeConfig } from '../config.js';
12
- import { AZTEC_ENR_KEY, AZTEC_NET } from '../services/types.js';
13
12
  import { convertToMultiaddr, createLibP2PPeerIdFromPrivateKey, getPeerIdPrivateKey } from '../util.js';
13
+ import { setAztecEnrKey } from '../versioning.js';
14
14
 
15
15
  /**
16
16
  * Encapsulates a 'Bootstrap' node, used for the purpose of assisting new joiners in acquiring peers.
@@ -46,7 +46,8 @@ export class BootstrapNode implements P2PBootstrapApi {
46
46
 
47
47
  const publicAddr = multiaddr(convertToMultiaddr(udpAnnounceAddress, 'udp'));
48
48
  enr.setLocationMultiaddr(publicAddr);
49
- enr.set(AZTEC_ENR_KEY, Uint8Array.from([AZTEC_NET]));
49
+
50
+ const versions = setAztecEnrKey(enr, config);
50
51
 
51
52
  this.logger.debug(`Starting bootstrap node ${peerId} listening on ${listenAddrUdp.toString()}`);
52
53
 
@@ -72,7 +73,12 @@ export class BootstrapNode implements P2PBootstrapApi {
72
73
 
73
74
  try {
74
75
  await this.node.start();
75
- this.logger.info('Bootstrap node started', { peerId, enr: enr.encodeTxt(), addr: listenAddrUdp.toString() });
76
+ this.logger.info('Bootstrap node started', {
77
+ peerId,
78
+ enr: enr.encodeTxt(),
79
+ addr: listenAddrUdp.toString(),
80
+ versions,
81
+ });
76
82
  } catch (e) {
77
83
  this.logger.error('Error starting Discv5', e);
78
84
  }
@@ -4,8 +4,8 @@ import {
4
4
  P2PClientType,
5
5
  type WorldStateSynchronizer,
6
6
  } from '@aztec/circuit-types';
7
- import { type EpochCache } from '@aztec/epoch-cache';
8
- import { createLogger } from '@aztec/foundation/log';
7
+ import { type EpochCacheInterface } from '@aztec/epoch-cache';
8
+ import { type Logger, createLogger } from '@aztec/foundation/log';
9
9
  import { type AztecAsyncKVStore } from '@aztec/kv-store';
10
10
  import { type DataStoreConfig } from '@aztec/kv-store/config';
11
11
  import { createStore } from '@aztec/kv-store/lmdb-v2';
@@ -29,6 +29,7 @@ type P2PClientDeps<T extends P2PClientType> = {
29
29
  store?: AztecAsyncKVStore;
30
30
  attestationPool?: T extends P2PClientType.Full ? AttestationPool : undefined;
31
31
  epochProofQuotePool?: EpochProofQuotePool;
32
+ logger?: Logger;
32
33
  };
33
34
 
34
35
  export const createP2PClient = async <T extends P2PClientType>(
@@ -37,12 +38,12 @@ export const createP2PClient = async <T extends P2PClientType>(
37
38
  l2BlockSource: L2BlockSource,
38
39
  proofVerifier: ClientProtocolCircuitVerifier,
39
40
  worldStateSynchronizer: WorldStateSynchronizer,
40
- epochCache: EpochCache,
41
+ epochCache: EpochCacheInterface,
41
42
  telemetry: TelemetryClient = getTelemetryClient(),
42
43
  deps: P2PClientDeps<T> = {},
43
44
  ) => {
44
45
  let config = { ..._config };
45
- const logger = createLogger('p2p');
46
+ const logger = deps.logger ?? createLogger('p2p');
46
47
  const store = deps.store ?? (await createStore('p2p', config, createLogger('p2p:lmdb-v2')));
47
48
  const archive = await createStore('p2p-archive', config, createLogger('p2p-archive:lmdb-v2'));
48
49
 
@@ -66,7 +67,12 @@ export const createP2PClient = async <T extends P2PClientType>(
66
67
  // Create peer discovery service
67
68
  const peerIdPrivateKey = await getPeerIdPrivateKey(config, store);
68
69
  const peerId = await createLibP2PPeerIdFromPrivateKey(peerIdPrivateKey);
69
- const discoveryService = new DiscV5Service(peerId, config, telemetry);
70
+ const discoveryService = new DiscV5Service(
71
+ peerId,
72
+ config,
73
+ telemetry,
74
+ createLogger(`${logger.module}:discv5_service`),
75
+ );
70
76
 
71
77
  p2pService = await LibP2PService.new<T>(
72
78
  clientType,
@@ -80,6 +86,7 @@ export const createP2PClient = async <T extends P2PClientType>(
80
86
  worldStateSynchronizer,
81
87
  store,
82
88
  telemetry,
89
+ createLogger(`${logger.module}:libp2p_service`),
83
90
  );
84
91
  } else {
85
92
  logger.verbose('P2P is disabled. Using dummy P2P service');
package/src/config.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import { type ChainConfig, chainConfigMappings } from '@aztec/circuit-types/config';
1
2
  import {
2
3
  type ConfigMappingsType,
3
4
  booleanConfigHelper,
@@ -13,7 +14,7 @@ import { type P2PReqRespConfig, p2pReqRespConfigMappings } from './services/reqr
13
14
  /**
14
15
  * P2P client configuration values.
15
16
  */
16
- export interface P2PConfig extends P2PReqRespConfig {
17
+ export interface P2PConfig extends P2PReqRespConfig, ChainConfig {
17
18
  /**
18
19
  * A flag dictating whether the P2P subsystem should be enabled.
19
20
  */
@@ -29,6 +30,16 @@ export interface P2PConfig extends P2PReqRespConfig {
29
30
  */
30
31
  blockRequestBatchSize: number;
31
32
 
33
+ /**
34
+ * DEBUG: Disable message validation - for testing purposes only
35
+ */
36
+ debugDisableMessageValidation: boolean;
37
+
38
+ /**
39
+ * DEBUG: Disable colocation penalty - for testing purposes only
40
+ */
41
+ debugDisableColocationPenalty: boolean;
42
+
32
43
  /**
33
44
  * The frequency in which to check for new peers.
34
45
  */
@@ -69,16 +80,14 @@ export interface P2PConfig extends P2PReqRespConfig {
69
80
  */
70
81
  bootstrapNodes: string[];
71
82
 
83
+ /** Whether to execute the version check in the bootstrap node ENR. */
84
+ bootstrapNodeEnrVersionCheck: boolean;
85
+
72
86
  /**
73
87
  * Protocol identifier for transaction gossiping.
74
88
  */
75
89
  transactionProtocol: string;
76
90
 
77
- /**
78
- * The minimum number of peers (a peer count below this will cause the node to look for more peers)
79
- */
80
- minPeerCount: number;
81
-
82
91
  /**
83
92
  * The maximum number of peers (a peer count above this will cause the node to refuse connection attempts)
84
93
  */
@@ -115,6 +124,16 @@ export interface P2PConfig extends P2PReqRespConfig {
115
124
  */
116
125
  gossipsubDhi: number;
117
126
 
127
+ /**
128
+ * The Dlazy parameter for the gossipsub protocol.
129
+ */
130
+ gossipsubDLazy: number;
131
+
132
+ /**
133
+ * Whether to flood publish messages. - For testing purposes only
134
+ */
135
+ gossipsubFloodPublish: boolean;
136
+
118
137
  /**
119
138
  * The number of gossipsub interval message cache windows to keep.
120
139
  */
@@ -150,11 +169,6 @@ export interface P2PConfig extends P2PReqRespConfig {
150
169
  */
151
170
  peerPenaltyValues: number[];
152
171
 
153
- /**
154
- * The chain id of the L1 chain.
155
- */
156
- l1ChainId: number;
157
-
158
172
  /** Limit of transactions to archive in the tx pool. Once the archived tx limit is reached, the oldest archived txs will be purged. */
159
173
  archivedTxLimit: number;
160
174
  }
@@ -170,6 +184,16 @@ export const p2pConfigMappings: ConfigMappingsType<P2PConfig> = {
170
184
  description: 'The frequency in which to check for new L2 blocks.',
171
185
  ...numberConfigHelper(100),
172
186
  },
187
+ debugDisableMessageValidation: {
188
+ env: 'DEBUG_P2P_DISABLE_MESSAGE_VALIDATION',
189
+ description: 'DEBUG: Disable message validation - NEVER set to true in production',
190
+ ...booleanConfigHelper(false),
191
+ },
192
+ debugDisableColocationPenalty: {
193
+ env: 'DEBUG_P2P_DISABLE_COLOCATION_PENALTY',
194
+ description: 'DEBUG: Disable colocation penalty - NEVER set to true in production',
195
+ ...booleanConfigHelper(false),
196
+ },
173
197
  peerCheckIntervalMS: {
174
198
  env: 'P2P_PEER_CHECK_INTERVAL_MS',
175
199
  description: 'The frequency in which to check for new peers.',
@@ -209,16 +233,16 @@ export const p2pConfigMappings: ConfigMappingsType<P2PConfig> = {
209
233
  parseEnv: (val: string) => val.split(','),
210
234
  description: 'A list of bootstrap peer ENRs to connect to. Separated by commas.',
211
235
  },
236
+ bootstrapNodeEnrVersionCheck: {
237
+ env: 'P2P_BOOTSTRAP_NODE_ENR_VERSION_CHECK',
238
+ description: 'Whether to check the version of the bootstrap node ENR.',
239
+ ...booleanConfigHelper(),
240
+ },
212
241
  transactionProtocol: {
213
242
  env: 'P2P_TX_PROTOCOL',
214
243
  description: 'Protocol identifier for transaction gossiping.',
215
244
  defaultValue: '/aztec/0.1.0',
216
245
  },
217
- minPeerCount: {
218
- env: 'P2P_MIN_PEERS',
219
- description: 'The minimum number of peers to connect to.',
220
- ...numberConfigHelper(10),
221
- },
222
246
  maxPeerCount: {
223
247
  env: 'P2P_MAX_PEERS',
224
248
  description: 'The maximum number of peers to connect to.',
@@ -244,7 +268,7 @@ export const p2pConfigMappings: ConfigMappingsType<P2PConfig> = {
244
268
  gossipsubInterval: {
245
269
  env: 'P2P_GOSSIPSUB_INTERVAL_MS',
246
270
  description: 'The interval of the gossipsub heartbeat to perform maintenance tasks.',
247
- ...numberConfigHelper(1_000),
271
+ ...numberConfigHelper(700),
248
272
  },
249
273
  gossipsubD: {
250
274
  env: 'P2P_GOSSIPSUB_D',
@@ -261,10 +285,20 @@ export const p2pConfigMappings: ConfigMappingsType<P2PConfig> = {
261
285
  description: 'The Dhi parameter for the gossipsub protocol.',
262
286
  ...numberConfigHelper(12),
263
287
  },
288
+ gossipsubDLazy: {
289
+ env: 'P2P_GOSSIPSUB_DLAZY',
290
+ description: 'The Dlazy parameter for the gossipsub protocol.',
291
+ ...numberConfigHelper(6),
292
+ },
293
+ gossipsubFloodPublish: {
294
+ env: 'P2P_GOSSIPSUB_FLOOD_PUBLISH',
295
+ description: 'Whether to flood publish messages. - For testing purposes only',
296
+ ...booleanConfigHelper(true),
297
+ },
264
298
  gossipsubMcacheLength: {
265
299
  env: 'P2P_GOSSIPSUB_MCACHE_LENGTH',
266
300
  description: 'The number of gossipsub interval message cache windows to keep.',
267
- ...numberConfigHelper(5),
301
+ ...numberConfigHelper(6),
268
302
  },
269
303
  gossipsubMcacheGossip: {
270
304
  env: 'P2P_GOSSIPSUB_MCACHE_GOSSIP',
@@ -298,11 +332,6 @@ export const p2pConfigMappings: ConfigMappingsType<P2PConfig> = {
298
332
  description: 'The "age" (in L2 blocks) of a tx after which we heavily penalize a peer for sending it.',
299
333
  ...numberConfigHelper(30),
300
334
  },
301
- l1ChainId: {
302
- env: 'L1_CHAIN_ID',
303
- description: 'The chain id of the L1 chain.',
304
- ...numberConfigHelper(31337),
305
- },
306
335
  blockRequestBatchSize: {
307
336
  env: 'P2P_BLOCK_REQUEST_BATCH_SIZE',
308
337
  description: 'The number of blocks to fetch in a single batch.',
@@ -315,6 +344,7 @@ export const p2pConfigMappings: ConfigMappingsType<P2PConfig> = {
315
344
  ...numberConfigHelper(0),
316
345
  },
317
346
  ...p2pReqRespConfigMappings,
347
+ ...chainConfigMappings,
318
348
  };
319
349
 
320
350
  /**
@@ -332,17 +362,14 @@ export function getP2PDefaultConfig(): P2PConfig {
332
362
  /**
333
363
  * Required P2P config values for a bootstrap node.
334
364
  */
335
- export type BootnodeConfig = Pick<
336
- P2PConfig,
337
- 'udpAnnounceAddress' | 'peerIdPrivateKey' | 'minPeerCount' | 'maxPeerCount'
338
- > &
365
+ export type BootnodeConfig = Pick<P2PConfig, 'udpAnnounceAddress' | 'peerIdPrivateKey' | 'maxPeerCount'> &
339
366
  Required<Pick<P2PConfig, 'udpListenAddress'>> &
340
- Pick<DataStoreConfig, 'dataDirectory' | 'dataStoreMapSizeKB'>;
367
+ Pick<DataStoreConfig, 'dataDirectory' | 'dataStoreMapSizeKB'> &
368
+ ChainConfig;
341
369
 
342
370
  const bootnodeConfigKeys: (keyof BootnodeConfig)[] = [
343
371
  'udpAnnounceAddress',
344
372
  'peerIdPrivateKey',
345
- 'minPeerCount',
346
373
  'maxPeerCount',
347
374
  'udpListenAddress',
348
375
  'dataDirectory',
@@ -1,4 +1,4 @@
1
- export type { TxPool } from './tx_pool/tx_pool.js';
2
- export type { AttestationPool } from './attestation_pool/attestation_pool.js';
3
- export type { EpochProofQuotePool } from './epoch_proof_quote_pool/epoch_proof_quote_pool.js';
1
+ export { TxPool } from './tx_pool/tx_pool.js';
2
+ export { AttestationPool } from './attestation_pool/attestation_pool.js';
3
+ export { EpochProofQuotePool } from './epoch_proof_quote_pool/epoch_proof_quote_pool.js';
4
4
  export { type MemPools } from './interface.js';
@@ -5,7 +5,6 @@ import {
5
5
  LmdbMetrics,
6
6
  type LmdbStatsCallback,
7
7
  Metrics,
8
- type MetricsType,
9
8
  type TelemetryClient,
10
9
  type UpDownCounter,
11
10
  } from '@aztec/telemetry-client';
@@ -17,8 +16,8 @@ export enum PoolName {
17
16
  }
18
17
 
19
18
  type MetricsLabels = {
20
- objectInMempool: MetricsType;
21
- objectSize: MetricsType;
19
+ objectInMempool: Metrics;
20
+ objectSize: Metrics;
22
21
  };
23
22
 
24
23
  /**
@@ -1,10 +1,10 @@
1
1
  import { type BlockAttestation, type P2PValidator, PeerErrorSeverity } from '@aztec/circuit-types';
2
- import { type EpochCache } from '@aztec/epoch-cache';
2
+ import { type EpochCacheInterface } from '@aztec/epoch-cache';
3
3
 
4
4
  export class AttestationValidator implements P2PValidator<BlockAttestation> {
5
- private epochCache: EpochCache;
5
+ private epochCache: EpochCacheInterface;
6
6
 
7
- constructor(epochCache: EpochCache) {
7
+ constructor(epochCache: EpochCacheInterface) {
8
8
  this.epochCache = epochCache;
9
9
  }
10
10
 
@@ -1,10 +1,10 @@
1
1
  import { type BlockProposal, type P2PValidator, PeerErrorSeverity } from '@aztec/circuit-types';
2
- import { type EpochCache } from '@aztec/epoch-cache';
2
+ import { type EpochCacheInterface } from '@aztec/epoch-cache';
3
3
 
4
4
  export class BlockProposalValidator implements P2PValidator<BlockProposal> {
5
- private epochCache: EpochCache;
5
+ private epochCache: EpochCacheInterface;
6
6
 
7
- constructor(epochCache: EpochCache) {
7
+ constructor(epochCache: EpochCacheInterface) {
8
8
  this.epochCache = epochCache;
9
9
  }
10
10
 
@@ -1,10 +1,10 @@
1
1
  import { type EpochProofQuote, type P2PValidator, PeerErrorSeverity } from '@aztec/circuit-types';
2
- import { type EpochCache } from '@aztec/epoch-cache';
2
+ import { type EpochCacheInterface } from '@aztec/epoch-cache';
3
3
 
4
4
  export class EpochProofQuoteValidator implements P2PValidator<EpochProofQuote> {
5
- private epochCache: EpochCache;
5
+ private epochCache: EpochCacheInterface;
6
6
 
7
- constructor(epochCache: EpochCache) {
7
+ constructor(epochCache: EpochCacheInterface) {
8
8
  this.epochCache = epochCache;
9
9
  }
10
10
 
@@ -1,3 +1,4 @@
1
+ import { type ComponentsVersions, checkCompressedComponentVersion } from '@aztec/circuit-types';
1
2
  import { createLogger } from '@aztec/foundation/log';
2
3
  import { sleep } from '@aztec/foundation/sleep';
3
4
  import { OtelMetricsAdapter, type TelemetryClient, getTelemetryClient } from '@aztec/telemetry-client';
@@ -10,8 +11,9 @@ import EventEmitter from 'events';
10
11
 
11
12
  import type { P2PConfig } from '../../config.js';
12
13
  import { convertToMultiaddr } from '../../util.js';
14
+ import { setAztecEnrKey } from '../../versioning.js';
13
15
  import { type PeerDiscoveryService, PeerDiscoveryState } from '../service.js';
14
- import { AZTEC_ENR_KEY, AZTEC_NET, Discv5Event, PeerEvent } from '../types.js';
16
+ import { AZTEC_ENR_KEY, Discv5Event, PeerEvent } from '../types.js';
15
17
 
16
18
  const delayBeforeStart = 2000; // 2sec
17
19
 
@@ -25,29 +27,32 @@ export class DiscV5Service extends EventEmitter implements PeerDiscoveryService
25
27
  /** This instance's ENR */
26
28
  private enr: SignableENR;
27
29
 
30
+ /** Version identifiers. */
31
+ private versions: ComponentsVersions;
32
+
28
33
  /** UDP listen addr */
29
34
  private listenMultiAddrUdp: Multiaddr;
30
35
 
31
36
  private currentState = PeerDiscoveryState.STOPPED;
32
37
 
33
- private bootstrapNodes: string[];
38
+ public readonly bootstrapNodes: string[] = [];
34
39
  private bootstrapNodePeerIds: PeerId[] = [];
35
40
 
36
41
  private startTime = 0;
37
42
 
38
43
  constructor(
39
44
  private peerId: PeerId,
40
- config: P2PConfig,
45
+ private config: P2PConfig,
41
46
  telemetry: TelemetryClient = getTelemetryClient(),
42
47
  private logger = createLogger('p2p:discv5_service'),
43
48
  ) {
44
49
  super();
45
50
  const { tcpAnnounceAddress, udpAnnounceAddress, udpListenAddress, bootstrapNodes } = config;
46
- this.bootstrapNodes = bootstrapNodes;
51
+ this.bootstrapNodes = bootstrapNodes ?? [];
47
52
  // create ENR from PeerId
48
53
  this.enr = SignableENR.createFromPeerId(peerId);
49
54
  // Add aztec identification to ENR
50
- this.enr.set(AZTEC_ENR_KEY, Uint8Array.from([AZTEC_NET]));
55
+ this.versions = setAztecEnrKey(this.enr, config);
51
56
 
52
57
  if (!tcpAnnounceAddress) {
53
58
  throw new Error('You need to provide at least a TCP announce address.');
@@ -78,6 +83,20 @@ export class DiscV5Service extends EventEmitter implements PeerDiscoveryService
78
83
  metricsRegistry,
79
84
  });
80
85
 
86
+ // Hook onto the onEstablished method to check the peer's version from the ENR,
87
+ // so we don't add it to our dht if it doesn't have the correct version.
88
+ // In addition, we'll hook onto onDiscovered to to repeat the same check there,
89
+ // just in case. Note that not adding the peer to the dht could lead to it
90
+ // being "readded" constantly, we'll need to keep an eye on whether this
91
+ // turns out to be a problem or not.
92
+ const origOnEstablished = this.discv5.onEstablished.bind(this.discv5);
93
+ this.discv5.onEstablished = (...args: unknown[]) => {
94
+ const enr = args[1] as ENR;
95
+ if (this.validateEnr(enr)) {
96
+ return origOnEstablished(...args);
97
+ }
98
+ };
99
+
81
100
  this.discv5.on(Discv5Event.DISCOVERED, this.onDiscovered.bind(this));
82
101
  this.discv5.on(Discv5Event.ENR_ADDED, this.onEnrAdded.bind(this));
83
102
  }
@@ -95,20 +114,29 @@ export class DiscV5Service extends EventEmitter implements PeerDiscoveryService
95
114
  peerId: this.peerId,
96
115
  enrUdp: await this.enr.getFullMultiaddr('udp'),
97
116
  enrTcp: await this.enr.getFullMultiaddr('tcp'),
117
+ versions: this.versions,
98
118
  });
99
119
  this.currentState = PeerDiscoveryState.RUNNING;
100
120
 
101
121
  // Add bootnode ENR if provided
102
122
  if (this.bootstrapNodes?.length) {
103
123
  // Do this conversion once since it involves an async function call
104
- this.bootstrapNodePeerIds = await Promise.all(this.bootstrapNodes.map(enr => ENR.decodeTxt(enr).peerId()));
105
- this.logger.info(`Adding bootstrap nodes ENRs: ${this.bootstrapNodes.join(', ')}`);
106
- try {
107
- this.bootstrapNodes.forEach(enr => {
124
+ const bootstrapNodesEnrs = this.bootstrapNodes.map(enr => ENR.decodeTxt(enr));
125
+ this.bootstrapNodePeerIds = await Promise.all(bootstrapNodesEnrs.map(enr => enr.peerId()));
126
+ this.logger.info(`Adding ${this.bootstrapNodes} bootstrap nodes ENRs: ${this.bootstrapNodes.join(', ')}`);
127
+ for (const enr of bootstrapNodesEnrs) {
128
+ try {
129
+ if (this.config.bootstrapNodeEnrVersionCheck) {
130
+ const value = enr.kvs.get(AZTEC_ENR_KEY);
131
+ if (!value) {
132
+ throw new Error('ENR does not contain aztec key');
133
+ }
134
+ checkCompressedComponentVersion(Buffer.from(value).toString(), this.versions);
135
+ }
108
136
  this.discv5.addEnr(enr);
109
- });
110
- } catch (e) {
111
- this.logger.error(`Error adding bootnode ENRs: ${e}`);
137
+ } catch (e) {
138
+ this.logger.error(`Error adding bootratrap node ${enr.encodeTxt()}`, e);
139
+ }
112
140
  }
113
141
  }
114
142
  }
@@ -169,14 +197,35 @@ export class DiscV5Service extends EventEmitter implements PeerDiscoveryService
169
197
  }
170
198
 
171
199
  private onDiscovered(enr: ENR) {
172
- // check the peer is an aztec peer
200
+ if (this.validateEnr(enr)) {
201
+ this.emit(PeerEvent.DISCOVERED, enr);
202
+ }
203
+ }
204
+
205
+ private validateEnr(enr: ENR): boolean {
206
+ // Check the peer is an aztec peer
173
207
  const value = enr.kvs.get(AZTEC_ENR_KEY);
174
- if (value) {
175
- const network = value[0];
176
- // check if the peer is on the same network
177
- if (network === AZTEC_NET) {
178
- this.emit(PeerEvent.DISCOVERED, enr);
208
+ if (!value) {
209
+ this.logger.warn(`Peer ${enr.nodeId} does not have aztec key in ENR`);
210
+ return false;
211
+ }
212
+
213
+ let compressedVersion;
214
+ try {
215
+ // And check it has the correct version
216
+ compressedVersion = Buffer.from(value).toString();
217
+ checkCompressedComponentVersion(compressedVersion, this.versions);
218
+ return true;
219
+ } catch (err: any) {
220
+ if (err.name === 'ComponentsVersionsError') {
221
+ this.logger.warn(`Peer ${enr.nodeId} has incorrect version: ${err.message}`, {
222
+ compressedVersion,
223
+ expected: this.versions,
224
+ });
225
+ } else {
226
+ this.logger.error(`Error checking peer version`, err);
179
227
  }
180
228
  }
229
+ return false;
181
230
  }
182
231
  }
@@ -88,6 +88,8 @@ export class DummyP2PService implements P2PService {
88
88
  */
89
89
  export class DummyPeerDiscoveryService extends EventEmitter implements PeerDiscoveryService {
90
90
  private currentState = PeerDiscoveryState.STOPPED;
91
+ public bootstrapNodes: string[] = [];
92
+
91
93
  /**
92
94
  * Starts the dummy implementation.
93
95
  * @returns A resolved promise.
@@ -0,0 +1,78 @@
1
+ import { createLogger } from '@aztec/foundation/log';
2
+
3
+ import { type ComponentLogger, type Logger } from '@libp2p/interface';
4
+
5
+ /**
6
+ * Creates a libp2p compatible logger that wraps our pino logger.
7
+ * This adapter implements the ComponentLogger interface required by libp2p.
8
+ */
9
+ export function createLibp2pComponentLogger(namespace: string, fixedTerms = {}): ComponentLogger {
10
+ return {
11
+ forComponent: (component: string) => createLibp2pLogger(`${namespace}:${component}`, fixedTerms),
12
+ };
13
+ }
14
+
15
+ function createLibp2pLogger(component: string, fixedTerms = {}): Logger {
16
+ const logger = createLogger(component, fixedTerms);
17
+
18
+ // Default log level is trace as this is super super noisy
19
+ const logFn = (formatter: any, ...args: any[]) => {
20
+ // Handle %p format specifier by manually replacing with args
21
+ if (typeof formatter === 'string' && args.length > 0) {
22
+ // Handle %p, %a, %s and %d format specifiers
23
+ const parts = formatter.split(/(%p|%a|%s|%d)/);
24
+ let result = parts[0];
25
+ let argIndex = 0;
26
+
27
+ for (let i = 1; i < parts.length; i += 2) {
28
+ if (argIndex < args.length) {
29
+ result += String(args[argIndex]) + (parts[i + 1] || '');
30
+ argIndex++;
31
+ }
32
+ }
33
+
34
+ formatter = result;
35
+ // Only keep non-format args as data
36
+ args = args.slice(argIndex);
37
+ }
38
+
39
+ // Handle object args by spreading them, but only if they weren't used in formatting
40
+ if (args.length === 1 && typeof args[0] === 'object') {
41
+ logger.trace(formatter, args[0]);
42
+ } else if (args.length > 0) {
43
+ // If we have remaining args after formatting, pass them as data
44
+ logger.trace(formatter, { _args: args });
45
+ } else {
46
+ logger.trace(formatter);
47
+ }
48
+ };
49
+
50
+ return Object.assign(logFn, {
51
+ enabled: logger.isLevelEnabled('debug'),
52
+
53
+ error(...args: any[]) {
54
+ const [msg, ...rest] = args;
55
+ logger.error(msg as string, ...rest);
56
+ },
57
+
58
+ debug(...args: any[]) {
59
+ const [msg, ...rest] = args;
60
+ logger.debug(msg as string, ...rest);
61
+ },
62
+
63
+ info(...args: any[]) {
64
+ const [msg, ...rest] = args;
65
+ logger.info(msg as string, ...rest);
66
+ },
67
+
68
+ warn(...args: any[]) {
69
+ const [msg, ...rest] = args;
70
+ logger.warn(msg as string, ...rest);
71
+ },
72
+
73
+ trace(...args: any[]) {
74
+ const [msg, ...rest] = args;
75
+ logger.trace(msg as string, ...rest);
76
+ },
77
+ });
78
+ }