@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
@@ -19,7 +19,7 @@ import {
19
19
  metricsTopicStrToLabels,
20
20
  } from '@aztec/circuit-types';
21
21
  import { Fr } from '@aztec/circuits.js';
22
- import { type EpochCache } from '@aztec/epoch-cache';
22
+ import { type EpochCacheInterface } from '@aztec/epoch-cache';
23
23
  import { createLogger } from '@aztec/foundation/log';
24
24
  import { SerialQueue } from '@aztec/foundation/queue';
25
25
  import { RunningPromise } from '@aztec/foundation/running-promise';
@@ -34,8 +34,10 @@ import {
34
34
  gossipsub,
35
35
  } from '@chainsafe/libp2p-gossipsub';
36
36
  import { createPeerScoreParams, createTopicScoreParams } from '@chainsafe/libp2p-gossipsub/score';
37
+ import { SignaturePolicy } from '@chainsafe/libp2p-gossipsub/types';
37
38
  import { noise } from '@chainsafe/libp2p-noise';
38
39
  import { yamux } from '@chainsafe/libp2p-yamux';
40
+ import { bootstrap } from '@libp2p/bootstrap';
39
41
  import { identify } from '@libp2p/identify';
40
42
  import { type Message, type PeerId, TopicValidatorResult } from '@libp2p/interface';
41
43
  import { type ConnectionManager } from '@libp2p/interface-internal';
@@ -65,6 +67,7 @@ import { pingHandler, reqRespBlockHandler, reqRespTxHandler, statusHandler } fro
65
67
  import { ReqResp } from '../reqresp/reqresp.js';
66
68
  import type { P2PService, PeerDiscoveryService } from '../service.js';
67
69
  import { GossipSubEvent } from '../types.js';
70
+ import { createLibp2pComponentLogger } from './libp2p_logger.js';
68
71
 
69
72
  interface MessageValidator {
70
73
  validator: {
@@ -111,7 +114,7 @@ export class LibP2PService<T extends P2PClientType> extends WithTracer implement
111
114
  private peerDiscoveryService: PeerDiscoveryService,
112
115
  private mempools: MemPools<T>,
113
116
  private l2BlockSource: L2BlockSource,
114
- epochCache: EpochCache,
117
+ epochCache: EpochCacheInterface,
115
118
  private proofVerifier: ClientProtocolCircuitVerifier,
116
119
  private worldStateSynchronizer: WorldStateSynchronizer,
117
120
  telemetry: TelemetryClient,
@@ -127,7 +130,7 @@ export class LibP2PService<T extends P2PClientType> extends WithTracer implement
127
130
  peerDiscoveryService,
128
131
  config,
129
132
  telemetry,
130
- logger,
133
+ createLogger(`${logger.module}:peer_manager`),
131
134
  peerScoring,
132
135
  this.reqresp,
133
136
  );
@@ -164,13 +167,14 @@ export class LibP2PService<T extends P2PClientType> extends WithTracer implement
164
167
  peerId: PeerId,
165
168
  mempools: MemPools<T>,
166
169
  l2BlockSource: L2BlockSource,
167
- epochCache: EpochCache,
170
+ epochCache: EpochCacheInterface,
168
171
  proofVerifier: ClientProtocolCircuitVerifier,
169
172
  worldStateSynchronizer: WorldStateSynchronizer,
170
173
  store: AztecAsyncKVStore,
171
174
  telemetry: TelemetryClient,
175
+ logger = createLogger('p2p:libp2p_service'),
172
176
  ) {
173
- const { tcpListenAddress, tcpAnnounceAddress, minPeerCount, maxPeerCount } = config;
177
+ const { tcpListenAddress, tcpAnnounceAddress, maxPeerCount } = config;
174
178
  const bindAddrTcp = convertToMultiaddr(tcpListenAddress, 'tcp');
175
179
  // We know tcpAnnounceAddress cannot be null here because we set it or throw when setting up the service.
176
180
  const announceAddrTcp = convertToMultiaddr(tcpAnnounceAddress!, 'tcp');
@@ -179,6 +183,12 @@ export class LibP2PService<T extends P2PClientType> extends WithTracer implement
179
183
 
180
184
  const otelMetricsAdapter = new OtelMetricsAdapter(telemetry);
181
185
 
186
+ // If bootstrap nodes are provided, also provide them to the p2p service
187
+ const peerDiscovery = [];
188
+ if (peerDiscoveryService.bootstrapNodes.length > 0) {
189
+ peerDiscovery.push(bootstrap({ list: peerDiscoveryService.bootstrapNodes }));
190
+ }
191
+
182
192
  const node = await createLibp2p({
183
193
  start: false,
184
194
  peerId,
@@ -200,24 +210,35 @@ export class LibP2PService<T extends P2PClientType> extends WithTracer implement
200
210
  }),
201
211
  ],
202
212
  datastore,
203
- streamMuxers: [yamux(), mplex()],
213
+ peerDiscovery,
214
+ streamMuxers: [mplex(), yamux()],
204
215
  connectionEncryption: [noise()],
205
216
  connectionManager: {
206
- minConnections: minPeerCount,
217
+ minConnections: 0,
207
218
  maxConnections: maxPeerCount,
219
+
220
+ maxParallelDials: 100,
221
+ maxPeerAddrsToDial: 5,
222
+ maxIncomingPendingConnections: 5,
208
223
  },
209
224
  services: {
210
225
  identify: identify({
211
226
  protocolPrefix: 'aztec',
212
227
  }),
213
228
  pubsub: gossipsub({
229
+ debugName: 'gossipsub',
230
+ globalSignaturePolicy: SignaturePolicy.StrictNoSign,
214
231
  allowPublishToZeroTopicPeers: true,
232
+ floodPublish: config.gossipsubFloodPublish,
215
233
  D: config.gossipsubD,
216
234
  Dlo: config.gossipsubDlo,
217
235
  Dhi: config.gossipsubDhi,
236
+ Dlazy: config.gossipsubDLazy,
218
237
  heartbeatInterval: config.gossipsubInterval,
219
238
  mcacheLength: config.gossipsubMcacheLength,
220
239
  mcacheGossip: config.gossipsubMcacheGossip,
240
+ // Increased from default 3s to give time for input lag: configuration and rationale from lodestar
241
+ gossipsubIWantFollowupMs: 12 * 1000,
221
242
  msgIdFn: getMsgIdFn,
222
243
  msgIdToStrFn: msgIdToStrFn,
223
244
  fastMsgIdFn: fastMsgIdFn,
@@ -226,6 +247,8 @@ export class LibP2PService<T extends P2PClientType> extends WithTracer implement
226
247
  metricsTopicStrToLabel: metricsTopicStrToLabels(),
227
248
  asyncValidation: true,
228
249
  scoreParams: createPeerScoreParams({
250
+ // IPColocation factor can be disabled for local testing - default to -5
251
+ IPColocationFactorWeight: config.debugDisableColocationPenalty ? 0 : -5.0,
229
252
  topics: {
230
253
  [Tx.p2pTopic]: createTopicScoreParams({
231
254
  topicWeight: 1,
@@ -254,6 +277,8 @@ export class LibP2PService<T extends P2PClientType> extends WithTracer implement
254
277
  connectionManager: components.connectionManager,
255
278
  }),
256
279
  },
280
+ // Fix the peer id in libp2p logs so we can see the source of the log
281
+ logger: createLibp2pComponentLogger(logger.module, { sourcePeerId: peerId }),
257
282
  });
258
283
 
259
284
  return new LibP2PService(
@@ -267,6 +292,7 @@ export class LibP2PService<T extends P2PClientType> extends WithTracer implement
267
292
  proofVerifier,
268
293
  worldStateSynchronizer,
269
294
  telemetry,
295
+ logger,
270
296
  );
271
297
  }
272
298
 
@@ -319,8 +345,16 @@ export class LibP2PService<T extends P2PClientType> extends WithTracer implement
319
345
  [BlockProposal.p2pTopic]: this.validatePropagatedBlockFromMessage.bind(this),
320
346
  [EpochProofQuote.p2pTopic]: this.validatePropagatedEpochProofQuoteFromMessage.bind(this),
321
347
  };
322
- for (const [topic, validator] of Object.entries(topicValidators)) {
323
- this.node.services.pubsub.topicValidators.set(topic, validator);
348
+ // When running bandwidth benchmarks, we use send blobs of data we do not want to validate
349
+ // NEVER switch this off in production
350
+ if (!this.config.debugDisableMessageValidation) {
351
+ for (const [topic, validator] of Object.entries(topicValidators)) {
352
+ this.node.services.pubsub.topicValidators.set(topic, validator);
353
+ }
354
+ } else {
355
+ this.logger.warn(
356
+ 'MESSAGE VALIDATION DISABLED - IF YOU SEE THIS LOG AND ARE NOT DEBUGGING AND ARE RUNNING IN A PRODUCTION ENVIRONMENT, PLEASE RE-ENABLE MESSAGE VALIDATION',
357
+ );
324
358
  }
325
359
 
326
360
  // add GossipSub listener
@@ -904,7 +938,10 @@ export class LibP2PService<T extends P2PClientType> extends WithTracer implement
904
938
  this.logger.trace(`Sending message ${identifier}`, { p2pMessageIdentifier: identifier });
905
939
 
906
940
  const recipientsNum = await this.publishToTopic(parent.p2pTopic, message.toBuffer());
907
- this.logger.debug(`Sent message ${identifier} to ${recipientsNum} peers`, { p2pMessageIdentifier: identifier });
941
+ this.logger.debug(`Sent message ${identifier} to ${recipientsNum} peers`, {
942
+ p2pMessageIdentifier: identifier,
943
+ sourcePeer: this.node.peerId.toString(),
944
+ });
908
945
  }
909
946
 
910
947
  // Libp2p seems to hang sometimes if new peers are initiating connections.
@@ -95,7 +95,7 @@ export function reqGoodbyeHandler(peerManager: PeerManager): ReqRespSubProtocolH
95
95
 
96
96
  peerManager.goodbyeReceived(peerId, reason);
97
97
 
98
- // Return a buffer of length 1 as an acknowledgement
98
+ // Return a buffer of length 1 as an acknowledgement: this is allowed to fail
99
99
  return Promise.resolve(Buffer.from([0x0]));
100
100
  };
101
101
  }
@@ -598,6 +598,8 @@ export class ReqResp {
598
598
  const handler = this.subProtocolHandlers[protocol];
599
599
  const transform = this.snappyTransform;
600
600
 
601
+ this.logger.info(`Stream handler for ${protocol}`);
602
+
601
603
  await pipe(
602
604
  stream,
603
605
  async function* (source: any) {
@@ -605,6 +607,12 @@ export class ReqResp {
605
607
  const msg = Buffer.from(chunkList.subarray());
606
608
  const response = await handler(connection.remotePeer, msg);
607
609
 
610
+ if (protocol === ReqRespSubProtocol.GOODBYE) {
611
+ // Don't respond
612
+ await stream.close();
613
+ return;
614
+ }
615
+
608
616
  // Send success code first, then the response
609
617
  const successChunk = Buffer.from([ReqRespStatus.SUCCESS]);
610
618
  yield new Uint8Array(successChunk);
@@ -615,7 +623,7 @@ export class ReqResp {
615
623
  stream,
616
624
  );
617
625
  } catch (e: any) {
618
- this.logger.warn(e);
626
+ this.logger.warn('Reqresp Response error: ', e);
619
627
  this.metrics.recordResponseError(protocol);
620
628
 
621
629
  // If we receive a known error, we use the error status in the response chunk, otherwise we categorize as unknown
@@ -106,4 +106,6 @@ export interface PeerDiscoveryService extends EventEmitter {
106
106
  getStatus(): PeerDiscoveryState;
107
107
 
108
108
  getEnr(): ENR | undefined;
109
+
110
+ bootstrapNodes: string[];
109
111
  }
@@ -29,16 +29,8 @@ export enum GossipSubEvent {
29
29
  /***************************************************
30
30
  * Types
31
31
  ***************************************************/
32
+
32
33
  /**
33
34
  * Aztec network specific types
34
35
  */
35
- export const AZTEC_ENR_KEY = 'aztec_network';
36
-
37
- export enum AztecENR {
38
- devnet = 0x01,
39
- testnet = 0x02,
40
- mainnet = 0x03,
41
- }
42
-
43
- // TODO: Make this an env var
44
- export const AZTEC_NET = AztecENR.devnet;
36
+ export const AZTEC_ENR_KEY = 'aztec';
@@ -0,0 +1,15 @@
1
+ import { generatePrivateKey } from 'viem/accounts';
2
+
3
+ /**
4
+ * Generate a list of peer id private keys
5
+ * @param numberOfPeers - The number of peer id private keys to generate
6
+ * @returns A list of peer id private keys
7
+ */
8
+ export function generatePeerIdPrivateKeys(numberOfPeers: number): string[] {
9
+ const peerIdPrivateKeys: string[] = [];
10
+ for (let i = 0; i < numberOfPeers; i++) {
11
+ // magic number is multiaddr prefix: https://multiformats.io/multiaddr/
12
+ peerIdPrivateKeys.push('08021220' + generatePrivateKey().slice(2, 68));
13
+ }
14
+ return peerIdPrivateKeys;
15
+ }
@@ -0,0 +1,8 @@
1
+ import getPort from 'get-port';
2
+
3
+ /**
4
+ * Get a list of ports for a given number of peers
5
+ * @param numberOfPeers - The number of peers to get ports for
6
+ * @returns A list of ports
7
+ */
8
+ export const getPorts = (numberOfPeers: number) => Promise.all(Array.from({ length: numberOfPeers }, () => getPort()));
@@ -0,0 +1,5 @@
1
+ export * from './generate-peer-id-private-keys.js';
2
+ export * from './get-ports.js';
3
+ export * from './make-enrs.js';
4
+ export * from './make-test-p2p-clients.js';
5
+ export * from './reqresp-nodes.js';
@@ -0,0 +1,44 @@
1
+ import { type ChainConfig } from '@aztec/circuit-types/config';
2
+
3
+ import { SignableENR } from '@chainsafe/enr';
4
+ import { multiaddr } from '@multiformats/multiaddr';
5
+
6
+ import { convertToMultiaddr, createLibP2PPeerIdFromPrivateKey } from '../util.js';
7
+ import { setAztecEnrKey } from '../versioning.js';
8
+
9
+ /**
10
+ * Make a list of ENRs for a given list of p2p private keys and ports
11
+ * @param p2pPrivateKeys - The private keys of the p2p nodes
12
+ * @param ports - The ports of the p2p nodes
13
+ * @returns A list of ENRs
14
+ */
15
+ export async function makeEnrs(p2pPrivateKeys: string[], ports: number[], config: ChainConfig) {
16
+ return await Promise.all(
17
+ p2pPrivateKeys.map((pk, i) => {
18
+ return makeEnr(pk, ports[i], config);
19
+ }),
20
+ );
21
+ }
22
+
23
+ /**
24
+ * Make an ENR for a given p2p private key and port
25
+ * @param p2pPrivateKey - The private key of the p2p node
26
+ * @param port - The port of the p2p node
27
+ * @returns The ENR of the p2p node
28
+ */
29
+ export async function makeEnr(p2pPrivateKey: string, port: number, config: ChainConfig) {
30
+ const peerId = await createLibP2PPeerIdFromPrivateKey(p2pPrivateKey);
31
+ const enr = SignableENR.createFromPeerId(peerId);
32
+
33
+ const udpAnnounceAddress = `127.0.0.1:${port}`;
34
+ const tcpAnnounceAddress = `127.0.0.1:${port}`;
35
+ const udpPublicAddr = multiaddr(convertToMultiaddr(udpAnnounceAddress, 'udp'));
36
+ const tcpPublicAddr = multiaddr(convertToMultiaddr(tcpAnnounceAddress, 'tcp'));
37
+
38
+ // ENRS must include the network and a discoverable address (udp for discv5)
39
+ setAztecEnrKey(enr, config);
40
+ enr.setLocationMultiaddr(udpPublicAddr);
41
+ enr.setLocationMultiaddr(tcpPublicAddr);
42
+
43
+ return enr.encodeTxt();
44
+ }
@@ -0,0 +1,124 @@
1
+ import { MockL2BlockSource } from '@aztec/archiver/test';
2
+ import { P2PClientType, type WorldStateSynchronizer } from '@aztec/circuit-types';
3
+ import { type EpochCache } from '@aztec/epoch-cache';
4
+ import { type Logger, createLogger } from '@aztec/foundation/log';
5
+ import { type DataStoreConfig } from '@aztec/kv-store/config';
6
+ import { openTmpStore } from '@aztec/kv-store/lmdb-v2';
7
+
8
+ import { createP2PClient } from '../client/index.js';
9
+ import { type P2PClient } from '../client/p2p_client.js';
10
+ import { type P2PConfig } from '../config.js';
11
+ import { type AttestationPool } from '../mem_pools/attestation_pool/attestation_pool.js';
12
+ import { type EpochProofQuotePool } from '../mem_pools/epoch_proof_quote_pool/epoch_proof_quote_pool.js';
13
+ import { type TxPool } from '../mem_pools/tx_pool/index.js';
14
+ import { generatePeerIdPrivateKeys } from '../test-helpers/generate-peer-id-private-keys.js';
15
+ import { getPorts } from './get-ports.js';
16
+ import { makeEnrs } from './make-enrs.js';
17
+ import { AlwaysFalseCircuitVerifier, AlwaysTrueCircuitVerifier } from './reqresp-nodes.js';
18
+
19
+ interface MakeTestP2PClientOptions {
20
+ mockAttestationPool: AttestationPool;
21
+ mockEpochProofQuotePool: EpochProofQuotePool;
22
+ mockTxPool: TxPool;
23
+ mockEpochCache: EpochCache;
24
+ mockWorldState: WorldStateSynchronizer;
25
+ alwaysTrueVerifier?: boolean;
26
+ p2pBaseConfig: P2PConfig;
27
+ p2pConfigOverrides?: Partial<P2PConfig>;
28
+ logger?: Logger;
29
+ }
30
+
31
+ /**
32
+ * Creates a single P2P client for testing purposes.
33
+ * @param peerIdPrivateKey - The private key of the peer.
34
+ * @param port - The port to run the client on.
35
+ * @param peers - The peers to connect to.
36
+ * @param options - The options for the client.
37
+ * @returns The created client.
38
+ */
39
+ export async function makeTestP2PClient(
40
+ peerIdPrivateKey: string,
41
+ port: number,
42
+ peers: string[],
43
+ {
44
+ alwaysTrueVerifier = true,
45
+ p2pBaseConfig,
46
+ p2pConfigOverrides = {},
47
+ mockAttestationPool,
48
+ mockEpochProofQuotePool,
49
+ mockTxPool,
50
+ mockEpochCache,
51
+ mockWorldState,
52
+ logger = createLogger('p2p-test-client'),
53
+ }: MakeTestP2PClientOptions,
54
+ ) {
55
+ const addr = `127.0.0.1:${port}`;
56
+ const listenAddr = `0.0.0.0:${port}`;
57
+
58
+ // Filter nodes so that we only dial active peers
59
+
60
+ const config: P2PConfig & DataStoreConfig = {
61
+ ...p2pBaseConfig,
62
+ p2pEnabled: true,
63
+ peerIdPrivateKey,
64
+ tcpListenAddress: listenAddr, // run on port 0
65
+ udpListenAddress: listenAddr,
66
+ tcpAnnounceAddress: addr,
67
+ udpAnnounceAddress: addr,
68
+ bootstrapNodes: peers,
69
+ peerCheckIntervalMS: 1000,
70
+ maxPeerCount: 10,
71
+ ...p2pConfigOverrides,
72
+ } as P2PConfig & DataStoreConfig;
73
+
74
+ const l2BlockSource = new MockL2BlockSource();
75
+ await l2BlockSource.createBlocks(100);
76
+
77
+ const proofVerifier = alwaysTrueVerifier ? new AlwaysTrueCircuitVerifier() : new AlwaysFalseCircuitVerifier();
78
+ const kvStore = await openTmpStore('test');
79
+ const deps = {
80
+ txPool: mockTxPool as unknown as TxPool,
81
+ attestationPool: mockAttestationPool as unknown as AttestationPool,
82
+ epochProofQuotePool: mockEpochProofQuotePool as unknown as EpochProofQuotePool,
83
+ store: kvStore,
84
+ logger,
85
+ };
86
+ const client = await createP2PClient(
87
+ P2PClientType.Full,
88
+ config,
89
+ l2BlockSource,
90
+ proofVerifier,
91
+ mockWorldState,
92
+ mockEpochCache,
93
+ undefined,
94
+ deps,
95
+ );
96
+ await client.start();
97
+
98
+ return client;
99
+ }
100
+
101
+ /**
102
+ * Creates a number of P2P clients for testing purposes.
103
+ * @param numberOfPeers - The number of clients to create.
104
+ * @param options - The options for the clients.
105
+ * @returns The created clients.
106
+ */
107
+ export async function makeTestP2PClients(numberOfPeers: number, testConfig: MakeTestP2PClientOptions) {
108
+ const clients: P2PClient[] = [];
109
+ const peerIdPrivateKeys = generatePeerIdPrivateKeys(numberOfPeers);
110
+
111
+ const ports = await getPorts(numberOfPeers);
112
+ const peerEnrs = await makeEnrs(peerIdPrivateKeys, ports, testConfig.p2pBaseConfig);
113
+
114
+ for (let i = 0; i < numberOfPeers; i++) {
115
+ const client = await makeTestP2PClient(peerIdPrivateKeys[i], ports[i], peerEnrs, {
116
+ ...testConfig,
117
+ logger: createLogger(`p2p:${i}`),
118
+ });
119
+ clients.push(client);
120
+ }
121
+
122
+ await Promise.all(clients.map(client => client.isReady()));
123
+ return clients;
124
+ }
@@ -5,6 +5,7 @@ import {
5
5
  type Tx,
6
6
  type WorldStateSynchronizer,
7
7
  } from '@aztec/circuit-types';
8
+ import { type ChainConfig, emptyChainConfig } from '@aztec/circuit-types/config';
8
9
  import { type EpochCache } from '@aztec/epoch-cache';
9
10
  import { timesParallel } from '@aztec/foundation/collection';
10
11
  import { type DataStoreConfig } from '@aztec/kv-store/config';
@@ -105,6 +106,7 @@ export async function createTestLibP2PService<T extends P2PClientType>(
105
106
  telemetry: TelemetryClient,
106
107
  port: number = 0,
107
108
  peerId?: PeerId,
109
+ chainConfig: ChainConfig = emptyChainConfig,
108
110
  ) {
109
111
  peerId = peerId ?? (await createSecp256k1PeerId());
110
112
  const config = {
@@ -114,10 +116,11 @@ export async function createTestLibP2PService<T extends P2PClientType>(
114
116
  udpListenAddress: `0.0.0.0:${port}`,
115
117
  bootstrapNodes: boostrapAddrs,
116
118
  peerCheckIntervalMS: 1000,
117
- minPeerCount: 1,
118
119
  maxPeerCount: 5,
119
120
  p2pEnabled: true,
120
121
  peerIdPrivateKey: Buffer.from(peerId.privateKey!).toString('hex'),
122
+ bootstrapNodeEnrVersionCheck: false,
123
+ ...chainConfig,
121
124
  } as P2PConfig & DataStoreConfig;
122
125
  const discoveryService = new DiscV5Service(peerId, config, telemetry);
123
126
  const proofVerifier = new AlwaysTrueCircuitVerifier();
@@ -230,15 +233,15 @@ export class AlwaysFalseCircuitVerifier implements ClientProtocolCircuitVerifier
230
233
  }
231
234
 
232
235
  // Bootnodes
233
- export function createBootstrapNodeConfig(privateKey: string, port: number): BootnodeConfig {
236
+ export function createBootstrapNodeConfig(privateKey: string, port: number, chainConfig: ChainConfig): BootnodeConfig {
234
237
  return {
235
238
  udpListenAddress: `0.0.0.0:${port}`,
236
239
  udpAnnounceAddress: `127.0.0.1:${port}`,
237
240
  peerIdPrivateKey: privateKey,
238
- minPeerCount: 10,
239
241
  maxPeerCount: 100,
240
242
  dataDirectory: undefined,
241
243
  dataStoreMapSizeKB: 0,
244
+ ...chainConfig,
242
245
  };
243
246
  }
244
247
 
@@ -246,17 +249,19 @@ export function createBootstrapNodeFromPrivateKey(
246
249
  privateKey: string,
247
250
  port: number,
248
251
  telemetry: TelemetryClient = getTelemetryClient(),
252
+ chainConfig: ChainConfig = emptyChainConfig,
249
253
  ): Promise<BootstrapNode> {
250
- const config = createBootstrapNodeConfig(privateKey, port);
254
+ const config = createBootstrapNodeConfig(privateKey, port, chainConfig);
251
255
  return startBootstrapNode(config, telemetry);
252
256
  }
253
257
 
254
258
  export async function createBootstrapNode(
255
259
  port: number,
256
260
  telemetry: TelemetryClient = getTelemetryClient(),
261
+ chainConfig: ChainConfig = emptyChainConfig,
257
262
  ): Promise<BootstrapNode> {
258
263
  const peerId = await createSecp256k1PeerId();
259
- const config = createBootstrapNodeConfig(Buffer.from(peerId.privateKey!).toString('hex'), port);
264
+ const config = createBootstrapNodeConfig(Buffer.from(peerId.privateKey!).toString('hex'), port, chainConfig);
260
265
 
261
266
  return startBootstrapNode(config, telemetry);
262
267
  }
@@ -0,0 +1,20 @@
1
+ ## P2P Test bench
2
+
3
+ A testbench that runs only the P2P client on a number of worker threads, with the purpose of monitoring and testing the performance of the P2P client.
4
+
5
+ ### Running the testbench
6
+
7
+ ```bash
8
+ ./run_testbench.sh <outputfile>
9
+ ```
10
+
11
+ This will produce a LONG series of logs that can be used for further analysis.
12
+
13
+ ## TODO
14
+
15
+ - Strongly parameterizing the testbench scripts
16
+ - Add traffic shaping options to the testbench
17
+ - Add log parsing step that can categorize a report in json of the propoagation of the message
18
+ - Add multiple different tx sizes
19
+ - Create ci pipeline that can run analysis on the logs and compare against previous runs
20
+ - Create a series of markdown reports detailing what each parameter change does and include graphs to compare performance
@@ -0,0 +1,156 @@
1
+ /**
2
+ * A testbench worker that creates a p2p client and listens for commands from the parent.
3
+ *
4
+ * Used when running testbench commands
5
+ */
6
+ import { MockL2BlockSource } from '@aztec/archiver/test';
7
+ import { P2PClientType, Tx, TxStatus, type WorldStateSynchronizer } from '@aztec/circuit-types';
8
+ import { type EpochCacheInterface } from '@aztec/epoch-cache';
9
+ import { EthAddress } from '@aztec/foundation/eth-address';
10
+ import { createLogger } from '@aztec/foundation/log';
11
+ import { sleep } from '@aztec/foundation/sleep';
12
+ import { type DataStoreConfig } from '@aztec/kv-store/config';
13
+ import { openTmpStore } from '@aztec/kv-store/lmdb-v2';
14
+
15
+ import { type P2PConfig } from '../config.js';
16
+ import { createP2PClient } from '../index.js';
17
+ import { type AttestationPool } from '../mem_pools/attestation_pool/attestation_pool.js';
18
+ import { type EpochProofQuotePool } from '../mem_pools/epoch_proof_quote_pool/epoch_proof_quote_pool.js';
19
+ import { type TxPool } from '../mem_pools/tx_pool/index.js';
20
+ import { AlwaysTrueCircuitVerifier } from '../test-helpers/reqresp-nodes.js';
21
+
22
+ // Simple mock implementation
23
+ function mockTxPool(): TxPool {
24
+ // Mock all methods
25
+ return {
26
+ addTxs: () => Promise.resolve(),
27
+ getTxByHash: () => Promise.resolve(undefined),
28
+ getArchivedTxByHash: () => Promise.resolve(undefined),
29
+ markAsMined: () => Promise.resolve(),
30
+ markMinedAsPending: () => Promise.resolve(),
31
+ deleteTxs: () => Promise.resolve(),
32
+ getAllTxs: () => Promise.resolve([]),
33
+ getAllTxHashes: () => Promise.resolve([]),
34
+ getPendingTxHashes: () => Promise.resolve([]),
35
+ getMinedTxHashes: () => Promise.resolve([]),
36
+ getTxStatus: () => Promise.resolve(TxStatus.PENDING),
37
+ };
38
+ }
39
+
40
+ function mockAttestationPool(): AttestationPool {
41
+ return {
42
+ addAttestations: () => Promise.resolve(),
43
+ deleteAttestations: () => Promise.resolve(),
44
+ deleteAttestationsOlderThan: () => Promise.resolve(),
45
+ deleteAttestationsForSlot: () => Promise.resolve(),
46
+ deleteAttestationsForSlotAndProposal: () => Promise.resolve(),
47
+ getAttestationsForSlot: () => Promise.resolve([]),
48
+ };
49
+ }
50
+
51
+ function mockEpochProofQuotePool(): EpochProofQuotePool {
52
+ return {
53
+ addQuote: () => {},
54
+ getQuotes: () => [],
55
+ deleteQuotesToEpoch: () => {},
56
+ };
57
+ }
58
+
59
+ function mockEpochCache(): EpochCacheInterface {
60
+ return {
61
+ getCommittee: () => Promise.resolve([] as EthAddress[]),
62
+ getProposerIndexEncoding: () => '0x' as `0x${string}`,
63
+ getEpochAndSlotNow: () => ({ epoch: 0n, slot: 0n, ts: 0n }),
64
+ computeProposerIndex: () => 0n,
65
+ getProposerInCurrentOrNextSlot: () =>
66
+ Promise.resolve({
67
+ currentProposer: EthAddress.ZERO,
68
+ nextProposer: EthAddress.ZERO,
69
+ currentSlot: 0n,
70
+ nextSlot: 0n,
71
+ }),
72
+ isInCommittee: () => Promise.resolve(false),
73
+ };
74
+ }
75
+
76
+ // eslint-disable-next-line @typescript-eslint/no-misused-promises
77
+ process.on('message', async msg => {
78
+ const { type, config, clientIndex } = msg as { type: string; config: P2PConfig; clientIndex: number };
79
+
80
+ try {
81
+ if (type === 'START') {
82
+ const txPool = mockTxPool();
83
+ const attestationPool = mockAttestationPool();
84
+ const epochProofQuotePool = mockEpochProofQuotePool();
85
+ const epochCache = mockEpochCache();
86
+ const worldState = {} as WorldStateSynchronizer;
87
+ const l2BlockSource = new MockL2BlockSource();
88
+ await l2BlockSource.createBlocks(100);
89
+
90
+ const proofVerifier = new AlwaysTrueCircuitVerifier();
91
+ const kvStore = await openTmpStore(`test-${clientIndex}`);
92
+ const logger = createLogger(`p2p:${clientIndex}`);
93
+
94
+ const deps = {
95
+ txPool,
96
+ attestationPool,
97
+ epochProofQuotePool,
98
+ store: kvStore,
99
+ logger,
100
+ };
101
+
102
+ const client = await createP2PClient(
103
+ P2PClientType.Full,
104
+ config as P2PConfig & DataStoreConfig,
105
+ l2BlockSource,
106
+ proofVerifier,
107
+ worldState,
108
+ epochCache,
109
+ undefined,
110
+ deps,
111
+ );
112
+
113
+ // Create spy for gossip messages
114
+ let gossipMessageCount = 0;
115
+ (client as any).p2pService.handleNewGossipMessage = (...args: any[]) => {
116
+ gossipMessageCount++;
117
+ process.send!({ type: 'GOSSIP_RECEIVED', count: gossipMessageCount });
118
+ return (client as any).p2pService.constructor.prototype.handleNewGossipMessage.apply(
119
+ (client as any).p2pService,
120
+ args,
121
+ );
122
+ };
123
+
124
+ await client.start();
125
+ // Wait until the client is ready
126
+ for (let i = 0; i < 100; i++) {
127
+ const isReady = client.isReady();
128
+ logger.debug(`Client ${clientIndex} isReady: ${isReady}`);
129
+ if (isReady) {
130
+ break;
131
+ }
132
+ await sleep(1000);
133
+ }
134
+
135
+ // Listen for commands from parent
136
+ // eslint-disable-next-line @typescript-eslint/no-misused-promises
137
+ process.on('message', async (cmd: any) => {
138
+ switch (cmd.type) {
139
+ case 'STOP':
140
+ await client.stop();
141
+ process.exit(0);
142
+ break;
143
+ case 'SEND_TX':
144
+ await client.sendTx(Tx.fromBuffer(Buffer.from(cmd.tx)));
145
+ process.send!({ type: 'TX_SENT' });
146
+ break;
147
+ }
148
+ });
149
+
150
+ process.send!({ type: 'READY' });
151
+ }
152
+ } catch (err: any) {
153
+ process.send!({ type: 'ERROR', error: err.message });
154
+ process.exit(1);
155
+ }
156
+ });