@aztec/p2p 0.0.1-commit.d431d1c → 0.0.1-commit.d58ff9d0

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 (570) hide show
  1. package/README.md +130 -3
  2. package/dest/bootstrap/bootstrap.d.ts +4 -3
  3. package/dest/bootstrap/bootstrap.d.ts.map +1 -1
  4. package/dest/bootstrap/bootstrap.js +26 -10
  5. package/dest/client/factory.d.ts +13 -12
  6. package/dest/client/factory.d.ts.map +1 -1
  7. package/dest/client/factory.js +70 -20
  8. package/dest/client/interface.d.ts +90 -40
  9. package/dest/client/interface.d.ts.map +1 -1
  10. package/dest/client/p2p_client.d.ts +69 -64
  11. package/dest/client/p2p_client.d.ts.map +1 -1
  12. package/dest/client/p2p_client.js +247 -244
  13. package/dest/config.d.ts +169 -84
  14. package/dest/config.d.ts.map +1 -1
  15. package/dest/config.js +159 -45
  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/errors/tx-pool.error.d.ts +8 -0
  23. package/dest/errors/tx-pool.error.d.ts.map +1 -0
  24. package/dest/errors/tx-pool.error.js +9 -0
  25. package/dest/index.d.ts +2 -2
  26. package/dest/index.d.ts.map +1 -1
  27. package/dest/index.js +1 -1
  28. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +164 -106
  29. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  30. package/dest/mem_pools/attestation_pool/attestation_pool.js +518 -3
  31. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +2 -2
  32. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
  33. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +550 -125
  34. package/dest/mem_pools/attestation_pool/index.d.ts +2 -3
  35. package/dest/mem_pools/attestation_pool/index.d.ts.map +1 -1
  36. package/dest/mem_pools/attestation_pool/index.js +1 -2
  37. package/dest/mem_pools/attestation_pool/mocks.d.ts +2 -2
  38. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  39. package/dest/mem_pools/attestation_pool/mocks.js +7 -5
  40. package/dest/mem_pools/index.d.ts +3 -3
  41. package/dest/mem_pools/index.d.ts.map +1 -1
  42. package/dest/mem_pools/index.js +1 -1
  43. package/dest/mem_pools/instrumentation.d.ts +12 -5
  44. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  45. package/dest/mem_pools/instrumentation.js +40 -19
  46. package/dest/mem_pools/interface.d.ts +5 -5
  47. package/dest/mem_pools/interface.d.ts.map +1 -1
  48. package/dest/mem_pools/tx_pool_v2/archive/index.d.ts +2 -0
  49. package/dest/mem_pools/tx_pool_v2/archive/index.d.ts.map +1 -0
  50. package/dest/mem_pools/tx_pool_v2/archive/index.js +1 -0
  51. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts +39 -0
  52. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts.map +1 -0
  53. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.js +97 -0
  54. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +104 -0
  55. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -0
  56. package/dest/mem_pools/tx_pool_v2/deleted_pool.js +251 -0
  57. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts +47 -0
  58. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts.map +1 -0
  59. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.js +128 -0
  60. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +17 -0
  61. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -0
  62. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +94 -0
  63. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +19 -0
  64. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -0
  65. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +97 -0
  66. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +11 -0
  67. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -0
  68. package/dest/mem_pools/tx_pool_v2/eviction/index.js +12 -0
  69. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts +16 -0
  70. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts.map +1 -0
  71. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.js +62 -0
  72. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +180 -0
  73. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -0
  74. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.js +25 -0
  75. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts +15 -0
  76. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -0
  77. package/dest/mem_pools/{tx_pool → tx_pool_v2}/eviction/invalid_txs_after_mining_rule.js +16 -35
  78. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts +17 -0
  79. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -0
  80. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +93 -0
  81. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +16 -0
  82. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -0
  83. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +78 -0
  84. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +20 -0
  85. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -0
  86. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +75 -0
  87. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +15 -0
  88. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -0
  89. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +19 -0
  90. package/dest/mem_pools/tx_pool_v2/index.d.ts +6 -0
  91. package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -0
  92. package/dest/mem_pools/tx_pool_v2/index.js +5 -0
  93. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts +15 -0
  94. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts.map +1 -0
  95. package/dest/mem_pools/tx_pool_v2/instrumentation.js +43 -0
  96. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +243 -0
  97. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -0
  98. package/dest/mem_pools/tx_pool_v2/interfaces.js +11 -0
  99. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +137 -0
  100. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -0
  101. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +223 -0
  102. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts +26 -0
  103. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts.map +1 -0
  104. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.js +70 -0
  105. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +122 -0
  106. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -0
  107. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +368 -0
  108. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +68 -0
  109. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -0
  110. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +178 -0
  111. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +91 -0
  112. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -0
  113. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +1013 -0
  114. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +11 -4
  115. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  116. package/dest/msg_validators/attestation_validator/attestation_validator.js +67 -13
  117. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +9 -5
  118. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
  119. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +22 -11
  120. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +12 -5
  121. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
  122. package/dest/msg_validators/proposal_validator/block_proposal_validator.js +11 -3
  123. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +12 -5
  124. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
  125. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +23 -3
  126. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +36 -9
  127. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
  128. package/dest/msg_validators/proposal_validator/proposal_validator.js +156 -43
  129. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +4 -4
  130. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  131. package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +11 -18
  132. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +2 -1
  133. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -1
  134. package/dest/msg_validators/tx_validator/allowed_public_setup.js +25 -21
  135. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts +17 -0
  136. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts.map +1 -0
  137. package/dest/msg_validators/tx_validator/allowed_setup_helpers.js +24 -0
  138. package/dest/msg_validators/tx_validator/archive_cache.d.ts +3 -3
  139. package/dest/msg_validators/tx_validator/archive_cache.d.ts.map +1 -1
  140. package/dest/msg_validators/tx_validator/block_header_validator.d.ts +20 -6
  141. package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
  142. package/dest/msg_validators/tx_validator/block_header_validator.js +4 -3
  143. package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts +15 -0
  144. package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts.map +1 -0
  145. package/dest/msg_validators/tx_validator/cached_tx_validator.js +19 -0
  146. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts +9 -0
  147. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts.map +1 -0
  148. package/dest/msg_validators/tx_validator/contract_instance_validator.js +48 -0
  149. package/dest/msg_validators/tx_validator/data_validator.d.ts +4 -1
  150. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  151. package/dest/msg_validators/tx_validator/data_validator.js +40 -3
  152. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +15 -4
  153. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
  154. package/dest/msg_validators/tx_validator/double_spend_validator.js +7 -6
  155. package/dest/msg_validators/tx_validator/factory.d.ts +136 -5
  156. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  157. package/dest/msg_validators/tx_validator/factory.js +268 -58
  158. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +1 -1
  159. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -1
  160. package/dest/msg_validators/tx_validator/fee_payer_balance.js +6 -2
  161. package/dest/msg_validators/tx_validator/gas_validator.d.ts +105 -3
  162. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  163. package/dest/msg_validators/tx_validator/gas_validator.js +138 -53
  164. package/dest/msg_validators/tx_validator/index.d.ts +5 -1
  165. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  166. package/dest/msg_validators/tx_validator/index.js +4 -0
  167. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +3 -2
  168. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  169. package/dest/msg_validators/tx_validator/metadata_validator.js +6 -6
  170. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts +14 -0
  171. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts.map +1 -0
  172. package/dest/msg_validators/tx_validator/nullifier_cache.js +24 -0
  173. package/dest/msg_validators/tx_validator/phases_validator.d.ts +24 -3
  174. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
  175. package/dest/msg_validators/tx_validator/phases_validator.js +75 -27
  176. package/dest/msg_validators/tx_validator/size_validator.d.ts +3 -1
  177. package/dest/msg_validators/tx_validator/size_validator.d.ts.map +1 -1
  178. package/dest/msg_validators/tx_validator/size_validator.js +4 -1
  179. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +22 -5
  180. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
  181. package/dest/msg_validators/tx_validator/timestamp_validator.js +8 -8
  182. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts +3 -2
  183. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts.map +1 -1
  184. package/dest/msg_validators/tx_validator/tx_permitted_validator.js +2 -2
  185. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +4 -2
  186. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
  187. package/dest/msg_validators/tx_validator/tx_proof_validator.js +4 -2
  188. package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts +48 -0
  189. package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts.map +1 -0
  190. package/dest/msg_validators/tx_validator/tx_validation_cache.js +68 -0
  191. package/dest/services/data_store.d.ts +1 -1
  192. package/dest/services/data_store.d.ts.map +1 -1
  193. package/dest/services/data_store.js +14 -10
  194. package/dest/services/discv5/discV5_service.d.ts +13 -2
  195. package/dest/services/discv5/discV5_service.d.ts.map +1 -1
  196. package/dest/services/discv5/discV5_service.js +120 -24
  197. package/dest/services/discv5/persisted_enr_store.d.ts +38 -0
  198. package/dest/services/discv5/persisted_enr_store.d.ts.map +1 -0
  199. package/dest/services/discv5/persisted_enr_store.js +145 -0
  200. package/dest/services/dummy_service.d.ts +37 -17
  201. package/dest/services/dummy_service.d.ts.map +1 -1
  202. package/dest/services/dummy_service.js +59 -15
  203. package/dest/services/encoding.d.ts +24 -7
  204. package/dest/services/encoding.d.ts.map +1 -1
  205. package/dest/services/encoding.js +43 -26
  206. package/dest/services/gossipsub/index.d.ts +3 -0
  207. package/dest/services/gossipsub/index.d.ts.map +1 -0
  208. package/dest/services/gossipsub/index.js +2 -0
  209. package/dest/services/gossipsub/scoring.d.ts +21 -3
  210. package/dest/services/gossipsub/scoring.d.ts.map +1 -1
  211. package/dest/services/gossipsub/scoring.js +24 -7
  212. package/dest/services/gossipsub/topic_score_params.d.ts +167 -0
  213. package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -0
  214. package/dest/services/gossipsub/topic_score_params.js +336 -0
  215. package/dest/services/index.d.ts +2 -1
  216. package/dest/services/index.d.ts.map +1 -1
  217. package/dest/services/index.js +1 -0
  218. package/dest/services/libp2p/instrumentation.d.ts +3 -1
  219. package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
  220. package/dest/services/libp2p/instrumentation.js +28 -3
  221. package/dest/services/libp2p/libp2p_service.d.ts +116 -60
  222. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  223. package/dest/services/libp2p/libp2p_service.js +800 -586
  224. package/dest/services/peer-manager/metrics.d.ts +4 -2
  225. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  226. package/dest/services/peer-manager/metrics.js +26 -5
  227. package/dest/services/peer-manager/peer_manager.d.ts +20 -3
  228. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  229. package/dest/services/peer-manager/peer_manager.js +83 -26
  230. package/dest/services/peer-manager/peer_scoring.d.ts +34 -2
  231. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  232. package/dest/services/peer-manager/peer_scoring.js +135 -17
  233. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +44 -0
  234. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -0
  235. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +534 -0
  236. package/dest/services/reqresp/batch-tx-requester/config.d.ts +17 -0
  237. package/dest/services/reqresp/batch-tx-requester/config.d.ts.map +1 -0
  238. package/dest/services/reqresp/batch-tx-requester/config.js +27 -0
  239. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +50 -0
  240. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -0
  241. package/dest/services/reqresp/batch-tx-requester/interface.js +1 -0
  242. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +35 -0
  243. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -0
  244. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +136 -0
  245. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +62 -0
  246. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -0
  247. package/dest/services/reqresp/batch-tx-requester/peer_collection.js +176 -0
  248. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +11 -0
  249. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -0
  250. package/dest/services/reqresp/batch-tx-requester/tx_validator.js +7 -0
  251. package/dest/services/reqresp/config.d.ts +15 -3
  252. package/dest/services/reqresp/config.d.ts.map +1 -1
  253. package/dest/services/reqresp/config.js +11 -0
  254. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +2 -1
  255. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -1
  256. package/dest/services/reqresp/connection-sampler/connection_sampler.js +12 -0
  257. package/dest/services/reqresp/interface.d.ts +27 -18
  258. package/dest/services/reqresp/interface.d.ts.map +1 -1
  259. package/dest/services/reqresp/interface.js +23 -19
  260. package/dest/services/reqresp/metrics.d.ts +6 -5
  261. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  262. package/dest/services/reqresp/metrics.js +16 -5
  263. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +8 -3
  264. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -1
  265. package/dest/services/reqresp/protocols/block_txs/bitvector.js +8 -2
  266. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +7 -5
  267. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
  268. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +35 -14
  269. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +36 -8
  270. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
  271. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +84 -20
  272. package/dest/services/reqresp/protocols/index.d.ts +1 -2
  273. package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
  274. package/dest/services/reqresp/protocols/index.js +0 -1
  275. package/dest/services/reqresp/protocols/tx.d.ts +7 -1
  276. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  277. package/dest/services/reqresp/protocols/tx.js +21 -3
  278. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +5 -4
  279. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
  280. package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -8
  281. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
  282. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
  283. package/dest/services/reqresp/rate-limiter/rate_limits.js +3 -13
  284. package/dest/services/reqresp/reqresp.d.ts +12 -29
  285. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  286. package/dest/services/reqresp/reqresp.js +90 -188
  287. package/dest/services/service.d.ts +65 -13
  288. package/dest/services/service.d.ts.map +1 -1
  289. package/dest/services/tx_collection/config.d.ts +11 -11
  290. package/dest/services/tx_collection/config.d.ts.map +1 -1
  291. package/dest/services/tx_collection/config.js +27 -26
  292. package/dest/services/tx_collection/file_store_tx_collection.d.ts +37 -0
  293. package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -0
  294. package/dest/services/tx_collection/file_store_tx_collection.js +127 -0
  295. package/dest/services/tx_collection/file_store_tx_source.d.ts +38 -0
  296. package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -0
  297. package/dest/services/tx_collection/file_store_tx_source.js +100 -0
  298. package/dest/services/tx_collection/index.d.ts +3 -2
  299. package/dest/services/tx_collection/index.d.ts.map +1 -1
  300. package/dest/services/tx_collection/index.js +1 -0
  301. package/dest/services/tx_collection/instrumentation.d.ts +1 -1
  302. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
  303. package/dest/services/tx_collection/instrumentation.js +8 -2
  304. package/dest/services/tx_collection/request_tracker.d.ts +53 -0
  305. package/dest/services/tx_collection/request_tracker.d.ts.map +1 -0
  306. package/dest/services/tx_collection/request_tracker.js +84 -0
  307. package/dest/services/tx_collection/tx_collection.d.ts +50 -56
  308. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  309. package/dest/services/tx_collection/tx_collection.js +298 -70
  310. package/dest/services/tx_collection/tx_collection_sink.d.ts +19 -9
  311. package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -1
  312. package/dest/services/tx_collection/tx_collection_sink.js +28 -31
  313. package/dest/services/tx_collection/tx_source.d.ts +13 -7
  314. package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
  315. package/dest/services/tx_collection/tx_source.js +29 -7
  316. package/dest/services/tx_file_store/config.d.ts +16 -0
  317. package/dest/services/tx_file_store/config.d.ts.map +1 -0
  318. package/dest/services/tx_file_store/config.js +22 -0
  319. package/dest/services/tx_file_store/index.d.ts +4 -0
  320. package/dest/services/tx_file_store/index.d.ts.map +1 -0
  321. package/dest/services/tx_file_store/index.js +3 -0
  322. package/dest/services/tx_file_store/instrumentation.d.ts +15 -0
  323. package/dest/services/tx_file_store/instrumentation.d.ts.map +1 -0
  324. package/dest/services/tx_file_store/instrumentation.js +29 -0
  325. package/dest/services/tx_file_store/tx_file_store.d.ts +46 -0
  326. package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -0
  327. package/dest/services/tx_file_store/tx_file_store.js +142 -0
  328. package/dest/services/tx_provider.d.ts +8 -6
  329. package/dest/services/tx_provider.d.ts.map +1 -1
  330. package/dest/services/tx_provider.js +12 -8
  331. package/dest/services/tx_provider_instrumentation.d.ts +1 -1
  332. package/dest/services/tx_provider_instrumentation.d.ts.map +1 -1
  333. package/dest/services/tx_provider_instrumentation.js +5 -5
  334. package/dest/test-helpers/index.d.ts +3 -1
  335. package/dest/test-helpers/index.d.ts.map +1 -1
  336. package/dest/test-helpers/index.js +2 -0
  337. package/dest/test-helpers/make-test-p2p-clients.d.ts +7 -8
  338. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  339. package/dest/test-helpers/make-test-p2p-clients.js +5 -3
  340. package/dest/test-helpers/mock-pubsub.d.ts +46 -6
  341. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  342. package/dest/test-helpers/mock-pubsub.js +115 -14
  343. package/dest/test-helpers/reqresp-nodes.d.ts +5 -7
  344. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  345. package/dest/test-helpers/reqresp-nodes.js +19 -20
  346. package/dest/test-helpers/test_tx_provider.d.ts +42 -0
  347. package/dest/test-helpers/test_tx_provider.d.ts.map +1 -0
  348. package/dest/test-helpers/test_tx_provider.js +44 -0
  349. package/dest/test-helpers/testbench-utils.d.ts +164 -0
  350. package/dest/test-helpers/testbench-utils.d.ts.map +1 -0
  351. package/dest/test-helpers/testbench-utils.js +400 -0
  352. package/dest/testbench/p2p_client_testbench_worker.d.ts +26 -2
  353. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  354. package/dest/testbench/p2p_client_testbench_worker.js +284 -139
  355. package/dest/testbench/worker_client_manager.d.ts +57 -6
  356. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  357. package/dest/testbench/worker_client_manager.js +277 -49
  358. package/dest/util.d.ts +13 -8
  359. package/dest/util.d.ts.map +1 -1
  360. package/dest/util.js +35 -14
  361. package/dest/versioning.d.ts +3 -6
  362. package/dest/versioning.d.ts.map +1 -1
  363. package/dest/versioning.js +3 -24
  364. package/package.json +16 -16
  365. package/src/bootstrap/bootstrap.ts +24 -7
  366. package/src/client/factory.ts +139 -39
  367. package/src/client/interface.ts +97 -48
  368. package/src/client/p2p_client.ts +291 -312
  369. package/src/client/test/p2p_client.batch_tx_requester.bench.README.md +197 -0
  370. package/src/config.ts +287 -49
  371. package/src/errors/p2p-service.error.ts +11 -0
  372. package/src/errors/reqresp.error.ts +13 -19
  373. package/src/errors/tx-pool.error.ts +12 -0
  374. package/src/index.ts +1 -1
  375. package/src/mem_pools/attestation_pool/attestation_pool.ts +585 -94
  376. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +656 -141
  377. package/src/mem_pools/attestation_pool/index.ts +9 -2
  378. package/src/mem_pools/attestation_pool/mocks.ts +14 -8
  379. package/src/mem_pools/index.ts +2 -2
  380. package/src/mem_pools/instrumentation.ts +29 -18
  381. package/src/mem_pools/interface.ts +4 -4
  382. package/src/mem_pools/tx_pool_v2/README.md +283 -0
  383. package/src/mem_pools/tx_pool_v2/archive/index.ts +1 -0
  384. package/src/mem_pools/tx_pool_v2/archive/tx_archive.ts +112 -0
  385. package/src/mem_pools/tx_pool_v2/deleted_pool.ts +321 -0
  386. package/src/mem_pools/tx_pool_v2/eviction/eviction_manager.ts +160 -0
  387. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +122 -0
  388. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +125 -0
  389. package/src/mem_pools/tx_pool_v2/eviction/index.ts +28 -0
  390. package/src/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.ts +65 -0
  391. package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +219 -0
  392. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +74 -0
  393. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +101 -0
  394. package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +91 -0
  395. package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +99 -0
  396. package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +32 -0
  397. package/src/mem_pools/tx_pool_v2/index.ts +12 -0
  398. package/src/mem_pools/tx_pool_v2/instrumentation.ts +69 -0
  399. package/src/mem_pools/tx_pool_v2/interfaces.ts +274 -0
  400. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +349 -0
  401. package/src/mem_pools/tx_pool_v2/tx_pool_bench_metrics.ts +77 -0
  402. package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +465 -0
  403. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +252 -0
  404. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +1215 -0
  405. package/src/msg_validators/attestation_validator/README.md +49 -0
  406. package/src/msg_validators/attestation_validator/attestation_validator.ts +60 -16
  407. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +30 -16
  408. package/src/msg_validators/proposal_validator/README.md +123 -0
  409. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +26 -4
  410. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +43 -7
  411. package/src/msg_validators/proposal_validator/proposal_validator.ts +163 -50
  412. package/src/msg_validators/tx_validator/README.md +129 -0
  413. package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +8 -17
  414. package/src/msg_validators/tx_validator/allowed_public_setup.ts +22 -27
  415. package/src/msg_validators/tx_validator/allowed_setup_helpers.ts +31 -0
  416. package/src/msg_validators/tx_validator/archive_cache.ts +2 -2
  417. package/src/msg_validators/tx_validator/block_header_validator.ts +21 -8
  418. package/src/msg_validators/tx_validator/cached_tx_validator.ts +31 -0
  419. package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
  420. package/src/msg_validators/tx_validator/data_validator.ts +50 -3
  421. package/src/msg_validators/tx_validator/double_spend_validator.ts +15 -9
  422. package/src/msg_validators/tx_validator/factory.ts +430 -56
  423. package/src/msg_validators/tx_validator/fee_payer_balance.ts +6 -2
  424. package/src/msg_validators/tx_validator/gas_validator.ts +198 -51
  425. package/src/msg_validators/tx_validator/index.ts +4 -0
  426. package/src/msg_validators/tx_validator/metadata_validator.ts +18 -7
  427. package/src/msg_validators/tx_validator/nullifier_cache.ts +30 -0
  428. package/src/msg_validators/tx_validator/phases_validator.ts +87 -30
  429. package/src/msg_validators/tx_validator/size_validator.ts +6 -2
  430. package/src/msg_validators/tx_validator/timestamp_validator.ts +29 -21
  431. package/src/msg_validators/tx_validator/tx_permitted_validator.ts +8 -3
  432. package/src/msg_validators/tx_validator/tx_proof_validator.ts +10 -3
  433. package/src/msg_validators/tx_validator/tx_validation_cache.ts +101 -0
  434. package/src/services/data_store.ts +14 -19
  435. package/src/services/discv5/discV5_service.ts +127 -15
  436. package/src/services/discv5/persisted_enr_store.ts +158 -0
  437. package/src/services/dummy_service.ts +77 -39
  438. package/src/services/encoding.ts +42 -26
  439. package/src/services/gossipsub/README.md +663 -0
  440. package/src/services/gossipsub/index.ts +2 -0
  441. package/src/services/gossipsub/scoring.ts +29 -5
  442. package/src/services/gossipsub/topic_score_params.ts +478 -0
  443. package/src/services/index.ts +1 -0
  444. package/src/services/libp2p/instrumentation.ts +29 -2
  445. package/src/services/libp2p/libp2p_service.ts +893 -648
  446. package/src/services/peer-manager/metrics.ts +28 -4
  447. package/src/services/peer-manager/peer_manager.ts +91 -25
  448. package/src/services/peer-manager/peer_scoring.ts +131 -9
  449. package/src/services/reqresp/README.md +194 -0
  450. package/src/services/reqresp/batch-tx-requester/README.md +344 -0
  451. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +660 -0
  452. package/src/services/reqresp/batch-tx-requester/config.ts +40 -0
  453. package/src/services/reqresp/batch-tx-requester/interface.ts +61 -0
  454. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +168 -0
  455. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +249 -0
  456. package/src/services/reqresp/batch-tx-requester/tx_validator.ts +24 -0
  457. package/src/services/reqresp/config.ts +19 -2
  458. package/src/services/reqresp/connection-sampler/connection_sampler.ts +16 -0
  459. package/src/services/reqresp/interface.ts +48 -46
  460. package/src/services/reqresp/metrics.ts +33 -9
  461. package/src/services/reqresp/protocols/block_txs/bitvector.ts +10 -2
  462. package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +44 -17
  463. package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +108 -16
  464. package/src/services/reqresp/protocols/index.ts +0 -1
  465. package/src/services/reqresp/protocols/tx.ts +23 -3
  466. package/src/services/reqresp/rate-limiter/rate_limiter.ts +13 -9
  467. package/src/services/reqresp/rate-limiter/rate_limits.ts +3 -13
  468. package/src/services/reqresp/reqresp.ts +107 -223
  469. package/src/services/service.ts +85 -29
  470. package/src/services/tx_collection/config.ts +41 -36
  471. package/src/services/tx_collection/file_store_tx_collection.ts +153 -0
  472. package/src/services/tx_collection/file_store_tx_source.ts +129 -0
  473. package/src/services/tx_collection/index.ts +2 -1
  474. package/src/services/tx_collection/instrumentation.ts +11 -2
  475. package/src/services/tx_collection/request_tracker.ts +127 -0
  476. package/src/services/tx_collection/tx_collection.ts +367 -115
  477. package/src/services/tx_collection/tx_collection_sink.ts +32 -36
  478. package/src/services/tx_collection/tx_source.ts +29 -8
  479. package/src/services/tx_file_store/config.ts +37 -0
  480. package/src/services/tx_file_store/index.ts +3 -0
  481. package/src/services/tx_file_store/instrumentation.ts +36 -0
  482. package/src/services/tx_file_store/tx_file_store.ts +163 -0
  483. package/src/services/tx_provider.ts +17 -11
  484. package/src/services/tx_provider_instrumentation.ts +11 -5
  485. package/src/test-helpers/index.ts +2 -0
  486. package/src/test-helpers/make-test-p2p-clients.ts +7 -6
  487. package/src/test-helpers/mock-pubsub.ts +137 -14
  488. package/src/test-helpers/reqresp-nodes.ts +17 -29
  489. package/src/test-helpers/test_tx_provider.ts +69 -0
  490. package/src/test-helpers/testbench-utils.ts +465 -0
  491. package/src/testbench/p2p_client_testbench_worker.ts +389 -133
  492. package/src/testbench/worker_client_manager.ts +355 -51
  493. package/src/util.ts +40 -19
  494. package/src/versioning.ts +3 -33
  495. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +0 -40
  496. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +0 -1
  497. package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +0 -218
  498. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +0 -31
  499. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +0 -1
  500. package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +0 -180
  501. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +0 -125
  502. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +0 -1
  503. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +0 -596
  504. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +0 -31
  505. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +0 -1
  506. package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +0 -112
  507. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +0 -156
  508. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +0 -1
  509. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +0 -52
  510. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +0 -16
  511. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +0 -1
  512. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +0 -115
  513. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +0 -17
  514. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +0 -1
  515. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +0 -19
  516. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +0 -1
  517. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +0 -76
  518. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +0 -26
  519. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +0 -1
  520. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +0 -84
  521. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +0 -25
  522. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +0 -1
  523. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +0 -57
  524. package/dest/mem_pools/tx_pool/index.d.ts +0 -3
  525. package/dest/mem_pools/tx_pool/index.d.ts.map +0 -1
  526. package/dest/mem_pools/tx_pool/index.js +0 -2
  527. package/dest/mem_pools/tx_pool/priority.d.ts +0 -12
  528. package/dest/mem_pools/tx_pool/priority.d.ts.map +0 -1
  529. package/dest/mem_pools/tx_pool/priority.js +0 -15
  530. package/dest/mem_pools/tx_pool/tx_pool.d.ts +0 -127
  531. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +0 -1
  532. package/dest/mem_pools/tx_pool/tx_pool.js +0 -3
  533. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +0 -7
  534. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +0 -1
  535. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +0 -400
  536. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +0 -23
  537. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +0 -1
  538. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +0 -157
  539. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +0 -45
  540. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +0 -1
  541. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +0 -92
  542. package/dest/services/reqresp/protocols/block.d.ts +0 -9
  543. package/dest/services/reqresp/protocols/block.d.ts.map +0 -1
  544. package/dest/services/reqresp/protocols/block.js +0 -32
  545. package/dest/services/tx_collection/fast_tx_collection.d.ts +0 -51
  546. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +0 -1
  547. package/dest/services/tx_collection/fast_tx_collection.js +0 -300
  548. package/dest/services/tx_collection/slow_tx_collection.d.ts +0 -53
  549. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +0 -1
  550. package/dest/services/tx_collection/slow_tx_collection.js +0 -177
  551. package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +0 -320
  552. package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +0 -264
  553. package/src/mem_pools/tx_pool/README.md +0 -270
  554. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -746
  555. package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +0 -131
  556. package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +0 -207
  557. package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +0 -159
  558. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +0 -104
  559. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +0 -91
  560. package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +0 -106
  561. package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +0 -75
  562. package/src/mem_pools/tx_pool/index.ts +0 -2
  563. package/src/mem_pools/tx_pool/priority.ts +0 -20
  564. package/src/mem_pools/tx_pool/tx_pool.ts +0 -141
  565. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +0 -319
  566. package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +0 -191
  567. package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +0 -100
  568. package/src/services/reqresp/protocols/block.ts +0 -37
  569. package/src/services/tx_collection/fast_tx_collection.ts +0 -341
  570. package/src/services/tx_collection/slow_tx_collection.ts +0 -233
@@ -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,31 @@ 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 { 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,
37
+ subProtocolSizeCalculators,
39
38
  } from './interface.js';
40
39
  import { ReqRespMetrics } from './metrics.js';
41
40
  import {
@@ -43,13 +42,13 @@ import {
43
42
  RequestResponseRateLimiter,
44
43
  prettyPrintRateLimitStatus,
45
44
  } from './rate-limiter/rate_limiter.js';
46
- import { ReqRespStatus, ReqRespStatusError, parseStatusChunk, prettyPrintReqRespStatus } from './status.js';
45
+ import { ReqRespStatus, ReqRespStatusError, parseStatusChunk } from './status.js';
47
46
 
48
47
  /**
49
48
  * The Request Response Service
50
49
  *
51
50
  * It allows nodes to request specific information from their peers, its use case covers recovering
52
- * information that was missed during a syncronisation or a gossip event.
51
+ * information that was missed during a synchronisation or a gossip event.
53
52
  *
54
53
  * This service implements the request response sub protocol, it is heavily inspired from
55
54
  * ethereum implementations of the same name.
@@ -64,13 +63,14 @@ export class ReqResp implements ReqRespInterface {
64
63
  private dialTimeoutMs: number = DEFAULT_REQRESP_DIAL_TIMEOUT_MS;
65
64
 
66
65
  private subProtocolHandlers: Partial<ReqRespSubProtocolHandlers> = {};
67
- private subProtocolValidators: Partial<ReqRespSubProtocolValidators> = {};
68
66
 
69
67
  private connectionSampler: ConnectionSampler;
70
68
  private rateLimiter: RequestResponseRateLimiter;
71
69
 
72
70
  private snappyTransform: SnappyTransform;
73
71
 
72
+ private shouldRejectPeer: ShouldRejectPeer | undefined;
73
+
74
74
  private metrics: ReqRespMetrics;
75
75
 
76
76
  constructor(
@@ -107,18 +107,29 @@ export class ReqResp implements ReqRespInterface {
107
107
  }
108
108
  }
109
109
 
110
+ public setShouldRejectPeer(checker: ShouldRejectPeer): void {
111
+ this.shouldRejectPeer = checker;
112
+ }
113
+
110
114
  get tracer() {
111
115
  return this.metrics.tracer;
112
116
  }
113
117
 
118
+ /**
119
+ * Get the connection sampler instance
120
+ */
121
+ getConnectionSampler(): Pick<ConnectionSampler, 'getPeerListSortedByConnectionCountAsc'> {
122
+ return this.connectionSampler;
123
+ }
124
+
114
125
  /**
115
126
  * Start the reqresp service
116
127
  */
117
- async start(subProtocolHandlers: ReqRespSubProtocolHandlers, subProtocolValidators: ReqRespSubProtocolValidators) {
128
+ async start(subProtocolHandlers: ReqRespSubProtocolHandlers) {
118
129
  Object.assign(this.subProtocolHandlers, subProtocolHandlers);
119
- Object.assign(this.subProtocolValidators, subProtocolValidators);
120
130
 
121
- // 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.
122
133
  for (const subProtocol of Object.keys(subProtocolHandlers)) {
123
134
  this.logger.debug(`Registering handler for sub protocol ${subProtocol}`);
124
135
  await this.libp2p.handle(
@@ -132,13 +143,8 @@ export class ReqResp implements ReqRespInterface {
132
143
  this.rateLimiter.start();
133
144
  }
134
145
 
135
- async addSubProtocol(
136
- subProtocol: ReqRespSubProtocol,
137
- handler: ReqRespSubProtocolHandler,
138
- validator: ReqRespSubProtocolValidators[ReqRespSubProtocol] = DEFAULT_SUB_PROTOCOL_VALIDATORS[subProtocol],
139
- ): Promise<void> {
146
+ async addSubProtocol(subProtocol: ReqRespSubProtocol, handler: ReqRespSubProtocolHandler): Promise<void> {
140
147
  this.subProtocolHandlers[subProtocol] = handler;
141
- this.subProtocolValidators[subProtocol] = validator;
142
148
  this.logger.debug(`Registering handler for sub protocol ${subProtocol}`);
143
149
  await this.libp2p.handle(
144
150
  subProtocol,
@@ -172,186 +178,6 @@ export class ReqResp implements ReqRespInterface {
172
178
  // NOTE: We assume libp2p instance is managed by the caller
173
179
  }
174
180
 
175
- /**
176
- * Request multiple messages over the same sub protocol, balancing the requests across peers.
177
- *
178
- * @devnote
179
- * - The function prioritizes sending requests to free peers using a batch sampling strategy.
180
- * - If a peer fails to respond or returns an invalid response, it is removed from the sampling pool and replaced.
181
- * - The function stops retrying once all requests are processed, no active peers remain, or the maximum retry attempts are reached.
182
- * - Responses are validated using a custom validator for the sub-protocol.*
183
- *
184
- * Requests are sent in parallel to each peer, but multiple requests are sent to the same peer in series
185
- * - If a peer fails to respond or returns an invalid response, it is removed from the sampling pool and replaced.
186
- * - The function stops retrying once all requests are processed, no active peers remain, or the maximum retry attempts are reached.
187
- * - Responses are validated using a custom validator for the sub-protocol.*
188
- *
189
- * @param subProtocol
190
- * @param requests
191
- * @param timeoutMs
192
- * @param maxPeers
193
- * @returns
194
- *
195
- * @throws {CollectiveReqRespTimeoutError} - If the request batch exceeds the specified timeout (`timeoutMs`).
196
- */
197
- @trackSpan(
198
- 'ReqResp.sendBatchRequest',
199
- (subProtocol: ReqRespSubProtocol, requests: InstanceType<SubProtocolMap[ReqRespSubProtocol]['request']>[]) => ({
200
- [Attributes.P2P_REQ_RESP_PROTOCOL]: subProtocol,
201
- [Attributes.P2P_REQ_RESP_BATCH_REQUESTS_COUNT]: requests.length,
202
- }),
203
- )
204
- async sendBatchRequest<SubProtocol extends ReqRespSubProtocol>(
205
- subProtocol: SubProtocol,
206
- requests: InstanceType<SubProtocolMap[SubProtocol]['request']>[],
207
- pinnedPeer: PeerId | undefined,
208
- timeoutMs = 10000,
209
- maxPeers = Math.max(10, Math.ceil(requests.length / 3)),
210
- maxRetryAttempts = 3,
211
- ): Promise<InstanceType<SubProtocolMap[SubProtocol]['response']>[]> {
212
- const responseValidator = this.subProtocolValidators[subProtocol] ?? DEFAULT_SUB_PROTOCOL_VALIDATORS[subProtocol];
213
- const responses: InstanceType<SubProtocolMap[SubProtocol]['response']>[] = new Array(requests.length);
214
- const requestBuffers = requests.map(req => req.toBuffer());
215
-
216
- const requestFunction = async (signal: AbortSignal) => {
217
- // Track which requests still need to be processed
218
- const pendingRequestIndices = new Set(requestBuffers.map((_, i) => i));
219
-
220
- // Create batch sampler with the total number of requests and max peers
221
- const batchSampler = new BatchConnectionSampler(
222
- this.connectionSampler,
223
- requests.length,
224
- maxPeers,
225
- compactArray([pinnedPeer]), // Exclude pinned peer from sampling, we will forcefully send all requests to it
226
- createLogger(`${this.logger.module}:batch-connection-sampler`),
227
- );
228
-
229
- if (batchSampler.activePeerCount === 0 && !pinnedPeer) {
230
- this.logger.warn('No active peers to send requests to');
231
- return [];
232
- }
233
-
234
- // This is where it gets fun
235
- // The outer loop is the retry loop, we will continue to retry until we process all indices we have
236
- // not received a response for, or we have reached the max retry attempts
237
-
238
- // The inner loop is the batch loop, we will process all requests for each peer in parallel
239
- // We will then process the results of the requests, and resample any peers that failed to respond
240
- // We will continue to retry until we have processed all indices, or we have reached the max retry attempts
241
-
242
- let retryAttempts = 0;
243
- while (pendingRequestIndices.size > 0 && batchSampler.activePeerCount > 0 && retryAttempts < maxRetryAttempts) {
244
- if (signal.aborted) {
245
- throw new AbortError('Batch request aborted');
246
- }
247
- // Process requests in parallel for each available peer
248
- type BatchEntry = { peerId: PeerId; indices: number[] };
249
- const requestBatches = new Map<string, BatchEntry>();
250
-
251
- // Group requests by peer
252
- for (const requestIndex of pendingRequestIndices) {
253
- const peer = batchSampler.getPeerForRequest(requestIndex);
254
- if (!peer) {
255
- break;
256
- }
257
- const peerAsString = peer.toString();
258
- if (!requestBatches.has(peerAsString)) {
259
- requestBatches.set(peerAsString, { peerId: peer, indices: [] });
260
- }
261
- requestBatches.get(peerAsString)!.indices.push(requestIndex);
262
- }
263
-
264
- // If there is a pinned peer, we will always send every request to that peer
265
- // We use the default limits for the subprotocol to avoid hitting the rate limiter
266
- if (pinnedPeer) {
267
- const limit = this.rateLimiter.getRateLimits(subProtocol).peerLimit.quotaCount;
268
- requestBatches.set(pinnedPeer.toString(), {
269
- peerId: pinnedPeer,
270
- indices: Array.from(pendingRequestIndices.values()).slice(0, limit),
271
- });
272
- }
273
-
274
- // Make parallel requests for each peer's batch
275
- // A batch entry will look something like this:
276
- // PeerId0: [0, 1, 2, 3]
277
- // PeerId1: [4, 5, 6, 7]
278
-
279
- // Peer Id 0 will send requests 0, 1, 2, 3 in serial
280
- // while simultaneously Peer Id 1 will send requests 4, 5, 6, 7 in serial
281
-
282
- const batchResults = await Promise.all(
283
- Array.from(requestBatches.entries()).map(async ([peerAsString, { peerId: peer, indices }]) => {
284
- try {
285
- // Requests all going to the same peer are sent synchronously
286
- const peerResults: { index: number; response: InstanceType<SubProtocolMap[SubProtocol]['response']> }[] =
287
- [];
288
- for (const index of indices) {
289
- this.logger.trace(`Sending request ${index} to peer ${peerAsString}`);
290
- const response = await this.sendRequestToPeer(peer, subProtocol, requestBuffers[index]);
291
-
292
- // Check the status of the response buffer
293
- if (response.status !== ReqRespStatus.SUCCESS) {
294
- this.logger.debug(
295
- `Request to peer ${peerAsString} failed with status ${prettyPrintReqRespStatus(response.status)}`,
296
- );
297
-
298
- // If we hit a rate limit or some failure, we remove the peer and return the results,
299
- // they will be split among remaining peers and the new sampled peer
300
- batchSampler.removePeerAndReplace(peer);
301
- return { peer, results: peerResults };
302
- }
303
-
304
- if (response && response.data.length > 0) {
305
- const object = responseFromBuffer(subProtocol, response.data);
306
- const isValid = await responseValidator(requests[index], object, peer);
307
-
308
- if (isValid) {
309
- peerResults.push({ index, response: object });
310
- }
311
- }
312
- }
313
-
314
- return { peer, results: peerResults };
315
- } catch (error) {
316
- this.logger.debug(`Failed batch request to peer ${peerAsString}:`, error);
317
- batchSampler.removePeerAndReplace(peer);
318
- return { peer, results: [] };
319
- }
320
- }),
321
- );
322
-
323
- // Process results
324
- for (const { results } of batchResults) {
325
- for (const { index, response } of results) {
326
- if (response) {
327
- responses[index] = response;
328
- pendingRequestIndices.delete(index);
329
- }
330
- }
331
- }
332
-
333
- retryAttempts++;
334
- }
335
-
336
- if (retryAttempts >= maxRetryAttempts) {
337
- this.logger.debug(`Max retry attempts ${maxRetryAttempts} reached for batch request`);
338
- }
339
-
340
- return responses;
341
- };
342
-
343
- try {
344
- return await executeTimeout<InstanceType<SubProtocolMap[SubProtocol]['response']>[]>(
345
- requestFunction,
346
- timeoutMs,
347
- () => new CollectiveReqRespTimeoutError(),
348
- );
349
- } catch (e: any) {
350
- this.logger.debug(`${e.message} | subProtocol: ${subProtocol}`);
351
- return [];
352
- }
353
- }
354
-
355
181
  /**
356
182
  * Sends a request to a specific peer
357
183
  *
@@ -387,10 +213,18 @@ export class ReqResp implements ReqRespInterface {
387
213
  payload: Buffer,
388
214
  dialTimeout: number = this.dialTimeoutMs,
389
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
+
390
221
  let stream: Stream | undefined;
391
222
  try {
392
223
  this.metrics.recordRequestSent(subProtocol);
393
224
 
225
+ // Calculate expected response size based on the request payload
226
+ const expectedSizeKb = subProtocolSizeCalculators[subProtocol](payload);
227
+
394
228
  this.logger.trace(`Sending request to peer ${peerId.toString()} on sub protocol ${subProtocol}`);
395
229
  stream = await this.connectionSampler.dialProtocol(peerId, subProtocol, dialTimeout);
396
230
  this.logger.trace(
@@ -398,17 +232,21 @@ export class ReqResp implements ReqRespInterface {
398
232
  );
399
233
 
400
234
  const timeoutErr = new IndividualReqRespTimeoutError();
235
+ // Create a wrapper to pass the expected size to readMessage
236
+ const readMessageWithSizeLimit = (source: AsyncIterable<Uint8ArrayList>) =>
237
+ this.readMessage(source, expectedSizeKb);
401
238
  const [_, resp] = await executeTimeout(
402
239
  signal =>
403
240
  Promise.all([
404
241
  pipeline([payload], stream!.sink, { signal }),
405
- pipeline(stream!.source, this.readMessage.bind(this), { signal }),
242
+ pipeline(stream!.source, readMessageWithSizeLimit, { signal }),
406
243
  ]),
407
244
  this.individualRequestTimeoutMs,
408
245
  () => timeoutErr,
409
246
  );
410
247
  return resp;
411
248
  } catch (e: any) {
249
+ this.logger.debug(`SUBPROTOCOL: ${subProtocol}\n`, e);
412
250
  // On error we immediately abort the stream, this is preferred way,
413
251
  // because it signals to the sender that error happened, whereas
414
252
  // closing the stream only closes our side and is much slower
@@ -463,15 +301,36 @@ export class ReqResp implements ReqRespInterface {
463
301
  * The message is split into two components
464
302
  * - The first chunk should contain a control byte, indicating the status of the response see `ReqRespStatus`
465
303
  * - The second chunk should contain the response data
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
+ *
313
+ * @param source - The async iterable source of data chunks
314
+ * @param maxSizeKb - Optional maximum expected size in KB for the decompressed response
466
315
  */
467
- private async readMessage(source: AsyncIterable<Uint8ArrayList>): Promise<ReqRespResponse> {
316
+ private async readMessage(source: AsyncIterable<Uint8ArrayList>, maxSizeKb?: number): Promise<ReqRespResponse> {
468
317
  let status: ReqRespStatus | undefined;
469
318
  const chunks: Uint8Array[] = [];
470
319
 
320
+ const maxAccumulatedBytes = (maxSizeKb ?? DEFAULT_MAX_RESPONSE_SIZE_KB) * 1024 * 2;
321
+ let accumulatedBytes = 0;
322
+
471
323
  try {
472
324
  for await (const chunk of source) {
473
325
  const statusParsed = status !== undefined;
474
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
+ }
475
334
  chunks.push(chunk.subarray());
476
335
  continue;
477
336
  }
@@ -489,23 +348,17 @@ export class ReqResp implements ReqRespInterface {
489
348
  }
490
349
 
491
350
  const messageData = Buffer.concat(chunks);
492
- const message: Buffer = this.snappyTransform.inboundTransformData(messageData);
351
+ const message: Buffer = this.snappyTransform.inboundTransformData(messageData, undefined, maxSizeKb);
493
352
 
494
353
  return {
495
354
  status: status ?? ReqRespStatus.UNKNOWN,
496
355
  data: message,
497
356
  };
498
357
  } catch (e: any) {
358
+ // All errors (invalid status bytes, oversized snappy responses, corrupt data, etc.)
359
+ // are re-thrown so the caller can penalize the peer via handleResponseError.
499
360
  this.logger.debug(`Reading message failed: ${e.message}`);
500
-
501
- let status = ReqRespStatus.UNKNOWN;
502
- if (e instanceof ReqRespStatusError) {
503
- status = e.status;
504
- }
505
-
506
- return {
507
- status,
508
- };
361
+ throw e;
509
362
  }
510
363
  }
511
364
 
@@ -545,6 +398,15 @@ export class ReqResp implements ReqRespInterface {
545
398
  throw new ReqRespStatusError(ReqRespStatus.RATE_LIMIT_EXCEEDED);
546
399
  }
547
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
+
548
410
  await this.processStream(protocol, incomingStream);
549
411
  } catch (err: any) {
550
412
  this.metrics.recordResponseError(protocol);
@@ -570,7 +432,9 @@ export class ReqResp implements ReqRespInterface {
570
432
  // and that this stream should be dropped
571
433
  const isMessageToNotWarn =
572
434
  err instanceof Error &&
573
- ['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
+ );
574
438
  const level = isMessageToNotWarn ? 'debug' : 'warn';
575
439
  this.logger[level]('Unknown stream error while handling the stream, aborting', {
576
440
  protocol,
@@ -605,6 +469,9 @@ export class ReqResp implements ReqRespInterface {
605
469
  await pipeline(
606
470
  stream.source,
607
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.
608
475
  for await (const chunk of source) {
609
476
  const response = await handler(connection.remotePeer, chunk.subarray());
610
477
 
@@ -619,6 +486,7 @@ export class ReqResp implements ReqRespInterface {
619
486
 
620
487
  yield SUCCESS;
621
488
  yield snappy.outboundTransformData(response);
489
+ return;
622
490
  }
623
491
  },
624
492
  stream.sink,
@@ -687,13 +555,13 @@ export class ReqResp implements ReqRespInterface {
687
555
  ): PeerErrorSeverity | undefined {
688
556
  const logTags = { peerId: peerId.toString(), subProtocol };
689
557
 
690
- //Punishable error - peer should never send badly formed request
558
+ // Punishable error - peer should never send badly formed request
691
559
  if (e instanceof ReqRespStatusError && e.status === ReqRespStatus.BADLY_FORMED_REQUEST) {
692
560
  this.logger.debug(`Punishable error in ${subProtocol}: ${e.cause}`, logTags);
693
561
  return PeerErrorSeverity.LowToleranceError;
694
562
  }
695
563
 
696
- //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
697
565
  return undefined;
698
566
  }
699
567
 
@@ -715,10 +583,25 @@ export class ReqResp implements ReqRespInterface {
715
583
  return undefined;
716
584
  }
717
585
 
718
- // We do not punish a collective timeout, as the node triggers this interupt, independent of the peer's behaviour
719
- if (e instanceof CollectiveReqRespTimeoutError || e instanceof InvalidResponseError) {
720
- this.logger.debug(`Non-punishable error in ${subProtocol}: ${e.message}`, logTags);
721
- return undefined;
586
+ // Invalid status byte: the peer sent a status byte that doesn't match any known status code.
587
+ // This is a protocol violation, penalize harshly.
588
+ if (e instanceof ReqRespStatusError) {
589
+ this.logger.warn(`Invalid status byte from peer ${peerId.toString()} in ${subProtocol}: ${e.message}`, logTags);
590
+ return PeerErrorSeverity.LowToleranceError;
591
+ }
592
+
593
+ // Oversized snappy response: the peer is sending data that exceeds the allowed size.
594
+ // This is a protocol violation that wastes bandwidth, so penalize harshly.
595
+ if (e instanceof OversizedSnappyResponseError) {
596
+ this.logger.warn(`Oversized response from peer ${peerId.toString()} in ${subProtocol}: ${e.message}`, logTags);
597
+ return PeerErrorSeverity.LowToleranceError;
598
+ }
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;
722
605
  }
723
606
 
724
607
  return this.categorizeConnectionErrors(e, peerId, subProtocol);
@@ -726,7 +609,8 @@ export class ReqResp implements ReqRespInterface {
726
609
 
727
610
  /*
728
611
  * Errors specific to connection handling
729
- * These can happen both when sending request and response*/
612
+ * These can happen both when sending request and response.
613
+ */
730
614
  private categorizeConnectionErrors(
731
615
  e: any,
732
616
  peerId: PeerId,
@@ -1,20 +1,23 @@
1
+ import type { SlotNumber } from '@aztec/foundation/branded-types';
1
2
  import type { EthAddress } from '@aztec/foundation/eth-address';
2
3
  import type { PeerInfo } from '@aztec/stdlib/interfaces/server';
3
- import type { BlockProposal, CheckpointAttestation, CheckpointProposalCore, Gossipable } from '@aztec/stdlib/p2p';
4
+ import type {
5
+ BlockProposal,
6
+ CheckpointAttestation,
7
+ CheckpointProposalCore,
8
+ Gossipable,
9
+ TopicType,
10
+ } from '@aztec/stdlib/p2p';
4
11
  import type { Tx } from '@aztec/stdlib/tx';
5
12
 
6
13
  import type { PeerId } from '@libp2p/interface';
7
14
  import type { ENR } from '@nethermindeth/enr';
8
15
  import type EventEmitter from 'events';
9
16
 
17
+ import type { BatchTxRequesterLibP2PService } from './reqresp/batch-tx-requester/interface.js';
10
18
  import type { P2PReqRespConfig } from './reqresp/config.js';
11
19
  import type { StatusMessage } from './reqresp/index.js';
12
- import type {
13
- ReqRespSubProtocol,
14
- ReqRespSubProtocolHandler,
15
- ReqRespSubProtocolValidators,
16
- SubProtocolMap,
17
- } from './reqresp/interface.js';
20
+ import type { ReqRespSubProtocol, ReqRespSubProtocolHandler } from './reqresp/interface.js';
18
21
  import type { AuthRequest, AuthResponse } from './reqresp/protocols/auth.js';
19
22
 
20
23
  export enum PeerDiscoveryState {
@@ -42,6 +45,47 @@ export type P2PCheckpointReceivedCallback = (
42
45
 
43
46
  export type AuthReceivedCallback = (peerId: PeerId, authRequest: AuthRequest) => Promise<AuthResponse | undefined>;
44
47
 
48
+ /** Minimal info passed to the duplicate proposal callback. */
49
+ export type DuplicateProposalInfo = {
50
+ slot: SlotNumber;
51
+ proposer: EthAddress;
52
+ type: 'checkpoint' | 'block';
53
+ };
54
+
55
+ /**
56
+ * Callback for when a duplicate proposal is detected (equivocation).
57
+ * Invoked on the first duplicate (when count goes from 1 to 2).
58
+ */
59
+ export type P2PDuplicateProposalCallback = (info: DuplicateProposalInfo) => void;
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
+
74
+ /** Minimal info passed to the duplicate attestation callback. */
75
+ export type DuplicateAttestationInfo = {
76
+ slot: SlotNumber;
77
+ attester: EthAddress;
78
+ };
79
+
80
+ /**
81
+ * Callback for when a duplicate attestation is detected (equivocation).
82
+ * A validator signing attestations for different proposals at the same slot.
83
+ * Invoked on the first duplicate (when count goes from 1 to 2).
84
+ */
85
+ export type P2PDuplicateAttestationCallback = (info: DuplicateAttestationInfo) => void;
86
+
87
+ export type P2PCheckpointAttestationCallback = (attestation: CheckpointAttestation) => void;
88
+
45
89
  /**
46
90
  * The interface for a P2P service implementation.
47
91
  */
@@ -64,38 +108,44 @@ export interface P2PService {
64
108
  */
65
109
  propagate<T extends Gossipable>(message: T): Promise<void>;
66
110
 
111
+ // Leaky abstraction: fix https://github.com/AztecProtocol/aztec-packages/issues/7963
112
+ registerBlockReceivedCallback(callback: P2PBlockReceivedCallback): void;
113
+
114
+ registerValidatorCheckpointReceivedCallback(callback: P2PCheckpointReceivedCallback): void;
115
+
116
+ registerAllNodesCheckpointReceivedCallback(callback: P2PCheckpointReceivedCallback): void;
117
+
67
118
  /**
68
- * Send a batch of requests to peers, and return the responses
69
- *
70
- * @param protocol - The request response protocol to use
71
- * @param requests - The requests to send to the peers
72
- * @returns The responses to the requests
119
+ * Registers a callback invoked when a duplicate proposal is detected (equivocation).
120
+ * The callback is triggered on the first duplicate (when count goes from 1 to 2).
73
121
  */
74
- sendBatchRequest<Protocol extends ReqRespSubProtocol>(
75
- protocol: Protocol,
76
- requests: InstanceType<SubProtocolMap[Protocol]['request']>[],
77
- pinnedPeerId?: PeerId,
78
- timeoutMs?: number,
79
- maxPeers?: number,
80
- maxRetryAttempts?: number,
81
- ): Promise<InstanceType<SubProtocolMap[Protocol]['response']>[]>;
122
+ registerDuplicateProposalCallback(callback: P2PDuplicateProposalCallback): void;
82
123
 
83
- // Leaky abstraction: fix https://github.com/AztecProtocol/aztec-packages/issues/7963
84
- registerBlockReceivedCallback(callback: P2PBlockReceivedCallback): void;
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
+
130
+ /**
131
+ * Registers a callback invoked when a duplicate attestation is detected (equivocation).
132
+ * A validator signing attestations for different proposals at the same slot.
133
+ * The callback is triggered on the first duplicate (when count goes from 1 to 2).
134
+ */
135
+ registerDuplicateAttestationCallback(callback: P2PDuplicateAttestationCallback): void;
85
136
 
86
- registerCheckpointReceivedCallback(callback: P2PCheckpointReceivedCallback): void;
137
+ registerCheckpointAttestationCallback(callback: P2PCheckpointAttestationCallback): void;
87
138
 
88
139
  getEnr(): ENR | undefined;
89
140
 
90
141
  getPeers(includePending?: boolean): PeerInfo[];
91
142
 
92
- validate(txs: Tx[]): Promise<void>;
143
+ /** Returns the number of peers in the GossipSub mesh for a given topic type. */
144
+ getGossipMeshPeerCount(topicType: TopicType): number;
93
145
 
94
- addReqRespSubProtocol(
95
- subProtocol: ReqRespSubProtocol,
96
- handler: ReqRespSubProtocolHandler,
97
- validator?: ReqRespSubProtocolValidators[ReqRespSubProtocol],
98
- ): Promise<void>;
146
+ validateTxsReceivedInBlockProposal(txs: Tx[]): Promise<void>;
147
+
148
+ addReqRespSubProtocol(subProtocol: ReqRespSubProtocol, handler: ReqRespSubProtocolHandler): Promise<void>;
99
149
 
100
150
  handleAuthRequestFromPeer(authRequest: AuthRequest, peerId: PeerId): Promise<StatusMessage>;
101
151
 
@@ -103,6 +153,9 @@ export interface P2PService {
103
153
 
104
154
  /** If node running this P2P stack is validator, passes in validator address to P2P layer */
105
155
  registerThisValidatorAddresses(address: EthAddress[]): void;
156
+
157
+ /** Get BatchTxRequester service dependencies */
158
+ getBatchTxRequesterService(): BatchTxRequesterLibP2PService;
106
159
  }
107
160
 
108
161
  /**
@@ -143,6 +196,9 @@ export interface PeerDiscoveryService extends EventEmitter {
143
196
  on(event: 'peer:discovered', listener: (enr: ENR) => void): this;
144
197
  emit(event: 'peer:discovered', enr: ENR): boolean;
145
198
 
199
+ on(event: 'ip:changed', listener: (ip: string) => void): this;
200
+ emit(event: 'ip:changed', ip: string): boolean;
201
+
146
202
  getStatus(): PeerDiscoveryState;
147
203
 
148
204
  getEnr(): ENR | undefined;