@aztec/p2p 0.0.1-commit.a89ec08 → 0.0.1-commit.aa0c64f

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 (427) hide show
  1. package/README.md +7 -6
  2. package/dest/bootstrap/bootstrap.d.ts +1 -1
  3. package/dest/bootstrap/bootstrap.d.ts.map +1 -1
  4. package/dest/bootstrap/bootstrap.js +22 -6
  5. package/dest/client/factory.d.ts +5 -4
  6. package/dest/client/factory.d.ts.map +1 -1
  7. package/dest/client/factory.js +33 -23
  8. package/dest/client/interface.d.ts +48 -11
  9. package/dest/client/interface.d.ts.map +1 -1
  10. package/dest/client/p2p_client.d.ts +34 -19
  11. package/dest/client/p2p_client.d.ts.map +1 -1
  12. package/dest/client/p2p_client.js +105 -44
  13. package/dest/config.d.ts +147 -111
  14. package/dest/config.d.ts.map +1 -1
  15. package/dest/config.js +78 -32
  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 +9 -16
  20. package/dest/errors/reqresp.error.d.ts.map +1 -1
  21. package/dest/errors/reqresp.error.js +10 -17
  22. package/dest/index.d.ts +1 -2
  23. package/dest/index.d.ts.map +1 -1
  24. package/dest/index.js +0 -1
  25. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +101 -59
  26. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  27. package/dest/mem_pools/attestation_pool/attestation_pool.js +274 -197
  28. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +1 -1
  29. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
  30. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +224 -65
  31. package/dest/mem_pools/attestation_pool/mocks.d.ts +1 -1
  32. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  33. package/dest/mem_pools/attestation_pool/mocks.js +6 -4
  34. package/dest/mem_pools/index.d.ts +1 -2
  35. package/dest/mem_pools/index.d.ts.map +1 -1
  36. package/dest/mem_pools/instrumentation.d.ts +12 -5
  37. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  38. package/dest/mem_pools/instrumentation.js +38 -17
  39. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts +1 -5
  40. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts.map +1 -1
  41. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.js +1 -7
  42. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +3 -3
  43. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -1
  44. package/dest/mem_pools/tx_pool_v2/deleted_pool.js +6 -6
  45. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +1 -1
  46. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +2 -1
  47. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -1
  48. package/dest/mem_pools/tx_pool_v2/eviction/index.js +1 -0
  49. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts +16 -0
  50. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts.map +1 -0
  51. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.js +62 -0
  52. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +2 -2
  53. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +39 -9
  54. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
  55. package/dest/mem_pools/tx_pool_v2/interfaces.js +3 -1
  56. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +9 -7
  57. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
  58. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +13 -6
  59. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +15 -1
  60. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -1
  61. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +55 -41
  62. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +9 -3
  63. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -1
  64. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +20 -6
  65. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +17 -3
  66. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -1
  67. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +225 -118
  68. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +10 -3
  69. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  70. package/dest/msg_validators/attestation_validator/attestation_validator.js +38 -15
  71. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +7 -3
  72. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
  73. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +4 -5
  74. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +8 -3
  75. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
  76. package/dest/msg_validators/proposal_validator/block_proposal_validator.js +2 -2
  77. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +8 -3
  78. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
  79. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +8 -2
  80. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +25 -3
  81. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
  82. package/dest/msg_validators/proposal_validator/proposal_validator.js +85 -15
  83. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +1 -1
  84. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  85. package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +8 -15
  86. package/dest/msg_validators/tx_validator/allowed_public_setup.js +3 -3
  87. package/dest/msg_validators/tx_validator/archive_cache.js +1 -1
  88. package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts +15 -0
  89. package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts.map +1 -0
  90. package/dest/msg_validators/tx_validator/cached_tx_validator.js +19 -0
  91. package/dest/msg_validators/tx_validator/data_validator.d.ts +2 -1
  92. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  93. package/dest/msg_validators/tx_validator/data_validator.js +1 -0
  94. package/dest/msg_validators/tx_validator/factory.d.ts +14 -15
  95. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  96. package/dest/msg_validators/tx_validator/factory.js +29 -16
  97. package/dest/msg_validators/tx_validator/gas_validator.d.ts +47 -10
  98. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  99. package/dest/msg_validators/tx_validator/gas_validator.js +65 -48
  100. package/dest/msg_validators/tx_validator/index.d.ts +3 -1
  101. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  102. package/dest/msg_validators/tx_validator/index.js +2 -0
  103. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +1 -1
  104. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  105. package/dest/msg_validators/tx_validator/metadata_validator.js +4 -4
  106. package/dest/msg_validators/tx_validator/phases_validator.js +2 -2
  107. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +2 -1
  108. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
  109. package/dest/msg_validators/tx_validator/tx_proof_validator.js +2 -0
  110. package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts +48 -0
  111. package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts.map +1 -0
  112. package/dest/msg_validators/tx_validator/tx_validation_cache.js +68 -0
  113. package/dest/services/data_store.d.ts +1 -1
  114. package/dest/services/data_store.d.ts.map +1 -1
  115. package/dest/services/data_store.js +5 -5
  116. package/dest/services/discv5/discV5_service.d.ts +13 -2
  117. package/dest/services/discv5/discV5_service.d.ts.map +1 -1
  118. package/dest/services/discv5/discV5_service.js +119 -23
  119. package/dest/services/discv5/persisted_enr_store.d.ts +38 -0
  120. package/dest/services/discv5/persisted_enr_store.d.ts.map +1 -0
  121. package/dest/services/discv5/persisted_enr_store.js +145 -0
  122. package/dest/services/dummy_service.d.ts +15 -15
  123. package/dest/services/dummy_service.d.ts.map +1 -1
  124. package/dest/services/dummy_service.js +15 -16
  125. package/dest/services/encoding.d.ts +19 -6
  126. package/dest/services/encoding.d.ts.map +1 -1
  127. package/dest/services/encoding.js +25 -15
  128. package/dest/services/gossipsub/topic_score_params.d.ts +6 -12
  129. package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -1
  130. package/dest/services/gossipsub/topic_score_params.js +4 -14
  131. package/dest/services/libp2p/instrumentation.d.ts +3 -1
  132. package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
  133. package/dest/services/libp2p/instrumentation.js +14 -0
  134. package/dest/services/libp2p/libp2p_service.d.ts +45 -47
  135. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  136. package/dest/services/libp2p/libp2p_service.js +409 -303
  137. package/dest/services/peer-manager/metrics.d.ts +3 -1
  138. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  139. package/dest/services/peer-manager/metrics.js +6 -0
  140. package/dest/services/peer-manager/peer_manager.d.ts +20 -3
  141. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  142. package/dest/services/peer-manager/peer_manager.js +83 -26
  143. package/dest/services/peer-manager/peer_scoring.d.ts +34 -2
  144. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  145. package/dest/services/peer-manager/peer_scoring.js +102 -13
  146. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +4 -8
  147. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -1
  148. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +94 -122
  149. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +10 -6
  150. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
  151. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +5 -4
  152. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -1
  153. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +13 -7
  154. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +19 -11
  155. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -1
  156. package/dest/services/reqresp/batch-tx-requester/peer_collection.js +52 -15
  157. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +5 -14
  158. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -1
  159. package/dest/services/reqresp/batch-tx-requester/tx_validator.js +6 -20
  160. package/dest/services/reqresp/config.d.ts +15 -3
  161. package/dest/services/reqresp/config.d.ts.map +1 -1
  162. package/dest/services/reqresp/config.js +11 -0
  163. package/dest/services/reqresp/interface.d.ts +16 -18
  164. package/dest/services/reqresp/interface.d.ts.map +1 -1
  165. package/dest/services/reqresp/interface.js +10 -20
  166. package/dest/services/reqresp/metrics.d.ts +1 -1
  167. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  168. package/dest/services/reqresp/metrics.js +0 -1
  169. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +4 -3
  170. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -1
  171. package/dest/services/reqresp/protocols/block_txs/bitvector.js +3 -2
  172. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +1 -1
  173. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
  174. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +31 -28
  175. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +12 -7
  176. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
  177. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +42 -24
  178. package/dest/services/reqresp/protocols/index.d.ts +1 -2
  179. package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
  180. package/dest/services/reqresp/protocols/index.js +0 -1
  181. package/dest/services/reqresp/protocols/tx.d.ts +1 -1
  182. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  183. package/dest/services/reqresp/protocols/tx.js +1 -3
  184. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
  185. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
  186. package/dest/services/reqresp/rate-limiter/rate_limits.js +3 -13
  187. package/dest/services/reqresp/reqresp.d.ts +7 -29
  188. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  189. package/dest/services/reqresp/reqresp.js +60 -209
  190. package/dest/services/service.d.ts +25 -12
  191. package/dest/services/service.d.ts.map +1 -1
  192. package/dest/services/tx_collection/config.d.ts +2 -23
  193. package/dest/services/tx_collection/config.d.ts.map +1 -1
  194. package/dest/services/tx_collection/config.js +2 -55
  195. package/dest/services/tx_collection/file_store_tx_collection.d.ts +12 -28
  196. package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -1
  197. package/dest/services/tx_collection/file_store_tx_collection.js +43 -83
  198. package/dest/services/tx_collection/index.d.ts +2 -3
  199. package/dest/services/tx_collection/index.d.ts.map +1 -1
  200. package/dest/services/tx_collection/index.js +0 -1
  201. package/dest/services/tx_collection/instrumentation.d.ts +1 -1
  202. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
  203. package/dest/services/tx_collection/instrumentation.js +0 -2
  204. package/dest/services/tx_collection/request_tracker.d.ts +53 -0
  205. package/dest/services/tx_collection/request_tracker.d.ts.map +1 -0
  206. package/dest/services/tx_collection/request_tracker.js +84 -0
  207. package/dest/services/tx_collection/tx_collection.d.ts +36 -55
  208. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  209. package/dest/services/tx_collection/tx_collection.js +275 -119
  210. package/dest/services/tx_collection/tx_collection_sink.d.ts +1 -1
  211. package/dest/services/tx_collection/tx_collection_sink.js +2 -2
  212. package/dest/services/tx_collection/tx_source.d.ts +1 -1
  213. package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
  214. package/dest/services/tx_collection/tx_source.js +4 -1
  215. package/dest/services/tx_file_store/tx_file_store.d.ts +1 -3
  216. package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -1
  217. package/dest/services/tx_file_store/tx_file_store.js +4 -14
  218. package/dest/services/tx_provider.d.ts +3 -1
  219. package/dest/services/tx_provider.d.ts.map +1 -1
  220. package/dest/services/tx_provider.js +3 -0
  221. package/dest/test-helpers/make-test-p2p-clients.d.ts +1 -1
  222. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  223. package/dest/test-helpers/make-test-p2p-clients.js +5 -2
  224. package/dest/test-helpers/mock-pubsub.d.ts +23 -9
  225. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  226. package/dest/test-helpers/mock-pubsub.js +44 -44
  227. package/dest/test-helpers/reqresp-nodes.d.ts +4 -5
  228. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  229. package/dest/test-helpers/reqresp-nodes.js +16 -18
  230. package/dest/test-helpers/test_tx_provider.d.ts +3 -1
  231. package/dest/test-helpers/test_tx_provider.d.ts.map +1 -1
  232. package/dest/test-helpers/test_tx_provider.js +3 -0
  233. package/dest/test-helpers/testbench-utils.d.ts +15 -14
  234. package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
  235. package/dest/test-helpers/testbench-utils.js +47 -14
  236. package/dest/testbench/p2p_client_testbench_worker.d.ts +3 -5
  237. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  238. package/dest/testbench/p2p_client_testbench_worker.js +102 -40
  239. package/dest/testbench/worker_client_manager.d.ts +10 -6
  240. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  241. package/dest/testbench/worker_client_manager.js +53 -10
  242. package/dest/util.d.ts +12 -7
  243. package/dest/util.d.ts.map +1 -1
  244. package/dest/util.js +35 -14
  245. package/dest/versioning.d.ts +3 -6
  246. package/dest/versioning.d.ts.map +1 -1
  247. package/dest/versioning.js +3 -24
  248. package/package.json +16 -16
  249. package/src/bootstrap/bootstrap.ts +17 -3
  250. package/src/client/factory.ts +50 -25
  251. package/src/client/interface.ts +44 -17
  252. package/src/client/p2p_client.ts +125 -77
  253. package/src/client/test/{tx_proposal_collector/README.md → p2p_client.batch_tx_requester.bench.README.md} +23 -53
  254. package/src/config.ts +156 -44
  255. package/src/errors/p2p-service.error.ts +11 -0
  256. package/src/errors/reqresp.error.ts +13 -19
  257. package/src/index.ts +0 -1
  258. package/src/mem_pools/attestation_pool/attestation_pool.ts +329 -243
  259. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +244 -69
  260. package/src/mem_pools/attestation_pool/mocks.ts +13 -8
  261. package/src/mem_pools/index.ts +0 -3
  262. package/src/mem_pools/instrumentation.ts +27 -17
  263. package/src/mem_pools/tx_pool_v2/archive/tx_archive.ts +1 -9
  264. package/src/mem_pools/tx_pool_v2/deleted_pool.ts +7 -7
  265. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +1 -1
  266. package/src/mem_pools/tx_pool_v2/eviction/index.ts +1 -0
  267. package/src/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.ts +65 -0
  268. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +3 -3
  269. package/src/mem_pools/tx_pool_v2/interfaces.ts +38 -8
  270. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +24 -12
  271. package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +62 -41
  272. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +23 -6
  273. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +250 -122
  274. package/src/msg_validators/attestation_validator/README.md +1 -1
  275. package/src/msg_validators/attestation_validator/attestation_validator.ts +46 -14
  276. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +15 -7
  277. package/src/msg_validators/proposal_validator/README.md +4 -4
  278. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +15 -3
  279. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +26 -3
  280. package/src/msg_validators/proposal_validator/proposal_validator.ts +95 -12
  281. package/src/msg_validators/tx_validator/README.md +13 -3
  282. package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +3 -12
  283. package/src/msg_validators/tx_validator/allowed_public_setup.ts +3 -3
  284. package/src/msg_validators/tx_validator/archive_cache.ts +1 -1
  285. package/src/msg_validators/tx_validator/cached_tx_validator.ts +31 -0
  286. package/src/msg_validators/tx_validator/data_validator.ts +2 -0
  287. package/src/msg_validators/tx_validator/factory.ts +37 -20
  288. package/src/msg_validators/tx_validator/gas_validator.ts +99 -54
  289. package/src/msg_validators/tx_validator/index.ts +2 -0
  290. package/src/msg_validators/tx_validator/metadata_validator.ts +12 -4
  291. package/src/msg_validators/tx_validator/phases_validator.ts +2 -2
  292. package/src/msg_validators/tx_validator/tx_proof_validator.ts +2 -0
  293. package/src/msg_validators/tx_validator/tx_validation_cache.ts +101 -0
  294. package/src/services/data_store.ts +5 -13
  295. package/src/services/discv5/discV5_service.ts +126 -14
  296. package/src/services/discv5/persisted_enr_store.ts +158 -0
  297. package/src/services/dummy_service.ts +20 -39
  298. package/src/services/encoding.ts +28 -20
  299. package/src/services/gossipsub/README.md +33 -11
  300. package/src/services/gossipsub/topic_score_params.ts +9 -18
  301. package/src/services/libp2p/instrumentation.ts +14 -0
  302. package/src/services/libp2p/libp2p_service.ts +457 -341
  303. package/src/services/peer-manager/metrics.ts +7 -0
  304. package/src/services/peer-manager/peer_manager.ts +91 -25
  305. package/src/services/peer-manager/peer_scoring.ts +102 -8
  306. package/src/services/reqresp/README.md +2 -37
  307. package/src/services/reqresp/batch-tx-requester/README.md +46 -7
  308. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +91 -137
  309. package/src/services/reqresp/batch-tx-requester/interface.ts +13 -5
  310. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +13 -6
  311. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +68 -24
  312. package/src/services/reqresp/batch-tx-requester/tx_validator.ts +12 -25
  313. package/src/services/reqresp/config.ts +19 -2
  314. package/src/services/reqresp/interface.ts +21 -47
  315. package/src/services/reqresp/metrics.ts +0 -1
  316. package/src/services/reqresp/protocols/block_txs/bitvector.ts +3 -2
  317. package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +34 -30
  318. package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +47 -20
  319. package/src/services/reqresp/protocols/index.ts +0 -1
  320. package/src/services/reqresp/protocols/tx.ts +1 -3
  321. package/src/services/reqresp/rate-limiter/rate_limits.ts +3 -13
  322. package/src/services/reqresp/reqresp.ts +71 -252
  323. package/src/services/service.ts +31 -28
  324. package/src/services/tx_collection/config.ts +3 -80
  325. package/src/services/tx_collection/file_store_tx_collection.ts +54 -103
  326. package/src/services/tx_collection/index.ts +1 -6
  327. package/src/services/tx_collection/instrumentation.ts +1 -7
  328. package/src/services/tx_collection/request_tracker.ts +127 -0
  329. package/src/services/tx_collection/tx_collection.ts +331 -176
  330. package/src/services/tx_collection/tx_collection_sink.ts +2 -2
  331. package/src/services/tx_collection/tx_source.ts +2 -1
  332. package/src/services/tx_file_store/tx_file_store.ts +5 -17
  333. package/src/services/tx_provider.ts +5 -0
  334. package/src/test-helpers/make-test-p2p-clients.ts +4 -1
  335. package/src/test-helpers/mock-pubsub.ts +46 -60
  336. package/src/test-helpers/reqresp-nodes.ts +13 -23
  337. package/src/test-helpers/test_tx_provider.ts +5 -0
  338. package/src/test-helpers/testbench-utils.ts +62 -28
  339. package/src/testbench/p2p_client_testbench_worker.ts +110 -57
  340. package/src/testbench/worker_client_manager.ts +61 -21
  341. package/src/util.ts +33 -18
  342. package/src/versioning.ts +3 -33
  343. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts +0 -2
  344. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts.map +0 -1
  345. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +0 -304
  346. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts +0 -73
  347. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts.map +0 -1
  348. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.js +0 -8
  349. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +0 -125
  350. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +0 -1
  351. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +0 -596
  352. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +0 -32
  353. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +0 -1
  354. package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +0 -112
  355. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +0 -157
  356. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +0 -1
  357. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +0 -52
  358. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +0 -16
  359. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +0 -1
  360. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +0 -123
  361. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +0 -17
  362. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +0 -1
  363. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +0 -84
  364. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +0 -19
  365. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +0 -1
  366. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +0 -78
  367. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +0 -26
  368. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +0 -1
  369. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +0 -84
  370. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +0 -25
  371. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +0 -1
  372. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +0 -57
  373. package/dest/mem_pools/tx_pool/index.d.ts +0 -3
  374. package/dest/mem_pools/tx_pool/index.d.ts.map +0 -1
  375. package/dest/mem_pools/tx_pool/index.js +0 -2
  376. package/dest/mem_pools/tx_pool/priority.d.ts +0 -12
  377. package/dest/mem_pools/tx_pool/priority.d.ts.map +0 -1
  378. package/dest/mem_pools/tx_pool/priority.js +0 -15
  379. package/dest/mem_pools/tx_pool/tx_pool.d.ts +0 -127
  380. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +0 -1
  381. package/dest/mem_pools/tx_pool/tx_pool.js +0 -3
  382. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +0 -7
  383. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +0 -1
  384. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +0 -402
  385. package/dest/msg_validators/clock_tolerance.d.ts +0 -21
  386. package/dest/msg_validators/clock_tolerance.d.ts.map +0 -1
  387. package/dest/msg_validators/clock_tolerance.js +0 -37
  388. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +0 -64
  389. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +0 -1
  390. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +0 -151
  391. package/dest/services/reqresp/protocols/block.d.ts +0 -9
  392. package/dest/services/reqresp/protocols/block.d.ts.map +0 -1
  393. package/dest/services/reqresp/protocols/block.js +0 -32
  394. package/dest/services/tx_collection/fast_tx_collection.d.ts +0 -54
  395. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +0 -1
  396. package/dest/services/tx_collection/fast_tx_collection.js +0 -327
  397. package/dest/services/tx_collection/missing_txs_tracker.d.ts +0 -32
  398. package/dest/services/tx_collection/missing_txs_tracker.d.ts.map +0 -1
  399. package/dest/services/tx_collection/missing_txs_tracker.js +0 -27
  400. package/dest/services/tx_collection/proposal_tx_collector.d.ts +0 -49
  401. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +0 -1
  402. package/dest/services/tx_collection/proposal_tx_collector.js +0 -50
  403. package/dest/services/tx_collection/slow_tx_collection.d.ts +0 -57
  404. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +0 -1
  405. package/dest/services/tx_collection/slow_tx_collection.js +0 -211
  406. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +0 -345
  407. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.ts +0 -43
  408. package/src/mem_pools/tx_pool/README.md +0 -270
  409. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -746
  410. package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +0 -132
  411. package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +0 -208
  412. package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +0 -163
  413. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +0 -104
  414. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +0 -93
  415. package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +0 -106
  416. package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +0 -75
  417. package/src/mem_pools/tx_pool/index.ts +0 -2
  418. package/src/mem_pools/tx_pool/priority.ts +0 -20
  419. package/src/mem_pools/tx_pool/tx_pool.ts +0 -141
  420. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +0 -321
  421. package/src/msg_validators/clock_tolerance.ts +0 -51
  422. package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +0 -161
  423. package/src/services/reqresp/protocols/block.ts +0 -37
  424. package/src/services/tx_collection/fast_tx_collection.ts +0 -387
  425. package/src/services/tx_collection/missing_txs_tracker.ts +0 -52
  426. package/src/services/tx_collection/proposal_tx_collector.ts +0 -113
  427. package/src/services/tx_collection/slow_tx_collection.ts +0 -266
@@ -9,7 +9,7 @@ export const DEFAULT_RATE_LIMITS: ReqRespSubProtocolRateLimits = {
9
9
  },
10
10
  globalLimit: {
11
11
  quotaTimeMs: 1000,
12
- quotaCount: 10,
12
+ quotaCount: 50,
13
13
  },
14
14
  },
15
15
  [ReqRespSubProtocol.STATUS]: {
@@ -19,7 +19,7 @@ export const DEFAULT_RATE_LIMITS: ReqRespSubProtocolRateLimits = {
19
19
  },
20
20
  globalLimit: {
21
21
  quotaTimeMs: 1000,
22
- quotaCount: 10,
22
+ quotaCount: 50,
23
23
  },
24
24
  },
25
25
  [ReqRespSubProtocol.AUTH]: {
@@ -42,16 +42,6 @@ export const DEFAULT_RATE_LIMITS: ReqRespSubProtocolRateLimits = {
42
42
  quotaCount: 200,
43
43
  },
44
44
  },
45
- [ReqRespSubProtocol.BLOCK]: {
46
- peerLimit: {
47
- quotaTimeMs: 1000,
48
- quotaCount: 2,
49
- },
50
- globalLimit: {
51
- quotaTimeMs: 1000,
52
- quotaCount: 5,
53
- },
54
- },
55
45
  [ReqRespSubProtocol.GOODBYE]: {
56
46
  peerLimit: {
57
47
  quotaTimeMs: 1000,
@@ -59,7 +49,7 @@ export const DEFAULT_RATE_LIMITS: ReqRespSubProtocolRateLimits = {
59
49
  },
60
50
  globalLimit: {
61
51
  quotaTimeMs: 1000,
62
- quotaCount: 10,
52
+ quotaCount: 50,
63
53
  },
64
54
  },
65
55
  [ReqRespSubProtocol.BLOCK_TXS]: {
@@ -1,5 +1,4 @@
1
1
  // @attribution: lodestar impl for inspiration
2
- import { compactArray } from '@aztec/foundation/collection';
3
2
  import { AbortError, TimeoutError } from '@aztec/foundation/error';
4
3
  import { createLogger } from '@aztec/foundation/log';
5
4
  import { executeTimeout } from '@aztec/foundation/timer';
@@ -11,31 +10,30 @@ import type { Libp2p } from 'libp2p';
11
10
  import { pipeline } from 'node:stream/promises';
12
11
  import type { Uint8ArrayList } from 'uint8arraylist';
13
12
 
13
+ import { IndividualReqRespTimeoutError, OversizedReqRespRequestError } from '../../errors/reqresp.error.js';
14
14
  import {
15
- CollectiveReqRespTimeoutError,
16
- IndividualReqRespTimeoutError,
17
- InvalidResponseError,
18
- } from '../../errors/reqresp.error.js';
19
- import { OversizedSnappyResponseError, SnappyTransform } from '../encoding.js';
15
+ DEFAULT_MAX_RESPONSE_SIZE_KB,
16
+ OversizedSnappyResponseError,
17
+ ResponseSizeLimitExceededError,
18
+ SnappyTransform,
19
+ } from '../encoding.js';
20
20
  import type { PeerScoring } from '../peer-manager/peer_scoring.js';
21
21
  import {
22
22
  DEFAULT_INDIVIDUAL_REQUEST_TIMEOUT_MS,
23
23
  DEFAULT_REQRESP_DIAL_TIMEOUT_MS,
24
+ MAX_REQRESP_REQUEST_SIZE_BYTES,
24
25
  type P2PReqRespConfig,
25
26
  } from './config.js';
26
- import { BatchConnectionSampler } from './connection-sampler/batch_connection_sampler.js';
27
27
  import { ConnectionSampler, RandomSampler } from './connection-sampler/connection_sampler.js';
28
28
  import {
29
- DEFAULT_SUB_PROTOCOL_VALIDATORS,
30
29
  type ReqRespInterface,
31
30
  type ReqRespResponse,
32
31
  ReqRespSubProtocol,
33
32
  type ReqRespSubProtocolHandler,
34
33
  type ReqRespSubProtocolHandlers,
35
34
  type ReqRespSubProtocolRateLimits,
36
- type ReqRespSubProtocolValidators,
37
- type SubProtocolMap,
38
- responseFromBuffer,
35
+ type ShouldRejectPeer,
36
+ UNAUTHENTICATED_ALLOWED_PROTOCOLS,
39
37
  subProtocolSizeCalculators,
40
38
  } from './interface.js';
41
39
  import { ReqRespMetrics } from './metrics.js';
@@ -44,13 +42,13 @@ import {
44
42
  RequestResponseRateLimiter,
45
43
  prettyPrintRateLimitStatus,
46
44
  } from './rate-limiter/rate_limiter.js';
47
- import { ReqRespStatus, ReqRespStatusError, parseStatusChunk, prettyPrintReqRespStatus } from './status.js';
45
+ import { ReqRespStatus, ReqRespStatusError, parseStatusChunk } from './status.js';
48
46
 
49
47
  /**
50
48
  * The Request Response Service
51
49
  *
52
50
  * It allows nodes to request specific information from their peers, its use case covers recovering
53
- * information that was missed during a syncronisation or a gossip event.
51
+ * information that was missed during a synchronisation or a gossip event.
54
52
  *
55
53
  * This service implements the request response sub protocol, it is heavily inspired from
56
54
  * ethereum implementations of the same name.
@@ -65,13 +63,14 @@ export class ReqResp implements ReqRespInterface {
65
63
  private dialTimeoutMs: number = DEFAULT_REQRESP_DIAL_TIMEOUT_MS;
66
64
 
67
65
  private subProtocolHandlers: Partial<ReqRespSubProtocolHandlers> = {};
68
- private subProtocolValidators: Partial<ReqRespSubProtocolValidators> = {};
69
66
 
70
67
  private connectionSampler: ConnectionSampler;
71
68
  private rateLimiter: RequestResponseRateLimiter;
72
69
 
73
70
  private snappyTransform: SnappyTransform;
74
71
 
72
+ private shouldRejectPeer: ShouldRejectPeer | undefined;
73
+
75
74
  private metrics: ReqRespMetrics;
76
75
 
77
76
  constructor(
@@ -108,6 +107,10 @@ export class ReqResp implements ReqRespInterface {
108
107
  }
109
108
  }
110
109
 
110
+ public setShouldRejectPeer(checker: ShouldRejectPeer): void {
111
+ this.shouldRejectPeer = checker;
112
+ }
113
+
111
114
  get tracer() {
112
115
  return this.metrics.tracer;
113
116
  }
@@ -122,11 +125,11 @@ export class ReqResp implements ReqRespInterface {
122
125
  /**
123
126
  * Start the reqresp service
124
127
  */
125
- async start(subProtocolHandlers: ReqRespSubProtocolHandlers, subProtocolValidators: ReqRespSubProtocolValidators) {
128
+ async start(subProtocolHandlers: ReqRespSubProtocolHandlers) {
126
129
  Object.assign(this.subProtocolHandlers, subProtocolHandlers);
127
- Object.assign(this.subProtocolValidators, subProtocolValidators);
128
130
 
129
- // Register all protocol handlers
131
+ // Register streamHandler with libp2p.
132
+ // The streamHandler is responsible for reading the incoming stream, determining the protocol, then triggering the appropriate handler.
130
133
  for (const subProtocol of Object.keys(subProtocolHandlers)) {
131
134
  this.logger.debug(`Registering handler for sub protocol ${subProtocol}`);
132
135
  await this.libp2p.handle(
@@ -140,13 +143,8 @@ export class ReqResp implements ReqRespInterface {
140
143
  this.rateLimiter.start();
141
144
  }
142
145
 
143
- async addSubProtocol(
144
- subProtocol: ReqRespSubProtocol,
145
- handler: ReqRespSubProtocolHandler,
146
- validator: ReqRespSubProtocolValidators[ReqRespSubProtocol] = DEFAULT_SUB_PROTOCOL_VALIDATORS[subProtocol],
147
- ): Promise<void> {
146
+ async addSubProtocol(subProtocol: ReqRespSubProtocol, handler: ReqRespSubProtocolHandler): Promise<void> {
148
147
  this.subProtocolHandlers[subProtocol] = handler;
149
- this.subProtocolValidators[subProtocol] = validator;
150
148
  this.logger.debug(`Registering handler for sub protocol ${subProtocol}`);
151
149
  await this.libp2p.handle(
152
150
  subProtocol,
@@ -180,225 +178,6 @@ export class ReqResp implements ReqRespInterface {
180
178
  // NOTE: We assume libp2p instance is managed by the caller
181
179
  }
182
180
 
183
- /**
184
- * Request multiple messages over the same sub protocol, balancing the requests across peers.
185
- *
186
- * @devnote
187
- * - The function prioritizes sending requests to free peers using a batch sampling strategy.
188
- * - If a peer fails to respond or returns an invalid response, it is removed from the sampling pool and replaced.
189
- * - The function stops retrying once all requests are processed, no active peers remain, or the maximum retry attempts are reached.
190
- * - Responses are validated using a custom validator for the sub-protocol.*
191
- *
192
- * Requests are sent in parallel to each peer, but multiple requests are sent to the same peer in series
193
- * - If a peer fails to respond or returns an invalid response, it is removed from the sampling pool and replaced.
194
- * - The function stops retrying once all requests are processed, no active peers remain, or the maximum retry attempts are reached.
195
- * - Responses are validated using a custom validator for the sub-protocol.*
196
- *
197
- * @param subProtocol
198
- * @param requests
199
- * @param timeoutMs
200
- * @param maxPeers
201
- * @returns
202
- *
203
- * @throws {CollectiveReqRespTimeoutError} - If the request batch exceeds the specified timeout (`timeoutMs`).
204
- */
205
- @trackSpan(
206
- 'ReqResp.sendBatchRequest',
207
- (subProtocol: ReqRespSubProtocol, requests: InstanceType<SubProtocolMap[ReqRespSubProtocol]['request']>[]) => ({
208
- [Attributes.P2P_REQ_RESP_PROTOCOL]: subProtocol,
209
- [Attributes.P2P_REQ_RESP_BATCH_REQUESTS_COUNT]: requests.length,
210
- }),
211
- )
212
- async sendBatchRequest<SubProtocol extends ReqRespSubProtocol>(
213
- subProtocol: SubProtocol,
214
- requests: InstanceType<SubProtocolMap[SubProtocol]['request']>[],
215
- pinnedPeer: PeerId | undefined,
216
- timeoutMs = 10000,
217
- maxPeers = Math.max(10, Math.ceil(requests.length / 3)),
218
- maxRetryAttempts = 3,
219
- ): Promise<InstanceType<SubProtocolMap[SubProtocol]['response']>[]> {
220
- const responseValidator = this.subProtocolValidators[subProtocol] ?? DEFAULT_SUB_PROTOCOL_VALIDATORS[subProtocol];
221
- const responses: InstanceType<SubProtocolMap[SubProtocol]['response']>[] = new Array(requests.length);
222
- const requestBuffers = requests.map(req => req.toBuffer());
223
- const isEmptyResponse = (value: unknown): boolean => {
224
- // Some responses serialize to a non-empty buffer even when they contain no items (e.g., empty TxArray).
225
- if (!value || typeof value !== 'object') {
226
- return false;
227
- }
228
- const length = (value as { length?: number }).length;
229
- return typeof length === 'number' && length === 0;
230
- };
231
-
232
- const requestFunction = async (signal: AbortSignal) => {
233
- // Track which requests still need to be processed
234
- const pendingRequestIndices = new Set(requestBuffers.map((_, i) => i));
235
-
236
- // Create batch sampler with the total number of requests and max peers
237
- const batchSampler = new BatchConnectionSampler(
238
- this.connectionSampler,
239
- requests.length,
240
- maxPeers,
241
- compactArray([pinnedPeer]), // Exclude pinned peer from sampling, we will forcefully send all requests to it
242
- createLogger(`${this.logger.module}:batch-connection-sampler`),
243
- );
244
-
245
- if (batchSampler.activePeerCount === 0 && !pinnedPeer) {
246
- this.logger.warn('No active peers to send requests to');
247
- return [];
248
- }
249
-
250
- // This is where it gets fun
251
- // The outer loop is the retry loop, we will continue to retry until we process all indices we have
252
- // not received a response for, or we have reached the max retry attempts
253
-
254
- // The inner loop is the batch loop, we will process all requests for each peer in parallel
255
- // We will then process the results of the requests, and resample any peers that failed to respond
256
- // We will continue to retry until we have processed all indices, or we have reached the max retry attempts
257
-
258
- let retryAttempts = 0;
259
- while (pendingRequestIndices.size > 0 && batchSampler.activePeerCount > 0 && retryAttempts < maxRetryAttempts) {
260
- if (signal.aborted) {
261
- throw new AbortError('Batch request aborted');
262
- }
263
- // Process requests in parallel for each available peer
264
- type BatchEntry = { peerId: PeerId; indices: number[] };
265
- const requestBatches = new Map<string, BatchEntry>();
266
-
267
- // Group requests by peer
268
- for (const requestIndex of pendingRequestIndices) {
269
- const peer = batchSampler.getPeerForRequest(requestIndex);
270
- if (!peer) {
271
- // No peer available for this specific index (all peers exhausted for it)
272
- // Skip this index for now - it stays in pendingRequestIndices for retry
273
- continue;
274
- }
275
- const peerAsString = peer.toString();
276
- if (!requestBatches.has(peerAsString)) {
277
- requestBatches.set(peerAsString, { peerId: peer, indices: [] });
278
- }
279
- requestBatches.get(peerAsString)!.indices.push(requestIndex);
280
- }
281
-
282
- // If there is a pinned peer, we will always send every request to that peer
283
- // We use the default limits for the subprotocol to avoid hitting the rate limiter
284
- if (pinnedPeer) {
285
- const limit = this.rateLimiter.getRateLimits(subProtocol).peerLimit.quotaCount;
286
- requestBatches.set(pinnedPeer.toString(), {
287
- peerId: pinnedPeer,
288
- indices: Array.from(pendingRequestIndices.values()).slice(0, limit),
289
- });
290
- }
291
-
292
- // If no requests could be assigned (all peers exhausted for all indices), exit early
293
- if (requestBatches.size === 0) {
294
- this.logger.warn('No peers available for any pending request indices, stopping batch request');
295
- break;
296
- }
297
-
298
- // Make parallel requests for each peer's batch
299
- // A batch entry will look something like this:
300
- // PeerId0: [0, 1, 2, 3]
301
- // PeerId1: [4, 5, 6, 7]
302
-
303
- // Peer Id 0 will send requests 0, 1, 2, 3 in serial
304
- // while simultaneously Peer Id 1 will send requests 4, 5, 6, 7 in serial
305
-
306
- const batchResults = await Promise.all(
307
- Array.from(requestBatches.entries()).map(async ([peerAsString, { peerId: peer, indices }]) => {
308
- try {
309
- const markIndexFailed = (index: number) => batchSampler.markPeerFailedForIndex(peer, index);
310
- // Requests all going to the same peer are sent synchronously
311
- const peerResults: { index: number; response: InstanceType<SubProtocolMap[SubProtocol]['response']> }[] =
312
- [];
313
- let shouldReplacePeer = false;
314
- const handleFailure = (status: ReqRespStatus, index: number) => {
315
- this.logger.warn(
316
- `Request to peer ${peerAsString} failed with status ${prettyPrintReqRespStatus(status)}`,
317
- );
318
- markIndexFailed(index);
319
- return status === ReqRespStatus.RATE_LIMIT_EXCEEDED;
320
- };
321
-
322
- for (const index of indices) {
323
- this.logger.info(`Sending request ${index} to peer ${peerAsString}`);
324
- const response = await this.sendRequestToPeer(peer, subProtocol, requestBuffers[index]);
325
-
326
- // Check the status of the response buffer
327
- if (response.status !== ReqRespStatus.SUCCESS) {
328
- shouldReplacePeer = handleFailure(response.status, index);
329
- if (shouldReplacePeer) {
330
- break;
331
- }
332
- continue;
333
- }
334
-
335
- if (response.data.length === 0) {
336
- markIndexFailed(index);
337
- continue;
338
- }
339
-
340
- const object = responseFromBuffer(subProtocol, response.data);
341
- if (isEmptyResponse(object)) {
342
- markIndexFailed(index);
343
- continue;
344
- }
345
-
346
- const isValid = await responseValidator(requests[index], object, peer);
347
- if (!isValid) {
348
- markIndexFailed(index);
349
- continue;
350
- }
351
-
352
- peerResults.push({ index, response: object });
353
- }
354
-
355
- // If peer had a hard failure (rate limit), replace it for future iterations
356
- if (shouldReplacePeer) {
357
- this.logger.warn(`Peer ${peerAsString} hit a hard failure, removing from sampler`);
358
- batchSampler.removePeerAndReplace(peer);
359
- }
360
-
361
- return { peer, results: peerResults };
362
- } catch (error) {
363
- this.logger.warn(`Failed batch request to peer ${peerAsString}:`, error);
364
- batchSampler.removePeerAndReplace(peer);
365
- return { peer, results: [] };
366
- }
367
- }),
368
- );
369
-
370
- // Process results
371
- for (const { results } of batchResults) {
372
- for (const { index, response } of results) {
373
- if (response) {
374
- responses[index] = response;
375
- pendingRequestIndices.delete(index);
376
- }
377
- }
378
- }
379
-
380
- retryAttempts++;
381
- }
382
-
383
- if (retryAttempts >= maxRetryAttempts) {
384
- this.logger.warn(`Max retry attempts ${maxRetryAttempts} reached for batch request`);
385
- }
386
-
387
- return responses;
388
- };
389
-
390
- try {
391
- return await executeTimeout<InstanceType<SubProtocolMap[SubProtocol]['response']>[]>(
392
- requestFunction,
393
- timeoutMs,
394
- () => new CollectiveReqRespTimeoutError(),
395
- );
396
- } catch (e: any) {
397
- this.logger.warn(`${e.message} | subProtocol: ${subProtocol}`);
398
- return [];
399
- }
400
- }
401
-
402
181
  /**
403
182
  * Sends a request to a specific peer
404
183
  *
@@ -434,6 +213,11 @@ export class ReqResp implements ReqRespInterface {
434
213
  payload: Buffer,
435
214
  dialTimeout: number = this.dialTimeoutMs,
436
215
  ): Promise<ReqRespResponse> {
216
+ // Thrown before the try block so the generic error handling below does not penalize the peer for our own bug.
217
+ if (payload.length > MAX_REQRESP_REQUEST_SIZE_BYTES) {
218
+ throw new OversizedReqRespRequestError(subProtocol, payload.length, MAX_REQRESP_REQUEST_SIZE_BYTES);
219
+ }
220
+
437
221
  let stream: Stream | undefined;
438
222
  try {
439
223
  this.metrics.recordRequestSent(subProtocol);
@@ -518,6 +302,14 @@ export class ReqResp implements ReqRespInterface {
518
302
  * - The first chunk should contain a control byte, indicating the status of the response see `ReqRespStatus`
519
303
  * - The second chunk should contain the response data
520
304
  *
305
+ * To bound memory usage we abort reception as soon as the accumulated compressed bytes exceed a
306
+ * bound derived from `maxSizeKb`, before the full stream has been buffered. Without this a peer we
307
+ * dialed could stream data up to the request timeout, forcing us to buffer arbitrarily much (the
308
+ * `maxSizeKb` guard in `inboundTransformData` only runs after the whole compressed payload is
309
+ * concatenated, so it does nothing to cap reception memory). Snappy can expand incompressible input
310
+ * to ~1.17x its size, so we allow 2x `maxSizeKb`: comfortably above the worst-case expansion of a
311
+ * legitimate max-size response, while still capping buffered memory at twice the permitted size.
312
+ *
521
313
  * @param source - The async iterable source of data chunks
522
314
  * @param maxSizeKb - Optional maximum expected size in KB for the decompressed response
523
315
  */
@@ -525,10 +317,20 @@ export class ReqResp implements ReqRespInterface {
525
317
  let status: ReqRespStatus | undefined;
526
318
  const chunks: Uint8Array[] = [];
527
319
 
320
+ const maxAccumulatedBytes = (maxSizeKb ?? DEFAULT_MAX_RESPONSE_SIZE_KB) * 1024 * 2;
321
+ let accumulatedBytes = 0;
322
+
528
323
  try {
529
324
  for await (const chunk of source) {
530
325
  const statusParsed = status !== undefined;
531
326
  if (statusParsed) {
327
+ // Use `byteLength` (the logical length) rather than `chunk.subarray().length`: calling
328
+ // `subarray()` on a `Uint8ArrayList` consolidates its backing buffers into a single copy,
329
+ // which would materialize the very chunk we are trying to reject.
330
+ accumulatedBytes += chunk.byteLength;
331
+ if (accumulatedBytes > maxAccumulatedBytes) {
332
+ throw new ResponseSizeLimitExceededError(accumulatedBytes, maxAccumulatedBytes);
333
+ }
532
334
  chunks.push(chunk.subarray());
533
335
  continue;
534
336
  }
@@ -596,6 +398,15 @@ export class ReqResp implements ReqRespInterface {
596
398
  throw new ReqRespStatusError(ReqRespStatus.RATE_LIMIT_EXCEEDED);
597
399
  }
598
400
 
401
+ // When p2pAllowOnlyValidators is enabled, reject unauthenticated peers on data protocols
402
+ if (
403
+ !UNAUTHENTICATED_ALLOWED_PROTOCOLS.has(protocol) &&
404
+ (this.shouldRejectPeer?.(connection.remotePeer.toString()) ?? false)
405
+ ) {
406
+ this.logger.debug(`Rejecting unauthenticated peer ${connection.remotePeer} on gated protocol ${protocol}`);
407
+ throw new ReqRespStatusError(ReqRespStatus.FAILURE);
408
+ }
409
+
599
410
  await this.processStream(protocol, incomingStream);
600
411
  } catch (err: any) {
601
412
  this.metrics.recordResponseError(protocol);
@@ -621,7 +432,9 @@ export class ReqResp implements ReqRespInterface {
621
432
  // and that this stream should be dropped
622
433
  const isMessageToNotWarn =
623
434
  err instanceof Error &&
624
- ['stream reset', 'Cannot push value onto an ended pushable'].some(msg => err.message.includes(msg));
435
+ ['stream reset', 'Cannot push value onto an ended pushable', 'read ECONNRESET'].some(msg =>
436
+ err.message.includes(msg),
437
+ );
625
438
  const level = isMessageToNotWarn ? 'debug' : 'warn';
626
439
  this.logger[level]('Unknown stream error while handling the stream, aborting', {
627
440
  protocol,
@@ -656,6 +469,9 @@ export class ReqResp implements ReqRespInterface {
656
469
  await pipeline(
657
470
  stream.source,
658
471
  async function* (source: any) {
472
+ // Req/resp is one-request-one-response: an honest sender writes a single payload and half-closes.
473
+ // Process only the first chunk and return, so extra frames a peer queues on the same stream cannot
474
+ // drive further handler invocations that bypass the per-stream rate-limit check in streamHandler.
659
475
  for await (const chunk of source) {
660
476
  const response = await handler(connection.remotePeer, chunk.subarray());
661
477
 
@@ -670,6 +486,7 @@ export class ReqResp implements ReqRespInterface {
670
486
 
671
487
  yield SUCCESS;
672
488
  yield snappy.outboundTransformData(response);
489
+ return;
673
490
  }
674
491
  },
675
492
  stream.sink,
@@ -738,13 +555,13 @@ export class ReqResp implements ReqRespInterface {
738
555
  ): PeerErrorSeverity | undefined {
739
556
  const logTags = { peerId: peerId.toString(), subProtocol };
740
557
 
741
- //Punishable error - peer should never send badly formed request
558
+ // Punishable error - peer should never send badly formed request
742
559
  if (e instanceof ReqRespStatusError && e.status === ReqRespStatus.BADLY_FORMED_REQUEST) {
743
560
  this.logger.debug(`Punishable error in ${subProtocol}: ${e.cause}`, logTags);
744
561
  return PeerErrorSeverity.LowToleranceError;
745
562
  }
746
563
 
747
- //TODO: (mralj): think if we should penalize peer here based on connection errors
564
+ // TODO: (mralj): think if we should penalize peer here based on connection errors
748
565
  return undefined;
749
566
  }
750
567
 
@@ -766,12 +583,6 @@ export class ReqResp implements ReqRespInterface {
766
583
  return undefined;
767
584
  }
768
585
 
769
- // We do not punish a collective timeout, as the node triggers this interupt, independent of the peer's behaviour
770
- if (e instanceof CollectiveReqRespTimeoutError || e instanceof InvalidResponseError) {
771
- this.logger.debug(`Non-punishable error in ${subProtocol}: ${e.message}`, logTags);
772
- return undefined;
773
- }
774
-
775
586
  // Invalid status byte: the peer sent a status byte that doesn't match any known status code.
776
587
  // This is a protocol violation, penalize harshly.
777
588
  if (e instanceof ReqRespStatusError) {
@@ -786,12 +597,20 @@ export class ReqResp implements ReqRespInterface {
786
597
  return PeerErrorSeverity.LowToleranceError;
787
598
  }
788
599
 
600
+ // Response exceeded the reception buffer bound: the peer streamed more compressed data than the
601
+ // per-request size limit allows. Same protocol violation as above, penalize harshly.
602
+ if (e instanceof ResponseSizeLimitExceededError) {
603
+ this.logger.warn(`Oversized response from peer ${peerId.toString()} in ${subProtocol}: ${e.message}`, logTags);
604
+ return PeerErrorSeverity.LowToleranceError;
605
+ }
606
+
789
607
  return this.categorizeConnectionErrors(e, peerId, subProtocol);
790
608
  }
791
609
 
792
610
  /*
793
611
  * Errors specific to connection handling
794
- * These can happen both when sending request and response*/
612
+ * These can happen both when sending request and response.
613
+ */
795
614
  private categorizeConnectionErrors(
796
615
  e: any,
797
616
  peerId: PeerId,
@@ -17,12 +17,7 @@ import type EventEmitter from 'events';
17
17
  import type { BatchTxRequesterLibP2PService } from './reqresp/batch-tx-requester/interface.js';
18
18
  import type { P2PReqRespConfig } from './reqresp/config.js';
19
19
  import type { StatusMessage } from './reqresp/index.js';
20
- import type {
21
- ReqRespSubProtocol,
22
- ReqRespSubProtocolHandler,
23
- ReqRespSubProtocolValidators,
24
- SubProtocolMap,
25
- } from './reqresp/interface.js';
20
+ import type { ReqRespSubProtocol, ReqRespSubProtocolHandler } from './reqresp/interface.js';
26
21
  import type { AuthRequest, AuthResponse } from './reqresp/protocols/auth.js';
27
22
 
28
23
  export enum PeerDiscoveryState {
@@ -63,6 +58,19 @@ export type DuplicateProposalInfo = {
63
58
  */
64
59
  export type P2PDuplicateProposalCallback = (info: DuplicateProposalInfo) => void;
65
60
 
61
+ /** Minimal info passed to the oversized proposal callback. */
62
+ export type OversizedProposalInfo = {
63
+ slot: SlotNumber;
64
+ proposer: EthAddress;
65
+ };
66
+
67
+ /**
68
+ * Callback for when a block proposal whose index lands at or beyond the consensus per-checkpoint block
69
+ * limit is stored and re-broadcast as slashing evidence. May fire multiple times per (slot, proposer)
70
+ * if the proposer signed several oversized proposals; consumers are expected to dedup.
71
+ */
72
+ export type P2POversizedProposalCallback = (info: OversizedProposalInfo) => void;
73
+
66
74
  /** Minimal info passed to the duplicate attestation callback. */
67
75
  export type DuplicateAttestationInfo = {
68
76
  slot: SlotNumber;
@@ -76,6 +84,8 @@ export type DuplicateAttestationInfo = {
76
84
  */
77
85
  export type P2PDuplicateAttestationCallback = (info: DuplicateAttestationInfo) => void;
78
86
 
87
+ export type P2PCheckpointAttestationCallback = (attestation: CheckpointAttestation) => void;
88
+
79
89
  /**
80
90
  * The interface for a P2P service implementation.
81
91
  */
@@ -98,26 +108,12 @@ export interface P2PService {
98
108
  */
99
109
  propagate<T extends Gossipable>(message: T): Promise<void>;
100
110
 
101
- /**
102
- * Send a batch of requests to peers, and return the responses
103
- *
104
- * @param protocol - The request response protocol to use
105
- * @param requests - The requests to send to the peers
106
- * @returns The responses to the requests
107
- */
108
- sendBatchRequest<Protocol extends ReqRespSubProtocol>(
109
- protocol: Protocol,
110
- requests: InstanceType<SubProtocolMap[Protocol]['request']>[],
111
- pinnedPeerId?: PeerId,
112
- timeoutMs?: number,
113
- maxPeers?: number,
114
- maxRetryAttempts?: number,
115
- ): Promise<InstanceType<SubProtocolMap[Protocol]['response']>[]>;
116
-
117
111
  // Leaky abstraction: fix https://github.com/AztecProtocol/aztec-packages/issues/7963
118
112
  registerBlockReceivedCallback(callback: P2PBlockReceivedCallback): void;
119
113
 
120
- registerCheckpointReceivedCallback(callback: P2PCheckpointReceivedCallback): void;
114
+ registerValidatorCheckpointReceivedCallback(callback: P2PCheckpointReceivedCallback): void;
115
+
116
+ registerAllNodesCheckpointReceivedCallback(callback: P2PCheckpointReceivedCallback): void;
121
117
 
122
118
  /**
123
119
  * Registers a callback invoked when a duplicate proposal is detected (equivocation).
@@ -125,6 +121,12 @@ export interface P2PService {
125
121
  */
126
122
  registerDuplicateProposalCallback(callback: P2PDuplicateProposalCallback): void;
127
123
 
124
+ /**
125
+ * Registers a callback invoked when an oversized block proposal (index at or beyond the consensus
126
+ * per-checkpoint block limit) is stored and re-broadcast as slashing evidence.
127
+ */
128
+ registerOversizedProposalCallback(callback: P2POversizedProposalCallback): void;
129
+
128
130
  /**
129
131
  * Registers a callback invoked when a duplicate attestation is detected (equivocation).
130
132
  * A validator signing attestations for different proposals at the same slot.
@@ -132,6 +134,8 @@ export interface P2PService {
132
134
  */
133
135
  registerDuplicateAttestationCallback(callback: P2PDuplicateAttestationCallback): void;
134
136
 
137
+ registerCheckpointAttestationCallback(callback: P2PCheckpointAttestationCallback): void;
138
+
135
139
  getEnr(): ENR | undefined;
136
140
 
137
141
  getPeers(includePending?: boolean): PeerInfo[];
@@ -141,11 +145,7 @@ export interface P2PService {
141
145
 
142
146
  validateTxsReceivedInBlockProposal(txs: Tx[]): Promise<void>;
143
147
 
144
- addReqRespSubProtocol(
145
- subProtocol: ReqRespSubProtocol,
146
- handler: ReqRespSubProtocolHandler,
147
- validator?: ReqRespSubProtocolValidators[ReqRespSubProtocol],
148
- ): Promise<void>;
148
+ addReqRespSubProtocol(subProtocol: ReqRespSubProtocol, handler: ReqRespSubProtocolHandler): Promise<void>;
149
149
 
150
150
  handleAuthRequestFromPeer(authRequest: AuthRequest, peerId: PeerId): Promise<StatusMessage>;
151
151
 
@@ -196,6 +196,9 @@ export interface PeerDiscoveryService extends EventEmitter {
196
196
  on(event: 'peer:discovered', listener: (enr: ENR) => void): this;
197
197
  emit(event: 'peer:discovered', enr: ENR): boolean;
198
198
 
199
+ on(event: 'ip:changed', listener: (ip: string) => void): this;
200
+ emit(event: 'ip:changed', ip: string): boolean;
201
+
199
202
  getStatus(): PeerDiscoveryState;
200
203
 
201
204
  getEnr(): ENR | undefined;