@aztec/p2p 0.0.0-test.1 → 0.0.1-commit.1142ef1

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 (443) hide show
  1. package/dest/bootstrap/bootstrap.d.ts +1 -1
  2. package/dest/bootstrap/bootstrap.d.ts.map +1 -1
  3. package/dest/bootstrap/bootstrap.js +22 -9
  4. package/dest/client/factory.d.ts +15 -5
  5. package/dest/client/factory.d.ts.map +1 -1
  6. package/dest/client/factory.js +60 -25
  7. package/dest/client/index.d.ts +2 -1
  8. package/dest/client/index.d.ts.map +1 -1
  9. package/dest/client/index.js +1 -0
  10. package/dest/client/interface.d.ts +170 -0
  11. package/dest/client/interface.d.ts.map +1 -0
  12. package/dest/client/interface.js +9 -0
  13. package/dest/client/p2p_client.d.ts +75 -193
  14. package/dest/client/p2p_client.d.ts.map +1 -1
  15. package/dest/client/p2p_client.js +757 -228
  16. package/dest/config.d.ts +148 -125
  17. package/dest/config.d.ts.map +1 -1
  18. package/dest/config.js +180 -34
  19. package/dest/enr/generate-enr.d.ts +11 -3
  20. package/dest/enr/generate-enr.d.ts.map +1 -1
  21. package/dest/enr/generate-enr.js +27 -5
  22. package/dest/enr/index.d.ts +1 -1
  23. package/dest/errors/attestation-pool.error.d.ts +7 -0
  24. package/dest/errors/attestation-pool.error.d.ts.map +1 -0
  25. package/dest/errors/attestation-pool.error.js +12 -0
  26. package/dest/errors/reqresp.error.d.ts +1 -1
  27. package/dest/errors/reqresp.error.d.ts.map +1 -1
  28. package/dest/index.d.ts +4 -1
  29. package/dest/index.d.ts.map +1 -1
  30. package/dest/index.js +2 -0
  31. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +104 -25
  32. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  33. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +1 -1
  34. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
  35. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +288 -174
  36. package/dest/mem_pools/attestation_pool/index.d.ts +1 -1
  37. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +29 -11
  38. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +1 -1
  39. package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +168 -62
  40. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +24 -10
  41. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +1 -1
  42. package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +133 -82
  43. package/dest/mem_pools/attestation_pool/mocks.d.ts +232 -11
  44. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  45. package/dest/mem_pools/attestation_pool/mocks.js +15 -20
  46. package/dest/mem_pools/index.d.ts +1 -1
  47. package/dest/mem_pools/instrumentation.d.ts +16 -12
  48. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  49. package/dest/mem_pools/instrumentation.js +55 -40
  50. package/dest/mem_pools/interface.d.ts +3 -4
  51. package/dest/mem_pools/interface.d.ts.map +1 -1
  52. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +70 -16
  53. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +1 -1
  54. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +452 -142
  55. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +18 -0
  56. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +1 -0
  57. package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +56 -0
  58. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +83 -0
  59. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +1 -0
  60. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +5 -0
  61. package/dest/mem_pools/tx_pool/eviction/insufficient_fee_payer_balance_rule.d.ts +15 -0
  62. package/dest/mem_pools/tx_pool/eviction/insufficient_fee_payer_balance_rule.d.ts.map +1 -0
  63. package/dest/mem_pools/tx_pool/eviction/insufficient_fee_payer_balance_rule.js +88 -0
  64. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +17 -0
  65. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -0
  66. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +84 -0
  67. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +19 -0
  68. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -0
  69. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +76 -0
  70. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +26 -0
  71. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +1 -0
  72. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +84 -0
  73. package/dest/mem_pools/tx_pool/index.d.ts +1 -2
  74. package/dest/mem_pools/tx_pool/index.d.ts.map +1 -1
  75. package/dest/mem_pools/tx_pool/index.js +0 -1
  76. package/dest/mem_pools/tx_pool/priority.d.ts +5 -1
  77. package/dest/mem_pools/tx_pool/priority.d.ts.map +1 -1
  78. package/dest/mem_pools/tx_pool/priority.js +7 -2
  79. package/dest/mem_pools/tx_pool/tx_pool.d.ts +72 -11
  80. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +1 -1
  81. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +1 -1
  82. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +1 -1
  83. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +276 -45
  84. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +7 -5
  85. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  86. package/dest/msg_validators/attestation_validator/attestation_validator.js +48 -10
  87. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +20 -0
  88. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -0
  89. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +64 -0
  90. package/dest/msg_validators/attestation_validator/index.d.ts +2 -1
  91. package/dest/msg_validators/attestation_validator/index.d.ts.map +1 -1
  92. package/dest/msg_validators/attestation_validator/index.js +1 -0
  93. package/dest/msg_validators/index.d.ts +2 -2
  94. package/dest/msg_validators/index.d.ts.map +1 -1
  95. package/dest/msg_validators/index.js +1 -1
  96. package/dest/msg_validators/msg_seen_validator/msg_seen_validator.d.ts +10 -0
  97. package/dest/msg_validators/msg_seen_validator/msg_seen_validator.d.ts.map +1 -0
  98. package/dest/msg_validators/msg_seen_validator/msg_seen_validator.js +36 -0
  99. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +9 -0
  100. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -0
  101. package/dest/msg_validators/proposal_validator/block_proposal_validator.js +6 -0
  102. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +9 -0
  103. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -0
  104. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +6 -0
  105. package/dest/msg_validators/proposal_validator/index.d.ts +4 -0
  106. package/dest/msg_validators/proposal_validator/index.d.ts.map +1 -0
  107. package/dest/msg_validators/proposal_validator/index.js +3 -0
  108. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +13 -0
  109. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -0
  110. package/dest/msg_validators/proposal_validator/proposal_validator.js +80 -0
  111. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +23 -0
  112. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +1 -0
  113. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +183 -0
  114. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +1 -1
  115. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  116. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +3 -0
  117. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -0
  118. package/dest/msg_validators/tx_validator/allowed_public_setup.js +27 -0
  119. package/dest/msg_validators/tx_validator/archive_cache.d.ts +14 -0
  120. package/dest/msg_validators/tx_validator/archive_cache.d.ts.map +1 -0
  121. package/dest/msg_validators/tx_validator/archive_cache.js +22 -0
  122. package/dest/msg_validators/tx_validator/block_header_validator.d.ts +2 -2
  123. package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
  124. package/dest/msg_validators/tx_validator/block_header_validator.js +4 -4
  125. package/dest/msg_validators/tx_validator/data_validator.d.ts +1 -1
  126. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  127. package/dest/msg_validators/tx_validator/data_validator.js +56 -86
  128. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +1 -3
  129. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
  130. package/dest/msg_validators/tx_validator/double_spend_validator.js +21 -27
  131. package/dest/msg_validators/tx_validator/factory.d.ts +16 -0
  132. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -0
  133. package/dest/msg_validators/tx_validator/factory.js +74 -0
  134. package/dest/msg_validators/tx_validator/gas_validator.d.ts +11 -0
  135. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -0
  136. package/dest/msg_validators/tx_validator/gas_validator.js +115 -0
  137. package/dest/msg_validators/tx_validator/index.d.ts +8 -1
  138. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  139. package/dest/msg_validators/tx_validator/index.js +7 -0
  140. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +9 -5
  141. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  142. package/dest/msg_validators/tx_validator/metadata_validator.js +39 -20
  143. package/dest/msg_validators/tx_validator/phases_validator.d.ts +14 -0
  144. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -0
  145. package/dest/msg_validators/tx_validator/phases_validator.js +93 -0
  146. package/dest/msg_validators/tx_validator/test_utils.d.ts +17 -0
  147. package/dest/msg_validators/tx_validator/test_utils.d.ts.map +1 -0
  148. package/dest/msg_validators/tx_validator/test_utils.js +22 -0
  149. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +13 -0
  150. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -0
  151. package/dest/msg_validators/tx_validator/timestamp_validator.js +32 -0
  152. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts +8 -0
  153. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts.map +1 -0
  154. package/dest/msg_validators/tx_validator/tx_permitted_validator.js +24 -0
  155. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +1 -1
  156. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
  157. package/dest/msg_validators/tx_validator/tx_proof_validator.js +6 -5
  158. package/dest/services/data_store.d.ts +1 -1
  159. package/dest/services/data_store.d.ts.map +1 -1
  160. package/dest/services/discv5/discV5_service.d.ts +10 -9
  161. package/dest/services/discv5/discV5_service.d.ts.map +1 -1
  162. package/dest/services/discv5/discV5_service.js +63 -36
  163. package/dest/services/dummy_service.d.ts +54 -11
  164. package/dest/services/dummy_service.d.ts.map +1 -1
  165. package/dest/services/dummy_service.js +91 -5
  166. package/dest/services/encoding.d.ts +26 -7
  167. package/dest/services/encoding.d.ts.map +1 -1
  168. package/dest/services/encoding.js +76 -6
  169. package/dest/services/gossipsub/scoring.d.ts +1 -1
  170. package/dest/services/index.d.ts +5 -1
  171. package/dest/services/index.d.ts.map +1 -1
  172. package/dest/services/index.js +4 -0
  173. package/dest/services/libp2p/instrumentation.d.ts +20 -0
  174. package/dest/services/libp2p/instrumentation.d.ts.map +1 -0
  175. package/dest/services/libp2p/instrumentation.js +111 -0
  176. package/dest/services/libp2p/libp2p_service.d.ts +102 -96
  177. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  178. package/dest/services/libp2p/libp2p_service.js +1307 -301
  179. package/dest/services/peer-manager/interface.d.ts +23 -0
  180. package/dest/services/peer-manager/interface.d.ts.map +1 -0
  181. package/dest/services/peer-manager/interface.js +1 -0
  182. package/dest/services/peer-manager/metrics.d.ts +11 -2
  183. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  184. package/dest/services/peer-manager/metrics.js +29 -12
  185. package/dest/services/peer-manager/peer_manager.d.ts +103 -23
  186. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  187. package/dest/services/peer-manager/peer_manager.js +551 -82
  188. package/dest/services/peer-manager/peer_scoring.d.ts +7 -2
  189. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  190. package/dest/services/peer-manager/peer_scoring.js +37 -2
  191. package/dest/services/reqresp/config.d.ts +11 -9
  192. package/dest/services/reqresp/config.d.ts.map +1 -1
  193. package/dest/services/reqresp/config.js +18 -4
  194. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +2 -2
  195. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +1 -1
  196. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +10 -6
  197. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +31 -17
  198. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -1
  199. package/dest/services/reqresp/connection-sampler/connection_sampler.js +142 -84
  200. package/dest/services/reqresp/index.d.ts +3 -2
  201. package/dest/services/reqresp/index.d.ts.map +1 -1
  202. package/dest/services/reqresp/index.js +2 -1
  203. package/dest/services/reqresp/interface.d.ts +73 -24
  204. package/dest/services/reqresp/interface.d.ts.map +1 -1
  205. package/dest/services/reqresp/interface.js +46 -27
  206. package/dest/services/reqresp/metrics.d.ts +1 -1
  207. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  208. package/dest/services/reqresp/metrics.js +5 -21
  209. package/dest/services/reqresp/protocols/auth.d.ts +43 -0
  210. package/dest/services/reqresp/protocols/auth.d.ts.map +1 -0
  211. package/dest/services/reqresp/protocols/auth.js +71 -0
  212. package/dest/services/reqresp/protocols/block.d.ts +6 -1
  213. package/dest/services/reqresp/protocols/block.d.ts.map +1 -1
  214. package/dest/services/reqresp/protocols/block.js +30 -6
  215. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +30 -0
  216. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -0
  217. package/dest/services/reqresp/protocols/block_txs/bitvector.js +75 -0
  218. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +11 -0
  219. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -0
  220. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +39 -0
  221. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +47 -0
  222. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -0
  223. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +75 -0
  224. package/dest/services/reqresp/protocols/block_txs/index.d.ts +4 -0
  225. package/dest/services/reqresp/protocols/block_txs/index.d.ts.map +1 -0
  226. package/dest/services/reqresp/protocols/block_txs/index.js +3 -0
  227. package/dest/services/reqresp/protocols/goodbye.d.ts +3 -5
  228. package/dest/services/reqresp/protocols/goodbye.d.ts.map +1 -1
  229. package/dest/services/reqresp/protocols/goodbye.js +7 -7
  230. package/dest/services/reqresp/protocols/index.d.ts +3 -1
  231. package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
  232. package/dest/services/reqresp/protocols/index.js +2 -0
  233. package/dest/services/reqresp/protocols/ping.d.ts +1 -3
  234. package/dest/services/reqresp/protocols/ping.d.ts.map +1 -1
  235. package/dest/services/reqresp/protocols/status.d.ts +40 -7
  236. package/dest/services/reqresp/protocols/status.d.ts.map +1 -1
  237. package/dest/services/reqresp/protocols/status.js +75 -5
  238. package/dest/services/reqresp/protocols/tx.d.ts +14 -4
  239. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  240. package/dest/services/reqresp/protocols/tx.js +34 -6
  241. package/dest/services/reqresp/rate-limiter/index.d.ts +1 -1
  242. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +6 -4
  243. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
  244. package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -2
  245. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
  246. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
  247. package/dest/services/reqresp/rate-limiter/rate_limits.js +21 -1
  248. package/dest/services/reqresp/reqresp.d.ts +24 -66
  249. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  250. package/dest/services/reqresp/reqresp.js +699 -230
  251. package/dest/services/reqresp/status.d.ts +10 -4
  252. package/dest/services/reqresp/status.d.ts.map +1 -1
  253. package/dest/services/reqresp/status.js +9 -2
  254. package/dest/services/service.d.ts +37 -20
  255. package/dest/services/service.d.ts.map +1 -1
  256. package/dest/services/tx_collection/config.d.ts +25 -0
  257. package/dest/services/tx_collection/config.d.ts.map +1 -0
  258. package/dest/services/tx_collection/config.js +58 -0
  259. package/dest/services/tx_collection/fast_tx_collection.d.ts +51 -0
  260. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -0
  261. package/dest/services/tx_collection/fast_tx_collection.js +300 -0
  262. package/dest/services/tx_collection/index.d.ts +3 -0
  263. package/dest/services/tx_collection/index.d.ts.map +1 -0
  264. package/dest/services/tx_collection/index.js +2 -0
  265. package/dest/services/tx_collection/instrumentation.d.ts +10 -0
  266. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -0
  267. package/dest/services/tx_collection/instrumentation.js +24 -0
  268. package/dest/services/tx_collection/slow_tx_collection.d.ts +53 -0
  269. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -0
  270. package/dest/services/tx_collection/slow_tx_collection.js +177 -0
  271. package/dest/services/tx_collection/tx_collection.d.ts +110 -0
  272. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -0
  273. package/dest/services/tx_collection/tx_collection.js +128 -0
  274. package/dest/services/tx_collection/tx_collection_sink.d.ts +30 -0
  275. package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -0
  276. package/dest/services/tx_collection/tx_collection_sink.js +111 -0
  277. package/dest/services/tx_collection/tx_source.d.ts +18 -0
  278. package/dest/services/tx_collection/tx_source.d.ts.map +1 -0
  279. package/dest/services/tx_collection/tx_source.js +31 -0
  280. package/dest/services/tx_provider.d.ts +51 -0
  281. package/dest/services/tx_provider.d.ts.map +1 -0
  282. package/dest/services/tx_provider.js +219 -0
  283. package/dest/services/tx_provider_instrumentation.d.ts +16 -0
  284. package/dest/services/tx_provider_instrumentation.d.ts.map +1 -0
  285. package/dest/services/tx_provider_instrumentation.js +34 -0
  286. package/dest/test-helpers/generate-peer-id-private-keys.d.ts +1 -1
  287. package/dest/test-helpers/get-ports.d.ts +1 -1
  288. package/dest/test-helpers/get-ports.d.ts.map +1 -1
  289. package/dest/test-helpers/index.d.ts +2 -1
  290. package/dest/test-helpers/index.d.ts.map +1 -1
  291. package/dest/test-helpers/index.js +1 -0
  292. package/dest/test-helpers/make-enrs.d.ts +1 -1
  293. package/dest/test-helpers/make-enrs.d.ts.map +1 -1
  294. package/dest/test-helpers/make-enrs.js +4 -5
  295. package/dest/test-helpers/make-test-p2p-clients.d.ts +33 -5
  296. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  297. package/dest/test-helpers/make-test-p2p-clients.js +86 -16
  298. package/dest/test-helpers/mock-pubsub.d.ts +59 -0
  299. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -0
  300. package/dest/test-helpers/mock-pubsub.js +130 -0
  301. package/dest/test-helpers/mock-tx-helpers.d.ts +12 -0
  302. package/dest/test-helpers/mock-tx-helpers.d.ts.map +1 -0
  303. package/dest/test-helpers/mock-tx-helpers.js +19 -0
  304. package/dest/test-helpers/reqresp-nodes.d.ts +15 -11
  305. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  306. package/dest/test-helpers/reqresp-nodes.js +62 -28
  307. package/dest/testbench/p2p_client_testbench_worker.d.ts +1 -1
  308. package/dest/testbench/p2p_client_testbench_worker.js +124 -35
  309. package/dest/testbench/parse_log_file.d.ts +1 -1
  310. package/dest/testbench/parse_log_file.js +4 -4
  311. package/dest/testbench/testbench.d.ts +1 -1
  312. package/dest/testbench/testbench.js +4 -4
  313. package/dest/testbench/worker_client_manager.d.ts +1 -6
  314. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  315. package/dest/testbench/worker_client_manager.js +17 -20
  316. package/dest/types/index.d.ts +4 -2
  317. package/dest/types/index.d.ts.map +1 -1
  318. package/dest/types/index.js +2 -0
  319. package/dest/util.d.ts +24 -16
  320. package/dest/util.d.ts.map +1 -1
  321. package/dest/util.js +75 -69
  322. package/dest/versioning.d.ts +4 -4
  323. package/dest/versioning.d.ts.map +1 -1
  324. package/dest/versioning.js +8 -3
  325. package/package.json +32 -27
  326. package/src/bootstrap/bootstrap.ts +27 -11
  327. package/src/client/factory.ts +139 -53
  328. package/src/client/index.ts +1 -0
  329. package/src/client/interface.ts +213 -0
  330. package/src/client/p2p_client.ts +471 -385
  331. package/src/config.ts +299 -134
  332. package/src/enr/generate-enr.ts +39 -6
  333. package/src/errors/attestation-pool.error.ts +13 -0
  334. package/src/index.ts +4 -0
  335. package/src/mem_pools/attestation_pool/attestation_pool.ts +119 -24
  336. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +344 -201
  337. package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +233 -72
  338. package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +199 -96
  339. package/src/mem_pools/attestation_pool/mocks.ts +21 -16
  340. package/src/mem_pools/instrumentation.ts +71 -48
  341. package/src/mem_pools/interface.ts +2 -4
  342. package/src/mem_pools/tx_pool/README.md +255 -0
  343. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +537 -155
  344. package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +71 -0
  345. package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +93 -0
  346. package/src/mem_pools/tx_pool/eviction/insufficient_fee_payer_balance_rule.ts +108 -0
  347. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +104 -0
  348. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +91 -0
  349. package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +106 -0
  350. package/src/mem_pools/tx_pool/index.ts +0 -1
  351. package/src/mem_pools/tx_pool/priority.ts +9 -2
  352. package/src/mem_pools/tx_pool/tx_pool.ts +75 -10
  353. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +225 -36
  354. package/src/msg_validators/attestation_validator/attestation_validator.ts +60 -14
  355. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +88 -0
  356. package/src/msg_validators/attestation_validator/index.ts +1 -0
  357. package/src/msg_validators/index.ts +1 -1
  358. package/src/msg_validators/msg_seen_validator/msg_seen_validator.ts +36 -0
  359. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +10 -0
  360. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +13 -0
  361. package/src/msg_validators/proposal_validator/index.ts +3 -0
  362. package/src/msg_validators/proposal_validator/proposal_validator.ts +92 -0
  363. package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +206 -0
  364. package/src/msg_validators/tx_validator/allowed_public_setup.ts +35 -0
  365. package/src/msg_validators/tx_validator/archive_cache.ts +28 -0
  366. package/src/msg_validators/tx_validator/block_header_validator.ts +5 -5
  367. package/src/msg_validators/tx_validator/data_validator.ts +89 -69
  368. package/src/msg_validators/tx_validator/double_spend_validator.ts +19 -17
  369. package/src/msg_validators/tx_validator/factory.ts +110 -0
  370. package/src/msg_validators/tx_validator/gas_validator.ts +134 -0
  371. package/src/msg_validators/tx_validator/index.ts +7 -0
  372. package/src/msg_validators/tx_validator/metadata_validator.ts +67 -22
  373. package/src/msg_validators/tx_validator/phases_validator.ts +116 -0
  374. package/src/msg_validators/tx_validator/test_utils.ts +43 -0
  375. package/src/msg_validators/tx_validator/timestamp_validator.ts +49 -0
  376. package/src/msg_validators/tx_validator/tx_permitted_validator.ts +17 -0
  377. package/src/msg_validators/tx_validator/tx_proof_validator.ts +6 -5
  378. package/src/services/discv5/discV5_service.ts +84 -38
  379. package/src/services/dummy_service.ts +153 -9
  380. package/src/services/encoding.ts +83 -6
  381. package/src/services/index.ts +4 -0
  382. package/src/services/libp2p/instrumentation.ts +113 -0
  383. package/src/services/libp2p/libp2p_service.ts +1120 -329
  384. package/src/services/peer-manager/interface.ts +29 -0
  385. package/src/services/peer-manager/metrics.ts +38 -12
  386. package/src/services/peer-manager/peer_manager.ts +657 -80
  387. package/src/services/peer-manager/peer_scoring.ts +42 -3
  388. package/src/services/reqresp/config.ts +26 -9
  389. package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +12 -6
  390. package/src/services/reqresp/connection-sampler/connection_sampler.ts +150 -95
  391. package/src/services/reqresp/index.ts +2 -0
  392. package/src/services/reqresp/interface.ts +92 -37
  393. package/src/services/reqresp/metrics.ts +11 -24
  394. package/src/services/reqresp/protocols/auth.ts +83 -0
  395. package/src/services/reqresp/protocols/block.ts +26 -4
  396. package/src/services/reqresp/protocols/block_txs/bitvector.ts +90 -0
  397. package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +53 -0
  398. package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +79 -0
  399. package/src/services/reqresp/protocols/block_txs/index.ts +3 -0
  400. package/src/services/reqresp/protocols/goodbye.ts +9 -7
  401. package/src/services/reqresp/protocols/index.ts +2 -0
  402. package/src/services/reqresp/protocols/status.ts +119 -5
  403. package/src/services/reqresp/protocols/tx.ts +36 -8
  404. package/src/services/reqresp/rate-limiter/rate_limiter.ts +12 -3
  405. package/src/services/reqresp/rate-limiter/rate_limits.ts +21 -1
  406. package/src/services/reqresp/reqresp.ts +387 -256
  407. package/src/services/reqresp/status.ts +12 -3
  408. package/src/services/service.ts +61 -22
  409. package/src/services/tx_collection/config.ts +84 -0
  410. package/src/services/tx_collection/fast_tx_collection.ts +341 -0
  411. package/src/services/tx_collection/index.ts +2 -0
  412. package/src/services/tx_collection/instrumentation.ts +26 -0
  413. package/src/services/tx_collection/slow_tx_collection.ts +233 -0
  414. package/src/services/tx_collection/tx_collection.ts +216 -0
  415. package/src/services/tx_collection/tx_collection_sink.ts +129 -0
  416. package/src/services/tx_collection/tx_source.ts +37 -0
  417. package/src/services/tx_provider.ts +232 -0
  418. package/src/services/tx_provider_instrumentation.ts +48 -0
  419. package/src/test-helpers/index.ts +1 -0
  420. package/src/test-helpers/make-enrs.ts +4 -5
  421. package/src/test-helpers/make-test-p2p-clients.ts +111 -21
  422. package/src/test-helpers/mock-pubsub.ts +188 -0
  423. package/src/test-helpers/mock-tx-helpers.ts +24 -0
  424. package/src/test-helpers/reqresp-nodes.ts +87 -36
  425. package/src/testbench/p2p_client_testbench_worker.ts +182 -32
  426. package/src/testbench/parse_log_file.ts +4 -4
  427. package/src/testbench/testbench.ts +4 -4
  428. package/src/testbench/worker_client_manager.ts +23 -24
  429. package/src/types/index.ts +2 -0
  430. package/src/util.ts +105 -91
  431. package/src/versioning.ts +11 -4
  432. package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts +0 -56
  433. package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts.map +0 -1
  434. package/dest/mem_pools/tx_pool/memory_tx_pool.js +0 -141
  435. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts +0 -8
  436. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts.map +0 -1
  437. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.js +0 -21
  438. package/dest/msg_validators/block_proposal_validator/index.d.ts +0 -2
  439. package/dest/msg_validators/block_proposal_validator/index.d.ts.map +0 -1
  440. package/dest/msg_validators/block_proposal_validator/index.js +0 -1
  441. package/src/mem_pools/tx_pool/memory_tx_pool.ts +0 -174
  442. package/src/msg_validators/block_proposal_validator/block_proposal_validator.ts +0 -29
  443. package/src/msg_validators/block_proposal_validator/index.ts +0 -1
@@ -3,16 +3,16 @@ import { sleep } from '@aztec/foundation/sleep';
3
3
  import { type ComponentsVersions, checkCompressedComponentVersion } from '@aztec/stdlib/versioning';
4
4
  import { OtelMetricsAdapter, type TelemetryClient, getTelemetryClient } from '@aztec/telemetry-client';
5
5
 
6
- import { Discv5, type Discv5EventEmitter } from '@chainsafe/discv5';
7
- import { ENR, SignableENR } from '@chainsafe/enr';
8
6
  import type { PeerId } from '@libp2p/interface';
9
7
  import { type Multiaddr, multiaddr } from '@multiformats/multiaddr';
8
+ import { Discv5, type Discv5EventEmitter, type IDiscv5CreateOptions } from '@nethermindeth/discv5';
9
+ import { ENR, SignableENR } from '@nethermindeth/enr';
10
10
  import EventEmitter from 'events';
11
11
 
12
12
  import type { P2PConfig } from '../../config.js';
13
+ import { createNodeENR } from '../../enr/generate-enr.js';
13
14
  import { AZTEC_ENR_KEY, Discv5Event, PeerEvent } from '../../types/index.js';
14
15
  import { convertToMultiaddr } from '../../util.js';
15
- import { setAztecEnrKey } from '../../versioning.js';
16
16
  import { type PeerDiscoveryService, PeerDiscoveryState } from '../service.js';
17
17
 
18
18
  const delayBeforeStart = 2000; // 2sec
@@ -22,7 +22,7 @@ const delayBeforeStart = 2000; // 2sec
22
22
  */
23
23
  export class DiscV5Service extends EventEmitter implements PeerDiscoveryService {
24
24
  /** The Discv5 instance */
25
- private discv5: Discv5 & Discv5EventEmitter;
25
+ private discv5: Discv5EventEmitter;
26
26
 
27
27
  /** This instance's ENR */
28
28
  private enr: SignableENR;
@@ -30,57 +30,74 @@ export class DiscV5Service extends EventEmitter implements PeerDiscoveryService
30
30
  /** Version identifiers. */
31
31
  private versions: ComponentsVersions;
32
32
 
33
- /** UDP listen addr */
34
- private listenMultiAddrUdp: Multiaddr;
35
-
36
33
  private currentState = PeerDiscoveryState.STOPPED;
37
34
 
38
- public readonly bootstrapNodes: string[] = [];
39
35
  private bootstrapNodePeerIds: PeerId[] = [];
40
- private bootstrapNodeEnrs: ENR[] = [];
36
+ public bootstrapNodeEnrs: ENR[] = [];
37
+ private trustedPeerEnrs: ENR[] = [];
41
38
 
42
39
  private startTime = 0;
43
40
 
41
+ private handlers = {
42
+ onMultiaddrUpdated: this.onMultiaddrUpdated.bind(this),
43
+ onDiscovered: this.onDiscovered.bind(this),
44
+ onEnrAdded: this.onEnrAdded.bind(this),
45
+ };
46
+
44
47
  constructor(
45
48
  private peerId: PeerId,
46
49
  private config: P2PConfig,
50
+ private readonly packageVersion: string,
47
51
  telemetry: TelemetryClient = getTelemetryClient(),
48
52
  private logger = createLogger('p2p:discv5_service'),
53
+ configOverrides: Partial<IDiscv5CreateOptions> = {},
49
54
  ) {
50
55
  super();
51
- const { tcpAnnounceAddress, udpAnnounceAddress, udpListenAddress, bootstrapNodes } = config;
52
- this.bootstrapNodes = bootstrapNodes ?? [];
53
- this.bootstrapNodeEnrs = this.bootstrapNodes.map(x => ENR.decodeTxt(x));
54
- // create ENR from PeerId
55
- this.enr = SignableENR.createFromPeerId(peerId);
56
- // Add aztec identification to ENR
57
- this.versions = setAztecEnrKey(this.enr, config);
58
-
59
- if (!tcpAnnounceAddress) {
60
- throw new Error('You need to provide at least a TCP announce address.');
56
+ const { p2pIp, p2pPort, p2pBroadcastPort, bootstrapNodes, trustedPeers, privatePeers } = config;
57
+
58
+ this.bootstrapNodeEnrs = bootstrapNodes.map(x => ENR.decodeTxt(x));
59
+ const privatePeerEnrs = new Set(privatePeers);
60
+ this.trustedPeerEnrs = trustedPeers.filter(x => !privatePeerEnrs.has(x)).map(x => ENR.decodeTxt(x));
61
+
62
+ // If no overridden broadcast port is provided, use the p2p port as the broadcast port
63
+ if (!p2pBroadcastPort) {
64
+ this.logger.warn('No p2pBroadcastPort provided, using p2pPort as broadcast port');
65
+ config.p2pBroadcastPort = p2pPort;
61
66
  }
62
67
 
63
- const multiAddrTcp = multiaddr(`${convertToMultiaddr(tcpAnnounceAddress, 'tcp')}/p2p/${peerId.toString()}`);
64
- // if no udp announce address is provided, use the tcp announce address
65
- const multiAddrUdp = multiaddr(
66
- `${convertToMultiaddr(udpAnnounceAddress || tcpAnnounceAddress, 'udp')}/p2p/${peerId.toString()}`,
67
- );
68
+ const bindAddrs: any = {
69
+ ip4: multiaddr(convertToMultiaddr(config.listenAddress, p2pPort, 'udp')),
70
+ };
68
71
 
69
- this.listenMultiAddrUdp = multiaddr(convertToMultiaddr(udpListenAddress, 'udp'));
72
+ let multiAddrUdp, multiAddrTcp;
73
+ if (p2pIp) {
74
+ multiAddrTcp = multiaddr(
75
+ `${convertToMultiaddr(p2pIp!, config.p2pBroadcastPort!, 'tcp')}/p2p/${peerId.toString()}`,
76
+ );
77
+ multiAddrUdp = multiaddr(
78
+ `${convertToMultiaddr(p2pIp!, config.p2pBroadcastPort!, 'udp')}/p2p/${peerId.toString()}`,
79
+ );
80
+ }
70
81
 
71
- // set location multiaddr in ENR record
72
- this.enr.setLocationMultiaddr(multiAddrUdp);
73
- this.enr.setLocationMultiaddr(multiAddrTcp);
82
+ ({ enr: this.enr, versions: this.versions } = createNodeENR(
83
+ peerId,
84
+ multiAddrUdp,
85
+ multiAddrTcp,
86
+ config,
87
+ this.packageVersion,
88
+ ));
74
89
 
75
90
  const metricsRegistry = new OtelMetricsAdapter(telemetry);
76
91
  this.discv5 = Discv5.create({
77
92
  enr: this.enr,
78
93
  peerId,
79
- bindAddrs: { ip4: this.listenMultiAddrUdp },
94
+ bindAddrs,
80
95
  config: {
81
96
  lookupTimeout: 2000,
82
97
  requestTimeout: 2000,
83
98
  allowUnverifiedSessions: true,
99
+ enrUpdate: !p2pIp ? true : false, // If no p2p IP is set, enrUpdate can automatically resolve it
100
+ ...configOverrides.config,
84
101
  },
85
102
  metricsRegistry,
86
103
  });
@@ -104,8 +121,17 @@ export class DiscV5Service extends EventEmitter implements PeerDiscoveryService
104
121
  }
105
122
  };
106
123
 
107
- this.discv5.on(Discv5Event.DISCOVERED, this.onDiscovered.bind(this));
108
- this.discv5.on(Discv5Event.ENR_ADDED, this.onEnrAdded.bind(this));
124
+ this.discv5.on(Discv5Event.DISCOVERED, this.handlers.onDiscovered);
125
+ this.discv5.on(Discv5Event.ENR_ADDED, this.handlers.onEnrAdded);
126
+ this.discv5.on(Discv5Event.MULTIADDR_UPDATED, this.handlers.onMultiaddrUpdated);
127
+ }
128
+
129
+ private onMultiaddrUpdated(m: Multiaddr) {
130
+ // We want to update our tcp port to match the udp port
131
+ // p2pBroadcastPort is optional on config, however it is set to default within the p2p client factory
132
+ const multiAddrTcp = multiaddr(convertToMultiaddr(m.nodeAddress().address, this.config.p2pBroadcastPort!, 'tcp'));
133
+ this.enr.setLocationMultiaddr(multiAddrTcp);
134
+ this.logger.info('Multiaddr updated', { multiaddr: multiAddrTcp.toString() });
109
135
  }
110
136
 
111
137
  public async start(): Promise<void> {
@@ -126,10 +152,14 @@ export class DiscV5Service extends EventEmitter implements PeerDiscoveryService
126
152
  this.currentState = PeerDiscoveryState.RUNNING;
127
153
 
128
154
  // Add bootnode ENR if provided
129
- if (this.bootstrapNodes?.length) {
155
+ if (this.bootstrapNodeEnrs?.length) {
130
156
  // Do this conversion once since it involves an async function call
131
157
  this.bootstrapNodePeerIds = await Promise.all(this.bootstrapNodeEnrs.map(enr => enr.peerId()));
132
- this.logger.info(`Adding ${this.bootstrapNodes} bootstrap nodes ENRs: ${this.bootstrapNodes.join(', ')}`);
158
+ this.logger.info(
159
+ `Adding ${this.bootstrapNodeEnrs.length} bootstrap nodes ENRs: ${this.bootstrapNodeEnrs
160
+ .map(enr => enr.encodeTxt())
161
+ .join(', ')}`,
162
+ );
133
163
  for (const enr of this.bootstrapNodeEnrs) {
134
164
  try {
135
165
  if (this.config.bootstrapNodeEnrVersionCheck) {
@@ -145,11 +175,23 @@ export class DiscV5Service extends EventEmitter implements PeerDiscoveryService
145
175
  }
146
176
  }
147
177
  }
178
+
179
+ // Add trusted peer ENRs if provided
180
+ if (this.trustedPeerEnrs?.length) {
181
+ this.logger.info(
182
+ `Adding ${this.trustedPeerEnrs.length} trusted peer ENRs: ${this.trustedPeerEnrs
183
+ .map(enr => enr.encodeTxt())
184
+ .join(', ')}`,
185
+ );
186
+ for (const enr of this.trustedPeerEnrs) {
187
+ this.discv5.addEnr(enr);
188
+ }
189
+ }
148
190
  }
149
191
 
150
192
  public async runRandomNodesQuery(): Promise<void> {
151
193
  if (this.currentState !== PeerDiscoveryState.RUNNING) {
152
- throw new Error('DiscV5Service not running');
194
+ return;
153
195
  }
154
196
 
155
197
  // First, wait some time before starting the peer discovery
@@ -166,7 +208,7 @@ export class DiscV5Service extends EventEmitter implements PeerDiscoveryService
166
208
  }
167
209
  }
168
210
 
169
- public getAllPeers(): ENR[] {
211
+ public getKadValues(): ENR[] {
170
212
  return this.discv5.kadValues();
171
213
  }
172
214
 
@@ -187,8 +229,12 @@ export class DiscV5Service extends EventEmitter implements PeerDiscoveryService
187
229
  }
188
230
 
189
231
  public async stop(): Promise<void> {
190
- await this.discv5.off(Discv5Event.DISCOVERED, this.onDiscovered);
191
- await this.discv5.off(Discv5Event.ENR_ADDED, this.onEnrAdded);
232
+ if (this.currentState !== PeerDiscoveryState.RUNNING) {
233
+ return;
234
+ }
235
+ await this.discv5.off(Discv5Event.DISCOVERED, this.handlers.onDiscovered);
236
+ await this.discv5.off(Discv5Event.ENR_ADDED, this.handlers.onEnrAdded);
237
+ await this.discv5.off(Discv5Event.MULTIADDR_UPDATED, this.handlers.onMultiaddrUpdated);
192
238
 
193
239
  await this.discv5.stop();
194
240
 
@@ -231,7 +277,7 @@ export class DiscV5Service extends EventEmitter implements PeerDiscoveryService
231
277
  // Check the peer is an aztec peer
232
278
  const value = enr.kvs.get(AZTEC_ENR_KEY);
233
279
  if (!value) {
234
- this.logger.warn(`Peer node ${enr.nodeId} does not have aztec key in ENR`);
280
+ this.logger.debug(`Peer node ${enr.nodeId} does not have aztec key in ENR`);
235
281
  return false;
236
282
  }
237
283
 
@@ -1,17 +1,40 @@
1
+ import type { EthAddress } from '@aztec/foundation/eth-address';
1
2
  import type { PeerInfo } from '@aztec/stdlib/interfaces/server';
2
- import type { BlockAttestation, BlockProposal, Gossipable } from '@aztec/stdlib/p2p';
3
- import { TxHash } from '@aztec/stdlib/tx';
3
+ import type { Gossipable, PeerErrorSeverity } from '@aztec/stdlib/p2p';
4
+ import { Tx, TxHash } from '@aztec/stdlib/tx';
4
5
 
5
6
  import type { PeerId } from '@libp2p/interface';
7
+ import type { ENR } from '@nethermindeth/enr';
6
8
  import EventEmitter from 'events';
7
9
 
8
- import type { ReqRespSubProtocol, SubProtocolMap } from './reqresp/interface.js';
9
- import { type P2PService, type PeerDiscoveryService, PeerDiscoveryState } from './service.js';
10
+ import type { PeerManagerInterface } from './peer-manager/interface.js';
11
+ import type { P2PReqRespConfig } from './reqresp/config.js';
12
+ import { type AuthRequest, StatusMessage } from './reqresp/index.js';
13
+ import type {
14
+ ReqRespInterface,
15
+ ReqRespResponse,
16
+ ReqRespSubProtocol,
17
+ ReqRespSubProtocolHandler,
18
+ ReqRespSubProtocolHandlers,
19
+ ReqRespSubProtocolValidators,
20
+ SubProtocolMap,
21
+ } from './reqresp/interface.js';
22
+ import type { GoodByeReason } from './reqresp/protocols/goodbye.js';
23
+ import { ReqRespStatus } from './reqresp/status.js';
24
+ import {
25
+ type P2PBlockReceivedCallback,
26
+ type P2PCheckpointReceivedCallback,
27
+ type P2PService,
28
+ type PeerDiscoveryService,
29
+ PeerDiscoveryState,
30
+ } from './service.js';
10
31
 
11
32
  /**
12
33
  * A dummy implementation of the P2P Service.
13
34
  */
14
35
  export class DummyP2PService implements P2PService {
36
+ updateConfig(_config: Partial<P2PReqRespConfig>): void {}
37
+
15
38
  /** Returns an empty array for peers. */
16
39
  getPeers(): PeerInfo[] {
17
40
  return [];
@@ -37,7 +60,9 @@ export class DummyP2PService implements P2PService {
37
60
  * Called to have the given message propagated through the P2P network.
38
61
  * @param _ - The message to be propagated.
39
62
  */
40
- public propagate<T extends Gossipable>(_: T) {}
63
+ public propagate<T extends Gossipable>(_: T) {
64
+ return Promise.resolve();
65
+ }
41
66
 
42
67
  /**
43
68
  * Called upon receipt of settled transactions.
@@ -48,7 +73,12 @@ export class DummyP2PService implements P2PService {
48
73
  /**
49
74
  * Register a callback into the validator client for when a block proposal is received
50
75
  */
51
- public registerBlockReceivedCallback(_: (block: BlockProposal) => Promise<BlockAttestation>) {}
76
+ public registerBlockReceivedCallback(_callback: P2PBlockReceivedCallback) {}
77
+
78
+ /**
79
+ * Register a callback into the validator client for when a checkpoint proposal is received
80
+ */
81
+ public registerCheckpointReceivedCallback(_callback: P2PCheckpointReceivedCallback) {}
52
82
 
53
83
  /**
54
84
  * Sends a request to a peer.
@@ -83,6 +113,25 @@ export class DummyP2PService implements P2PService {
83
113
  public getEnr(): undefined {
84
114
  return undefined;
85
115
  }
116
+
117
+ validate(_txs: Tx[]): Promise<void> {
118
+ return Promise.resolve();
119
+ }
120
+
121
+ addReqRespSubProtocol(
122
+ _subProtocol: ReqRespSubProtocol,
123
+ _handler: ReqRespSubProtocolHandler,
124
+ _validator?: ReqRespSubProtocolValidators[ReqRespSubProtocol],
125
+ ): Promise<void> {
126
+ return Promise.resolve();
127
+ }
128
+
129
+ handleAuthRequestFromPeer(_authRequest: AuthRequest, _peerId: PeerId): Promise<StatusMessage> {
130
+ return Promise.resolve(StatusMessage.random());
131
+ }
132
+
133
+ //this is no-op
134
+ registerThisValidatorAddresses(_address: EthAddress[]): void {}
86
135
  }
87
136
 
88
137
  /**
@@ -90,7 +139,7 @@ export class DummyP2PService implements P2PService {
90
139
  */
91
140
  export class DummyPeerDiscoveryService extends EventEmitter implements PeerDiscoveryService {
92
141
  private currentState = PeerDiscoveryState.STOPPED;
93
- public bootstrapNodes: string[] = [];
142
+ public bootstrapNodeEnrs: ENR[] = [];
94
143
 
95
144
  /**
96
145
  * Starts the dummy implementation.
@@ -110,9 +159,9 @@ export class DummyPeerDiscoveryService extends EventEmitter implements PeerDisco
110
159
  }
111
160
  /**
112
161
  * Called to discover peers in the network.
113
- * @returns An array of discovered peer addresses.
162
+ * @returns An array of Enrs.
114
163
  */
115
- public getAllPeers() {
164
+ public getKadValues() {
116
165
  return [];
117
166
  }
118
167
 
@@ -132,3 +181,98 @@ export class DummyPeerDiscoveryService extends EventEmitter implements PeerDisco
132
181
  return undefined;
133
182
  }
134
183
  }
184
+
185
+ export class DummyPeerManager implements PeerManagerInterface {
186
+ constructor(
187
+ public peerId: PeerId,
188
+ private peersProvider?: { getPeers: () => PeerId[] },
189
+ ) {}
190
+
191
+ public getPeers(_includePending?: boolean): PeerInfo[] {
192
+ if (!this.peersProvider) {
193
+ return [];
194
+ }
195
+ return this.peersProvider
196
+ .getPeers()
197
+ .filter(peer => !peer.equals(this.peerId))
198
+ .map(id => ({
199
+ id: id.toString(),
200
+ status: 'connected',
201
+ score: 0,
202
+ }));
203
+ }
204
+
205
+ public initializePeers(): Promise<void> {
206
+ return Promise.resolve();
207
+ }
208
+ public getPeerScore(_peerId: string): number {
209
+ return 0;
210
+ }
211
+
212
+ public shouldDisableP2PGossip(_peerId: string): boolean {
213
+ return false;
214
+ }
215
+
216
+ public stop(): Promise<void> {
217
+ return Promise.resolve();
218
+ }
219
+ public heartbeat(): Promise<void> {
220
+ return Promise.resolve();
221
+ }
222
+ public addTrustedPeer(_peerId: PeerId): void {}
223
+ public addPrivatePeer(_peerId: PeerId): void {}
224
+ public goodbyeReceived(_peerId: PeerId, _reason: GoodByeReason): void {}
225
+ public penalizePeer(_peerId: PeerId, _penalty: PeerErrorSeverity): void {}
226
+ public addPreferredPeer(_peerId: PeerId): void {}
227
+ public handleAuthRequestFromPeer(_authRequest: AuthRequest, _peerId: PeerId): Promise<StatusMessage> {
228
+ return Promise.resolve(StatusMessage.random());
229
+ }
230
+
231
+ //this is no-op
232
+ registerThisValidatorAddresses(_address: EthAddress[]): void {}
233
+ }
234
+
235
+ export class DummyReqResp implements ReqRespInterface {
236
+ updateConfig(_config: Partial<P2PReqRespConfig>): void {}
237
+ start(
238
+ _subProtocolHandlers: ReqRespSubProtocolHandlers,
239
+ _subProtocolValidators: ReqRespSubProtocolValidators,
240
+ ): Promise<void> {
241
+ return Promise.resolve();
242
+ }
243
+ stop(): Promise<void> {
244
+ return Promise.resolve();
245
+ }
246
+ sendRequest<SubProtocol extends ReqRespSubProtocol>(
247
+ _subProtocol: SubProtocol,
248
+ _request: InstanceType<SubProtocolMap[SubProtocol]['request']>,
249
+ ): Promise<InstanceType<SubProtocolMap[SubProtocol]['response']> | undefined> {
250
+ return Promise.resolve(undefined);
251
+ }
252
+ sendBatchRequest<SubProtocol extends ReqRespSubProtocol>(
253
+ _subProtocol: SubProtocol,
254
+ _requests: InstanceType<SubProtocolMap[SubProtocol]['request']>[],
255
+ _pinnedPeer: PeerId | undefined,
256
+ _timeoutMs?: number,
257
+ _maxPeers?: number,
258
+ _maxRetryAttempts?: number,
259
+ ): Promise<InstanceType<SubProtocolMap[SubProtocol]['response']>[]> {
260
+ return Promise.resolve([]);
261
+ }
262
+ public sendRequestToPeer(
263
+ _peerId: PeerId,
264
+ _subProtocol: ReqRespSubProtocol,
265
+ _payload: Buffer,
266
+ _dialTimeout?: number,
267
+ ): Promise<ReqRespResponse> {
268
+ return Promise.resolve({ status: ReqRespStatus.SUCCESS, data: Buffer.from([]) });
269
+ }
270
+
271
+ addSubProtocol(
272
+ _subProtocol: ReqRespSubProtocol,
273
+ _handler: ReqRespSubProtocolHandler,
274
+ _validator?: ReqRespSubProtocolValidators[ReqRespSubProtocol],
275
+ ): Promise<void> {
276
+ return Promise.resolve();
277
+ }
278
+ }
@@ -1,5 +1,7 @@
1
1
  // Taken from lodestar: https://github.com/ChainSafe/lodestar
2
- import { sha256 } from '@aztec/foundation/crypto';
2
+ import { sha256 } from '@aztec/foundation/crypto/sha256';
3
+ import { createLogger } from '@aztec/foundation/log';
4
+ import { TopicType, getTopicFromString } from '@aztec/stdlib/p2p';
3
5
 
4
6
  import type { RPC } from '@chainsafe/libp2p-gossipsub/message';
5
7
  import type { DataTransform } from '@chainsafe/libp2p-gossipsub/types';
@@ -49,31 +51,106 @@ export function getMsgIdFn(message: Message) {
49
51
  return sha256(Buffer.concat(vec)).subarray(0, 20);
50
52
  }
51
53
 
54
+ const DefaultMaxSizesKb: Record<TopicType, number> = {
55
+ // Tx effects should not exceed 128kb, so 512kb for the full tx obj should be sufficient
56
+ [TopicType.tx]: 512,
57
+ // An attestation has roughly 30 fields, which is 1kb, so 5x is plenty
58
+ [TopicType.checkpoint_attestation]: 5,
59
+ // Proposals may carry some tx objects, so we allow a larger size capped at 10mb
60
+ // Note this may not be enough for carrying all tx objects in a block
61
+ [TopicType.block_proposal]: 1024 * 10,
62
+ // TODO(palla/mbps): Check size for checkpoint proposal
63
+ [TopicType.checkpoint_proposal]: 1024 * 10,
64
+ };
65
+
52
66
  /**
53
67
  * Snappy transform for libp2p gossipsub
54
68
  */
55
69
  export class SnappyTransform implements DataTransform {
70
+ constructor(
71
+ private maxSizesKb: Record<TopicType, number> = DefaultMaxSizesKb,
72
+ private defaultMaxSizeKb: number = 10 * 1024,
73
+ private logger = createLogger('p2p:snappy-transform'),
74
+ ) {}
75
+
56
76
  // Topic string included to satisfy DataTransform interface
57
- inboundTransform(_topicStr: string, data: Uint8Array): Uint8Array {
58
- return this.inboundTransformNoTopic(Buffer.from(data));
77
+ inboundTransform(topicStr: string, data: Uint8Array): Uint8Array {
78
+ const topic = getTopicFromString(topicStr);
79
+ return this.inboundTransformData(Buffer.from(data), topic);
59
80
  }
60
81
 
61
- public inboundTransformNoTopic(data: Buffer): Buffer {
82
+ public inboundTransformData(data: Buffer, topic?: TopicType): Buffer {
62
83
  if (data.length === 0) {
63
84
  return data;
64
85
  }
86
+ const maxSizeKb = this.maxSizesKb[topic!] ?? this.defaultMaxSizeKb;
87
+ const { decompressedSize } = readSnappyPreamble(data);
88
+ if (decompressedSize > maxSizeKb * 1024) {
89
+ this.logger.warn(`Decompressed size ${decompressedSize} exceeds maximum allowed size of ${maxSizeKb}kb`);
90
+ throw new Error(`Decompressed size ${decompressedSize} exceeds maximum allowed size of ${maxSizeKb}kb`);
91
+ }
92
+
65
93
  return Buffer.from(uncompressSync(data, { asBuffer: true }));
66
94
  }
67
95
 
68
96
  // Topic string included to satisfy DataTransform interface
69
97
  outboundTransform(_topicStr: string, data: Uint8Array): Uint8Array {
70
- return this.outboundTransformNoTopic(Buffer.from(data));
98
+ return this.outboundTransformData(Buffer.from(data));
71
99
  }
72
100
 
73
- public outboundTransformNoTopic(data: Buffer): Buffer {
101
+ public outboundTransformData(data: Buffer): Buffer {
74
102
  if (data.length === 0) {
75
103
  return data;
76
104
  }
77
105
  return Buffer.from(compressSync(data));
78
106
  }
79
107
  }
108
+
109
+ /**
110
+ * Reads the Snappy preamble from compressed data and returns the expected decompressed size.
111
+ *
112
+ * The Snappy format starts with a little-endian varint encoding the uncompressed length.
113
+ * Varints consist of a series of bytes where:
114
+ * - Lower 7 bits contain data
115
+ * - Upper bit (0x80) is set if more bytes follow
116
+ *
117
+ * @param data - The compressed data starting with the Snappy preamble
118
+ * @returns Object containing the decompressed size and the number of bytes read from the preamble
119
+ * @throws Error if the data is too short or the varint is invalid
120
+ */
121
+ export function readSnappyPreamble(data: Uint8Array): { decompressedSize: number; bytesRead: number } {
122
+ if (data.length === 0) {
123
+ throw new Error('Cannot read preamble from empty data');
124
+ }
125
+
126
+ let result = 0;
127
+ let shift = 0;
128
+ let bytesRead = 0;
129
+
130
+ // Maximum varint length for 32-bit value is 5 bytes
131
+ // (7 bits per byte, so 5 bytes = 35 bits, enough for 2^32 - 1)
132
+ const maxBytes = 5;
133
+
134
+ for (let i = 0; i < Math.min(data.length, maxBytes); i++) {
135
+ const byte = data[i];
136
+ bytesRead++;
137
+
138
+ // Extract lower 7 bits and add to result with appropriate shift
139
+ // Use >>> 0 to convert to unsigned 32-bit integer to avoid sign issues
140
+ result = (result | ((byte & 0x7f) << shift)) >>> 0;
141
+
142
+ // If upper bit is not set, we're done
143
+ if ((byte & 0x80) === 0) {
144
+ return { decompressedSize: result, bytesRead };
145
+ }
146
+
147
+ shift += 7;
148
+ }
149
+
150
+ // If we get here, either we ran out of data or the varint is too long
151
+ if (bytesRead >= maxBytes) {
152
+ throw new Error('Varint is too long (max 5 bytes for 32-bit value)');
153
+ }
154
+
155
+ throw new Error('Incomplete varint: data ended before varint termination');
156
+ }
@@ -1,2 +1,6 @@
1
1
  export * from './service.js';
2
2
  export * from './libp2p/libp2p_service.js';
3
+ export * from './tx_provider.js';
4
+ export * from './dummy_service.js';
5
+ export * from './reqresp/index.js';
6
+ export * from './tx_collection/index.js';
@@ -0,0 +1,113 @@
1
+ import type { Timer } from '@aztec/foundation/timer';
2
+ import { TopicType } from '@aztec/stdlib/p2p';
3
+ import {
4
+ Attributes,
5
+ type BatchObservableResult,
6
+ type Histogram,
7
+ Metrics,
8
+ type ObservableGauge,
9
+ type TelemetryClient,
10
+ type UpDownCounter,
11
+ } from '@aztec/telemetry-client';
12
+
13
+ import { type RecordableHistogram, createHistogram } from 'node:perf_hooks';
14
+
15
+ export class P2PInstrumentation {
16
+ private messageValidationDuration: Histogram;
17
+ private messagePrevalidationCount: UpDownCounter;
18
+ private messageLatency: Histogram;
19
+ private txReceivedCount: UpDownCounter;
20
+
21
+ private aggLatencyHisto = new Map<TopicType, RecordableHistogram>();
22
+ private aggValidationHisto = new Map<TopicType, RecordableHistogram>();
23
+
24
+ private aggLatencyMetrics: Record<'min' | 'max' | 'p50' | 'p90' | 'avg', ObservableGauge>;
25
+ private aggValidationMetrics: Record<'min' | 'max' | 'p50' | 'p90' | 'avg', ObservableGauge>;
26
+
27
+ constructor(client: TelemetryClient, name: string) {
28
+ const meter = client.getMeter(name);
29
+
30
+ this.messageValidationDuration = meter.createHistogram(Metrics.P2P_GOSSIP_MESSAGE_VALIDATION_DURATION);
31
+
32
+ this.messagePrevalidationCount = meter.createUpDownCounter(Metrics.P2P_GOSSIP_MESSAGE_PREVALIDATION_COUNT);
33
+
34
+ this.messageLatency = meter.createHistogram(Metrics.P2P_GOSSIP_MESSAGE_LATENCY);
35
+
36
+ this.txReceivedCount = meter.createUpDownCounter(Metrics.P2P_GOSSIP_TX_RECEIVED_COUNT);
37
+
38
+ this.aggLatencyMetrics = {
39
+ avg: meter.createObservableGauge(Metrics.P2P_GOSSIP_AGG_MESSAGE_LATENCY_AVG),
40
+ max: meter.createObservableGauge(Metrics.P2P_GOSSIP_AGG_MESSAGE_LATENCY_MAX),
41
+ min: meter.createObservableGauge(Metrics.P2P_GOSSIP_AGG_MESSAGE_LATENCY_MIN),
42
+ p50: meter.createObservableGauge(Metrics.P2P_GOSSIP_AGG_MESSAGE_LATENCY_P50),
43
+ p90: meter.createObservableGauge(Metrics.P2P_GOSSIP_AGG_MESSAGE_LATENCY_P90),
44
+ };
45
+
46
+ this.aggValidationMetrics = {
47
+ avg: meter.createObservableGauge(Metrics.P2P_GOSSIP_AGG_MESSAGE_VALIDATION_DURATION_AVG),
48
+ max: meter.createObservableGauge(Metrics.P2P_GOSSIP_AGG_MESSAGE_VALIDATION_DURATION_MAX),
49
+ min: meter.createObservableGauge(Metrics.P2P_GOSSIP_AGG_MESSAGE_VALIDATION_DURATION_MIN),
50
+ p50: meter.createObservableGauge(Metrics.P2P_GOSSIP_AGG_MESSAGE_VALIDATION_DURATION_P50),
51
+ p90: meter.createObservableGauge(Metrics.P2P_GOSSIP_AGG_MESSAGE_VALIDATION_DURATION_P90),
52
+ };
53
+
54
+ meter.addBatchObservableCallback(this.aggregate, [
55
+ ...Object.values(this.aggValidationMetrics),
56
+ ...Object.values(this.aggLatencyMetrics),
57
+ ]);
58
+ }
59
+
60
+ public recordMessageValidation(topicName: TopicType, timerOrMs: Timer | number) {
61
+ const ms = Math.ceil(typeof timerOrMs === 'number' ? timerOrMs : timerOrMs.ms());
62
+ this.messageValidationDuration.record(ms, { [Attributes.TOPIC_NAME]: topicName });
63
+
64
+ let validationHistogram = this.aggValidationHisto.get(topicName);
65
+ if (!validationHistogram) {
66
+ validationHistogram = createHistogram({ min: 1, max: 5 * 60 * 1000 }); // 5 mins
67
+ this.aggValidationHisto.set(topicName, validationHistogram);
68
+ }
69
+
70
+ validationHistogram.record(Math.max(ms, 1));
71
+ }
72
+
73
+ public incrementTxReceived(count: number) {
74
+ this.txReceivedCount.add(count);
75
+ }
76
+
77
+ public incMessagePrevalidationStatus(passed: boolean, topicName: TopicType | undefined) {
78
+ this.messagePrevalidationCount.add(1, { [Attributes.TOPIC_NAME]: topicName, [Attributes.OK]: passed });
79
+ }
80
+
81
+ public recordMessageLatency(topicName: TopicType, timerOrMs: Timer | number) {
82
+ const ms = Math.ceil(typeof timerOrMs === 'number' ? timerOrMs : timerOrMs.ms());
83
+ this.messageLatency.record(ms, { [Attributes.TOPIC_NAME]: topicName });
84
+
85
+ let latencyHistogram = this.aggLatencyHisto.get(topicName);
86
+ if (!latencyHistogram) {
87
+ latencyHistogram = createHistogram({ min: 1, max: 60 * 1000 }); // Max: 1 minute
88
+ this.aggLatencyHisto.set(topicName, latencyHistogram);
89
+ }
90
+
91
+ latencyHistogram.record(Math.max(ms, 1));
92
+ }
93
+
94
+ private aggregate = (res: BatchObservableResult) => {
95
+ for (const [metrics, histograms] of [
96
+ [this.aggLatencyMetrics, this.aggLatencyHisto],
97
+ [this.aggValidationMetrics, this.aggValidationHisto],
98
+ ] as const) {
99
+ for (const topicName of Object.values(TopicType)) {
100
+ const histogram = histograms.get(topicName);
101
+ if (!histogram || histogram.count === 0) {
102
+ continue;
103
+ }
104
+
105
+ res.observe(metrics.avg, histogram.mean, { [Attributes.TOPIC_NAME]: topicName });
106
+ res.observe(metrics.max, histogram.max, { [Attributes.TOPIC_NAME]: topicName });
107
+ res.observe(metrics.min, histogram.min, { [Attributes.TOPIC_NAME]: topicName });
108
+ res.observe(metrics.p50, histogram.percentile(50), { [Attributes.TOPIC_NAME]: topicName });
109
+ res.observe(metrics.p90, histogram.percentile(90), { [Attributes.TOPIC_NAME]: topicName });
110
+ }
111
+ }
112
+ };
113
+ }