@aztec/p2p 0.0.1-commit.03f7ef2 → 0.0.1-commit.04d373f

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 (565) hide show
  1. package/README.md +129 -3
  2. package/dest/bootstrap/bootstrap.d.ts +4 -3
  3. package/dest/bootstrap/bootstrap.d.ts.map +1 -1
  4. package/dest/bootstrap/bootstrap.js +13 -5
  5. package/dest/client/factory.d.ts +13 -12
  6. package/dest/client/factory.d.ts.map +1 -1
  7. package/dest/client/factory.js +65 -20
  8. package/dest/client/interface.d.ts +72 -37
  9. package/dest/client/interface.d.ts.map +1 -1
  10. package/dest/client/p2p_client.d.ts +55 -64
  11. package/dest/client/p2p_client.d.ts.map +1 -1
  12. package/dest/client/p2p_client.js +670 -339
  13. package/dest/config.d.ts +165 -89
  14. package/dest/config.d.ts.map +1 -1
  15. package/dest/config.js +163 -53
  16. package/dest/errors/p2p-service.error.d.ts +9 -0
  17. package/dest/errors/p2p-service.error.d.ts.map +1 -0
  18. package/dest/errors/p2p-service.error.js +10 -0
  19. package/dest/errors/reqresp.error.d.ts +1 -20
  20. package/dest/errors/reqresp.error.d.ts.map +1 -1
  21. package/dest/errors/reqresp.error.js +0 -21
  22. package/dest/errors/tx-pool.error.d.ts +8 -0
  23. package/dest/errors/tx-pool.error.d.ts.map +1 -0
  24. package/dest/errors/tx-pool.error.js +9 -0
  25. package/dest/index.d.ts +2 -2
  26. package/dest/index.d.ts.map +1 -1
  27. package/dest/index.js +1 -1
  28. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +152 -77
  29. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  30. package/dest/mem_pools/attestation_pool/attestation_pool.js +511 -3
  31. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +2 -2
  32. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
  33. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +649 -293
  34. package/dest/mem_pools/attestation_pool/index.d.ts +2 -3
  35. package/dest/mem_pools/attestation_pool/index.d.ts.map +1 -1
  36. package/dest/mem_pools/attestation_pool/index.js +1 -2
  37. package/dest/mem_pools/attestation_pool/mocks.d.ts +9 -6
  38. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  39. package/dest/mem_pools/attestation_pool/mocks.js +18 -12
  40. package/dest/mem_pools/index.d.ts +3 -3
  41. package/dest/mem_pools/index.d.ts.map +1 -1
  42. package/dest/mem_pools/index.js +1 -1
  43. package/dest/mem_pools/instrumentation.d.ts +6 -4
  44. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  45. package/dest/mem_pools/instrumentation.js +35 -24
  46. package/dest/mem_pools/interface.d.ts +5 -5
  47. package/dest/mem_pools/interface.d.ts.map +1 -1
  48. package/dest/mem_pools/tx_pool_v2/archive/index.d.ts +2 -0
  49. package/dest/mem_pools/tx_pool_v2/archive/index.d.ts.map +1 -0
  50. package/dest/mem_pools/tx_pool_v2/archive/index.js +1 -0
  51. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts +43 -0
  52. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts.map +1 -0
  53. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.js +103 -0
  54. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +104 -0
  55. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -0
  56. package/dest/mem_pools/tx_pool_v2/deleted_pool.js +251 -0
  57. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts +47 -0
  58. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts.map +1 -0
  59. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.js +128 -0
  60. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +17 -0
  61. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -0
  62. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +94 -0
  63. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +19 -0
  64. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -0
  65. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +97 -0
  66. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +11 -0
  67. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -0
  68. package/dest/mem_pools/tx_pool_v2/eviction/index.js +12 -0
  69. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts +16 -0
  70. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts.map +1 -0
  71. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.js +62 -0
  72. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +180 -0
  73. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -0
  74. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.js +25 -0
  75. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts +15 -0
  76. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -0
  77. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +65 -0
  78. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts +17 -0
  79. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -0
  80. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +93 -0
  81. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +16 -0
  82. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -0
  83. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +78 -0
  84. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +20 -0
  85. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -0
  86. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +75 -0
  87. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +15 -0
  88. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -0
  89. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +19 -0
  90. package/dest/mem_pools/tx_pool_v2/index.d.ts +6 -0
  91. package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -0
  92. package/dest/mem_pools/tx_pool_v2/index.js +5 -0
  93. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts +15 -0
  94. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts.map +1 -0
  95. package/dest/mem_pools/tx_pool_v2/instrumentation.js +43 -0
  96. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +218 -0
  97. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -0
  98. package/dest/mem_pools/tx_pool_v2/interfaces.js +10 -0
  99. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +137 -0
  100. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -0
  101. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +223 -0
  102. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts +26 -0
  103. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts.map +1 -0
  104. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.js +70 -0
  105. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +108 -0
  106. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -0
  107. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +337 -0
  108. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +62 -0
  109. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -0
  110. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +167 -0
  111. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +78 -0
  112. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -0
  113. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +914 -0
  114. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +11 -5
  115. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  116. package/dest/msg_validators/attestation_validator/attestation_validator.js +79 -21
  117. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +11 -7
  118. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
  119. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +25 -17
  120. package/dest/msg_validators/clock_tolerance.d.ts +32 -0
  121. package/dest/msg_validators/clock_tolerance.d.ts.map +1 -0
  122. package/dest/msg_validators/clock_tolerance.js +95 -0
  123. package/dest/msg_validators/index.d.ts +2 -2
  124. package/dest/msg_validators/index.d.ts.map +1 -1
  125. package/dest/msg_validators/index.js +1 -1
  126. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +15 -0
  127. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -0
  128. package/dest/msg_validators/proposal_validator/block_proposal_validator.js +14 -0
  129. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +15 -0
  130. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -0
  131. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +20 -0
  132. package/dest/msg_validators/proposal_validator/index.d.ts +4 -0
  133. package/dest/msg_validators/proposal_validator/index.d.ts.map +1 -0
  134. package/dest/msg_validators/proposal_validator/index.js +3 -0
  135. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +26 -0
  136. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -0
  137. package/dest/msg_validators/proposal_validator/proposal_validator.js +150 -0
  138. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +4 -4
  139. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  140. package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +11 -18
  141. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +2 -1
  142. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -1
  143. package/dest/msg_validators/tx_validator/allowed_public_setup.js +25 -21
  144. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts +17 -0
  145. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts.map +1 -0
  146. package/dest/msg_validators/tx_validator/allowed_setup_helpers.js +24 -0
  147. package/dest/msg_validators/tx_validator/archive_cache.d.ts +3 -3
  148. package/dest/msg_validators/tx_validator/archive_cache.d.ts.map +1 -1
  149. package/dest/msg_validators/tx_validator/block_header_validator.d.ts +20 -6
  150. package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
  151. package/dest/msg_validators/tx_validator/block_header_validator.js +4 -3
  152. package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts +15 -0
  153. package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts.map +1 -0
  154. package/dest/msg_validators/tx_validator/cached_tx_validator.js +19 -0
  155. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts +9 -0
  156. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts.map +1 -0
  157. package/dest/msg_validators/tx_validator/contract_instance_validator.js +48 -0
  158. package/dest/msg_validators/tx_validator/data_validator.d.ts +4 -1
  159. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  160. package/dest/msg_validators/tx_validator/data_validator.js +40 -3
  161. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +15 -4
  162. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
  163. package/dest/msg_validators/tx_validator/double_spend_validator.js +7 -6
  164. package/dest/msg_validators/tx_validator/factory.d.ts +138 -5
  165. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  166. package/dest/msg_validators/tx_validator/factory.js +259 -58
  167. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +10 -0
  168. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -0
  169. package/dest/msg_validators/tx_validator/fee_payer_balance.js +24 -0
  170. package/dest/msg_validators/tx_validator/gas_validator.d.ts +100 -3
  171. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  172. package/dest/msg_validators/tx_validator/gas_validator.js +146 -67
  173. package/dest/msg_validators/tx_validator/index.d.ts +6 -1
  174. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  175. package/dest/msg_validators/tx_validator/index.js +5 -0
  176. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +3 -2
  177. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  178. package/dest/msg_validators/tx_validator/metadata_validator.js +6 -6
  179. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts +14 -0
  180. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts.map +1 -0
  181. package/dest/msg_validators/tx_validator/nullifier_cache.js +24 -0
  182. package/dest/msg_validators/tx_validator/phases_validator.d.ts +24 -3
  183. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
  184. package/dest/msg_validators/tx_validator/phases_validator.js +75 -27
  185. package/dest/msg_validators/tx_validator/size_validator.d.ts +8 -0
  186. package/dest/msg_validators/tx_validator/size_validator.d.ts.map +1 -0
  187. package/dest/msg_validators/tx_validator/size_validator.js +23 -0
  188. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +22 -5
  189. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
  190. package/dest/msg_validators/tx_validator/timestamp_validator.js +8 -8
  191. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts +3 -2
  192. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts.map +1 -1
  193. package/dest/msg_validators/tx_validator/tx_permitted_validator.js +2 -2
  194. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +4 -2
  195. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
  196. package/dest/msg_validators/tx_validator/tx_proof_validator.js +4 -2
  197. package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts +48 -0
  198. package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts.map +1 -0
  199. package/dest/msg_validators/tx_validator/tx_validation_cache.js +69 -0
  200. package/dest/services/data_store.d.ts +1 -1
  201. package/dest/services/data_store.d.ts.map +1 -1
  202. package/dest/services/data_store.js +14 -10
  203. package/dest/services/discv5/discV5_service.d.ts +2 -1
  204. package/dest/services/discv5/discV5_service.d.ts.map +1 -1
  205. package/dest/services/discv5/discV5_service.js +36 -9
  206. package/dest/services/dummy_service.d.ts +36 -16
  207. package/dest/services/dummy_service.d.ts.map +1 -1
  208. package/dest/services/dummy_service.js +58 -14
  209. package/dest/services/encoding.d.ts +7 -3
  210. package/dest/services/encoding.d.ts.map +1 -1
  211. package/dest/services/encoding.js +23 -15
  212. package/dest/services/gossipsub/index.d.ts +3 -0
  213. package/dest/services/gossipsub/index.d.ts.map +1 -0
  214. package/dest/services/gossipsub/index.js +2 -0
  215. package/dest/services/gossipsub/scoring.d.ts +21 -3
  216. package/dest/services/gossipsub/scoring.d.ts.map +1 -1
  217. package/dest/services/gossipsub/scoring.js +24 -7
  218. package/dest/services/gossipsub/topic_score_params.d.ts +184 -0
  219. package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -0
  220. package/dest/services/gossipsub/topic_score_params.js +363 -0
  221. package/dest/services/index.d.ts +2 -1
  222. package/dest/services/index.d.ts.map +1 -1
  223. package/dest/services/index.js +1 -0
  224. package/dest/services/libp2p/instrumentation.d.ts +3 -1
  225. package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
  226. package/dest/services/libp2p/instrumentation.js +43 -71
  227. package/dest/services/libp2p/libp2p_service.d.ts +116 -51
  228. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  229. package/dest/services/libp2p/libp2p_service.js +1207 -504
  230. package/dest/services/peer-manager/metrics.d.ts +9 -2
  231. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  232. package/dest/services/peer-manager/metrics.js +39 -21
  233. package/dest/services/peer-manager/peer_manager.d.ts +7 -3
  234. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  235. package/dest/services/peer-manager/peer_manager.js +42 -21
  236. package/dest/services/peer-manager/peer_scoring.d.ts +7 -2
  237. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  238. package/dest/services/peer-manager/peer_scoring.js +64 -16
  239. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +51 -0
  240. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -0
  241. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +552 -0
  242. package/dest/services/reqresp/batch-tx-requester/config.d.ts +17 -0
  243. package/dest/services/reqresp/batch-tx-requester/config.d.ts.map +1 -0
  244. package/dest/services/reqresp/batch-tx-requester/config.js +27 -0
  245. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +50 -0
  246. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -0
  247. package/dest/services/reqresp/batch-tx-requester/interface.js +1 -0
  248. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +35 -0
  249. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -0
  250. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +136 -0
  251. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +62 -0
  252. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -0
  253. package/dest/services/reqresp/batch-tx-requester/peer_collection.js +176 -0
  254. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +11 -0
  255. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -0
  256. package/dest/services/reqresp/batch-tx-requester/tx_validator.js +7 -0
  257. package/dest/services/reqresp/config.d.ts +3 -3
  258. package/dest/services/reqresp/config.d.ts.map +1 -1
  259. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +2 -1
  260. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -1
  261. package/dest/services/reqresp/connection-sampler/connection_sampler.js +12 -0
  262. package/dest/services/reqresp/constants.d.ts +12 -0
  263. package/dest/services/reqresp/constants.d.ts.map +1 -0
  264. package/dest/services/reqresp/constants.js +7 -0
  265. package/dest/services/reqresp/interface.d.ts +27 -18
  266. package/dest/services/reqresp/interface.d.ts.map +1 -1
  267. package/dest/services/reqresp/interface.js +23 -19
  268. package/dest/services/reqresp/metrics.d.ts +6 -5
  269. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  270. package/dest/services/reqresp/metrics.js +16 -21
  271. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +5 -1
  272. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -1
  273. package/dest/services/reqresp/protocols/block_txs/bitvector.js +12 -0
  274. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +7 -5
  275. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
  276. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +29 -9
  277. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +29 -6
  278. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
  279. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +59 -13
  280. package/dest/services/reqresp/protocols/index.d.ts +1 -2
  281. package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
  282. package/dest/services/reqresp/protocols/index.js +0 -1
  283. package/dest/services/reqresp/protocols/status.d.ts +1 -1
  284. package/dest/services/reqresp/protocols/status.d.ts.map +1 -1
  285. package/dest/services/reqresp/protocols/status.js +4 -1
  286. package/dest/services/reqresp/protocols/tx.d.ts +7 -1
  287. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  288. package/dest/services/reqresp/protocols/tx.js +21 -3
  289. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +5 -4
  290. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
  291. package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -8
  292. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
  293. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
  294. package/dest/services/reqresp/rate-limiter/rate_limits.js +0 -10
  295. package/dest/services/reqresp/reqresp.d.ts +12 -29
  296. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  297. package/dest/services/reqresp/reqresp.js +448 -199
  298. package/dest/services/service.d.ts +62 -13
  299. package/dest/services/service.d.ts.map +1 -1
  300. package/dest/services/tx_collection/config.d.ts +11 -11
  301. package/dest/services/tx_collection/config.d.ts.map +1 -1
  302. package/dest/services/tx_collection/config.js +27 -26
  303. package/dest/services/tx_collection/file_store_tx_collection.d.ts +37 -0
  304. package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -0
  305. package/dest/services/tx_collection/file_store_tx_collection.js +127 -0
  306. package/dest/services/tx_collection/file_store_tx_source.d.ts +38 -0
  307. package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -0
  308. package/dest/services/tx_collection/file_store_tx_source.js +100 -0
  309. package/dest/services/tx_collection/index.d.ts +3 -2
  310. package/dest/services/tx_collection/index.d.ts.map +1 -1
  311. package/dest/services/tx_collection/index.js +1 -0
  312. package/dest/services/tx_collection/instrumentation.d.ts +1 -1
  313. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
  314. package/dest/services/tx_collection/instrumentation.js +9 -13
  315. package/dest/services/tx_collection/request_tracker.d.ts +53 -0
  316. package/dest/services/tx_collection/request_tracker.d.ts.map +1 -0
  317. package/dest/services/tx_collection/request_tracker.js +84 -0
  318. package/dest/services/tx_collection/tx_collection.d.ts +50 -56
  319. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  320. package/dest/services/tx_collection/tx_collection.js +298 -70
  321. package/dest/services/tx_collection/tx_collection_sink.d.ts +19 -9
  322. package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -1
  323. package/dest/services/tx_collection/tx_collection_sink.js +28 -31
  324. package/dest/services/tx_collection/tx_source.d.ts +13 -7
  325. package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
  326. package/dest/services/tx_collection/tx_source.js +26 -7
  327. package/dest/services/tx_file_store/config.d.ts +16 -0
  328. package/dest/services/tx_file_store/config.d.ts.map +1 -0
  329. package/dest/services/tx_file_store/config.js +22 -0
  330. package/dest/services/tx_file_store/index.d.ts +4 -0
  331. package/dest/services/tx_file_store/index.d.ts.map +1 -0
  332. package/dest/services/tx_file_store/index.js +3 -0
  333. package/dest/services/tx_file_store/instrumentation.d.ts +15 -0
  334. package/dest/services/tx_file_store/instrumentation.d.ts.map +1 -0
  335. package/dest/services/tx_file_store/instrumentation.js +29 -0
  336. package/dest/services/tx_file_store/tx_file_store.d.ts +46 -0
  337. package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -0
  338. package/dest/services/tx_file_store/tx_file_store.js +142 -0
  339. package/dest/services/tx_provider.d.ts +8 -6
  340. package/dest/services/tx_provider.d.ts.map +1 -1
  341. package/dest/services/tx_provider.js +15 -9
  342. package/dest/services/tx_provider_instrumentation.d.ts +1 -1
  343. package/dest/services/tx_provider_instrumentation.d.ts.map +1 -1
  344. package/dest/services/tx_provider_instrumentation.js +7 -20
  345. package/dest/test-helpers/index.d.ts +3 -1
  346. package/dest/test-helpers/index.d.ts.map +1 -1
  347. package/dest/test-helpers/index.js +2 -0
  348. package/dest/test-helpers/make-test-p2p-clients.d.ts +7 -8
  349. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  350. package/dest/test-helpers/make-test-p2p-clients.js +5 -3
  351. package/dest/test-helpers/mock-pubsub.d.ts +46 -6
  352. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  353. package/dest/test-helpers/mock-pubsub.js +115 -14
  354. package/dest/test-helpers/reqresp-nodes.d.ts +5 -7
  355. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  356. package/dest/test-helpers/reqresp-nodes.js +19 -20
  357. package/dest/test-helpers/test_tx_provider.d.ts +42 -0
  358. package/dest/test-helpers/test_tx_provider.d.ts.map +1 -0
  359. package/dest/test-helpers/test_tx_provider.js +44 -0
  360. package/dest/test-helpers/testbench-utils.d.ts +161 -0
  361. package/dest/test-helpers/testbench-utils.d.ts.map +1 -0
  362. package/dest/test-helpers/testbench-utils.js +393 -0
  363. package/dest/testbench/p2p_client_testbench_worker.d.ts +26 -2
  364. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  365. package/dest/testbench/p2p_client_testbench_worker.js +275 -134
  366. package/dest/testbench/worker_client_manager.d.ts +57 -6
  367. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  368. package/dest/testbench/worker_client_manager.js +277 -44
  369. package/dest/util.d.ts +13 -8
  370. package/dest/util.d.ts.map +1 -1
  371. package/dest/util.js +35 -14
  372. package/dest/versioning.d.ts +3 -6
  373. package/dest/versioning.d.ts.map +1 -1
  374. package/dest/versioning.js +3 -24
  375. package/package.json +17 -16
  376. package/src/bootstrap/bootstrap.ts +16 -5
  377. package/src/client/factory.ts +136 -40
  378. package/src/client/interface.ts +86 -45
  379. package/src/client/p2p_client.ts +334 -403
  380. package/src/client/test/p2p_client.batch_tx_requester.bench.README.md +197 -0
  381. package/src/config.ts +282 -62
  382. package/src/errors/p2p-service.error.ts +11 -0
  383. package/src/errors/reqresp.error.ts +0 -25
  384. package/src/errors/tx-pool.error.ts +12 -0
  385. package/src/index.ts +1 -1
  386. package/src/mem_pools/attestation_pool/attestation_pool.ts +584 -76
  387. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +758 -330
  388. package/src/mem_pools/attestation_pool/index.ts +9 -2
  389. package/src/mem_pools/attestation_pool/mocks.ts +27 -15
  390. package/src/mem_pools/index.ts +2 -2
  391. package/src/mem_pools/instrumentation.ts +30 -28
  392. package/src/mem_pools/interface.ts +4 -4
  393. package/src/mem_pools/tx_pool_v2/README.md +283 -0
  394. package/src/mem_pools/tx_pool_v2/archive/index.ts +1 -0
  395. package/src/mem_pools/tx_pool_v2/archive/tx_archive.ts +120 -0
  396. package/src/mem_pools/tx_pool_v2/deleted_pool.ts +321 -0
  397. package/src/mem_pools/tx_pool_v2/eviction/eviction_manager.ts +160 -0
  398. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +122 -0
  399. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +125 -0
  400. package/src/mem_pools/tx_pool_v2/eviction/index.ts +28 -0
  401. package/src/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.ts +65 -0
  402. package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +219 -0
  403. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +74 -0
  404. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +101 -0
  405. package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +91 -0
  406. package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +99 -0
  407. package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +32 -0
  408. package/src/mem_pools/tx_pool_v2/index.ts +12 -0
  409. package/src/mem_pools/tx_pool_v2/instrumentation.ts +69 -0
  410. package/src/mem_pools/tx_pool_v2/interfaces.ts +250 -0
  411. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +349 -0
  412. package/src/mem_pools/tx_pool_v2/tx_pool_bench_metrics.ts +77 -0
  413. package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +430 -0
  414. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +238 -0
  415. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +1090 -0
  416. package/src/msg_validators/attestation_validator/README.md +49 -0
  417. package/src/msg_validators/attestation_validator/attestation_validator.ts +70 -23
  418. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +33 -23
  419. package/src/msg_validators/clock_tolerance.ts +127 -0
  420. package/src/msg_validators/index.ts +1 -1
  421. package/src/msg_validators/proposal_validator/README.md +123 -0
  422. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +30 -0
  423. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +41 -0
  424. package/src/msg_validators/proposal_validator/index.ts +3 -0
  425. package/src/msg_validators/proposal_validator/proposal_validator.ts +159 -0
  426. package/src/msg_validators/tx_validator/README.md +127 -0
  427. package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +8 -17
  428. package/src/msg_validators/tx_validator/allowed_public_setup.ts +22 -27
  429. package/src/msg_validators/tx_validator/allowed_setup_helpers.ts +31 -0
  430. package/src/msg_validators/tx_validator/archive_cache.ts +2 -2
  431. package/src/msg_validators/tx_validator/block_header_validator.ts +21 -8
  432. package/src/msg_validators/tx_validator/cached_tx_validator.ts +31 -0
  433. package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
  434. package/src/msg_validators/tx_validator/data_validator.ts +62 -7
  435. package/src/msg_validators/tx_validator/double_spend_validator.ts +15 -9
  436. package/src/msg_validators/tx_validator/factory.ts +424 -56
  437. package/src/msg_validators/tx_validator/fee_payer_balance.ts +44 -0
  438. package/src/msg_validators/tx_validator/gas_validator.ts +211 -77
  439. package/src/msg_validators/tx_validator/index.ts +5 -0
  440. package/src/msg_validators/tx_validator/metadata_validator.ts +30 -11
  441. package/src/msg_validators/tx_validator/nullifier_cache.ts +30 -0
  442. package/src/msg_validators/tx_validator/phases_validator.ts +87 -30
  443. package/src/msg_validators/tx_validator/size_validator.ts +22 -0
  444. package/src/msg_validators/tx_validator/timestamp_validator.ts +29 -19
  445. package/src/msg_validators/tx_validator/tx_permitted_validator.ts +8 -3
  446. package/src/msg_validators/tx_validator/tx_proof_validator.ts +10 -3
  447. package/src/msg_validators/tx_validator/tx_validation_cache.ts +102 -0
  448. package/src/services/data_store.ts +14 -19
  449. package/src/services/discv5/discV5_service.ts +39 -6
  450. package/src/services/dummy_service.ts +76 -38
  451. package/src/services/encoding.ts +22 -13
  452. package/src/services/gossipsub/README.md +641 -0
  453. package/src/services/gossipsub/index.ts +2 -0
  454. package/src/services/gossipsub/scoring.ts +29 -5
  455. package/src/services/gossipsub/topic_score_params.ts +519 -0
  456. package/src/services/index.ts +1 -0
  457. package/src/services/libp2p/instrumentation.ts +48 -75
  458. package/src/services/libp2p/libp2p_service.ts +929 -549
  459. package/src/services/peer-manager/metrics.ts +46 -21
  460. package/src/services/peer-manager/peer_manager.ts +49 -13
  461. package/src/services/peer-manager/peer_scoring.ts +55 -9
  462. package/src/services/reqresp/README.md +215 -0
  463. package/src/services/reqresp/batch-tx-requester/README.md +344 -0
  464. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +684 -0
  465. package/src/services/reqresp/batch-tx-requester/config.ts +40 -0
  466. package/src/services/reqresp/batch-tx-requester/interface.ts +61 -0
  467. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +168 -0
  468. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +249 -0
  469. package/src/services/reqresp/batch-tx-requester/tx_validator.ts +24 -0
  470. package/src/services/reqresp/config.ts +2 -2
  471. package/src/services/reqresp/connection-sampler/connection_sampler.ts +19 -1
  472. package/src/services/reqresp/constants.ts +14 -0
  473. package/src/services/reqresp/interface.ts +48 -46
  474. package/src/services/reqresp/metrics.ts +35 -27
  475. package/src/services/reqresp/protocols/block_txs/bitvector.ts +16 -0
  476. package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +37 -12
  477. package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +74 -9
  478. package/src/services/reqresp/protocols/index.ts +0 -1
  479. package/src/services/reqresp/protocols/status.ts +7 -4
  480. package/src/services/reqresp/protocols/tx.ts +23 -3
  481. package/src/services/reqresp/rate-limiter/rate_limiter.ts +13 -9
  482. package/src/services/reqresp/rate-limiter/rate_limits.ts +0 -10
  483. package/src/services/reqresp/reqresp.ts +68 -224
  484. package/src/services/service.ts +83 -31
  485. package/src/services/tx_collection/config.ts +41 -36
  486. package/src/services/tx_collection/file_store_tx_collection.ts +153 -0
  487. package/src/services/tx_collection/file_store_tx_source.ts +129 -0
  488. package/src/services/tx_collection/index.ts +2 -1
  489. package/src/services/tx_collection/instrumentation.ts +5 -13
  490. package/src/services/tx_collection/request_tracker.ts +127 -0
  491. package/src/services/tx_collection/tx_collection.ts +367 -115
  492. package/src/services/tx_collection/tx_collection_sink.ts +32 -36
  493. package/src/services/tx_collection/tx_source.ts +28 -8
  494. package/src/services/tx_file_store/config.ts +37 -0
  495. package/src/services/tx_file_store/index.ts +3 -0
  496. package/src/services/tx_file_store/instrumentation.ts +36 -0
  497. package/src/services/tx_file_store/tx_file_store.ts +163 -0
  498. package/src/services/tx_provider.ts +21 -12
  499. package/src/services/tx_provider_instrumentation.ts +13 -20
  500. package/src/test-helpers/index.ts +2 -0
  501. package/src/test-helpers/make-test-p2p-clients.ts +7 -6
  502. package/src/test-helpers/mock-pubsub.ts +137 -14
  503. package/src/test-helpers/reqresp-nodes.ts +17 -29
  504. package/src/test-helpers/test_tx_provider.ts +69 -0
  505. package/src/test-helpers/testbench-utils.ts +455 -0
  506. package/src/testbench/p2p_client_testbench_worker.ts +386 -130
  507. package/src/testbench/worker_client_manager.ts +355 -46
  508. package/src/util.ts +40 -19
  509. package/src/versioning.ts +3 -33
  510. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +0 -37
  511. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +0 -1
  512. package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +0 -213
  513. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +0 -30
  514. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +0 -1
  515. package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +0 -219
  516. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +0 -116
  517. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +0 -1
  518. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +0 -620
  519. package/dest/mem_pools/tx_pool/index.d.ts +0 -4
  520. package/dest/mem_pools/tx_pool/index.d.ts.map +0 -1
  521. package/dest/mem_pools/tx_pool/index.js +0 -3
  522. package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts +0 -81
  523. package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts.map +0 -1
  524. package/dest/mem_pools/tx_pool/memory_tx_pool.js +0 -242
  525. package/dest/mem_pools/tx_pool/priority.d.ts +0 -8
  526. package/dest/mem_pools/tx_pool/priority.d.ts.map +0 -1
  527. package/dest/mem_pools/tx_pool/priority.js +0 -10
  528. package/dest/mem_pools/tx_pool/tx_pool.d.ts +0 -123
  529. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +0 -1
  530. package/dest/mem_pools/tx_pool/tx_pool.js +0 -3
  531. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +0 -7
  532. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +0 -1
  533. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +0 -400
  534. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts +0 -12
  535. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts.map +0 -1
  536. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.js +0 -82
  537. package/dest/msg_validators/block_proposal_validator/index.d.ts +0 -2
  538. package/dest/msg_validators/block_proposal_validator/index.d.ts.map +0 -1
  539. package/dest/msg_validators/block_proposal_validator/index.js +0 -1
  540. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +0 -45
  541. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +0 -1
  542. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +0 -92
  543. package/dest/services/reqresp/protocols/block.d.ts +0 -9
  544. package/dest/services/reqresp/protocols/block.d.ts.map +0 -1
  545. package/dest/services/reqresp/protocols/block.js +0 -32
  546. package/dest/services/tx_collection/fast_tx_collection.d.ts +0 -51
  547. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +0 -1
  548. package/dest/services/tx_collection/fast_tx_collection.js +0 -300
  549. package/dest/services/tx_collection/slow_tx_collection.d.ts +0 -53
  550. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +0 -1
  551. package/dest/services/tx_collection/slow_tx_collection.js +0 -177
  552. package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +0 -298
  553. package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +0 -287
  554. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -754
  555. package/src/mem_pools/tx_pool/index.ts +0 -3
  556. package/src/mem_pools/tx_pool/memory_tx_pool.ts +0 -288
  557. package/src/mem_pools/tx_pool/priority.ts +0 -13
  558. package/src/mem_pools/tx_pool/tx_pool.ts +0 -136
  559. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +0 -319
  560. package/src/msg_validators/block_proposal_validator/block_proposal_validator.ts +0 -97
  561. package/src/msg_validators/block_proposal_validator/index.ts +0 -1
  562. package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +0 -100
  563. package/src/services/reqresp/protocols/block.ts +0 -37
  564. package/src/services/tx_collection/fast_tx_collection.ts +0 -341
  565. package/src/services/tx_collection/slow_tx_collection.ts +0 -233
@@ -1,10 +1,10 @@
1
- import { SecretValue } from '@aztec/foundation/config';
2
1
  import { EthAddress } from '@aztec/foundation/eth-address';
3
2
  import type { Logger } from '@aztec/foundation/log';
4
3
  import { sleep } from '@aztec/foundation/sleep';
5
4
  import type { ChainConfig } from '@aztec/stdlib/config';
6
5
 
7
6
  import { type ChildProcess, fork } from 'child_process';
7
+ import { existsSync } from 'fs';
8
8
  import path from 'path';
9
9
  import { fileURLToPath } from 'url';
10
10
 
@@ -12,23 +12,45 @@ import { type P2PConfig, getP2PDefaultConfig } from '../config.js';
12
12
  import { generatePeerIdPrivateKeys } from '../test-helpers/generate-peer-id-private-keys.js';
13
13
  import { getPorts } from '../test-helpers/get-ports.js';
14
14
  import { makeEnr, makeEnrs } from '../test-helpers/make-enrs.js';
15
+ import { BENCHMARK_CONSTANTS } from '../test-helpers/testbench-utils.js';
16
+ import type { BenchReqRespCommand, BenchResultMessage, DistributionPattern } from './p2p_client_testbench_worker.js';
15
17
 
16
18
  const __dirname = path.dirname(fileURLToPath(import.meta.url));
17
- const workerPath = path.join(__dirname, '../../dest/testbench/p2p_client_testbench_worker.js');
19
+ const p2pRoot = path.resolve(__dirname, '../..');
20
+ const workerTsPath = path.join(__dirname, 'p2p_client_testbench_worker.ts');
21
+ const workerJsPath = path.join(p2pRoot, 'dest/testbench/p2p_client_testbench_worker.js');
22
+ const tsconfigPath = path.join(p2pRoot, 'tsconfig.json');
18
23
 
19
24
  const testChainConfig: ChainConfig = {
20
25
  l1ChainId: 31337,
21
26
  rollupVersion: 1,
22
- l1Contracts: {
23
- rollupAddress: EthAddress.random(),
24
- },
27
+ rollupAddress: EthAddress.random(),
25
28
  };
26
29
 
30
+ export interface ReqRespBenchmarkConfig {
31
+ txCount: number;
32
+ distribution: DistributionPattern;
33
+ timeoutMs: number;
34
+ pinnedPeerIndex?: number;
35
+ blockNumber?: number;
36
+ seed?: number;
37
+ }
38
+
39
+ export interface ReqRespBenchmarkResult {
40
+ txCount: number;
41
+ distribution: DistributionPattern;
42
+ durationMs: number;
43
+ fetchedCount: number;
44
+ success: boolean;
45
+ error?: string;
46
+ }
47
+
27
48
  class WorkerClientManager {
28
49
  public processes: ChildProcess[] = [];
29
50
  public peerIdPrivateKeys: string[] = [];
30
51
  public peerEnrs: string[] = [];
31
52
  public ports: number[] = [];
53
+ public peerIds: string[] = [];
32
54
  private p2pConfig: Partial<P2PConfig>;
33
55
  private logger: Logger;
34
56
  private messageReceivedByClient: number[] = [];
@@ -41,38 +63,65 @@ class WorkerClientManager {
41
63
  destroy() {
42
64
  this.cleanup().catch((error: Error) => {
43
65
  this.logger.error('Failed to cleanup worker client manager', error);
44
- process.exit(1);
45
66
  });
46
67
  }
47
68
 
48
69
  /**
49
- * Creates a client configuration object
70
+ * Creates a client configuration object for IPC.
71
+ * Note: We send the raw peerIdPrivateKey string instead of SecretValue
72
+ * because SecretValue.toJSON() returns '[Redacted]', losing the value.
73
+ * The worker must re-wrap it in SecretValue.
74
+ * We also omit priceBumpPercentage since it's a bigint and can't be
75
+ * serialized over IPC (which uses JSON under the hood).
50
76
  */
51
77
  private createClientConfig(
52
78
  clientIndex: number,
53
79
  port: number,
54
80
  otherNodes: string[],
55
- ): P2PConfig & Partial<ChainConfig> {
56
- return {
81
+ ): Omit<P2PConfig, 'peerIdPrivateKey' | 'priceBumpPercentage'> & { peerIdPrivateKey: string } & Partial<ChainConfig> {
82
+ const { priceBumpPercentage: _, ...config } = {
57
83
  ...getP2PDefaultConfig(),
58
84
  p2pEnabled: true,
59
- peerIdPrivateKey: new SecretValue(this.peerIdPrivateKeys[clientIndex]),
85
+ peerIdPrivateKey: this.peerIdPrivateKeys[clientIndex],
60
86
  listenAddress: '127.0.0.1',
61
87
  p2pIp: '127.0.0.1',
62
88
  p2pPort: port,
63
89
  bootstrapNodes: [...otherNodes],
64
90
  ...this.p2pConfig,
65
91
  };
92
+ return config as Omit<P2PConfig, 'peerIdPrivateKey' | 'priceBumpPercentage'> & {
93
+ peerIdPrivateKey: string;
94
+ } & Partial<ChainConfig>;
66
95
  }
67
96
 
68
97
  /**
69
- * Spawns a worker process and returns a promise that resolves when the worker is ready
98
+ * Spawns a worker process and returns a promise that resolves when the worker is ready.
99
+ * Config uses raw string for peerIdPrivateKey (not SecretValue) for IPC serialization.
70
100
  */
71
101
  private spawnWorkerProcess(
72
- config: P2PConfig & Partial<ChainConfig>,
102
+ config: Omit<P2PConfig, 'peerIdPrivateKey' | 'priceBumpPercentage'> & {
103
+ peerIdPrivateKey: string;
104
+ } & Partial<ChainConfig>,
73
105
  clientIndex: number,
74
106
  ): [ChildProcess, Promise<void>] {
75
- const childProcess = fork(workerPath);
107
+ const useCompiled = existsSync(workerJsPath);
108
+ const workerPath = useCompiled ? workerJsPath : workerTsPath;
109
+
110
+ const execArgv = [...process.execArgv];
111
+ if (!useCompiled && !execArgv.includes('ts-node/esm')) {
112
+ execArgv.push('--loader', 'ts-node/esm');
113
+ }
114
+
115
+ const env = {
116
+ ...process.env,
117
+ TS_NODE_PROJECT: tsconfigPath,
118
+ };
119
+
120
+ const childProcess = fork(workerPath, {
121
+ cwd: p2pRoot,
122
+ execArgv,
123
+ env,
124
+ });
76
125
  childProcess.send({ type: 'START', config, clientIndex });
77
126
 
78
127
  // Handle unexpected child process exit
@@ -90,74 +139,131 @@ class WorkerClientManager {
90
139
 
91
140
  // Create ready signal promise
92
141
  const readySignal = new Promise<void>((resolve, reject) => {
93
- // Set a timeout to avoid hanging indefinitely
142
+ let resolved = false;
143
+
94
144
  const timeout = setTimeout(() => {
145
+ if (resolved) {
146
+ return;
147
+ }
148
+ resolved = true;
149
+ childProcess.off('message', messageHandler);
150
+ childProcess.off('exit', exitHandler);
95
151
  reject(new Error(`Timeout waiting for worker ${clientIndex} to be ready`));
96
- }, 30000); // 30 second timeout
152
+ }, BENCHMARK_CONSTANTS.WORKER_READY_TIMEOUT_MS);
97
153
 
98
- childProcess.once('message', (msg: any) => {
99
- clearTimeout(timeout);
154
+ const messageHandler = (msg: any) => {
155
+ if (resolved) {
156
+ return;
157
+ }
158
+ // Only handle READY or ERROR messages; ignore others (e.g., GOSSIP_RECEIVED)
100
159
  if (msg.type === 'READY') {
160
+ resolved = true;
161
+ clearTimeout(timeout);
162
+ childProcess.off('message', messageHandler);
163
+ childProcess.off('exit', exitHandler);
164
+ if (typeof msg.peerId === 'string') {
165
+ this.peerIds[clientIndex] = msg.peerId;
166
+ }
101
167
  resolve();
102
- }
103
- // For future use
104
- if (msg.type === 'ERROR') {
168
+ } else if (msg.type === 'ERROR') {
169
+ resolved = true;
170
+ clearTimeout(timeout);
171
+ childProcess.off('message', messageHandler);
172
+ childProcess.off('exit', exitHandler);
105
173
  reject(new Error(msg.error));
106
174
  }
107
- });
175
+ // Ignore other message types and keep waiting for READY/ERROR
176
+ };
108
177
 
109
- // Also resolve/reject if process exits before sending message
110
- childProcess.once('exit', code => {
178
+ const exitHandler = (code: number | null) => {
179
+ if (resolved) {
180
+ return;
181
+ }
182
+ resolved = true;
111
183
  clearTimeout(timeout);
184
+ childProcess.off('message', messageHandler);
112
185
  if (code === 0) {
113
186
  resolve();
114
187
  } else {
115
188
  reject(new Error(`Worker ${clientIndex} exited with code ${code} before becoming ready`));
116
189
  }
117
- });
190
+ };
191
+
192
+ childProcess.on('message', messageHandler);
193
+ childProcess.once('exit', exitHandler);
118
194
  });
119
195
 
120
196
  return [childProcess, readySignal];
121
197
  }
122
198
 
123
199
  /**
124
- * Creates a number of worker clients in separate processes
125
- * All are configured to connect to each other and overrided with the test specific config
200
+ * Creates a number of worker clients in separate processes.
201
+ * All are configured to connect to each other and overridden with the test-specific config.
126
202
  *
127
203
  * @param numberOfClients - The number of clients to create
204
+ * @param options - Optional overrides for seeding/bootstrapping strategy
128
205
  * @returns The ENRs of the created clients
129
206
  */
130
- async makeWorkerClients(numberOfClients: number) {
207
+ async makeWorkerClients(
208
+ numberOfClients: number,
209
+ options: {
210
+ bootstrapMode?: 'subset' | 'all';
211
+ seedPeerLimit?: number;
212
+ batchSize?: number;
213
+ batchDelayMs?: number;
214
+ } = {},
215
+ ) {
131
216
  try {
217
+ const bootstrapMode = options.bootstrapMode ?? (this.p2pConfig.bootstrapNodesAsFullPeers ? 'all' : 'subset');
218
+ const seedPeerLimit = options.seedPeerLimit ?? 10;
219
+ const batchSize = options.batchSize ?? (bootstrapMode === 'all' ? Math.min(5, numberOfClients) : numberOfClients);
220
+ const batchDelayMs = options.batchDelayMs ?? (bootstrapMode === 'all' ? 500 : 0);
221
+
132
222
  this.messageReceivedByClient = new Array(numberOfClients).fill(0);
133
223
  this.peerIdPrivateKeys = generatePeerIdPrivateKeys(numberOfClients);
134
224
  this.ports = await getPorts(numberOfClients);
135
225
  this.peerEnrs = await makeEnrs(this.peerIdPrivateKeys, this.ports, testChainConfig);
226
+ this.peerIds = new Array(numberOfClients);
136
227
 
137
228
  this.processes = [];
138
229
  const readySignals: Promise<void>[] = [];
139
230
 
140
- for (let i = 0; i < numberOfClients; i++) {
141
- this.logger.info(`Creating client ${i}`);
231
+ for (let batchStart = 0; batchStart < numberOfClients; batchStart += batchSize) {
232
+ const batchEnd = Math.min(batchStart + batchSize, numberOfClients);
233
+ const batchPromises: Promise<void>[] = [];
142
234
 
143
- // Maximum seed with 10 other peers to allow peer discovery to connect them at a smoother rate
144
- const otherNodes = this.peerEnrs.filter((_, ind) => ind < Math.min(i, 10));
235
+ for (let i = batchStart; i < batchEnd; i++) {
236
+ this.logger.info(`Creating client ${i}`);
145
237
 
146
- const config = this.createClientConfig(i, this.ports[i], otherNodes);
147
- const [childProcess, readySignal] = this.spawnWorkerProcess(config, i);
238
+ const otherNodes =
239
+ bootstrapMode === 'all'
240
+ ? this.peerEnrs.filter((_, ind) => ind !== i)
241
+ : this.peerEnrs.filter((_, ind) => ind < Math.min(i, seedPeerLimit));
148
242
 
149
- readySignals.push(readySignal);
150
- this.processes.push(childProcess);
243
+ const config = this.createClientConfig(i, this.ports[i], otherNodes);
244
+ const [childProcess, readySignal] = this.spawnWorkerProcess(config, i);
245
+
246
+ readySignals.push(readySignal);
247
+ batchPromises.push(readySignal);
248
+ this.processes.push(childProcess);
249
+ }
250
+
251
+ await Promise.all(batchPromises);
252
+
253
+ if (batchEnd < numberOfClients && batchDelayMs > 0) {
254
+ await sleep(batchDelayMs);
255
+ }
151
256
  }
152
257
 
153
- // Wait for peers to all connect with each other
154
- await sleep(10000);
258
+ await sleep(BENCHMARK_CONSTANTS.PEER_DISCOVERY_WAIT_MS);
155
259
 
156
- // Wait for all peers to be booted up with timeout
157
260
  await Promise.race([
158
261
  Promise.all(readySignals),
159
262
  new Promise((_, reject) =>
160
- setTimeout(() => reject(new Error('Timeout waiting for all workers to be ready')), 30000),
263
+ setTimeout(
264
+ () => reject(new Error('Timeout waiting for all workers to be ready')),
265
+ BENCHMARK_CONSTANTS.WORKER_READY_TIMEOUT_MS,
266
+ ),
161
267
  ),
162
268
  ]);
163
269
 
@@ -215,11 +321,13 @@ class WorkerClientManager {
215
321
 
216
322
  this.processes[clientIndex] = childProcess;
217
323
 
218
- // Wait for the process to be ready with a timeout
219
324
  await Promise.race([
220
325
  readySignal,
221
326
  new Promise((_, reject) =>
222
- setTimeout(() => reject(new Error(`Timeout waiting for client ${clientIndex} to be ready`)), 30000),
327
+ setTimeout(
328
+ () => reject(new Error(`Timeout waiting for client ${clientIndex} to be ready`)),
329
+ BENCHMARK_CONSTANTS.WORKER_READY_TIMEOUT_MS,
330
+ ),
223
331
  ),
224
332
  ]);
225
333
  } catch (error) {
@@ -239,15 +347,14 @@ class WorkerClientManager {
239
347
  }
240
348
 
241
349
  return new Promise<void>(resolve => {
242
- // Set a timeout for the graceful exit
243
350
  const forceKillTimeout = setTimeout(() => {
244
351
  this.logger.warn(`Process ${index} didn't exit gracefully, force killing...`);
245
352
  try {
246
- process.kill('SIGKILL'); // Force kill
353
+ process.kill('SIGKILL');
247
354
  } catch (e) {
248
355
  this.logger.error(`Error force killing process ${index}:`, e);
249
356
  }
250
- }, 5000); // 5 second timeout for graceful exit
357
+ }, BENCHMARK_CONSTANTS.GRACEFUL_SHUTDOWN_TIMEOUT_MS);
251
358
 
252
359
  // Listen for process exit
253
360
  process.once('exit', () => {
@@ -280,7 +387,6 @@ class WorkerClientManager {
280
387
  // Create array of promises for each process termination
281
388
  const terminationPromises = this.processes.map((process, index) => this.terminateProcess(process, index));
282
389
 
283
- // Wait for all processes to terminate with a timeout
284
390
  try {
285
391
  await Promise.race([
286
392
  Promise.all(terminationPromises),
@@ -297,7 +403,7 @@ class WorkerClientManager {
297
403
  }
298
404
  });
299
405
  resolve();
300
- }, 10000); // 10 second timeout for all processes
406
+ }, BENCHMARK_CONSTANTS.CLEANUP_TIMEOUT_MS);
301
407
  }),
302
408
  ]);
303
409
  } catch (error) {
@@ -305,8 +411,211 @@ class WorkerClientManager {
305
411
  }
306
412
 
307
413
  this.processes = [];
414
+ this.peerIds = [];
308
415
  this.logger.info('All worker processes cleaned up');
309
416
  }
417
+
418
+ /**
419
+ * Checks that the aggregator (client 0) has sufficient peer connections before running a benchmark.
420
+ * This prevents benchmark cases from starting with degraded connectivity after a previous case
421
+ * caused connection failures.
422
+ */
423
+ async waitForConnectivity(minPeers: number, timeoutMs: number = 15_000): Promise<number> {
424
+ const waitInterval = 1000;
425
+ let waited = 0;
426
+
427
+ while (waited < timeoutMs) {
428
+ const count = await this.getPeerCount(0, 5000);
429
+ if (count >= minPeers) {
430
+ this.logger.info(`Connectivity check passed: ${count}/${minPeers} peers connected`);
431
+ return count;
432
+ }
433
+ this.logger.debug(`Waiting for connectivity: ${count}/${minPeers} (waited ${waited}ms)`);
434
+ await sleep(waitInterval);
435
+ waited += waitInterval;
436
+ }
437
+
438
+ const finalCount = await this.getPeerCount(0, 5000);
439
+ this.logger.warn(`Connectivity check: only ${finalCount}/${minPeers} peers after ${timeoutMs}ms`);
440
+ return finalCount;
441
+ }
442
+
443
+ private getPeerCount(clientIndex: number, timeoutMs: number): Promise<number> {
444
+ return new Promise<number>(resolve => {
445
+ let resolved = false;
446
+
447
+ const handler = (msg: any) => {
448
+ if (resolved) {
449
+ return;
450
+ }
451
+ if (msg.type === 'PEER_COUNT') {
452
+ resolved = true;
453
+ clearTimeout(timeout);
454
+ this.processes[clientIndex].off('message', handler);
455
+ resolve(msg.count as number);
456
+ }
457
+ };
458
+
459
+ const timeout = setTimeout(() => {
460
+ if (resolved) {
461
+ return;
462
+ }
463
+ resolved = true;
464
+ this.processes[clientIndex].off('message', handler);
465
+ resolve(0);
466
+ }, timeoutMs);
467
+
468
+ this.processes[clientIndex].on('message', handler);
469
+ this.processes[clientIndex].send({ type: 'GET_PEER_COUNT' });
470
+ });
471
+ }
472
+
473
+ /**
474
+ * Run a req/resp benchmark across all worker clients.
475
+ *
476
+ * This sends a BENCH_REQRESP command to all workers:
477
+ * - Aggregator (client 0) runs the collector and returns timing results
478
+ * - Responders (clients 1..N) populate their tx pools based on distribution
479
+ *
480
+ * All workers generate the same txs deterministically from a shared seed,
481
+ * then filter based on their peerIndex and distribution pattern.
482
+ */
483
+ async runReqRespBenchmark(config: ReqRespBenchmarkConfig): Promise<ReqRespBenchmarkResult> {
484
+ const peerCount = this.processes.length;
485
+ if (peerCount < 2) {
486
+ throw new Error('Need at least 2 peers to run req/resp benchmark');
487
+ }
488
+
489
+ const seed = config.seed ?? Date.now();
490
+ const blockNumber = config.blockNumber ?? 1;
491
+ const pinnedPeerId = config.pinnedPeerIndex !== undefined ? this.peerIds[config.pinnedPeerIndex] : undefined;
492
+
493
+ this.logger.info(`Starting req/resp benchmark: txCount=${config.txCount}, distribution=${config.distribution}`);
494
+
495
+ const readyPromises: Promise<void>[] = [];
496
+
497
+ for (let i = 1; i < peerCount; i++) {
498
+ const cmd: BenchReqRespCommand = {
499
+ type: 'BENCH_REQRESP',
500
+ txCount: config.txCount,
501
+ peerCount,
502
+ distribution: config.distribution,
503
+ timeoutMs: config.timeoutMs,
504
+ isAggregator: false,
505
+ peerIndex: i,
506
+ pinnedPeerIndex: config.pinnedPeerIndex,
507
+ pinnedPeerId,
508
+ blockNumber,
509
+ seed,
510
+ };
511
+
512
+ this.processes[i].send(cmd);
513
+ readyPromises.push(this.waitForBenchReady(i, 30000));
514
+ }
515
+
516
+ await Promise.all(readyPromises);
517
+ this.logger.info('All responder peers ready, starting aggregator benchmark...');
518
+
519
+ const aggregatorCmd: BenchReqRespCommand = {
520
+ type: 'BENCH_REQRESP',
521
+ txCount: config.txCount,
522
+ peerCount,
523
+ distribution: config.distribution,
524
+ timeoutMs: config.timeoutMs,
525
+ isAggregator: true,
526
+ peerIndex: 0,
527
+ pinnedPeerIndex: config.pinnedPeerIndex,
528
+ pinnedPeerId,
529
+ blockNumber,
530
+ seed,
531
+ };
532
+
533
+ this.processes[0].send(aggregatorCmd);
534
+ const aggregatorBudgetMs = config.timeoutMs + BENCHMARK_CONSTANTS.MAX_PEER_WAIT_MS + 30000;
535
+ const result = await this.waitForBenchResult(0, aggregatorBudgetMs);
536
+
537
+ this.logger.info(
538
+ `Benchmark complete: fetched=${result.fetchedCount}/${config.txCount}, duration=${result.durationMs.toFixed(0)}ms, success=${result.success}`,
539
+ );
540
+
541
+ return {
542
+ txCount: config.txCount,
543
+ distribution: config.distribution,
544
+ durationMs: result.durationMs,
545
+ fetchedCount: result.fetchedCount,
546
+ success: result.success,
547
+ error: result.error,
548
+ };
549
+ }
550
+
551
+ private waitForBenchReady(clientIndex: number, timeoutMs: number): Promise<void> {
552
+ return new Promise((resolve, reject) => {
553
+ let resolved = false;
554
+
555
+ const handler = (msg: any) => {
556
+ if (resolved) {
557
+ return;
558
+ }
559
+ if (msg.type === 'BENCH_READY') {
560
+ resolved = true;
561
+ clearTimeout(timeout);
562
+ this.processes[clientIndex].off('message', handler);
563
+ resolve();
564
+ } else if (msg.type === 'ERROR') {
565
+ resolved = true;
566
+ clearTimeout(timeout);
567
+ this.processes[clientIndex].off('message', handler);
568
+ reject(new Error(`Client ${clientIndex} error: ${msg.error}`));
569
+ }
570
+ };
571
+
572
+ const timeout = setTimeout(() => {
573
+ if (resolved) {
574
+ return;
575
+ }
576
+ resolved = true;
577
+ this.processes[clientIndex].off('message', handler);
578
+ reject(new Error(`Timeout waiting for BENCH_READY from client ${clientIndex}`));
579
+ }, timeoutMs);
580
+
581
+ this.processes[clientIndex].on('message', handler);
582
+ });
583
+ }
584
+
585
+ private waitForBenchResult(clientIndex: number, timeoutMs: number): Promise<BenchResultMessage> {
586
+ return new Promise((resolve, reject) => {
587
+ let resolved = false;
588
+
589
+ const handler = (msg: any) => {
590
+ if (resolved) {
591
+ return;
592
+ }
593
+ if (msg.type === 'BENCH_RESULT') {
594
+ resolved = true;
595
+ clearTimeout(timeout);
596
+ this.processes[clientIndex].off('message', handler);
597
+ resolve(msg as BenchResultMessage);
598
+ } else if (msg.type === 'ERROR') {
599
+ resolved = true;
600
+ clearTimeout(timeout);
601
+ this.processes[clientIndex].off('message', handler);
602
+ reject(new Error(`Client ${clientIndex} error: ${msg.error}`));
603
+ }
604
+ };
605
+
606
+ const timeout = setTimeout(() => {
607
+ if (resolved) {
608
+ return;
609
+ }
610
+ resolved = true;
611
+ this.processes[clientIndex].off('message', handler);
612
+ reject(new Error(`Timeout waiting for BENCH_RESULT from client ${clientIndex}`));
613
+ }, timeoutMs);
614
+
615
+ this.processes[clientIndex].on('message', handler);
616
+ });
617
+ }
310
618
  }
311
619
 
312
620
  export { WorkerClientManager, testChainConfig };
621
+ export type { DistributionPattern } from './p2p_client_testbench_worker.js';
package/src/util.ts CHANGED
@@ -1,13 +1,13 @@
1
1
  import { SecretValue } from '@aztec/foundation/config';
2
- import type { Logger } from '@aztec/foundation/log';
2
+ import { type Logger, createLogger } from '@aztec/foundation/log';
3
3
  import type { AztecAsyncKVStore, AztecAsyncSingleton } from '@aztec/kv-store';
4
- import type { DataStoreConfig } from '@aztec/kv-store/config';
4
+ import type { DataStoreConfig } from '@aztec/stdlib/kv-store';
5
5
 
6
6
  import type { GossipSub } from '@chainsafe/libp2p-gossipsub';
7
7
  import { generateKeyPair, marshalPrivateKey, unmarshalPrivateKey } from '@libp2p/crypto/keys';
8
8
  import type { Identify } from '@libp2p/identify';
9
9
  import type { PeerId, PrivateKey } from '@libp2p/interface';
10
- import type { ConnectionManager } from '@libp2p/interface-internal';
10
+ import type { AddressManager, ConnectionManager } from '@libp2p/interface-internal';
11
11
  import { createFromPrivKey } from '@libp2p/peer-id-factory';
12
12
  import { resolve } from 'dns/promises';
13
13
  import { promises as fs } from 'fs';
@@ -15,7 +15,7 @@ import type { Libp2p } from 'libp2p';
15
15
  import net from 'net';
16
16
  import path from 'path';
17
17
 
18
- import type { P2PConfig } from './config.js';
18
+ import { DEFAULT_PUBLIC_IP_SERVICES, type P2PConfig } from './config.js';
19
19
 
20
20
  const PEER_ID_DATA_DIR_FILE = 'p2p-private-key';
21
21
 
@@ -23,8 +23,17 @@ export interface PubSubLibp2p extends Pick<Libp2p, 'status' | 'start' | 'stop' |
23
23
  services: {
24
24
  pubsub: Pick<
25
25
  GossipSub,
26
- 'addEventListener' | 'removeEventListener' | 'publish' | 'subscribe' | 'reportMessageValidationResult' | 'direct'
26
+ | 'addEventListener'
27
+ | 'removeEventListener'
28
+ | 'publish'
29
+ | 'subscribe'
30
+ | 'reportMessageValidationResult'
31
+ | 'direct'
32
+ | 'getMeshPeers'
27
33
  > & { score: Pick<GossipSub['score'], 'score'> };
34
+ components: {
35
+ addressManager: Pick<AddressManager, 'addObservedAddr' | 'confirmObservedAddr' | 'removeObservedAddr'>;
36
+ };
28
37
  };
29
38
  }
30
39
 
@@ -33,6 +42,7 @@ export type FullLibp2p = Libp2p<{
33
42
  pubsub: GossipSub;
34
43
  components: {
35
44
  connectionManager: ConnectionManager;
45
+ addressManager: AddressManager;
36
46
  };
37
47
  }>;
38
48
 
@@ -54,16 +64,25 @@ export function convertToMultiaddr(address: string, port: number, protocol: 'tcp
54
64
  }
55
65
 
56
66
  /**
57
- * Queries the public IP address of the machine.
67
+ * Queries the public IP address of the machine, trying multiple services in order.
68
+ * @param services - HTTPS URLs to try; defaults to {@link DEFAULT_PUBLIC_IP_SERVICES}.
58
69
  */
59
- export async function getPublicIp(): Promise<string> {
60
- const resp = await fetch('https://checkip.amazonaws.com/');
61
- const text = await resp.text();
62
- const address = text.trim();
63
- if (!isValidIpAddress(address)) {
64
- throw new Error(`Received invalid IP address from checkip service: ${address}`);
70
+ export async function getPublicIp(services: string[] = DEFAULT_PUBLIC_IP_SERVICES): Promise<string> {
71
+ const errors: string[] = [];
72
+ for (const url of services) {
73
+ try {
74
+ const resp = await fetch(url, { signal: AbortSignal.timeout(5000) });
75
+ const text = await resp.text();
76
+ const address = text.trim();
77
+ if (isValidIpAddress(address)) {
78
+ return address;
79
+ }
80
+ errors.push(`${url}: invalid IP "${address}"`);
81
+ } catch (err: any) {
82
+ errors.push(`${url}: ${err.message ?? err}`);
83
+ }
65
84
  }
66
- return address;
85
+ throw new Error(`Failed to determine public IP from all services:\n${errors.join('\n')}`);
67
86
  }
68
87
 
69
88
  export function isValidIpAddress(address: string): boolean {
@@ -101,18 +120,20 @@ export async function configureP2PClientAddresses(
101
120
  ): Promise<P2PConfig & DataStoreConfig> {
102
121
  const config = { ..._config };
103
122
  const { p2pIp, queryForIp, p2pBroadcastPort, p2pPort } = config;
123
+ const logger = createLogger('p2p:config');
104
124
 
105
125
  // If no broadcast port is provided, use the given p2p port as the broadcast port
106
126
  if (!p2pBroadcastPort) {
107
127
  config.p2pBroadcastPort = p2pPort;
108
128
  }
109
129
 
110
- // check if no announce IP was provided
111
- if (!p2pIp) {
112
- if (queryForIp) {
113
- const publicIp = await getPublicIp();
114
- config.p2pIp = publicIp;
115
- }
130
+ // Resolve the initial public IP so the ENR and announce address are set at startup.
131
+ // If queryForIp is enabled, discv5 will also track IP changes at runtime via enrUpdate.
132
+ if (!p2pIp && queryForIp) {
133
+ config.p2pIp = await getPublicIp(config.publicIpServices);
134
+ logger.info('Resolved initial public IP for P2P', { ip: config.p2pIp, queryForIp });
135
+ } else if (p2pIp) {
136
+ logger.info('Using configured static P2P IP', { ip: p2pIp, queryForIp });
116
137
  }
117
138
  // TODO(md): guard against setting a local ip address as the announce ip
118
139