@aztec/p2p 0.0.1-commit.85d7d01 → 0.0.1-commit.8655d4a

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 (447) hide show
  1. package/README.md +129 -3
  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 +9 -1
  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 -15
  8. package/dest/client/interface.d.ts +14 -5
  9. package/dest/client/interface.d.ts.map +1 -1
  10. package/dest/client/p2p_client.d.ts +13 -9
  11. package/dest/client/p2p_client.d.ts.map +1 -1
  12. package/dest/client/p2p_client.js +93 -49
  13. package/dest/config.d.ts +153 -102
  14. package/dest/config.d.ts.map +1 -1
  15. package/dest/config.js +134 -35
  16. package/dest/errors/p2p-service.error.d.ts +9 -0
  17. package/dest/errors/p2p-service.error.d.ts.map +1 -0
  18. package/dest/errors/p2p-service.error.js +10 -0
  19. package/dest/errors/reqresp.error.d.ts +1 -20
  20. package/dest/errors/reqresp.error.d.ts.map +1 -1
  21. package/dest/errors/reqresp.error.js +0 -21
  22. package/dest/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 +99 -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 +267 -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 +181 -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 +4 -2
  37. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  38. package/dest/mem_pools/instrumentation.js +33 -15
  39. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +1 -1
  40. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -1
  41. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +2 -1
  42. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +2 -1
  43. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -1
  44. package/dest/mem_pools/tx_pool_v2/eviction/index.js +1 -0
  45. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts +16 -0
  46. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts.map +1 -0
  47. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.js +62 -0
  48. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +7 -1
  49. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -1
  50. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +2 -2
  51. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +1 -1
  52. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -1
  53. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +8 -6
  54. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +2 -2
  55. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -1
  56. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +2 -2
  57. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +12 -5
  58. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
  59. package/dest/mem_pools/tx_pool_v2/interfaces.js +2 -1
  60. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +29 -11
  61. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
  62. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +46 -16
  63. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +1 -1
  64. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -1
  65. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +26 -43
  66. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +4 -2
  67. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -1
  68. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +6 -0
  69. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +2 -1
  70. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -1
  71. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +97 -88
  72. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +9 -3
  73. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  74. package/dest/msg_validators/attestation_validator/attestation_validator.js +37 -12
  75. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +7 -3
  76. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
  77. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +4 -5
  78. package/dest/msg_validators/clock_tolerance.d.ts +12 -1
  79. package/dest/msg_validators/clock_tolerance.d.ts.map +1 -1
  80. package/dest/msg_validators/clock_tolerance.js +61 -3
  81. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +10 -4
  82. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
  83. package/dest/msg_validators/proposal_validator/block_proposal_validator.js +10 -2
  84. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +10 -4
  85. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
  86. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +16 -2
  87. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +21 -8
  88. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
  89. package/dest/msg_validators/proposal_validator/proposal_validator.js +90 -44
  90. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +1 -1
  91. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  92. package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +8 -15
  93. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +2 -1
  94. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -1
  95. package/dest/msg_validators/tx_validator/allowed_public_setup.js +25 -21
  96. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts +17 -0
  97. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts.map +1 -0
  98. package/dest/msg_validators/tx_validator/allowed_setup_helpers.js +24 -0
  99. package/dest/msg_validators/tx_validator/archive_cache.js +1 -1
  100. package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts +15 -0
  101. package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts.map +1 -0
  102. package/dest/msg_validators/tx_validator/cached_tx_validator.js +19 -0
  103. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts +9 -0
  104. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts.map +1 -0
  105. package/dest/msg_validators/tx_validator/contract_instance_validator.js +48 -0
  106. package/dest/msg_validators/tx_validator/data_validator.d.ts +2 -1
  107. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  108. package/dest/msg_validators/tx_validator/data_validator.js +36 -2
  109. package/dest/msg_validators/tx_validator/factory.d.ts +27 -7
  110. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  111. package/dest/msg_validators/tx_validator/factory.js +47 -17
  112. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +1 -1
  113. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -1
  114. package/dest/msg_validators/tx_validator/fee_payer_balance.js +6 -2
  115. package/dest/msg_validators/tx_validator/gas_validator.d.ts +48 -7
  116. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  117. package/dest/msg_validators/tx_validator/gas_validator.js +88 -41
  118. package/dest/msg_validators/tx_validator/index.d.ts +4 -1
  119. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  120. package/dest/msg_validators/tx_validator/index.js +3 -0
  121. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +1 -1
  122. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  123. package/dest/msg_validators/tx_validator/metadata_validator.js +4 -4
  124. package/dest/msg_validators/tx_validator/phases_validator.d.ts +22 -2
  125. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
  126. package/dest/msg_validators/tx_validator/phases_validator.js +72 -24
  127. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +2 -1
  128. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
  129. package/dest/msg_validators/tx_validator/tx_proof_validator.js +2 -0
  130. package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts +48 -0
  131. package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts.map +1 -0
  132. package/dest/msg_validators/tx_validator/tx_validation_cache.js +69 -0
  133. package/dest/services/data_store.d.ts +1 -1
  134. package/dest/services/data_store.d.ts.map +1 -1
  135. package/dest/services/data_store.js +5 -5
  136. package/dest/services/discv5/discV5_service.d.ts +2 -1
  137. package/dest/services/discv5/discV5_service.d.ts.map +1 -1
  138. package/dest/services/discv5/discV5_service.js +35 -8
  139. package/dest/services/dummy_service.d.ts +11 -15
  140. package/dest/services/dummy_service.d.ts.map +1 -1
  141. package/dest/services/dummy_service.js +12 -16
  142. package/dest/services/encoding.d.ts +5 -1
  143. package/dest/services/encoding.d.ts.map +1 -1
  144. package/dest/services/encoding.js +7 -1
  145. package/dest/services/gossipsub/topic_score_params.d.ts +13 -2
  146. package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -1
  147. package/dest/services/gossipsub/topic_score_params.js +21 -4
  148. package/dest/services/libp2p/instrumentation.d.ts +3 -1
  149. package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
  150. package/dest/services/libp2p/instrumentation.js +14 -0
  151. package/dest/services/libp2p/libp2p_service.d.ts +36 -46
  152. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  153. package/dest/services/libp2p/libp2p_service.js +296 -244
  154. package/dest/services/peer-manager/metrics.d.ts +3 -1
  155. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  156. package/dest/services/peer-manager/metrics.js +6 -0
  157. package/dest/services/peer-manager/peer_manager.d.ts +6 -2
  158. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  159. package/dest/services/peer-manager/peer_manager.js +40 -11
  160. package/dest/services/peer-manager/peer_scoring.d.ts +7 -2
  161. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  162. package/dest/services/peer-manager/peer_scoring.js +32 -10
  163. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +11 -8
  164. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -1
  165. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +84 -71
  166. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +10 -6
  167. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
  168. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +5 -4
  169. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -1
  170. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +13 -7
  171. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +3 -1
  172. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -1
  173. package/dest/services/reqresp/batch-tx-requester/peer_collection.js +3 -0
  174. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +5 -14
  175. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -1
  176. package/dest/services/reqresp/batch-tx-requester/tx_validator.js +6 -20
  177. package/dest/services/reqresp/config.d.ts +3 -3
  178. package/dest/services/reqresp/config.d.ts.map +1 -1
  179. package/dest/services/reqresp/interface.d.ts +16 -18
  180. package/dest/services/reqresp/interface.d.ts.map +1 -1
  181. package/dest/services/reqresp/interface.js +10 -20
  182. package/dest/services/reqresp/metrics.d.ts +1 -1
  183. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  184. package/dest/services/reqresp/metrics.js +0 -1
  185. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +1 -1
  186. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
  187. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +4 -2
  188. package/dest/services/reqresp/protocols/index.d.ts +1 -2
  189. package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
  190. package/dest/services/reqresp/protocols/index.js +0 -1
  191. package/dest/services/reqresp/protocols/tx.d.ts +1 -1
  192. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  193. package/dest/services/reqresp/protocols/tx.js +1 -3
  194. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +5 -4
  195. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
  196. package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -8
  197. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
  198. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
  199. package/dest/services/reqresp/rate-limiter/rate_limits.js +0 -10
  200. package/dest/services/reqresp/reqresp.d.ts +7 -29
  201. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  202. package/dest/services/reqresp/reqresp.js +41 -214
  203. package/dest/services/service.d.ts +9 -12
  204. package/dest/services/service.d.ts.map +1 -1
  205. package/dest/services/tx_collection/config.d.ts +2 -23
  206. package/dest/services/tx_collection/config.d.ts.map +1 -1
  207. package/dest/services/tx_collection/config.js +2 -55
  208. package/dest/services/tx_collection/file_store_tx_collection.d.ts +12 -28
  209. package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -1
  210. package/dest/services/tx_collection/file_store_tx_collection.js +43 -83
  211. package/dest/services/tx_collection/file_store_tx_source.d.ts +5 -4
  212. package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -1
  213. package/dest/services/tx_collection/file_store_tx_source.js +39 -29
  214. package/dest/services/tx_collection/index.d.ts +2 -3
  215. package/dest/services/tx_collection/index.d.ts.map +1 -1
  216. package/dest/services/tx_collection/index.js +0 -1
  217. package/dest/services/tx_collection/instrumentation.d.ts +1 -1
  218. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
  219. package/dest/services/tx_collection/instrumentation.js +0 -2
  220. package/dest/services/tx_collection/request_tracker.d.ts +53 -0
  221. package/dest/services/tx_collection/request_tracker.d.ts.map +1 -0
  222. package/dest/services/tx_collection/request_tracker.js +84 -0
  223. package/dest/services/tx_collection/tx_collection.d.ts +36 -55
  224. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  225. package/dest/services/tx_collection/tx_collection.js +275 -119
  226. package/dest/services/tx_collection/tx_collection_sink.d.ts +1 -1
  227. package/dest/services/tx_collection/tx_collection_sink.js +2 -2
  228. package/dest/services/tx_collection/tx_source.d.ts +6 -5
  229. package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
  230. package/dest/services/tx_collection/tx_source.js +9 -7
  231. package/dest/services/tx_file_store/tx_file_store.d.ts +1 -3
  232. package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -1
  233. package/dest/services/tx_file_store/tx_file_store.js +4 -14
  234. package/dest/services/tx_provider.d.ts +3 -1
  235. package/dest/services/tx_provider.d.ts.map +1 -1
  236. package/dest/services/tx_provider.js +3 -0
  237. package/dest/test-helpers/make-test-p2p-clients.d.ts +1 -1
  238. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  239. package/dest/test-helpers/make-test-p2p-clients.js +5 -2
  240. package/dest/test-helpers/mock-pubsub.d.ts +23 -9
  241. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  242. package/dest/test-helpers/mock-pubsub.js +44 -44
  243. package/dest/test-helpers/reqresp-nodes.d.ts +4 -5
  244. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  245. package/dest/test-helpers/reqresp-nodes.js +16 -18
  246. package/dest/test-helpers/test_tx_provider.d.ts +3 -1
  247. package/dest/test-helpers/test_tx_provider.d.ts.map +1 -1
  248. package/dest/test-helpers/test_tx_provider.js +3 -0
  249. package/dest/test-helpers/testbench-utils.d.ts +12 -14
  250. package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
  251. package/dest/test-helpers/testbench-utils.js +42 -15
  252. package/dest/testbench/p2p_client_testbench_worker.d.ts +3 -5
  253. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  254. package/dest/testbench/p2p_client_testbench_worker.js +85 -39
  255. package/dest/testbench/worker_client_manager.d.ts +12 -6
  256. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  257. package/dest/testbench/worker_client_manager.js +57 -11
  258. package/dest/util.d.ts +12 -7
  259. package/dest/util.d.ts.map +1 -1
  260. package/dest/util.js +35 -14
  261. package/dest/versioning.d.ts +3 -6
  262. package/dest/versioning.d.ts.map +1 -1
  263. package/dest/versioning.js +3 -24
  264. package/package.json +15 -14
  265. package/src/bootstrap/bootstrap.ts +9 -1
  266. package/src/client/factory.ts +57 -8
  267. package/src/client/interface.ts +15 -11
  268. package/src/client/p2p_client.ts +106 -70
  269. package/src/client/test/{tx_proposal_collector/README.md → p2p_client.batch_tx_requester.bench.README.md} +23 -53
  270. package/src/config.ts +226 -36
  271. package/src/errors/p2p-service.error.ts +11 -0
  272. package/src/errors/reqresp.error.ts +0 -25
  273. package/src/index.ts +0 -1
  274. package/src/mem_pools/attestation_pool/attestation_pool.ts +318 -242
  275. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +204 -68
  276. package/src/mem_pools/attestation_pool/mocks.ts +13 -8
  277. package/src/mem_pools/index.ts +0 -3
  278. package/src/mem_pools/instrumentation.ts +22 -14
  279. package/src/mem_pools/tx_pool_v2/README.md +9 -1
  280. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +2 -1
  281. package/src/mem_pools/tx_pool_v2/eviction/index.ts +1 -0
  282. package/src/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.ts +65 -0
  283. package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +11 -1
  284. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +3 -3
  285. package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +15 -6
  286. package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +2 -1
  287. package/src/mem_pools/tx_pool_v2/interfaces.ts +12 -4
  288. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +72 -20
  289. package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +29 -43
  290. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +16 -1
  291. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +101 -94
  292. package/src/msg_validators/attestation_validator/README.md +49 -0
  293. package/src/msg_validators/attestation_validator/attestation_validator.ts +41 -9
  294. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +14 -7
  295. package/src/msg_validators/clock_tolerance.ts +79 -3
  296. package/src/msg_validators/proposal_validator/README.md +123 -0
  297. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +24 -4
  298. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +35 -7
  299. package/src/msg_validators/proposal_validator/proposal_validator.ts +114 -47
  300. package/src/msg_validators/tx_validator/README.md +15 -3
  301. package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +3 -12
  302. package/src/msg_validators/tx_validator/allowed_public_setup.ts +22 -27
  303. package/src/msg_validators/tx_validator/allowed_setup_helpers.ts +31 -0
  304. package/src/msg_validators/tx_validator/archive_cache.ts +1 -1
  305. package/src/msg_validators/tx_validator/cached_tx_validator.ts +31 -0
  306. package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
  307. package/src/msg_validators/tx_validator/data_validator.ts +44 -1
  308. package/src/msg_validators/tx_validator/factory.ts +61 -10
  309. package/src/msg_validators/tx_validator/fee_payer_balance.ts +6 -2
  310. package/src/msg_validators/tx_validator/gas_validator.ts +121 -39
  311. package/src/msg_validators/tx_validator/index.ts +3 -0
  312. package/src/msg_validators/tx_validator/metadata_validator.ts +12 -4
  313. package/src/msg_validators/tx_validator/phases_validator.ts +82 -27
  314. package/src/msg_validators/tx_validator/tx_proof_validator.ts +2 -0
  315. package/src/msg_validators/tx_validator/tx_validation_cache.ts +102 -0
  316. package/src/services/data_store.ts +5 -13
  317. package/src/services/discv5/discV5_service.ts +38 -5
  318. package/src/services/dummy_service.ts +14 -39
  319. package/src/services/encoding.ts +9 -1
  320. package/src/services/gossipsub/topic_score_params.ts +36 -4
  321. package/src/services/libp2p/instrumentation.ts +14 -0
  322. package/src/services/libp2p/libp2p_service.ts +321 -276
  323. package/src/services/peer-manager/metrics.ts +7 -0
  324. package/src/services/peer-manager/peer_manager.ts +46 -11
  325. package/src/services/peer-manager/peer_scoring.ts +27 -5
  326. package/src/services/reqresp/README.md +215 -0
  327. package/src/services/reqresp/batch-tx-requester/README.md +46 -7
  328. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +83 -77
  329. package/src/services/reqresp/batch-tx-requester/interface.ts +13 -5
  330. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +13 -6
  331. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +5 -0
  332. package/src/services/reqresp/batch-tx-requester/tx_validator.ts +12 -25
  333. package/src/services/reqresp/config.ts +2 -2
  334. package/src/services/reqresp/interface.ts +21 -47
  335. package/src/services/reqresp/metrics.ts +0 -1
  336. package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +4 -2
  337. package/src/services/reqresp/protocols/index.ts +0 -1
  338. package/src/services/reqresp/protocols/tx.ts +1 -3
  339. package/src/services/reqresp/rate-limiter/rate_limiter.ts +13 -9
  340. package/src/services/reqresp/rate-limiter/rate_limits.ts +0 -10
  341. package/src/services/reqresp/reqresp.ts +45 -260
  342. package/src/services/service.ts +12 -28
  343. package/src/services/tx_collection/config.ts +3 -80
  344. package/src/services/tx_collection/file_store_tx_collection.ts +54 -103
  345. package/src/services/tx_collection/file_store_tx_source.ts +43 -31
  346. package/src/services/tx_collection/index.ts +1 -6
  347. package/src/services/tx_collection/instrumentation.ts +1 -7
  348. package/src/services/tx_collection/request_tracker.ts +127 -0
  349. package/src/services/tx_collection/tx_collection.ts +331 -176
  350. package/src/services/tx_collection/tx_collection_sink.ts +2 -2
  351. package/src/services/tx_collection/tx_source.ts +8 -7
  352. package/src/services/tx_file_store/tx_file_store.ts +5 -17
  353. package/src/services/tx_provider.ts +5 -0
  354. package/src/test-helpers/make-test-p2p-clients.ts +4 -1
  355. package/src/test-helpers/mock-pubsub.ts +46 -60
  356. package/src/test-helpers/reqresp-nodes.ts +13 -23
  357. package/src/test-helpers/test_tx_provider.ts +5 -0
  358. package/src/test-helpers/testbench-utils.ts +53 -28
  359. package/src/testbench/p2p_client_testbench_worker.ts +89 -55
  360. package/src/testbench/worker_client_manager.ts +72 -25
  361. package/src/util.ts +33 -18
  362. package/src/versioning.ts +3 -33
  363. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts +0 -2
  364. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts.map +0 -1
  365. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +0 -304
  366. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts +0 -73
  367. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts.map +0 -1
  368. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.js +0 -8
  369. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +0 -125
  370. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +0 -1
  371. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +0 -596
  372. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +0 -32
  373. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +0 -1
  374. package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +0 -112
  375. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +0 -157
  376. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +0 -1
  377. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +0 -52
  378. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +0 -16
  379. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +0 -1
  380. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +0 -122
  381. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +0 -17
  382. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +0 -1
  383. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +0 -84
  384. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +0 -19
  385. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +0 -1
  386. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +0 -78
  387. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +0 -26
  388. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +0 -1
  389. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +0 -84
  390. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +0 -25
  391. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +0 -1
  392. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +0 -57
  393. package/dest/mem_pools/tx_pool/index.d.ts +0 -3
  394. package/dest/mem_pools/tx_pool/index.d.ts.map +0 -1
  395. package/dest/mem_pools/tx_pool/index.js +0 -2
  396. package/dest/mem_pools/tx_pool/priority.d.ts +0 -12
  397. package/dest/mem_pools/tx_pool/priority.d.ts.map +0 -1
  398. package/dest/mem_pools/tx_pool/priority.js +0 -15
  399. package/dest/mem_pools/tx_pool/tx_pool.d.ts +0 -127
  400. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +0 -1
  401. package/dest/mem_pools/tx_pool/tx_pool.js +0 -3
  402. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +0 -7
  403. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +0 -1
  404. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +0 -400
  405. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +0 -23
  406. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +0 -1
  407. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +0 -212
  408. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +0 -64
  409. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +0 -1
  410. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +0 -151
  411. package/dest/services/reqresp/protocols/block.d.ts +0 -9
  412. package/dest/services/reqresp/protocols/block.d.ts.map +0 -1
  413. package/dest/services/reqresp/protocols/block.js +0 -32
  414. package/dest/services/tx_collection/fast_tx_collection.d.ts +0 -54
  415. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +0 -1
  416. package/dest/services/tx_collection/fast_tx_collection.js +0 -327
  417. package/dest/services/tx_collection/missing_txs_tracker.d.ts +0 -32
  418. package/dest/services/tx_collection/missing_txs_tracker.d.ts.map +0 -1
  419. package/dest/services/tx_collection/missing_txs_tracker.js +0 -27
  420. package/dest/services/tx_collection/proposal_tx_collector.d.ts +0 -49
  421. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +0 -1
  422. package/dest/services/tx_collection/proposal_tx_collector.js +0 -50
  423. package/dest/services/tx_collection/slow_tx_collection.d.ts +0 -57
  424. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +0 -1
  425. package/dest/services/tx_collection/slow_tx_collection.js +0 -211
  426. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +0 -345
  427. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.ts +0 -43
  428. package/src/mem_pools/tx_pool/README.md +0 -270
  429. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -746
  430. package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +0 -132
  431. package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +0 -208
  432. package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +0 -162
  433. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +0 -104
  434. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +0 -93
  435. package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +0 -106
  436. package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +0 -75
  437. package/src/mem_pools/tx_pool/index.ts +0 -2
  438. package/src/mem_pools/tx_pool/priority.ts +0 -20
  439. package/src/mem_pools/tx_pool/tx_pool.ts +0 -141
  440. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +0 -319
  441. package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +0 -230
  442. package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +0 -161
  443. package/src/services/reqresp/protocols/block.ts +0 -37
  444. package/src/services/tx_collection/fast_tx_collection.ts +0 -387
  445. package/src/services/tx_collection/missing_txs_tracker.ts +0 -52
  446. package/src/services/tx_collection/proposal_tx_collector.ts +0 -113
  447. package/src/services/tx_collection/slow_tx_collection.ts +0 -266
@@ -26,7 +26,6 @@ export class ReqRespMetrics {
26
26
  ReqRespSubProtocol.STATUS,
27
27
  ReqRespSubProtocol.GOODBYE,
28
28
  ReqRespSubProtocol.TX,
29
- ReqRespSubProtocol.BLOCK,
30
29
  ReqRespSubProtocol.AUTH,
31
30
  ReqRespSubProtocol.BLOCK_TXS,
32
31
  ],
@@ -37,9 +37,11 @@ export function reqRespBlockTxsHandler(
37
37
  throw new ReqRespStatusError(ReqRespStatus.BADLY_FORMED_REQUEST, { cause: err });
38
38
  }
39
39
  // First try attestation pool, then fall back to archiver
40
- let txHashes = (await attestationPool.getBlockProposal(request.archiveRoot.toString()))?.txHashes;
40
+ let txHashes = (await attestationPool.getBlockProposalByArchive(request.archiveRoot.toString()))?.txHashes;
41
41
  if (!txHashes) {
42
- txHashes = (await archiver.getL2BlockByArchive(request.archiveRoot))?.body.txEffects.map(effect => effect.txHash);
42
+ txHashes = (await archiver.getBlock({ archive: request.archiveRoot }))?.body.txEffects.map(
43
+ effect => effect.txHash,
44
+ );
43
45
  }
44
46
 
45
47
  let requestedTxsHashes;
@@ -5,6 +5,5 @@ export * from './ping.js';
5
5
  export * from './status.js';
6
6
  export * from './tx.js';
7
7
  export * from './goodbye.js';
8
- export * from './block.js';
9
8
  export * from './auth.js';
10
9
  export * from './block_txs/index.js';
@@ -51,9 +51,7 @@ export function reqRespTxHandler(mempools: MemPools): ReqRespSubProtocolHandler
51
51
  * Per: https://github.com/AztecProtocol/aztec-packages/issues/15149#issuecomment-2999054485
52
52
  * we define Q as max number of transactions per batch, the comment explains why we use 8.
53
53
  */
54
- //TODO: (mralj) chunk size should by default be 8, this is just temporary until the protocol is implemented correctly
55
- //more info: https://github.com/AztecProtocol/aztec-packages/pull/15516#pullrequestreview-2995474321
56
- export function chunkTxHashesRequest(hashes: TxHash[], chunkSize = 1): Array<TxHashArray> {
54
+ export function chunkTxHashesRequest(hashes: TxHash[], chunkSize = 8): Array<TxHashArray> {
57
55
  return chunk(hashes, chunkSize).map(chunk => new TxHashArray(...chunk));
58
56
  }
59
57
 
@@ -97,9 +97,10 @@ export function prettyPrintRateLimitStatus(status: RateLimitStatus) {
97
97
  * 2. Individual rate limits for each peer.
98
98
  *
99
99
  * How it works:
100
- * - When a request comes in, it first checks against the global rate limit.
101
- * - If the global limit allows, it then checks against the specific peer's rate limit.
102
- * - The request is only allowed if both the global and peer-specific limits allow it.
100
+ * - When a request comes in, it first checks against the peer's individual rate limit.
101
+ * - If the peer limit allows, it then checks against the global rate limit.
102
+ * - The request is only allowed if both the peer-specific and global limits allow it.
103
+ * - Checking peer limit first ensures a rate-limited peer cannot exhaust the global quota.
103
104
  * - It automatically creates and manages rate limiters for new peers as they make requests.
104
105
  * - It periodically cleans up rate limiters for inactive peers to conserve memory.
105
106
  *
@@ -119,10 +120,6 @@ export class SubProtocolRateLimiter {
119
120
  }
120
121
 
121
122
  allow(peerId: PeerId): RateLimitStatus {
122
- if (!this.globalLimiter.allow()) {
123
- return RateLimitStatus.DeniedGlobal;
124
- }
125
-
126
123
  const peerIdStr = peerId.toString();
127
124
  let peerLimiter: PeerRateLimiter | undefined = this.peerLimiters.get(peerIdStr);
128
125
  if (!peerLimiter) {
@@ -135,10 +132,17 @@ export class SubProtocolRateLimiter {
135
132
  } else {
136
133
  peerLimiter.lastAccess = Date.now();
137
134
  }
138
- const peerLimitAllowed = peerLimiter.limiter.allow();
139
- if (!peerLimitAllowed) {
135
+
136
+ // Check peer limit first: a rate-limited peer must not consume global quota,
137
+ // otherwise one spamming peer can starve all others by exhausting the global bucket.
138
+ if (!peerLimiter.limiter.allow()) {
140
139
  return RateLimitStatus.DeniedPeer;
141
140
  }
141
+
142
+ if (!this.globalLimiter.allow()) {
143
+ return RateLimitStatus.DeniedGlobal;
144
+ }
145
+
142
146
  return RateLimitStatus.Allowed;
143
147
  }
144
148
 
@@ -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,
@@ -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,24 @@ import type { Libp2p } from 'libp2p';
11
10
  import { pipeline } from 'node:stream/promises';
12
11
  import type { Uint8ArrayList } from 'uint8arraylist';
13
12
 
14
- import {
15
- CollectiveReqRespTimeoutError,
16
- IndividualReqRespTimeoutError,
17
- InvalidResponseError,
18
- } from '../../errors/reqresp.error.js';
19
- import { SnappyTransform } from '../encoding.js';
13
+ import { IndividualReqRespTimeoutError } from '../../errors/reqresp.error.js';
14
+ import { OversizedSnappyResponseError, SnappyTransform } from '../encoding.js';
20
15
  import type { PeerScoring } from '../peer-manager/peer_scoring.js';
21
16
  import {
22
17
  DEFAULT_INDIVIDUAL_REQUEST_TIMEOUT_MS,
23
18
  DEFAULT_REQRESP_DIAL_TIMEOUT_MS,
24
19
  type P2PReqRespConfig,
25
20
  } from './config.js';
26
- import { BatchConnectionSampler } from './connection-sampler/batch_connection_sampler.js';
27
21
  import { ConnectionSampler, RandomSampler } from './connection-sampler/connection_sampler.js';
28
22
  import {
29
- DEFAULT_SUB_PROTOCOL_VALIDATORS,
30
23
  type ReqRespInterface,
31
24
  type ReqRespResponse,
32
25
  ReqRespSubProtocol,
33
26
  type ReqRespSubProtocolHandler,
34
27
  type ReqRespSubProtocolHandlers,
35
28
  type ReqRespSubProtocolRateLimits,
36
- type ReqRespSubProtocolValidators,
37
- type SubProtocolMap,
38
- responseFromBuffer,
29
+ type ShouldRejectPeer,
30
+ UNAUTHENTICATED_ALLOWED_PROTOCOLS,
39
31
  subProtocolSizeCalculators,
40
32
  } from './interface.js';
41
33
  import { ReqRespMetrics } from './metrics.js';
@@ -44,13 +36,13 @@ import {
44
36
  RequestResponseRateLimiter,
45
37
  prettyPrintRateLimitStatus,
46
38
  } from './rate-limiter/rate_limiter.js';
47
- import { ReqRespStatus, ReqRespStatusError, parseStatusChunk, prettyPrintReqRespStatus } from './status.js';
39
+ import { ReqRespStatus, ReqRespStatusError, parseStatusChunk } from './status.js';
48
40
 
49
41
  /**
50
42
  * The Request Response Service
51
43
  *
52
44
  * 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.
45
+ * information that was missed during a synchronisation or a gossip event.
54
46
  *
55
47
  * This service implements the request response sub protocol, it is heavily inspired from
56
48
  * ethereum implementations of the same name.
@@ -65,13 +57,14 @@ export class ReqResp implements ReqRespInterface {
65
57
  private dialTimeoutMs: number = DEFAULT_REQRESP_DIAL_TIMEOUT_MS;
66
58
 
67
59
  private subProtocolHandlers: Partial<ReqRespSubProtocolHandlers> = {};
68
- private subProtocolValidators: Partial<ReqRespSubProtocolValidators> = {};
69
60
 
70
61
  private connectionSampler: ConnectionSampler;
71
62
  private rateLimiter: RequestResponseRateLimiter;
72
63
 
73
64
  private snappyTransform: SnappyTransform;
74
65
 
66
+ private shouldRejectPeer: ShouldRejectPeer | undefined;
67
+
75
68
  private metrics: ReqRespMetrics;
76
69
 
77
70
  constructor(
@@ -108,6 +101,10 @@ export class ReqResp implements ReqRespInterface {
108
101
  }
109
102
  }
110
103
 
104
+ public setShouldRejectPeer(checker: ShouldRejectPeer): void {
105
+ this.shouldRejectPeer = checker;
106
+ }
107
+
111
108
  get tracer() {
112
109
  return this.metrics.tracer;
113
110
  }
@@ -122,11 +119,11 @@ export class ReqResp implements ReqRespInterface {
122
119
  /**
123
120
  * Start the reqresp service
124
121
  */
125
- async start(subProtocolHandlers: ReqRespSubProtocolHandlers, subProtocolValidators: ReqRespSubProtocolValidators) {
122
+ async start(subProtocolHandlers: ReqRespSubProtocolHandlers) {
126
123
  Object.assign(this.subProtocolHandlers, subProtocolHandlers);
127
- Object.assign(this.subProtocolValidators, subProtocolValidators);
128
124
 
129
- // Register all protocol handlers
125
+ // Register streamHandler with libp2p.
126
+ // The streamHandler is responsible for reading the incoming stream, determining the protocol, then triggering the appropriate handler.
130
127
  for (const subProtocol of Object.keys(subProtocolHandlers)) {
131
128
  this.logger.debug(`Registering handler for sub protocol ${subProtocol}`);
132
129
  await this.libp2p.handle(
@@ -140,13 +137,8 @@ export class ReqResp implements ReqRespInterface {
140
137
  this.rateLimiter.start();
141
138
  }
142
139
 
143
- async addSubProtocol(
144
- subProtocol: ReqRespSubProtocol,
145
- handler: ReqRespSubProtocolHandler,
146
- validator: ReqRespSubProtocolValidators[ReqRespSubProtocol] = DEFAULT_SUB_PROTOCOL_VALIDATORS[subProtocol],
147
- ): Promise<void> {
140
+ async addSubProtocol(subProtocol: ReqRespSubProtocol, handler: ReqRespSubProtocolHandler): Promise<void> {
148
141
  this.subProtocolHandlers[subProtocol] = handler;
149
- this.subProtocolValidators[subProtocol] = validator;
150
142
  this.logger.debug(`Registering handler for sub protocol ${subProtocol}`);
151
143
  await this.libp2p.handle(
152
144
  subProtocol,
@@ -180,225 +172,6 @@ export class ReqResp implements ReqRespInterface {
180
172
  // NOTE: We assume libp2p instance is managed by the caller
181
173
  }
182
174
 
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
175
  /**
403
176
  * Sends a request to a specific peer
404
177
  *
@@ -462,7 +235,7 @@ export class ReqResp implements ReqRespInterface {
462
235
  );
463
236
  return resp;
464
237
  } catch (e: any) {
465
- this.logger.warn(`SUBPROTOCOL: ${subProtocol}\n`, e);
238
+ this.logger.debug(`SUBPROTOCOL: ${subProtocol}\n`, e);
466
239
  // On error we immediately abort the stream, this is preferred way,
467
240
  // because it signals to the sender that error happened, whereas
468
241
  // closing the stream only closes our side and is much slower
@@ -553,16 +326,10 @@ export class ReqResp implements ReqRespInterface {
553
326
  data: message,
554
327
  };
555
328
  } catch (e: any) {
329
+ // All errors (invalid status bytes, oversized snappy responses, corrupt data, etc.)
330
+ // are re-thrown so the caller can penalize the peer via handleResponseError.
556
331
  this.logger.debug(`Reading message failed: ${e.message}`);
557
-
558
- let status = ReqRespStatus.UNKNOWN;
559
- if (e instanceof ReqRespStatusError) {
560
- status = e.status;
561
- }
562
-
563
- return {
564
- status,
565
- };
332
+ throw e;
566
333
  }
567
334
  }
568
335
 
@@ -602,6 +369,15 @@ export class ReqResp implements ReqRespInterface {
602
369
  throw new ReqRespStatusError(ReqRespStatus.RATE_LIMIT_EXCEEDED);
603
370
  }
604
371
 
372
+ // When p2pAllowOnlyValidators is enabled, reject unauthenticated peers on data protocols
373
+ if (
374
+ !UNAUTHENTICATED_ALLOWED_PROTOCOLS.has(protocol) &&
375
+ (this.shouldRejectPeer?.(connection.remotePeer.toString()) ?? false)
376
+ ) {
377
+ this.logger.debug(`Rejecting unauthenticated peer ${connection.remotePeer} on gated protocol ${protocol}`);
378
+ throw new ReqRespStatusError(ReqRespStatus.FAILURE);
379
+ }
380
+
605
381
  await this.processStream(protocol, incomingStream);
606
382
  } catch (err: any) {
607
383
  this.metrics.recordResponseError(protocol);
@@ -746,13 +522,13 @@ export class ReqResp implements ReqRespInterface {
746
522
  ): PeerErrorSeverity | undefined {
747
523
  const logTags = { peerId: peerId.toString(), subProtocol };
748
524
 
749
- //Punishable error - peer should never send badly formed request
525
+ // Punishable error - peer should never send badly formed request
750
526
  if (e instanceof ReqRespStatusError && e.status === ReqRespStatus.BADLY_FORMED_REQUEST) {
751
527
  this.logger.debug(`Punishable error in ${subProtocol}: ${e.cause}`, logTags);
752
528
  return PeerErrorSeverity.LowToleranceError;
753
529
  }
754
530
 
755
- //TODO: (mralj): think if we should penalize peer here based on connection errors
531
+ // TODO: (mralj): think if we should penalize peer here based on connection errors
756
532
  return undefined;
757
533
  }
758
534
 
@@ -774,10 +550,18 @@ export class ReqResp implements ReqRespInterface {
774
550
  return undefined;
775
551
  }
776
552
 
777
- // We do not punish a collective timeout, as the node triggers this interupt, independent of the peer's behaviour
778
- if (e instanceof CollectiveReqRespTimeoutError || e instanceof InvalidResponseError) {
779
- this.logger.debug(`Non-punishable error in ${subProtocol}: ${e.message}`, logTags);
780
- return undefined;
553
+ // Invalid status byte: the peer sent a status byte that doesn't match any known status code.
554
+ // This is a protocol violation, penalize harshly.
555
+ if (e instanceof ReqRespStatusError) {
556
+ this.logger.warn(`Invalid status byte from peer ${peerId.toString()} in ${subProtocol}: ${e.message}`, logTags);
557
+ return PeerErrorSeverity.LowToleranceError;
558
+ }
559
+
560
+ // Oversized snappy response: the peer is sending data that exceeds the allowed size.
561
+ // This is a protocol violation that wastes bandwidth, so penalize harshly.
562
+ if (e instanceof OversizedSnappyResponseError) {
563
+ this.logger.warn(`Oversized response from peer ${peerId.toString()} in ${subProtocol}: ${e.message}`, logTags);
564
+ return PeerErrorSeverity.LowToleranceError;
781
565
  }
782
566
 
783
567
  return this.categorizeConnectionErrors(e, peerId, subProtocol);
@@ -785,7 +569,8 @@ export class ReqResp implements ReqRespInterface {
785
569
 
786
570
  /*
787
571
  * Errors specific to connection handling
788
- * These can happen both when sending request and response*/
572
+ * These can happen both when sending request and response.
573
+ */
789
574
  private categorizeConnectionErrors(
790
575
  e: any,
791
576
  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 {
@@ -76,6 +71,8 @@ export type DuplicateAttestationInfo = {
76
71
  */
77
72
  export type P2PDuplicateAttestationCallback = (info: DuplicateAttestationInfo) => void;
78
73
 
74
+ export type P2PCheckpointAttestationCallback = (attestation: CheckpointAttestation) => void;
75
+
79
76
  /**
80
77
  * The interface for a P2P service implementation.
81
78
  */
@@ -98,26 +95,12 @@ export interface P2PService {
98
95
  */
99
96
  propagate<T extends Gossipable>(message: T): Promise<void>;
100
97
 
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
98
  // Leaky abstraction: fix https://github.com/AztecProtocol/aztec-packages/issues/7963
118
99
  registerBlockReceivedCallback(callback: P2PBlockReceivedCallback): void;
119
100
 
120
- registerCheckpointReceivedCallback(callback: P2PCheckpointReceivedCallback): void;
101
+ registerValidatorCheckpointReceivedCallback(callback: P2PCheckpointReceivedCallback): void;
102
+
103
+ registerAllNodesCheckpointReceivedCallback(callback: P2PCheckpointReceivedCallback): void;
121
104
 
122
105
  /**
123
106
  * Registers a callback invoked when a duplicate proposal is detected (equivocation).
@@ -132,6 +115,8 @@ export interface P2PService {
132
115
  */
133
116
  registerDuplicateAttestationCallback(callback: P2PDuplicateAttestationCallback): void;
134
117
 
118
+ registerCheckpointAttestationCallback(callback: P2PCheckpointAttestationCallback): void;
119
+
135
120
  getEnr(): ENR | undefined;
136
121
 
137
122
  getPeers(includePending?: boolean): PeerInfo[];
@@ -141,11 +126,7 @@ export interface P2PService {
141
126
 
142
127
  validateTxsReceivedInBlockProposal(txs: Tx[]): Promise<void>;
143
128
 
144
- addReqRespSubProtocol(
145
- subProtocol: ReqRespSubProtocol,
146
- handler: ReqRespSubProtocolHandler,
147
- validator?: ReqRespSubProtocolValidators[ReqRespSubProtocol],
148
- ): Promise<void>;
129
+ addReqRespSubProtocol(subProtocol: ReqRespSubProtocol, handler: ReqRespSubProtocolHandler): Promise<void>;
149
130
 
150
131
  handleAuthRequestFromPeer(authRequest: AuthRequest, peerId: PeerId): Promise<StatusMessage>;
151
132
 
@@ -196,6 +177,9 @@ export interface PeerDiscoveryService extends EventEmitter {
196
177
  on(event: 'peer:discovered', listener: (enr: ENR) => void): this;
197
178
  emit(event: 'peer:discovered', enr: ENR): boolean;
198
179
 
180
+ on(event: 'ip:changed', listener: (ip: string) => void): this;
181
+ emit(event: 'ip:changed', ip: string): boolean;
182
+
199
183
  getStatus(): PeerDiscoveryState;
200
184
 
201
185
  getEnr(): ENR | undefined;