@aztec/p2p 0.0.1-commit.c7c42ec → 0.0.1-commit.cf93bcc56

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 (513) hide show
  1. package/dest/bootstrap/bootstrap.d.ts +4 -3
  2. package/dest/bootstrap/bootstrap.d.ts.map +1 -1
  3. package/dest/bootstrap/bootstrap.js +4 -4
  4. package/dest/client/factory.d.ts +7 -6
  5. package/dest/client/factory.d.ts.map +1 -1
  6. package/dest/client/factory.js +52 -14
  7. package/dest/client/interface.d.ts +56 -25
  8. package/dest/client/interface.d.ts.map +1 -1
  9. package/dest/client/p2p_client.d.ts +44 -51
  10. package/dest/client/p2p_client.d.ts.map +1 -1
  11. package/dest/client/p2p_client.js +579 -259
  12. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts +2 -0
  13. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts.map +1 -0
  14. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +305 -0
  15. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts +73 -0
  16. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts.map +1 -0
  17. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.js +8 -0
  18. package/dest/config.d.ts +33 -3
  19. package/dest/config.d.ts.map +1 -1
  20. package/dest/config.js +23 -4
  21. package/dest/errors/tx-pool.error.d.ts +8 -0
  22. package/dest/errors/tx-pool.error.d.ts.map +1 -0
  23. package/dest/errors/tx-pool.error.js +9 -0
  24. package/dest/index.d.ts +2 -1
  25. package/dest/index.d.ts.map +1 -1
  26. package/dest/index.js +1 -0
  27. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +111 -76
  28. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  29. package/dest/mem_pools/attestation_pool/attestation_pool.js +441 -3
  30. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +2 -2
  31. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
  32. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +527 -287
  33. package/dest/mem_pools/attestation_pool/index.d.ts +2 -3
  34. package/dest/mem_pools/attestation_pool/index.d.ts.map +1 -1
  35. package/dest/mem_pools/attestation_pool/index.js +1 -2
  36. package/dest/mem_pools/attestation_pool/mocks.d.ts +9 -6
  37. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  38. package/dest/mem_pools/attestation_pool/mocks.js +16 -12
  39. package/dest/mem_pools/index.d.ts +3 -2
  40. package/dest/mem_pools/index.d.ts.map +1 -1
  41. package/dest/mem_pools/index.js +1 -1
  42. package/dest/mem_pools/instrumentation.d.ts +1 -1
  43. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  44. package/dest/mem_pools/instrumentation.js +5 -14
  45. package/dest/mem_pools/interface.d.ts +5 -5
  46. package/dest/mem_pools/interface.d.ts.map +1 -1
  47. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +15 -10
  48. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +1 -1
  49. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +91 -50
  50. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +19 -5
  51. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +1 -1
  52. package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +59 -3
  53. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +79 -5
  54. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +1 -1
  55. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +47 -0
  56. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +16 -0
  57. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -0
  58. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +122 -0
  59. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +2 -2
  60. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -1
  61. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +3 -3
  62. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +4 -4
  63. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -1
  64. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +2 -0
  65. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +2 -2
  66. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +1 -1
  67. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +25 -0
  68. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +1 -0
  69. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +57 -0
  70. package/dest/mem_pools/tx_pool_v2/archive/index.d.ts +2 -0
  71. package/dest/mem_pools/tx_pool_v2/archive/index.d.ts.map +1 -0
  72. package/dest/mem_pools/tx_pool_v2/archive/index.js +1 -0
  73. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts +43 -0
  74. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts.map +1 -0
  75. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.js +103 -0
  76. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +104 -0
  77. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -0
  78. package/dest/mem_pools/tx_pool_v2/deleted_pool.js +251 -0
  79. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts +47 -0
  80. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts.map +1 -0
  81. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.js +128 -0
  82. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +17 -0
  83. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -0
  84. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +93 -0
  85. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +19 -0
  86. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -0
  87. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +95 -0
  88. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +10 -0
  89. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -0
  90. package/dest/mem_pools/tx_pool_v2/eviction/index.js +11 -0
  91. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +174 -0
  92. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -0
  93. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.js +25 -0
  94. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts +15 -0
  95. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -0
  96. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +65 -0
  97. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts +17 -0
  98. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -0
  99. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +93 -0
  100. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +16 -0
  101. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -0
  102. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +74 -0
  103. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +20 -0
  104. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -0
  105. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +73 -0
  106. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +15 -0
  107. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -0
  108. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +19 -0
  109. package/dest/mem_pools/tx_pool_v2/index.d.ts +6 -0
  110. package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -0
  111. package/dest/mem_pools/tx_pool_v2/index.js +5 -0
  112. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts +15 -0
  113. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts.map +1 -0
  114. package/dest/mem_pools/tx_pool_v2/instrumentation.js +43 -0
  115. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +207 -0
  116. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -0
  117. package/dest/mem_pools/tx_pool_v2/interfaces.js +8 -0
  118. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +97 -0
  119. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -0
  120. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +152 -0
  121. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts +26 -0
  122. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts.map +1 -0
  123. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.js +70 -0
  124. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +108 -0
  125. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -0
  126. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +355 -0
  127. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +58 -0
  128. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -0
  129. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +161 -0
  130. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +75 -0
  131. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -0
  132. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +871 -0
  133. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +4 -4
  134. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  135. package/dest/msg_validators/attestation_validator/attestation_validator.js +51 -18
  136. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +7 -7
  137. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
  138. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +22 -13
  139. package/dest/msg_validators/clock_tolerance.d.ts +21 -0
  140. package/dest/msg_validators/clock_tolerance.d.ts.map +1 -0
  141. package/dest/msg_validators/clock_tolerance.js +37 -0
  142. package/dest/msg_validators/index.d.ts +2 -2
  143. package/dest/msg_validators/index.d.ts.map +1 -1
  144. package/dest/msg_validators/index.js +1 -1
  145. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +9 -0
  146. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -0
  147. package/dest/msg_validators/proposal_validator/block_proposal_validator.js +6 -0
  148. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +9 -0
  149. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -0
  150. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +6 -0
  151. package/dest/msg_validators/proposal_validator/index.d.ts +4 -0
  152. package/dest/msg_validators/proposal_validator/index.d.ts.map +1 -0
  153. package/dest/msg_validators/proposal_validator/index.js +3 -0
  154. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +13 -0
  155. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -0
  156. package/dest/msg_validators/proposal_validator/proposal_validator.js +104 -0
  157. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +23 -0
  158. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +1 -0
  159. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +212 -0
  160. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +3 -3
  161. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  162. package/dest/msg_validators/tx_validator/archive_cache.d.ts +3 -3
  163. package/dest/msg_validators/tx_validator/archive_cache.d.ts.map +1 -1
  164. package/dest/msg_validators/tx_validator/archive_cache.js +1 -1
  165. package/dest/msg_validators/tx_validator/block_header_validator.d.ts +20 -6
  166. package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
  167. package/dest/msg_validators/tx_validator/block_header_validator.js +4 -3
  168. package/dest/msg_validators/tx_validator/data_validator.d.ts +3 -1
  169. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  170. package/dest/msg_validators/tx_validator/data_validator.js +4 -1
  171. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +15 -4
  172. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
  173. package/dest/msg_validators/tx_validator/double_spend_validator.js +7 -6
  174. package/dest/msg_validators/tx_validator/factory.d.ts +8 -3
  175. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  176. package/dest/msg_validators/tx_validator/factory.js +21 -11
  177. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +10 -0
  178. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -0
  179. package/dest/msg_validators/tx_validator/fee_payer_balance.js +20 -0
  180. package/dest/msg_validators/tx_validator/gas_validator.d.ts +3 -2
  181. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  182. package/dest/msg_validators/tx_validator/gas_validator.js +11 -16
  183. package/dest/msg_validators/tx_validator/index.d.ts +2 -1
  184. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  185. package/dest/msg_validators/tx_validator/index.js +1 -0
  186. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +3 -2
  187. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  188. package/dest/msg_validators/tx_validator/metadata_validator.js +2 -2
  189. package/dest/msg_validators/tx_validator/phases_validator.d.ts +3 -2
  190. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
  191. package/dest/msg_validators/tx_validator/phases_validator.js +3 -3
  192. package/dest/msg_validators/tx_validator/size_validator.d.ts +8 -0
  193. package/dest/msg_validators/tx_validator/size_validator.d.ts.map +1 -0
  194. package/dest/msg_validators/tx_validator/size_validator.js +23 -0
  195. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +22 -5
  196. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
  197. package/dest/msg_validators/tx_validator/timestamp_validator.js +8 -8
  198. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts +3 -2
  199. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts.map +1 -1
  200. package/dest/msg_validators/tx_validator/tx_permitted_validator.js +2 -2
  201. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +3 -2
  202. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
  203. package/dest/msg_validators/tx_validator/tx_proof_validator.js +2 -2
  204. package/dest/services/data_store.d.ts +1 -1
  205. package/dest/services/data_store.d.ts.map +1 -1
  206. package/dest/services/data_store.js +10 -6
  207. package/dest/services/discv5/discV5_service.js +1 -1
  208. package/dest/services/dummy_service.d.ts +26 -2
  209. package/dest/services/dummy_service.d.ts.map +1 -1
  210. package/dest/services/dummy_service.js +48 -0
  211. package/dest/services/encoding.d.ts +2 -2
  212. package/dest/services/encoding.d.ts.map +1 -1
  213. package/dest/services/encoding.js +9 -7
  214. package/dest/services/gossipsub/index.d.ts +3 -0
  215. package/dest/services/gossipsub/index.d.ts.map +1 -0
  216. package/dest/services/gossipsub/index.js +2 -0
  217. package/dest/services/gossipsub/scoring.d.ts +21 -3
  218. package/dest/services/gossipsub/scoring.d.ts.map +1 -1
  219. package/dest/services/gossipsub/scoring.js +24 -7
  220. package/dest/services/gossipsub/topic_score_params.d.ts +161 -0
  221. package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -0
  222. package/dest/services/gossipsub/topic_score_params.js +324 -0
  223. package/dest/services/index.d.ts +2 -1
  224. package/dest/services/index.d.ts.map +1 -1
  225. package/dest/services/index.js +1 -0
  226. package/dest/services/libp2p/instrumentation.d.ts +1 -1
  227. package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
  228. package/dest/services/libp2p/instrumentation.js +30 -72
  229. package/dest/services/libp2p/libp2p_service.d.ts +105 -33
  230. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  231. package/dest/services/libp2p/libp2p_service.js +980 -317
  232. package/dest/services/peer-manager/metrics.d.ts +2 -2
  233. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  234. package/dest/services/peer-manager/metrics.js +21 -26
  235. package/dest/services/peer-manager/peer_manager.d.ts +2 -2
  236. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  237. package/dest/services/peer-manager/peer_manager.js +0 -10
  238. package/dest/services/peer-manager/peer_scoring.d.ts +1 -1
  239. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  240. package/dest/services/peer-manager/peer_scoring.js +32 -6
  241. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +47 -0
  242. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -0
  243. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +566 -0
  244. package/dest/services/reqresp/batch-tx-requester/config.d.ts +17 -0
  245. package/dest/services/reqresp/batch-tx-requester/config.d.ts.map +1 -0
  246. package/dest/services/reqresp/batch-tx-requester/config.js +27 -0
  247. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +50 -0
  248. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -0
  249. package/dest/services/reqresp/batch-tx-requester/interface.js +1 -0
  250. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +37 -0
  251. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -0
  252. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +151 -0
  253. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +54 -0
  254. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -0
  255. package/dest/services/reqresp/batch-tx-requester/peer_collection.js +139 -0
  256. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +20 -0
  257. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -0
  258. package/dest/services/reqresp/batch-tx-requester/tx_validator.js +21 -0
  259. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +22 -3
  260. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +1 -1
  261. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +63 -4
  262. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +2 -1
  263. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -1
  264. package/dest/services/reqresp/connection-sampler/connection_sampler.js +12 -0
  265. package/dest/services/reqresp/constants.d.ts +12 -0
  266. package/dest/services/reqresp/constants.d.ts.map +1 -0
  267. package/dest/services/reqresp/constants.js +7 -0
  268. package/dest/services/reqresp/interface.d.ts +12 -1
  269. package/dest/services/reqresp/interface.d.ts.map +1 -1
  270. package/dest/services/reqresp/interface.js +15 -1
  271. package/dest/services/reqresp/metrics.d.ts +6 -5
  272. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  273. package/dest/services/reqresp/metrics.js +17 -21
  274. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +5 -1
  275. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -1
  276. package/dest/services/reqresp/protocols/block_txs/bitvector.js +12 -0
  277. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +7 -5
  278. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
  279. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +27 -9
  280. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +29 -6
  281. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
  282. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +59 -13
  283. package/dest/services/reqresp/protocols/status.d.ts +1 -1
  284. package/dest/services/reqresp/protocols/status.d.ts.map +1 -1
  285. package/dest/services/reqresp/protocols/status.js +4 -1
  286. package/dest/services/reqresp/protocols/tx.d.ts +7 -1
  287. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  288. package/dest/services/reqresp/protocols/tx.js +20 -0
  289. package/dest/services/reqresp/reqresp.d.ts +6 -1
  290. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  291. package/dest/services/reqresp/reqresp.js +471 -50
  292. package/dest/services/service.d.ts +53 -3
  293. package/dest/services/service.d.ts.map +1 -1
  294. package/dest/services/tx_collection/config.d.ts +22 -1
  295. package/dest/services/tx_collection/config.d.ts.map +1 -1
  296. package/dest/services/tx_collection/config.js +55 -1
  297. package/dest/services/tx_collection/fast_tx_collection.d.ts +7 -4
  298. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
  299. package/dest/services/tx_collection/fast_tx_collection.js +34 -13
  300. package/dest/services/tx_collection/file_store_tx_collection.d.ts +53 -0
  301. package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -0
  302. package/dest/services/tx_collection/file_store_tx_collection.js +165 -0
  303. package/dest/services/tx_collection/file_store_tx_source.d.ts +37 -0
  304. package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -0
  305. package/dest/services/tx_collection/file_store_tx_source.js +79 -0
  306. package/dest/services/tx_collection/index.d.ts +3 -1
  307. package/dest/services/tx_collection/index.d.ts.map +1 -1
  308. package/dest/services/tx_collection/index.js +2 -0
  309. package/dest/services/tx_collection/instrumentation.d.ts +1 -1
  310. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
  311. package/dest/services/tx_collection/instrumentation.js +11 -13
  312. package/dest/services/tx_collection/proposal_tx_collector.d.ts +48 -0
  313. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -0
  314. package/dest/services/tx_collection/proposal_tx_collector.js +49 -0
  315. package/dest/services/tx_collection/slow_tx_collection.d.ts +8 -4
  316. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -1
  317. package/dest/services/tx_collection/slow_tx_collection.js +55 -23
  318. package/dest/services/tx_collection/tx_collection.d.ts +25 -13
  319. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  320. package/dest/services/tx_collection/tx_collection.js +79 -7
  321. package/dest/services/tx_collection/tx_collection_sink.d.ts +15 -6
  322. package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -1
  323. package/dest/services/tx_collection/tx_collection_sink.js +13 -7
  324. package/dest/services/tx_file_store/config.d.ts +16 -0
  325. package/dest/services/tx_file_store/config.d.ts.map +1 -0
  326. package/dest/services/tx_file_store/config.js +22 -0
  327. package/dest/services/tx_file_store/index.d.ts +4 -0
  328. package/dest/services/tx_file_store/index.d.ts.map +1 -0
  329. package/dest/services/tx_file_store/index.js +3 -0
  330. package/dest/services/tx_file_store/instrumentation.d.ts +15 -0
  331. package/dest/services/tx_file_store/instrumentation.d.ts.map +1 -0
  332. package/dest/services/tx_file_store/instrumentation.js +29 -0
  333. package/dest/services/tx_file_store/tx_file_store.d.ts +48 -0
  334. package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -0
  335. package/dest/services/tx_file_store/tx_file_store.js +152 -0
  336. package/dest/services/tx_provider.d.ts +5 -5
  337. package/dest/services/tx_provider.d.ts.map +1 -1
  338. package/dest/services/tx_provider.js +5 -4
  339. package/dest/services/tx_provider_instrumentation.d.ts +1 -1
  340. package/dest/services/tx_provider_instrumentation.d.ts.map +1 -1
  341. package/dest/services/tx_provider_instrumentation.js +7 -20
  342. package/dest/test-helpers/index.d.ts +3 -1
  343. package/dest/test-helpers/index.d.ts.map +1 -1
  344. package/dest/test-helpers/index.js +2 -0
  345. package/dest/test-helpers/make-test-p2p-clients.d.ts +3 -3
  346. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  347. package/dest/test-helpers/mock-pubsub.d.ts +27 -1
  348. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  349. package/dest/test-helpers/mock-pubsub.js +97 -2
  350. package/dest/test-helpers/reqresp-nodes.d.ts +1 -1
  351. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  352. package/dest/test-helpers/reqresp-nodes.js +2 -1
  353. package/dest/test-helpers/test_tx_provider.d.ts +40 -0
  354. package/dest/test-helpers/test_tx_provider.d.ts.map +1 -0
  355. package/dest/test-helpers/test_tx_provider.js +41 -0
  356. package/dest/test-helpers/testbench-utils.d.ts +161 -0
  357. package/dest/test-helpers/testbench-utils.d.ts.map +1 -0
  358. package/dest/test-helpers/testbench-utils.js +366 -0
  359. package/dest/testbench/p2p_client_testbench_worker.d.ts +28 -2
  360. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  361. package/dest/testbench/p2p_client_testbench_worker.js +219 -125
  362. package/dest/testbench/worker_client_manager.d.ts +51 -6
  363. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  364. package/dest/testbench/worker_client_manager.js +226 -39
  365. package/package.json +16 -16
  366. package/src/bootstrap/bootstrap.ts +7 -4
  367. package/src/client/factory.ts +95 -24
  368. package/src/client/interface.ts +67 -25
  369. package/src/client/p2p_client.ts +243 -291
  370. package/src/client/test/tx_proposal_collector/README.md +227 -0
  371. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +336 -0
  372. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.ts +43 -0
  373. package/src/config.ts +48 -4
  374. package/src/errors/tx-pool.error.ts +12 -0
  375. package/src/index.ts +1 -0
  376. package/src/mem_pools/attestation_pool/attestation_pool.ts +510 -78
  377. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +612 -320
  378. package/src/mem_pools/attestation_pool/index.ts +9 -2
  379. package/src/mem_pools/attestation_pool/mocks.ts +20 -13
  380. package/src/mem_pools/index.ts +4 -1
  381. package/src/mem_pools/instrumentation.ts +10 -18
  382. package/src/mem_pools/interface.ts +4 -4
  383. package/src/mem_pools/tx_pool/README.md +29 -14
  384. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +130 -75
  385. package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +66 -5
  386. package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +119 -4
  387. package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +162 -0
  388. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +3 -3
  389. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +4 -2
  390. package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +75 -0
  391. package/src/mem_pools/tx_pool_v2/README.md +275 -0
  392. package/src/mem_pools/tx_pool_v2/archive/index.ts +1 -0
  393. package/src/mem_pools/tx_pool_v2/archive/tx_archive.ts +120 -0
  394. package/src/mem_pools/tx_pool_v2/deleted_pool.ts +321 -0
  395. package/src/mem_pools/tx_pool_v2/eviction/eviction_manager.ts +160 -0
  396. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +121 -0
  397. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +122 -0
  398. package/src/mem_pools/tx_pool_v2/eviction/index.ts +27 -0
  399. package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +209 -0
  400. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +74 -0
  401. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +101 -0
  402. package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +87 -0
  403. package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +90 -0
  404. package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +31 -0
  405. package/src/mem_pools/tx_pool_v2/index.ts +12 -0
  406. package/src/mem_pools/tx_pool_v2/instrumentation.ts +69 -0
  407. package/src/mem_pools/tx_pool_v2/interfaces.ts +239 -0
  408. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +242 -0
  409. package/src/mem_pools/tx_pool_v2/tx_pool_bench_metrics.ts +77 -0
  410. package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +444 -0
  411. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +223 -0
  412. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +1042 -0
  413. package/src/msg_validators/attestation_validator/attestation_validator.ts +36 -21
  414. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +21 -18
  415. package/src/msg_validators/clock_tolerance.ts +51 -0
  416. package/src/msg_validators/index.ts +1 -1
  417. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +10 -0
  418. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +13 -0
  419. package/src/msg_validators/proposal_validator/index.ts +3 -0
  420. package/src/msg_validators/proposal_validator/proposal_validator.ts +92 -0
  421. package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +230 -0
  422. package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +2 -2
  423. package/src/msg_validators/tx_validator/archive_cache.ts +3 -3
  424. package/src/msg_validators/tx_validator/block_header_validator.ts +21 -8
  425. package/src/msg_validators/tx_validator/data_validator.ts +18 -6
  426. package/src/msg_validators/tx_validator/double_spend_validator.ts +15 -9
  427. package/src/msg_validators/tx_validator/factory.ts +64 -23
  428. package/src/msg_validators/tx_validator/fee_payer_balance.ts +40 -0
  429. package/src/msg_validators/tx_validator/gas_validator.ts +17 -28
  430. package/src/msg_validators/tx_validator/index.ts +1 -0
  431. package/src/msg_validators/tx_validator/metadata_validator.ts +18 -7
  432. package/src/msg_validators/tx_validator/phases_validator.ts +5 -3
  433. package/src/msg_validators/tx_validator/size_validator.ts +22 -0
  434. package/src/msg_validators/tx_validator/timestamp_validator.ts +29 -19
  435. package/src/msg_validators/tx_validator/tx_permitted_validator.ts +8 -3
  436. package/src/msg_validators/tx_validator/tx_proof_validator.ts +8 -3
  437. package/src/services/data_store.ts +10 -7
  438. package/src/services/discv5/discV5_service.ts +1 -1
  439. package/src/services/dummy_service.ts +63 -0
  440. package/src/services/encoding.ts +8 -6
  441. package/src/services/gossipsub/README.md +626 -0
  442. package/src/services/gossipsub/index.ts +2 -0
  443. package/src/services/gossipsub/scoring.ts +29 -5
  444. package/src/services/gossipsub/topic_score_params.ts +451 -0
  445. package/src/services/index.ts +1 -0
  446. package/src/services/libp2p/instrumentation.ts +32 -73
  447. package/src/services/libp2p/libp2p_service.ts +646 -301
  448. package/src/services/peer-manager/metrics.ts +22 -26
  449. package/src/services/peer-manager/peer_manager.ts +1 -2
  450. package/src/services/peer-manager/peer_scoring.ts +28 -4
  451. package/src/services/reqresp/batch-tx-requester/README.md +305 -0
  452. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +706 -0
  453. package/src/services/reqresp/batch-tx-requester/config.ts +40 -0
  454. package/src/services/reqresp/batch-tx-requester/interface.ts +57 -0
  455. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +209 -0
  456. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +205 -0
  457. package/src/services/reqresp/batch-tx-requester/tx_validator.ts +37 -0
  458. package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +65 -4
  459. package/src/services/reqresp/connection-sampler/connection_sampler.ts +19 -1
  460. package/src/services/reqresp/constants.ts +14 -0
  461. package/src/services/reqresp/interface.ts +29 -1
  462. package/src/services/reqresp/metrics.ts +36 -27
  463. package/src/services/reqresp/protocols/block_txs/bitvector.ts +16 -0
  464. package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +35 -12
  465. package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +74 -9
  466. package/src/services/reqresp/protocols/status.ts +7 -4
  467. package/src/services/reqresp/protocols/tx.ts +22 -0
  468. package/src/services/reqresp/reqresp.ts +79 -22
  469. package/src/services/service.ts +63 -4
  470. package/src/services/tx_collection/config.ts +83 -1
  471. package/src/services/tx_collection/fast_tx_collection.ts +44 -19
  472. package/src/services/tx_collection/file_store_tx_collection.ts +198 -0
  473. package/src/services/tx_collection/file_store_tx_source.ts +104 -0
  474. package/src/services/tx_collection/index.ts +6 -0
  475. package/src/services/tx_collection/instrumentation.ts +11 -13
  476. package/src/services/tx_collection/proposal_tx_collector.ts +112 -0
  477. package/src/services/tx_collection/slow_tx_collection.ts +66 -32
  478. package/src/services/tx_collection/tx_collection.ts +117 -21
  479. package/src/services/tx_collection/tx_collection_sink.ts +17 -7
  480. package/src/services/tx_file_store/config.ts +37 -0
  481. package/src/services/tx_file_store/index.ts +3 -0
  482. package/src/services/tx_file_store/instrumentation.ts +36 -0
  483. package/src/services/tx_file_store/tx_file_store.ts +175 -0
  484. package/src/services/tx_provider.ts +10 -9
  485. package/src/services/tx_provider_instrumentation.ts +13 -20
  486. package/src/test-helpers/index.ts +2 -0
  487. package/src/test-helpers/make-test-p2p-clients.ts +3 -3
  488. package/src/test-helpers/mock-pubsub.ts +133 -3
  489. package/src/test-helpers/reqresp-nodes.ts +2 -1
  490. package/src/test-helpers/test_tx_provider.ts +64 -0
  491. package/src/test-helpers/testbench-utils.ts +430 -0
  492. package/src/testbench/p2p_client_testbench_worker.ts +338 -120
  493. package/src/testbench/worker_client_manager.ts +304 -42
  494. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +0 -37
  495. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +0 -1
  496. package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +0 -213
  497. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +0 -30
  498. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +0 -1
  499. package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +0 -219
  500. package/dest/mem_pools/tx_pool/eviction/insufficient_fee_payer_balance_rule.d.ts +0 -15
  501. package/dest/mem_pools/tx_pool/eviction/insufficient_fee_payer_balance_rule.d.ts.map +0 -1
  502. package/dest/mem_pools/tx_pool/eviction/insufficient_fee_payer_balance_rule.js +0 -88
  503. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts +0 -12
  504. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts.map +0 -1
  505. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.js +0 -82
  506. package/dest/msg_validators/block_proposal_validator/index.d.ts +0 -2
  507. package/dest/msg_validators/block_proposal_validator/index.d.ts.map +0 -1
  508. package/dest/msg_validators/block_proposal_validator/index.js +0 -1
  509. package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +0 -298
  510. package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +0 -287
  511. package/src/mem_pools/tx_pool/eviction/insufficient_fee_payer_balance_rule.ts +0 -108
  512. package/src/msg_validators/block_proposal_validator/block_proposal_validator.ts +0 -97
  513. package/src/msg_validators/block_proposal_validator/index.ts +0 -1
@@ -36,6 +36,7 @@ import {
36
36
  type ReqRespSubProtocolValidators,
37
37
  type SubProtocolMap,
38
38
  responseFromBuffer,
39
+ subProtocolSizeCalculators,
39
40
  } from './interface.js';
40
41
  import { ReqRespMetrics } from './metrics.js';
41
42
  import {
@@ -111,6 +112,13 @@ export class ReqResp implements ReqRespInterface {
111
112
  return this.metrics.tracer;
112
113
  }
113
114
 
115
+ /**
116
+ * Get the connection sampler instance
117
+ */
118
+ getConnectionSampler(): Pick<ConnectionSampler, 'getPeerListSortedByConnectionCountAsc'> {
119
+ return this.connectionSampler;
120
+ }
121
+
114
122
  /**
115
123
  * Start the reqresp service
116
124
  */
@@ -212,6 +220,14 @@ export class ReqResp implements ReqRespInterface {
212
220
  const responseValidator = this.subProtocolValidators[subProtocol] ?? DEFAULT_SUB_PROTOCOL_VALIDATORS[subProtocol];
213
221
  const responses: InstanceType<SubProtocolMap[SubProtocol]['response']>[] = new Array(requests.length);
214
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
+ };
215
231
 
216
232
  const requestFunction = async (signal: AbortSignal) => {
217
233
  // Track which requests still need to be processed
@@ -252,7 +268,9 @@ export class ReqResp implements ReqRespInterface {
252
268
  for (const requestIndex of pendingRequestIndices) {
253
269
  const peer = batchSampler.getPeerForRequest(requestIndex);
254
270
  if (!peer) {
255
- break;
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;
256
274
  }
257
275
  const peerAsString = peer.toString();
258
276
  if (!requestBatches.has(peerAsString)) {
@@ -271,6 +289,12 @@ export class ReqResp implements ReqRespInterface {
271
289
  });
272
290
  }
273
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
+
274
298
  // Make parallel requests for each peer's batch
275
299
  // A batch entry will look something like this:
276
300
  // PeerId0: [0, 1, 2, 3]
@@ -282,38 +306,61 @@ export class ReqResp implements ReqRespInterface {
282
306
  const batchResults = await Promise.all(
283
307
  Array.from(requestBatches.entries()).map(async ([peerAsString, { peerId: peer, indices }]) => {
284
308
  try {
309
+ const markIndexFailed = (index: number) => batchSampler.markPeerFailedForIndex(peer, index);
285
310
  // Requests all going to the same peer are sent synchronously
286
311
  const peerResults: { index: number; response: InstanceType<SubProtocolMap[SubProtocol]['response']> }[] =
287
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
+
288
322
  for (const index of indices) {
289
- this.logger.trace(`Sending request ${index} to peer ${peerAsString}`);
323
+ this.logger.info(`Sending request ${index} to peer ${peerAsString}`);
290
324
  const response = await this.sendRequestToPeer(peer, subProtocol, requestBuffers[index]);
291
325
 
292
326
  // Check the status of the response buffer
293
327
  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 };
328
+ shouldReplacePeer = handleFailure(response.status, index);
329
+ if (shouldReplacePeer) {
330
+ break;
331
+ }
332
+ continue;
302
333
  }
303
334
 
304
- if (response && response.data.length > 0) {
305
- const object = responseFromBuffer(subProtocol, response.data);
306
- const isValid = await responseValidator(requests[index], object, peer);
335
+ if (response.data.length === 0) {
336
+ markIndexFailed(index);
337
+ continue;
338
+ }
307
339
 
308
- if (isValid) {
309
- peerResults.push({ index, response: object });
310
- }
340
+ const object = responseFromBuffer(subProtocol, response.data);
341
+ if (isEmptyResponse(object)) {
342
+ markIndexFailed(index);
343
+ continue;
311
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);
312
359
  }
313
360
 
314
361
  return { peer, results: peerResults };
315
362
  } catch (error) {
316
- this.logger.debug(`Failed batch request to peer ${peerAsString}:`, error);
363
+ this.logger.warn(`Failed batch request to peer ${peerAsString}:`, error);
317
364
  batchSampler.removePeerAndReplace(peer);
318
365
  return { peer, results: [] };
319
366
  }
@@ -334,7 +381,7 @@ export class ReqResp implements ReqRespInterface {
334
381
  }
335
382
 
336
383
  if (retryAttempts >= maxRetryAttempts) {
337
- this.logger.debug(`Max retry attempts ${maxRetryAttempts} reached for batch request`);
384
+ this.logger.warn(`Max retry attempts ${maxRetryAttempts} reached for batch request`);
338
385
  }
339
386
 
340
387
  return responses;
@@ -347,7 +394,7 @@ export class ReqResp implements ReqRespInterface {
347
394
  () => new CollectiveReqRespTimeoutError(),
348
395
  );
349
396
  } catch (e: any) {
350
- this.logger.debug(`${e.message} | subProtocol: ${subProtocol}`);
397
+ this.logger.warn(`${e.message} | subProtocol: ${subProtocol}`);
351
398
  return [];
352
399
  }
353
400
  }
@@ -391,6 +438,9 @@ export class ReqResp implements ReqRespInterface {
391
438
  try {
392
439
  this.metrics.recordRequestSent(subProtocol);
393
440
 
441
+ // Calculate expected response size based on the request payload
442
+ const expectedSizeKb = subProtocolSizeCalculators[subProtocol](payload);
443
+
394
444
  this.logger.trace(`Sending request to peer ${peerId.toString()} on sub protocol ${subProtocol}`);
395
445
  stream = await this.connectionSampler.dialProtocol(peerId, subProtocol, dialTimeout);
396
446
  this.logger.trace(
@@ -398,17 +448,21 @@ export class ReqResp implements ReqRespInterface {
398
448
  );
399
449
 
400
450
  const timeoutErr = new IndividualReqRespTimeoutError();
451
+ // Create a wrapper to pass the expected size to readMessage
452
+ const readMessageWithSizeLimit = (source: AsyncIterable<Uint8ArrayList>) =>
453
+ this.readMessage(source, expectedSizeKb);
401
454
  const [_, resp] = await executeTimeout(
402
455
  signal =>
403
456
  Promise.all([
404
457
  pipeline([payload], stream!.sink, { signal }),
405
- pipeline(stream!.source, this.readMessage.bind(this), { signal }),
458
+ pipeline(stream!.source, readMessageWithSizeLimit, { signal }),
406
459
  ]),
407
460
  this.individualRequestTimeoutMs,
408
461
  () => timeoutErr,
409
462
  );
410
463
  return resp;
411
464
  } catch (e: any) {
465
+ this.logger.warn(`SUBPROTOCOL: ${subProtocol}\n`, e);
412
466
  // On error we immediately abort the stream, this is preferred way,
413
467
  // because it signals to the sender that error happened, whereas
414
468
  // closing the stream only closes our side and is much slower
@@ -463,8 +517,11 @@ export class ReqResp implements ReqRespInterface {
463
517
  * The message is split into two components
464
518
  * - The first chunk should contain a control byte, indicating the status of the response see `ReqRespStatus`
465
519
  * - The second chunk should contain the response data
520
+ *
521
+ * @param source - The async iterable source of data chunks
522
+ * @param maxSizeKb - Optional maximum expected size in KB for the decompressed response
466
523
  */
467
- private async readMessage(source: AsyncIterable<Uint8ArrayList>): Promise<ReqRespResponse> {
524
+ private async readMessage(source: AsyncIterable<Uint8ArrayList>, maxSizeKb?: number): Promise<ReqRespResponse> {
468
525
  let status: ReqRespStatus | undefined;
469
526
  const chunks: Uint8Array[] = [];
470
527
 
@@ -489,7 +546,7 @@ export class ReqResp implements ReqRespInterface {
489
546
  }
490
547
 
491
548
  const messageData = Buffer.concat(chunks);
492
- const message: Buffer = this.snappyTransform.inboundTransformData(messageData);
549
+ const message: Buffer = this.snappyTransform.inboundTransformData(messageData, undefined, maxSizeKb);
493
550
 
494
551
  return {
495
552
  status: status ?? ReqRespStatus.UNKNOWN,
@@ -1,12 +1,14 @@
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 { BlockAttestation, BlockProposal, Gossipable } from '@aztec/stdlib/p2p';
4
+ import type { BlockProposal, CheckpointAttestation, CheckpointProposalCore, Gossipable } from '@aztec/stdlib/p2p';
4
5
  import type { Tx } from '@aztec/stdlib/tx';
5
6
 
6
7
  import type { PeerId } from '@libp2p/interface';
7
8
  import type { ENR } from '@nethermindeth/enr';
8
9
  import type EventEmitter from 'events';
9
10
 
11
+ import type { BatchTxRequesterLibP2PService } from './reqresp/batch-tx-requester/interface.js';
10
12
  import type { P2PReqRespConfig } from './reqresp/config.js';
11
13
  import type { StatusMessage } from './reqresp/index.js';
12
14
  import type {
@@ -22,13 +24,52 @@ export enum PeerDiscoveryState {
22
24
  STOPPED = 'stopped',
23
25
  }
24
26
 
25
- export type P2PBlockReceivedCallback = (
26
- block: BlockProposal,
27
+ /**
28
+ * Callback for when a block proposal is received.
29
+ * Validators validate but DO NOT attest to individual blocks - attestations are only for checkpoints.
30
+ * @returns true if the proposal is valid, false otherwise
31
+ */
32
+ export type P2PBlockReceivedCallback = (block: BlockProposal, sender: PeerId) => Promise<boolean>;
33
+
34
+ /**
35
+ * Callback for when a checkpoint proposal is received.
36
+ * The checkpoint proposal is passed as CheckpointProposalCore (without lastBlock) since
37
+ * the lastBlock is extracted and stored separately as a BlockProposal, and the block
38
+ * callback is invoked and awaited before this checkpoint callback.
39
+ */
40
+ export type P2PCheckpointReceivedCallback = (
41
+ checkpoint: CheckpointProposalCore,
27
42
  sender: PeerId,
28
- ) => Promise<BlockAttestation[] | undefined>;
43
+ ) => Promise<CheckpointAttestation[] | undefined>;
29
44
 
30
45
  export type AuthReceivedCallback = (peerId: PeerId, authRequest: AuthRequest) => Promise<AuthResponse | undefined>;
31
46
 
47
+ /** Minimal info passed to the duplicate proposal callback. */
48
+ export type DuplicateProposalInfo = {
49
+ slot: SlotNumber;
50
+ proposer: EthAddress;
51
+ type: 'checkpoint' | 'block';
52
+ };
53
+
54
+ /**
55
+ * Callback for when a duplicate proposal is detected (equivocation).
56
+ * Invoked on the first duplicate (when count goes from 1 to 2).
57
+ */
58
+ export type P2PDuplicateProposalCallback = (info: DuplicateProposalInfo) => void;
59
+
60
+ /** Minimal info passed to the duplicate attestation callback. */
61
+ export type DuplicateAttestationInfo = {
62
+ slot: SlotNumber;
63
+ attester: EthAddress;
64
+ };
65
+
66
+ /**
67
+ * Callback for when a duplicate attestation is detected (equivocation).
68
+ * A validator signing attestations for different proposals at the same slot.
69
+ * Invoked on the first duplicate (when count goes from 1 to 2).
70
+ */
71
+ export type P2PDuplicateAttestationCallback = (info: DuplicateAttestationInfo) => void;
72
+
32
73
  /**
33
74
  * The interface for a P2P service implementation.
34
75
  */
@@ -70,6 +111,21 @@ export interface P2PService {
70
111
  // Leaky abstraction: fix https://github.com/AztecProtocol/aztec-packages/issues/7963
71
112
  registerBlockReceivedCallback(callback: P2PBlockReceivedCallback): void;
72
113
 
114
+ registerCheckpointReceivedCallback(callback: P2PCheckpointReceivedCallback): void;
115
+
116
+ /**
117
+ * Registers a callback invoked when a duplicate proposal is detected (equivocation).
118
+ * The callback is triggered on the first duplicate (when count goes from 1 to 2).
119
+ */
120
+ registerDuplicateProposalCallback(callback: P2PDuplicateProposalCallback): void;
121
+
122
+ /**
123
+ * Registers a callback invoked when a duplicate attestation is detected (equivocation).
124
+ * A validator signing attestations for different proposals at the same slot.
125
+ * The callback is triggered on the first duplicate (when count goes from 1 to 2).
126
+ */
127
+ registerDuplicateAttestationCallback(callback: P2PDuplicateAttestationCallback): void;
128
+
73
129
  getEnr(): ENR | undefined;
74
130
 
75
131
  getPeers(includePending?: boolean): PeerInfo[];
@@ -88,6 +144,9 @@ export interface P2PService {
88
144
 
89
145
  /** If node running this P2P stack is validator, passes in validator address to P2P layer */
90
146
  registerThisValidatorAddresses(address: EthAddress[]): void;
147
+
148
+ /** Get BatchTxRequester service dependencies */
149
+ getBatchTxRequesterService(): BatchTxRequesterLibP2PService;
91
150
  }
92
151
 
93
152
  /**
@@ -1,6 +1,13 @@
1
- import { type ConfigMappingsType, booleanConfigHelper, numberConfigHelper } from '@aztec/foundation/config';
1
+ import {
2
+ type ConfigMappingsType,
3
+ booleanConfigHelper,
4
+ enumConfigHelper,
5
+ numberConfigHelper,
6
+ } from '@aztec/foundation/config';
2
7
  import { MAX_RPC_TXS_LEN } from '@aztec/stdlib/interfaces/api-limit';
3
8
 
9
+ export type MissingTxsCollectorType = 'new' | 'old';
10
+
4
11
  export type TxCollectionConfig = {
5
12
  /** How long to wait before starting reqresp for fast collection */
6
13
  txCollectionFastNodesTimeoutBeforeReqRespMs: number;
@@ -22,6 +29,26 @@ export type TxCollectionConfig = {
22
29
  txCollectionFastMaxParallelRequestsPerNode: number;
23
30
  /** Maximum number of transactions to request from a node in a single batch */
24
31
  txCollectionNodeRpcMaxBatchSize: number;
32
+ /** Which collector implementation to use for missing txs collection */
33
+ txCollectionMissingTxsCollectorType: MissingTxsCollectorType;
34
+ /** A comma-separated list of file store URLs (s3://, gs://, file://, http://) for tx collection */
35
+ txCollectionFileStoreUrls: string[];
36
+ /** Delay in ms before file store collection starts after slow collection is triggered */
37
+ txCollectionFileStoreSlowDelayMs: number;
38
+ /** Delay in ms before file store collection starts after fast collection is triggered */
39
+ txCollectionFileStoreFastDelayMs: number;
40
+ /** Number of concurrent workers for fast file store collection */
41
+ txCollectionFileStoreFastWorkerCount: number;
42
+ /** Number of concurrent workers for slow file store collection */
43
+ txCollectionFileStoreSlowWorkerCount: number;
44
+ /** Base backoff time in ms for fast file store collection retries */
45
+ txCollectionFileStoreFastBackoffBaseMs: number;
46
+ /** Base backoff time in ms for slow file store collection retries */
47
+ txCollectionFileStoreSlowBackoffBaseMs: number;
48
+ /** Max backoff time in ms for fast file store collection retries */
49
+ txCollectionFileStoreFastBackoffMaxMs: number;
50
+ /** Max backoff time in ms for slow file store collection retries */
51
+ txCollectionFileStoreSlowBackoffMaxMs: number;
25
52
  };
26
53
 
27
54
  export const txCollectionConfigMappings: ConfigMappingsType<TxCollectionConfig> = {
@@ -81,4 +108,59 @@ export const txCollectionConfigMappings: ConfigMappingsType<TxCollectionConfig>
81
108
  description: 'Maximum number of transactions to request from a node in a single batch',
82
109
  ...numberConfigHelper(MAX_RPC_TXS_LEN),
83
110
  },
111
+ txCollectionMissingTxsCollectorType: {
112
+ env: 'TX_COLLECTION_MISSING_TXS_COLLECTOR_TYPE',
113
+ description: 'Which collector implementation to use for missing txs collection (new or old)',
114
+ ...enumConfigHelper(['new', 'old'] as const, 'new'),
115
+ },
116
+ txCollectionFileStoreUrls: {
117
+ env: 'TX_COLLECTION_FILE_STORE_URLS',
118
+ description: 'A comma-separated list of file store URLs (s3://, gs://, file://, http://) for tx collection',
119
+ parseEnv: (val: string) =>
120
+ val
121
+ .split(',')
122
+ .map(url => url.trim())
123
+ .filter(url => url.length > 0),
124
+ defaultValue: [],
125
+ },
126
+ txCollectionFileStoreSlowDelayMs: {
127
+ env: 'TX_COLLECTION_FILE_STORE_SLOW_DELAY_MS',
128
+ description: 'Delay before file store collection starts after slow collection',
129
+ ...numberConfigHelper(24_000),
130
+ },
131
+ txCollectionFileStoreFastDelayMs: {
132
+ env: 'TX_COLLECTION_FILE_STORE_FAST_DELAY_MS',
133
+ description: 'Delay before file store collection starts after fast collection',
134
+ ...numberConfigHelper(2_000),
135
+ },
136
+ txCollectionFileStoreFastWorkerCount: {
137
+ env: 'TX_COLLECTION_FILE_STORE_FAST_WORKER_COUNT',
138
+ description: 'Number of concurrent workers for fast file store collection',
139
+ ...numberConfigHelper(5),
140
+ },
141
+ txCollectionFileStoreSlowWorkerCount: {
142
+ env: 'TX_COLLECTION_FILE_STORE_SLOW_WORKER_COUNT',
143
+ description: 'Number of concurrent workers for slow file store collection',
144
+ ...numberConfigHelper(2),
145
+ },
146
+ txCollectionFileStoreFastBackoffBaseMs: {
147
+ env: 'TX_COLLECTION_FILE_STORE_FAST_BACKOFF_BASE_MS',
148
+ description: 'Base backoff time in ms for fast file store collection retries',
149
+ ...numberConfigHelper(1_000),
150
+ },
151
+ txCollectionFileStoreSlowBackoffBaseMs: {
152
+ env: 'TX_COLLECTION_FILE_STORE_SLOW_BACKOFF_BASE_MS',
153
+ description: 'Base backoff time in ms for slow file store collection retries',
154
+ ...numberConfigHelper(5_000),
155
+ },
156
+ txCollectionFileStoreFastBackoffMaxMs: {
157
+ env: 'TX_COLLECTION_FILE_STORE_FAST_BACKOFF_MAX_MS',
158
+ description: 'Max backoff time in ms for fast file store collection retries',
159
+ ...numberConfigHelper(5_000),
160
+ },
161
+ txCollectionFileStoreSlowBackoffMaxMs: {
162
+ env: 'TX_COLLECTION_FILE_STORE_SLOW_BACKOFF_MAX_MS',
163
+ description: 'Max backoff time in ms for slow file store collection retries',
164
+ ...numberConfigHelper(30_000),
165
+ },
84
166
  };
@@ -2,7 +2,6 @@ import { BlockNumber } from '@aztec/foundation/branded-types';
2
2
  import { times } from '@aztec/foundation/collection';
3
3
  import { AbortError, TimeoutError } from '@aztec/foundation/error';
4
4
  import { type Logger, createLogger } from '@aztec/foundation/log';
5
- import { boundInclusive } from '@aztec/foundation/number';
6
5
  import { promiseWithResolvers } from '@aztec/foundation/promise';
7
6
  import { sleep } from '@aztec/foundation/sleep';
8
7
  import { DateProvider, elapsed } from '@aztec/foundation/timer';
@@ -12,25 +11,40 @@ import { type Tx, TxHash } from '@aztec/stdlib/tx';
12
11
 
13
12
  import type { PeerId } from '@libp2p/interface';
14
13
 
15
- import { type ReqRespInterface, ReqRespSubProtocol } from '../reqresp/interface.js';
16
- import { chunkTxHashesRequest } from '../reqresp/protocols/tx.js';
14
+ import type { BatchTxRequesterConfig } from '../reqresp/batch-tx-requester/config.js';
15
+ import type { BatchTxRequesterLibP2PService } from '../reqresp/batch-tx-requester/interface.js';
17
16
  import type { TxCollectionConfig } from './config.js';
17
+ import {
18
+ BatchTxRequesterCollector,
19
+ type MissingTxsCollector,
20
+ SendBatchRequestCollector,
21
+ } from './proposal_tx_collector.js';
18
22
  import type { FastCollectionRequest, FastCollectionRequestInput } from './tx_collection.js';
19
- import type { TxCollectionSink } from './tx_collection_sink.js';
23
+ import type { TxAddContext, TxCollectionSink } from './tx_collection_sink.js';
20
24
  import type { TxSource } from './tx_source.js';
21
25
 
22
26
  export class FastTxCollection {
23
27
  // eslint-disable-next-line aztec-custom/no-non-primitive-in-collections
24
28
  protected requests: Set<FastCollectionRequest> = new Set();
29
+ private missingTxsCollector: MissingTxsCollector;
25
30
 
26
31
  constructor(
27
- private reqResp: Pick<ReqRespInterface, 'sendBatchRequest'>,
32
+ p2pService: BatchTxRequesterLibP2PService,
28
33
  private nodes: TxSource[],
29
34
  private txCollectionSink: TxCollectionSink,
30
35
  private config: TxCollectionConfig,
31
36
  private dateProvider: DateProvider = new DateProvider(),
32
37
  private log: Logger = createLogger('p2p:tx_collection_service'),
33
- ) {}
38
+ missingTxsCollector?: MissingTxsCollector,
39
+ ) {
40
+ const batchTxRequesterConfig = this.config as Partial<BatchTxRequesterConfig>;
41
+ const missingTxsCollectorType = this.config.txCollectionMissingTxsCollectorType;
42
+ this.missingTxsCollector =
43
+ missingTxsCollector ??
44
+ (missingTxsCollectorType === 'old'
45
+ ? new SendBatchRequestCollector(p2pService)
46
+ : new BatchTxRequesterCollector(p2pService, log, dateProvider, undefined, batchTxRequesterConfig));
47
+ }
34
48
 
35
49
  public async stop() {
36
50
  this.requests.forEach(request => request.promise.reject(new AbortError(`Stopped collection service`)));
@@ -63,7 +77,7 @@ export class FastTxCollection {
63
77
  // This promise is used to await for the collection to finish during the main collectFast method.
64
78
  // It gets resolved in `foundTxs` when all txs have been collected, or rejected if the request is aborted or hits the deadline.
65
79
  const promise = promiseWithResolvers<void>();
66
- setTimeout(() => promise.reject(new TimeoutError(`Timed out while collecting txs`)), timeout);
80
+ const timeoutTimer = setTimeout(() => promise.reject(new TimeoutError(`Timed out while collecting txs`)), timeout);
67
81
 
68
82
  const request: FastCollectionRequest = {
69
83
  ...input,
@@ -75,6 +89,7 @@ export class FastTxCollection {
75
89
  };
76
90
 
77
91
  const [duration] = await elapsed(() => this.collectFast(request, { ...opts }));
92
+ clearTimeout(timeoutTimer);
78
93
 
79
94
  this.log.verbose(
80
95
  `Collected ${request.foundTxs.size} txs out of ${txHashes.length} for ${input.type} at slot ${blockInfo.slotNumber}`,
@@ -220,6 +235,7 @@ export class FastTxCollection {
220
235
  method: 'fast-node-rpc',
221
236
  ...request.blockInfo,
222
237
  },
238
+ this.getAddContext(request),
223
239
  );
224
240
 
225
241
  // Clear from the active requests the txs we just requested
@@ -241,8 +257,6 @@ export class FastTxCollection {
241
257
  private async collectFastViaReqResp(request: FastCollectionRequest, opts: { pinnedPeer?: PeerId }) {
242
258
  const timeoutMs = +request.deadline - this.dateProvider.now();
243
259
  const pinnedPeer = opts.pinnedPeer;
244
- const maxPeers = boundInclusive(Math.ceil(request.missingTxHashes.size / 2), 8, 32);
245
- const maxRetryAttempts = 5;
246
260
  const blockInfo = request.blockInfo;
247
261
  const slotNumber = blockInfo.slotNumber;
248
262
  if (timeoutMs < 100) {
@@ -261,19 +275,21 @@ export class FastTxCollection {
261
275
  try {
262
276
  await this.txCollectionSink.collect(
263
277
  async txHashes => {
264
- const txs = await this.reqResp.sendBatchRequest<ReqRespSubProtocol.TX>(
265
- ReqRespSubProtocol.TX,
266
- chunkTxHashesRequest(txHashes),
267
- pinnedPeer,
268
- timeoutMs,
269
- maxPeers,
270
- maxRetryAttempts,
271
- );
272
-
273
- return txs.flat();
278
+ if (request.type === 'proposal') {
279
+ return await this.missingTxsCollector.collectTxs(txHashes, request.blockProposal, pinnedPeer, timeoutMs);
280
+ } else if (request.type === 'block') {
281
+ const blockTxsSource = {
282
+ txHashes: request.block.body.txEffects.map(e => e.txHash),
283
+ archive: request.block.archive.root,
284
+ };
285
+ return await this.missingTxsCollector.collectTxs(txHashes, blockTxsSource, pinnedPeer, timeoutMs);
286
+ } else {
287
+ throw new Error(`Unknown request type: ${(request as any).type}`);
288
+ }
274
289
  },
275
290
  Array.from(request.missingTxHashes).map(txHash => TxHash.fromString(txHash)),
276
291
  { description: `reqresp for slot ${slotNumber}`, method: 'fast-req-resp', ...opts, ...request.blockInfo },
292
+ this.getAddContext(request),
277
293
  );
278
294
  } catch (err) {
279
295
  this.log.error(`Error sending fast reqresp request for txs`, err, {
@@ -283,6 +299,15 @@ export class FastTxCollection {
283
299
  }
284
300
  }
285
301
 
302
+ /** Returns the TxAddContext for the given request, used by the sink to add txs to the pool correctly. */
303
+ private getAddContext(request: FastCollectionRequest): TxAddContext {
304
+ if (request.type === 'proposal') {
305
+ return { type: 'proposal', blockHeader: request.blockProposal.blockHeader };
306
+ } else {
307
+ return { type: 'mined', block: request.block };
308
+ }
309
+ }
310
+
286
311
  /**
287
312
  * Handle txs by marking them as found for the requests that are waiting for them, and resolves the request if all its txs have been found.
288
313
  * Called internally and from the main tx collection manager whenever the tx pool emits a tx-added event.