@aztec/p2p 0.0.1-commit.f146247c → 0.0.1-commit.f1b29a41e

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 (470) hide show
  1. package/README.md +129 -3
  2. package/dest/client/factory.d.ts +11 -11
  3. package/dest/client/factory.d.ts.map +1 -1
  4. package/dest/client/factory.js +55 -15
  5. package/dest/client/interface.d.ts +54 -34
  6. package/dest/client/interface.d.ts.map +1 -1
  7. package/dest/client/p2p_client.d.ts +43 -52
  8. package/dest/client/p2p_client.d.ts.map +1 -1
  9. package/dest/client/p2p_client.js +174 -224
  10. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +21 -11
  11. package/dest/config.d.ts +60 -17
  12. package/dest/config.d.ts.map +1 -1
  13. package/dest/config.js +105 -39
  14. package/dest/errors/p2p-service.error.d.ts +9 -0
  15. package/dest/errors/p2p-service.error.d.ts.map +1 -0
  16. package/dest/errors/p2p-service.error.js +10 -0
  17. package/dest/errors/tx-pool.error.d.ts +8 -0
  18. package/dest/errors/tx-pool.error.d.ts.map +1 -0
  19. package/dest/errors/tx-pool.error.js +9 -0
  20. package/dest/index.d.ts +2 -2
  21. package/dest/index.d.ts.map +1 -1
  22. package/dest/index.js +1 -1
  23. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +104 -88
  24. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  25. package/dest/mem_pools/attestation_pool/attestation_pool.js +446 -3
  26. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +2 -2
  27. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
  28. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +353 -87
  29. package/dest/mem_pools/attestation_pool/index.d.ts +2 -3
  30. package/dest/mem_pools/attestation_pool/index.d.ts.map +1 -1
  31. package/dest/mem_pools/attestation_pool/index.js +1 -2
  32. package/dest/mem_pools/attestation_pool/mocks.d.ts +2 -2
  33. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  34. package/dest/mem_pools/attestation_pool/mocks.js +2 -2
  35. package/dest/mem_pools/index.d.ts +3 -3
  36. package/dest/mem_pools/index.d.ts.map +1 -1
  37. package/dest/mem_pools/index.js +1 -1
  38. package/dest/mem_pools/instrumentation.d.ts +4 -2
  39. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  40. package/dest/mem_pools/instrumentation.js +16 -14
  41. package/dest/mem_pools/interface.d.ts +5 -5
  42. package/dest/mem_pools/interface.d.ts.map +1 -1
  43. package/dest/mem_pools/tx_pool_v2/archive/index.d.ts +2 -0
  44. package/dest/mem_pools/tx_pool_v2/archive/index.d.ts.map +1 -0
  45. package/dest/mem_pools/tx_pool_v2/archive/index.js +1 -0
  46. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts +43 -0
  47. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts.map +1 -0
  48. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.js +103 -0
  49. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +104 -0
  50. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -0
  51. package/dest/mem_pools/tx_pool_v2/deleted_pool.js +251 -0
  52. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts +47 -0
  53. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts.map +1 -0
  54. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.js +128 -0
  55. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +17 -0
  56. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -0
  57. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +94 -0
  58. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +19 -0
  59. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -0
  60. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +97 -0
  61. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +10 -0
  62. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -0
  63. package/dest/mem_pools/tx_pool_v2/eviction/index.js +11 -0
  64. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +180 -0
  65. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -0
  66. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.js +25 -0
  67. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts +15 -0
  68. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -0
  69. package/dest/mem_pools/{tx_pool → tx_pool_v2}/eviction/invalid_txs_after_mining_rule.js +16 -35
  70. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts +17 -0
  71. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -0
  72. package/dest/mem_pools/{tx_pool → tx_pool_v2}/eviction/invalid_txs_after_reorg_rule.js +39 -24
  73. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +16 -0
  74. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -0
  75. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +78 -0
  76. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +20 -0
  77. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -0
  78. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +75 -0
  79. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +15 -0
  80. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -0
  81. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +19 -0
  82. package/dest/mem_pools/tx_pool_v2/index.d.ts +6 -0
  83. package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -0
  84. package/dest/mem_pools/tx_pool_v2/index.js +5 -0
  85. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts +15 -0
  86. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts.map +1 -0
  87. package/dest/mem_pools/tx_pool_v2/instrumentation.js +43 -0
  88. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +215 -0
  89. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -0
  90. package/dest/mem_pools/tx_pool_v2/interfaces.js +10 -0
  91. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +134 -0
  92. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -0
  93. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +220 -0
  94. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts +26 -0
  95. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts.map +1 -0
  96. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.js +70 -0
  97. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +108 -0
  98. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -0
  99. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +337 -0
  100. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +62 -0
  101. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -0
  102. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +167 -0
  103. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +78 -0
  104. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -0
  105. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +923 -0
  106. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +1 -1
  107. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  108. package/dest/msg_validators/attestation_validator/attestation_validator.js +5 -4
  109. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +3 -3
  110. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
  111. package/dest/msg_validators/clock_tolerance.d.ts +1 -1
  112. package/dest/msg_validators/clock_tolerance.d.ts.map +1 -1
  113. package/dest/msg_validators/clock_tolerance.js +4 -3
  114. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +6 -4
  115. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
  116. package/dest/msg_validators/proposal_validator/block_proposal_validator.js +10 -2
  117. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +6 -4
  118. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
  119. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +16 -2
  120. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +13 -8
  121. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
  122. package/dest/msg_validators/proposal_validator/proposal_validator.js +53 -41
  123. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +4 -4
  124. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  125. package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +3 -3
  126. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +2 -1
  127. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -1
  128. package/dest/msg_validators/tx_validator/allowed_public_setup.js +24 -20
  129. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts +17 -0
  130. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts.map +1 -0
  131. package/dest/msg_validators/tx_validator/allowed_setup_helpers.js +24 -0
  132. package/dest/msg_validators/tx_validator/block_header_validator.d.ts +16 -3
  133. package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
  134. package/dest/msg_validators/tx_validator/block_header_validator.js +1 -1
  135. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts +9 -0
  136. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts.map +1 -0
  137. package/dest/msg_validators/tx_validator/contract_instance_validator.js +48 -0
  138. package/dest/msg_validators/tx_validator/data_validator.d.ts +1 -1
  139. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  140. package/dest/msg_validators/tx_validator/data_validator.js +35 -2
  141. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +13 -3
  142. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
  143. package/dest/msg_validators/tx_validator/double_spend_validator.js +4 -4
  144. package/dest/msg_validators/tx_validator/factory.d.ts +133 -6
  145. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  146. package/dest/msg_validators/tx_validator/factory.js +247 -60
  147. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +1 -1
  148. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -1
  149. package/dest/msg_validators/tx_validator/fee_payer_balance.js +6 -2
  150. package/dest/msg_validators/tx_validator/gas_validator.d.ts +67 -3
  151. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  152. package/dest/msg_validators/tx_validator/gas_validator.js +104 -37
  153. package/dest/msg_validators/tx_validator/index.d.ts +3 -1
  154. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  155. package/dest/msg_validators/tx_validator/index.js +2 -0
  156. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +1 -1
  157. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  158. package/dest/msg_validators/tx_validator/metadata_validator.js +4 -4
  159. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts +14 -0
  160. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts.map +1 -0
  161. package/dest/msg_validators/tx_validator/nullifier_cache.js +24 -0
  162. package/dest/msg_validators/tx_validator/phases_validator.d.ts +22 -2
  163. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
  164. package/dest/msg_validators/tx_validator/phases_validator.js +72 -24
  165. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +20 -4
  166. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
  167. package/dest/msg_validators/tx_validator/timestamp_validator.js +6 -6
  168. package/dest/services/dummy_service.d.ts +16 -6
  169. package/dest/services/dummy_service.d.ts.map +1 -1
  170. package/dest/services/dummy_service.js +15 -5
  171. package/dest/services/encoding.d.ts +7 -3
  172. package/dest/services/encoding.d.ts.map +1 -1
  173. package/dest/services/encoding.js +18 -11
  174. package/dest/services/gossipsub/index.d.ts +3 -0
  175. package/dest/services/gossipsub/index.d.ts.map +1 -0
  176. package/dest/services/gossipsub/index.js +2 -0
  177. package/dest/services/gossipsub/scoring.d.ts +21 -3
  178. package/dest/services/gossipsub/scoring.d.ts.map +1 -1
  179. package/dest/services/gossipsub/scoring.js +24 -7
  180. package/dest/services/gossipsub/topic_score_params.d.ts +173 -0
  181. package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -0
  182. package/dest/services/gossipsub/topic_score_params.js +346 -0
  183. package/dest/services/index.d.ts +2 -1
  184. package/dest/services/index.d.ts.map +1 -1
  185. package/dest/services/index.js +1 -0
  186. package/dest/services/libp2p/libp2p_service.d.ts +106 -51
  187. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  188. package/dest/services/libp2p/libp2p_service.js +538 -378
  189. package/dest/services/peer-manager/metrics.d.ts +3 -1
  190. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  191. package/dest/services/peer-manager/metrics.js +6 -0
  192. package/dest/services/peer-manager/peer_manager.d.ts +6 -2
  193. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  194. package/dest/services/peer-manager/peer_manager.js +24 -9
  195. package/dest/services/peer-manager/peer_scoring.d.ts +5 -2
  196. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  197. package/dest/services/peer-manager/peer_scoring.js +53 -12
  198. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +14 -10
  199. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -1
  200. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +89 -112
  201. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +4 -7
  202. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
  203. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +11 -13
  204. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -1
  205. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +31 -46
  206. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +19 -11
  207. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -1
  208. package/dest/services/reqresp/batch-tx-requester/peer_collection.js +52 -15
  209. package/dest/services/reqresp/batch-tx-requester/tx_validator.js +2 -2
  210. package/dest/services/reqresp/interface.d.ts +10 -1
  211. package/dest/services/reqresp/interface.d.ts.map +1 -1
  212. package/dest/services/reqresp/interface.js +15 -1
  213. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +7 -5
  214. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
  215. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +16 -11
  216. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +21 -10
  217. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
  218. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +27 -11
  219. package/dest/services/reqresp/protocols/tx.d.ts +7 -1
  220. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  221. package/dest/services/reqresp/protocols/tx.js +20 -0
  222. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +5 -4
  223. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
  224. package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -8
  225. package/dest/services/reqresp/reqresp.d.ts +1 -1
  226. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  227. package/dest/services/reqresp/reqresp.js +30 -14
  228. package/dest/services/service.d.ts +43 -4
  229. package/dest/services/service.d.ts.map +1 -1
  230. package/dest/services/tx_collection/config.d.ts +22 -4
  231. package/dest/services/tx_collection/config.d.ts.map +1 -1
  232. package/dest/services/tx_collection/config.js +49 -3
  233. package/dest/services/tx_collection/fast_tx_collection.d.ts +6 -8
  234. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
  235. package/dest/services/tx_collection/fast_tx_collection.js +88 -88
  236. package/dest/services/tx_collection/file_store_tx_collection.d.ts +53 -0
  237. package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -0
  238. package/dest/services/tx_collection/file_store_tx_collection.js +167 -0
  239. package/dest/services/tx_collection/file_store_tx_source.d.ts +38 -0
  240. package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -0
  241. package/dest/services/tx_collection/file_store_tx_source.js +100 -0
  242. package/dest/services/tx_collection/index.d.ts +3 -2
  243. package/dest/services/tx_collection/index.d.ts.map +1 -1
  244. package/dest/services/tx_collection/index.js +1 -0
  245. package/dest/services/tx_collection/instrumentation.d.ts +1 -1
  246. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
  247. package/dest/services/tx_collection/instrumentation.js +2 -1
  248. package/dest/services/tx_collection/proposal_tx_collector.d.ts +15 -15
  249. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -1
  250. package/dest/services/tx_collection/proposal_tx_collector.js +6 -6
  251. package/dest/services/tx_collection/request_tracker.d.ts +53 -0
  252. package/dest/services/tx_collection/request_tracker.d.ts.map +1 -0
  253. package/dest/services/tx_collection/request_tracker.js +84 -0
  254. package/dest/services/tx_collection/slow_tx_collection.d.ts +7 -3
  255. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -1
  256. package/dest/services/tx_collection/slow_tx_collection.js +60 -26
  257. package/dest/services/tx_collection/tx_collection.d.ts +23 -13
  258. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  259. package/dest/services/tx_collection/tx_collection.js +75 -3
  260. package/dest/services/tx_collection/tx_collection_sink.d.ts +18 -8
  261. package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -1
  262. package/dest/services/tx_collection/tx_collection_sink.js +26 -29
  263. package/dest/services/tx_collection/tx_source.d.ts +13 -7
  264. package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
  265. package/dest/services/tx_collection/tx_source.js +26 -7
  266. package/dest/services/tx_file_store/config.d.ts +16 -0
  267. package/dest/services/tx_file_store/config.d.ts.map +1 -0
  268. package/dest/services/tx_file_store/config.js +22 -0
  269. package/dest/services/tx_file_store/index.d.ts +4 -0
  270. package/dest/services/tx_file_store/index.d.ts.map +1 -0
  271. package/dest/services/tx_file_store/index.js +3 -0
  272. package/dest/services/tx_file_store/instrumentation.d.ts +15 -0
  273. package/dest/services/tx_file_store/instrumentation.d.ts.map +1 -0
  274. package/dest/services/tx_file_store/instrumentation.js +29 -0
  275. package/dest/services/tx_file_store/tx_file_store.d.ts +48 -0
  276. package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -0
  277. package/dest/services/tx_file_store/tx_file_store.js +152 -0
  278. package/dest/services/tx_provider.d.ts +4 -4
  279. package/dest/services/tx_provider.d.ts.map +1 -1
  280. package/dest/services/tx_provider.js +9 -8
  281. package/dest/test-helpers/make-test-p2p-clients.d.ts +7 -8
  282. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  283. package/dest/test-helpers/make-test-p2p-clients.js +1 -2
  284. package/dest/test-helpers/mock-pubsub.d.ts +30 -4
  285. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  286. package/dest/test-helpers/mock-pubsub.js +105 -4
  287. package/dest/test-helpers/reqresp-nodes.d.ts +2 -3
  288. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  289. package/dest/test-helpers/reqresp-nodes.js +4 -3
  290. package/dest/test-helpers/testbench-utils.d.ts +43 -38
  291. package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
  292. package/dest/test-helpers/testbench-utils.js +149 -61
  293. package/dest/testbench/p2p_client_testbench_worker.d.ts +2 -2
  294. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  295. package/dest/testbench/p2p_client_testbench_worker.js +58 -28
  296. package/dest/testbench/worker_client_manager.d.ts +3 -1
  297. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  298. package/dest/testbench/worker_client_manager.js +6 -3
  299. package/dest/util.d.ts +3 -3
  300. package/dest/util.d.ts.map +1 -1
  301. package/package.json +14 -14
  302. package/src/client/factory.ts +108 -28
  303. package/src/client/interface.ts +65 -35
  304. package/src/client/p2p_client.ts +210 -269
  305. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +34 -15
  306. package/src/config.ts +165 -44
  307. package/src/errors/p2p-service.error.ts +11 -0
  308. package/src/errors/tx-pool.error.ts +12 -0
  309. package/src/index.ts +1 -1
  310. package/src/mem_pools/attestation_pool/attestation_pool.ts +499 -91
  311. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +442 -102
  312. package/src/mem_pools/attestation_pool/index.ts +9 -2
  313. package/src/mem_pools/attestation_pool/mocks.ts +2 -1
  314. package/src/mem_pools/index.ts +2 -2
  315. package/src/mem_pools/instrumentation.ts +17 -13
  316. package/src/mem_pools/interface.ts +4 -4
  317. package/src/mem_pools/tx_pool_v2/README.md +283 -0
  318. package/src/mem_pools/tx_pool_v2/archive/index.ts +1 -0
  319. package/src/mem_pools/tx_pool_v2/archive/tx_archive.ts +120 -0
  320. package/src/mem_pools/tx_pool_v2/deleted_pool.ts +321 -0
  321. package/src/mem_pools/tx_pool_v2/eviction/eviction_manager.ts +160 -0
  322. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +122 -0
  323. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +125 -0
  324. package/src/mem_pools/tx_pool_v2/eviction/index.ts +27 -0
  325. package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +219 -0
  326. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +74 -0
  327. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +101 -0
  328. package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +91 -0
  329. package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +99 -0
  330. package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +32 -0
  331. package/src/mem_pools/tx_pool_v2/index.ts +12 -0
  332. package/src/mem_pools/tx_pool_v2/instrumentation.ts +69 -0
  333. package/src/mem_pools/tx_pool_v2/interfaces.ts +247 -0
  334. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +343 -0
  335. package/src/mem_pools/tx_pool_v2/tx_pool_bench_metrics.ts +77 -0
  336. package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +430 -0
  337. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +238 -0
  338. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +1105 -0
  339. package/src/msg_validators/attestation_validator/README.md +49 -0
  340. package/src/msg_validators/attestation_validator/attestation_validator.ts +5 -4
  341. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +2 -2
  342. package/src/msg_validators/clock_tolerance.ts +4 -3
  343. package/src/msg_validators/proposal_validator/README.md +123 -0
  344. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +14 -4
  345. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +20 -7
  346. package/src/msg_validators/proposal_validator/proposal_validator.ts +69 -45
  347. package/src/msg_validators/tx_validator/README.md +119 -0
  348. package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +5 -5
  349. package/src/msg_validators/tx_validator/allowed_public_setup.ts +22 -27
  350. package/src/msg_validators/tx_validator/allowed_setup_helpers.ts +31 -0
  351. package/src/msg_validators/tx_validator/block_header_validator.ts +15 -3
  352. package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
  353. package/src/msg_validators/tx_validator/data_validator.ts +42 -1
  354. package/src/msg_validators/tx_validator/double_spend_validator.ts +11 -6
  355. package/src/msg_validators/tx_validator/factory.ts +394 -78
  356. package/src/msg_validators/tx_validator/fee_payer_balance.ts +6 -2
  357. package/src/msg_validators/tx_validator/gas_validator.ts +123 -27
  358. package/src/msg_validators/tx_validator/index.ts +2 -0
  359. package/src/msg_validators/tx_validator/metadata_validator.ts +12 -4
  360. package/src/msg_validators/tx_validator/nullifier_cache.ts +30 -0
  361. package/src/msg_validators/tx_validator/phases_validator.ts +82 -27
  362. package/src/msg_validators/tx_validator/timestamp_validator.ts +23 -18
  363. package/src/services/dummy_service.ts +24 -7
  364. package/src/services/encoding.ts +18 -10
  365. package/src/services/gossipsub/README.md +641 -0
  366. package/src/services/gossipsub/index.ts +2 -0
  367. package/src/services/gossipsub/scoring.ts +29 -5
  368. package/src/services/gossipsub/topic_score_params.ts +487 -0
  369. package/src/services/index.ts +1 -0
  370. package/src/services/libp2p/libp2p_service.ts +564 -412
  371. package/src/services/peer-manager/metrics.ts +7 -0
  372. package/src/services/peer-manager/peer_manager.ts +28 -9
  373. package/src/services/peer-manager/peer_scoring.ts +46 -5
  374. package/src/services/reqresp/README.md +229 -0
  375. package/src/services/reqresp/batch-tx-requester/README.md +53 -14
  376. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +89 -122
  377. package/src/services/reqresp/batch-tx-requester/interface.ts +3 -6
  378. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +30 -71
  379. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +68 -24
  380. package/src/services/reqresp/batch-tx-requester/tx_validator.ts +2 -2
  381. package/src/services/reqresp/interface.ts +26 -1
  382. package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +23 -14
  383. package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +38 -15
  384. package/src/services/reqresp/protocols/tx.ts +22 -0
  385. package/src/services/reqresp/rate-limiter/rate_limiter.ts +13 -9
  386. package/src/services/reqresp/reqresp.ts +35 -15
  387. package/src/services/service.ts +57 -3
  388. package/src/services/tx_collection/config.ts +74 -6
  389. package/src/services/tx_collection/fast_tx_collection.ts +94 -97
  390. package/src/services/tx_collection/file_store_tx_collection.ts +202 -0
  391. package/src/services/tx_collection/file_store_tx_source.ts +129 -0
  392. package/src/services/tx_collection/index.ts +2 -1
  393. package/src/services/tx_collection/instrumentation.ts +7 -1
  394. package/src/services/tx_collection/proposal_tx_collector.ts +21 -27
  395. package/src/services/tx_collection/request_tracker.ts +127 -0
  396. package/src/services/tx_collection/slow_tx_collection.ts +66 -33
  397. package/src/services/tx_collection/tx_collection.ts +114 -19
  398. package/src/services/tx_collection/tx_collection_sink.ts +30 -34
  399. package/src/services/tx_collection/tx_source.ts +28 -8
  400. package/src/services/tx_file_store/config.ts +37 -0
  401. package/src/services/tx_file_store/index.ts +3 -0
  402. package/src/services/tx_file_store/instrumentation.ts +36 -0
  403. package/src/services/tx_file_store/tx_file_store.ts +175 -0
  404. package/src/services/tx_provider.ts +10 -9
  405. package/src/test-helpers/make-test-p2p-clients.ts +4 -6
  406. package/src/test-helpers/mock-pubsub.ts +146 -9
  407. package/src/test-helpers/reqresp-nodes.ts +5 -7
  408. package/src/test-helpers/testbench-utils.ts +156 -74
  409. package/src/testbench/p2p_client_testbench_worker.ts +64 -31
  410. package/src/testbench/worker_client_manager.ts +13 -6
  411. package/src/util.ts +8 -2
  412. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +0 -40
  413. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +0 -1
  414. package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +0 -218
  415. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +0 -31
  416. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +0 -1
  417. package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +0 -180
  418. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +0 -125
  419. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +0 -1
  420. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +0 -596
  421. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +0 -32
  422. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +0 -1
  423. package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +0 -112
  424. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +0 -157
  425. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +0 -1
  426. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +0 -52
  427. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +0 -16
  428. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +0 -1
  429. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +0 -122
  430. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +0 -17
  431. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +0 -1
  432. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +0 -19
  433. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +0 -1
  434. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +0 -26
  435. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +0 -1
  436. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +0 -84
  437. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +0 -25
  438. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +0 -1
  439. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +0 -57
  440. package/dest/mem_pools/tx_pool/index.d.ts +0 -3
  441. package/dest/mem_pools/tx_pool/index.d.ts.map +0 -1
  442. package/dest/mem_pools/tx_pool/index.js +0 -2
  443. package/dest/mem_pools/tx_pool/priority.d.ts +0 -12
  444. package/dest/mem_pools/tx_pool/priority.d.ts.map +0 -1
  445. package/dest/mem_pools/tx_pool/priority.js +0 -15
  446. package/dest/mem_pools/tx_pool/tx_pool.d.ts +0 -127
  447. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +0 -1
  448. package/dest/mem_pools/tx_pool/tx_pool.js +0 -3
  449. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +0 -7
  450. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +0 -1
  451. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +0 -400
  452. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +0 -23
  453. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +0 -1
  454. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +0 -212
  455. package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +0 -320
  456. package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +0 -264
  457. package/src/mem_pools/tx_pool/README.md +0 -270
  458. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -746
  459. package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +0 -132
  460. package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +0 -208
  461. package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +0 -162
  462. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +0 -104
  463. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +0 -93
  464. package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +0 -106
  465. package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +0 -75
  466. package/src/mem_pools/tx_pool/index.ts +0 -2
  467. package/src/mem_pools/tx_pool/priority.ts +0 -20
  468. package/src/mem_pools/tx_pool/tx_pool.ts +0 -141
  469. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +0 -319
  470. package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +0 -230
@@ -1,25 +1,23 @@
1
1
  import { BlockNumber } from '@aztec/foundation/branded-types';
2
2
  import { type Logger } from '@aztec/foundation/log';
3
3
  import { DateProvider } from '@aztec/foundation/timer';
4
- import type { BlockProposal } from '@aztec/stdlib/p2p';
5
4
  import { type Tx, TxHash } from '@aztec/stdlib/tx';
6
5
  import type { PeerId } from '@libp2p/interface';
7
6
  import type { BatchTxRequesterLibP2PService } from '../reqresp/batch-tx-requester/interface.js';
8
7
  import type { TxCollectionConfig } from './config.js';
9
- import { type ProposalTxCollector } from './proposal_tx_collector.js';
8
+ import { type MissingTxsCollector } from './proposal_tx_collector.js';
10
9
  import type { FastCollectionRequest, FastCollectionRequestInput } from './tx_collection.js';
11
10
  import type { TxCollectionSink } from './tx_collection_sink.js';
12
11
  import type { TxSource } from './tx_source.js';
13
12
  export declare class FastTxCollection {
14
- private p2pService;
15
13
  private nodes;
16
14
  private txCollectionSink;
17
15
  private config;
18
16
  private dateProvider;
19
17
  private log;
20
18
  protected requests: Set<FastCollectionRequest>;
21
- private proposalTxCollector;
22
- constructor(p2pService: BatchTxRequesterLibP2PService, nodes: TxSource[], txCollectionSink: TxCollectionSink, config: TxCollectionConfig, dateProvider?: DateProvider, log?: Logger, proposalTxCollector?: ProposalTxCollector);
19
+ private missingTxsCollector;
20
+ constructor(p2pService: BatchTxRequesterLibP2PService, nodes: TxSource[], txCollectionSink: TxCollectionSink, config: TxCollectionConfig, dateProvider?: DateProvider, log?: Logger, missingTxsCollector?: MissingTxsCollector);
23
21
  stop(): Promise<void>;
24
22
  getFastCollectionRequests(): Set<FastCollectionRequest>;
25
23
  collectFastFor(input: FastCollectionRequestInput, txHashes: TxHash[] | string[], opts: {
@@ -27,13 +25,13 @@ export declare class FastTxCollection {
27
25
  pinnedPeer?: PeerId;
28
26
  }): Promise<Tx[]>;
29
27
  protected collectFast(request: FastCollectionRequest, opts: {
30
- proposal?: BlockProposal;
31
- deadline: Date;
32
28
  pinnedPeer?: PeerId;
33
29
  }): Promise<void>;
34
30
  private collectFastFromNodes;
35
31
  private collectFastFromNode;
36
32
  private collectFastViaReqResp;
33
+ /** Returns the TxAddContext for the given request, used by the sink to add txs to the pool correctly. */
34
+ private getAddContext;
37
35
  /**
38
36
  * 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.
39
37
  * Called internally and from the main tx collection manager whenever the tx pool emits a tx-added event.
@@ -50,4 +48,4 @@ export declare class FastTxCollection {
50
48
  */
51
49
  stopCollectingForBlocksAfter(blockNumber: BlockNumber): void;
52
50
  }
53
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFzdF90eF9jb2xsZWN0aW9uLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvdHhfY29sbGVjdGlvbi9mYXN0X3R4X2NvbGxlY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRzlELE9BQU8sRUFBRSxLQUFLLE1BQU0sRUFBZ0IsTUFBTSx1QkFBdUIsQ0FBQztBQUlsRSxPQUFPLEVBQUUsWUFBWSxFQUFXLE1BQU0seUJBQXlCLENBQUM7QUFFaEUsT0FBTyxLQUFLLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDdkQsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFLE1BQU0sRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRW5ELE9BQU8sS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBR2hELE9BQU8sS0FBSyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFHaEcsT0FBTyxLQUFLLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDdEQsT0FBTyxFQUVMLEtBQUssbUJBQW1CLEVBRXpCLE1BQU0sNEJBQTRCLENBQUM7QUFDcEMsT0FBTyxLQUFLLEVBQUUscUJBQXFCLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM1RixPQUFPLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2hFLE9BQU8sS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRS9DLHFCQUFhLGdCQUFnQjtJQU16QixPQUFPLENBQUMsVUFBVTtJQUNsQixPQUFPLENBQUMsS0FBSztJQUNiLE9BQU8sQ0FBQyxnQkFBZ0I7SUFDeEIsT0FBTyxDQUFDLE1BQU07SUFDZCxPQUFPLENBQUMsWUFBWTtJQUNwQixPQUFPLENBQUMsR0FBRztJQVRiLFNBQVMsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLHFCQUFxQixDQUFDLENBQWE7SUFDM0QsT0FBTyxDQUFDLG1CQUFtQixDQUFzQjtJQUVqRCxZQUNVLFVBQVUsRUFBRSw2QkFBNkIsRUFDekMsS0FBSyxFQUFFLFFBQVEsRUFBRSxFQUNqQixnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFDbEMsTUFBTSxFQUFFLGtCQUFrQixFQUMxQixZQUFZLEdBQUUsWUFBaUMsRUFDL0MsR0FBRyxHQUFFLE1BQWtELEVBQy9ELG1CQUFtQixDQUFDLEVBQUUsbUJBQW1CLEVBUzFDO0lBRVksSUFBSSxrQkFHaEI7SUFFTSx5QkFBeUIsK0JBRS9CO0lBRVksY0FBYyxDQUN6QixLQUFLLEVBQUUsMEJBQTBCLEVBQ2pDLFFBQVEsRUFBRSxNQUFNLEVBQUUsR0FBRyxNQUFNLEVBQUUsRUFDN0IsSUFBSSxFQUFFO1FBQUUsUUFBUSxFQUFFLElBQUksQ0FBQztRQUFDLFVBQVUsQ0FBQyxFQUFFLE1BQU0sQ0FBQTtLQUFFLGlCQTBDOUM7SUFFRCxVQUFnQixXQUFXLENBQ3pCLE9BQU8sRUFBRSxxQkFBcUIsRUFDOUIsSUFBSSxFQUFFO1FBQUUsUUFBUSxDQUFDLEVBQUUsYUFBYSxDQUFDO1FBQUMsUUFBUSxFQUFFLElBQUksQ0FBQztRQUFDLFVBQVUsQ0FBQyxFQUFFLE1BQU0sQ0FBQTtLQUFFLGlCQStDeEU7WUFRYSxvQkFBb0I7WUFZcEIsbUJBQW1CO1lBaUZuQixxQkFBcUI7SUFtRG5DOzs7T0FHRztJQUNJLFFBQVEsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLFFBd0J4QjtJQUVEOzs7T0FHRztJQUNJLDJCQUEyQixDQUFDLFdBQVcsRUFBRSxXQUFXLEdBQUcsSUFBSSxDQU9qRTtJQUVEOzs7T0FHRztJQUNJLDRCQUE0QixDQUFDLFdBQVcsRUFBRSxXQUFXLEdBQUcsSUFBSSxDQU9sRTtDQUNGIn0=
51
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFzdF90eF9jb2xsZWN0aW9uLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvdHhfY29sbGVjdGlvbi9mYXN0X3R4X2NvbGxlY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRTlELE9BQU8sRUFBRSxLQUFLLE1BQU0sRUFBZ0IsTUFBTSx1QkFBdUIsQ0FBQztBQUVsRSxPQUFPLEVBQUUsWUFBWSxFQUFXLE1BQU0seUJBQXlCLENBQUM7QUFFaEUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFLE1BQU0sRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRW5ELE9BQU8sS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBR2hELE9BQU8sS0FBSyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDaEcsT0FBTyxLQUFLLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDdEQsT0FBTyxFQUVMLEtBQUssbUJBQW1CLEVBRXpCLE1BQU0sNEJBQTRCLENBQUM7QUFFcEMsT0FBTyxLQUFLLEVBQUUscUJBQXFCLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM1RixPQUFPLEtBQUssRUFBZ0IsZ0JBQWdCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM5RSxPQUFPLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUvQyxxQkFBYSxnQkFBZ0I7SUFPekIsT0FBTyxDQUFDLEtBQUs7SUFDYixPQUFPLENBQUMsZ0JBQWdCO0lBQ3hCLE9BQU8sQ0FBQyxNQUFNO0lBQ2QsT0FBTyxDQUFDLFlBQVk7SUFDcEIsT0FBTyxDQUFDLEdBQUc7SUFUYixTQUFTLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFhO0lBQzNELE9BQU8sQ0FBQyxtQkFBbUIsQ0FBc0I7SUFFakQsWUFDRSxVQUFVLEVBQUUsNkJBQTZCLEVBQ2pDLEtBQUssRUFBRSxRQUFRLEVBQUUsRUFDakIsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQ2xDLE1BQU0sRUFBRSxrQkFBa0IsRUFDMUIsWUFBWSxHQUFFLFlBQWlDLEVBQy9DLEdBQUcsR0FBRSxNQUFrRCxFQUMvRCxtQkFBbUIsQ0FBQyxFQUFFLG1CQUFtQixFQVMxQztJQUVZLElBQUksa0JBS2hCO0lBRU0seUJBQXlCLCtCQUUvQjtJQUVZLGNBQWMsQ0FDekIsS0FBSyxFQUFFLDBCQUEwQixFQUNqQyxRQUFRLEVBQUUsTUFBTSxFQUFFLEdBQUcsTUFBTSxFQUFFLEVBQzdCLElBQUksRUFBRTtRQUFFLFFBQVEsRUFBRSxJQUFJLENBQUM7UUFBQyxVQUFVLENBQUMsRUFBRSxNQUFNLENBQUE7S0FBRSxpQkFrQzlDO0lBRUQsVUFBZ0IsV0FBVyxDQUFDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxJQUFJLEVBQUU7UUFBRSxVQUFVLENBQUMsRUFBRSxNQUFNLENBQUE7S0FBRSxpQkF5Q3hGO1lBUWEsb0JBQW9CO1lBZ0JwQixtQkFBbUI7WUEwRm5CLHFCQUFxQjtJQWtEbkMseUdBQXlHO0lBQ3pHLE9BQU8sQ0FBQyxhQUFhO0lBUXJCOzs7T0FHRztJQUNJLFFBQVEsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLFFBcUJ4QjtJQUVEOzs7T0FHRztJQUNJLDJCQUEyQixDQUFDLFdBQVcsRUFBRSxXQUFXLEdBQUcsSUFBSSxDQU1qRTtJQUVEOzs7T0FHRztJQUNJLDRCQUE0QixDQUFDLFdBQVcsRUFBRSxXQUFXLEdBQUcsSUFBSSxDQU1sRTtDQUNGIn0=
@@ -1 +1 @@
1
- {"version":3,"file":"fast_tx_collection.d.ts","sourceRoot":"","sources":["../../../src/services/tx_collection/fast_tx_collection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAG9D,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAIlE,OAAO,EAAE,YAAY,EAAW,MAAM,yBAAyB,CAAC;AAEhE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAEnD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAGhD,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,4CAA4C,CAAC;AAGhG,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAEL,KAAK,mBAAmB,EAEzB,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,qBAAqB,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAC5F,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE/C,qBAAa,gBAAgB;IAMzB,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,gBAAgB;IACxB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,GAAG;IATb,SAAS,CAAC,QAAQ,EAAE,GAAG,CAAC,qBAAqB,CAAC,CAAa;IAC3D,OAAO,CAAC,mBAAmB,CAAsB;IAEjD,YACU,UAAU,EAAE,6BAA6B,EACzC,KAAK,EAAE,QAAQ,EAAE,EACjB,gBAAgB,EAAE,gBAAgB,EAClC,MAAM,EAAE,kBAAkB,EAC1B,YAAY,GAAE,YAAiC,EAC/C,GAAG,GAAE,MAAkD,EAC/D,mBAAmB,CAAC,EAAE,mBAAmB,EAS1C;IAEY,IAAI,kBAGhB;IAEM,yBAAyB,+BAE/B;IAEY,cAAc,CACzB,KAAK,EAAE,0BAA0B,EACjC,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,EAC7B,IAAI,EAAE;QAAE,QAAQ,EAAE,IAAI,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,iBA0C9C;IAED,UAAgB,WAAW,CACzB,OAAO,EAAE,qBAAqB,EAC9B,IAAI,EAAE;QAAE,QAAQ,CAAC,EAAE,aAAa,CAAC;QAAC,QAAQ,EAAE,IAAI,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,iBA+CxE;YAQa,oBAAoB;YAYpB,mBAAmB;YAiFnB,qBAAqB;IAmDnC;;;OAGG;IACI,QAAQ,CAAC,GAAG,EAAE,EAAE,EAAE,QAwBxB;IAED;;;OAGG;IACI,2BAA2B,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI,CAOjE;IAED;;;OAGG;IACI,4BAA4B,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI,CAOlE;CACF"}
1
+ {"version":3,"file":"fast_tx_collection.d.ts","sourceRoot":"","sources":["../../../src/services/tx_collection/fast_tx_collection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAE9D,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAElE,OAAO,EAAE,YAAY,EAAW,MAAM,yBAAyB,CAAC;AAEhE,OAAO,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAEnD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAGhD,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,4CAA4C,CAAC;AAChG,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAEL,KAAK,mBAAmB,EAEzB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,KAAK,EAAE,qBAAqB,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAC5F,OAAO,KAAK,EAAgB,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC9E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE/C,qBAAa,gBAAgB;IAOzB,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,gBAAgB;IACxB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,GAAG;IATb,SAAS,CAAC,QAAQ,EAAE,GAAG,CAAC,qBAAqB,CAAC,CAAa;IAC3D,OAAO,CAAC,mBAAmB,CAAsB;IAEjD,YACE,UAAU,EAAE,6BAA6B,EACjC,KAAK,EAAE,QAAQ,EAAE,EACjB,gBAAgB,EAAE,gBAAgB,EAClC,MAAM,EAAE,kBAAkB,EAC1B,YAAY,GAAE,YAAiC,EAC/C,GAAG,GAAE,MAAkD,EAC/D,mBAAmB,CAAC,EAAE,mBAAmB,EAS1C;IAEY,IAAI,kBAKhB;IAEM,yBAAyB,+BAE/B;IAEY,cAAc,CACzB,KAAK,EAAE,0BAA0B,EACjC,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,EAC7B,IAAI,EAAE;QAAE,QAAQ,EAAE,IAAI,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,iBAkC9C;IAED,UAAgB,WAAW,CAAC,OAAO,EAAE,qBAAqB,EAAE,IAAI,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,iBAyCxF;YAQa,oBAAoB;YAgBpB,mBAAmB;YA0FnB,qBAAqB;IAkDnC,yGAAyG;IACzG,OAAO,CAAC,aAAa;IAQrB;;;OAGG;IACI,QAAQ,CAAC,GAAG,EAAE,EAAE,EAAE,QAqBxB;IAED;;;OAGG;IACI,2BAA2B,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI,CAMjE;IAED;;;OAGG;IACI,4BAA4B,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI,CAMlE;CACF"}
@@ -1,16 +1,11 @@
1
1
  import { times } from '@aztec/foundation/collection';
2
- import { AbortError, TimeoutError } from '@aztec/foundation/error';
3
2
  import { createLogger } from '@aztec/foundation/log';
4
- import { boundInclusive } from '@aztec/foundation/number';
5
- import { promiseWithResolvers } from '@aztec/foundation/promise';
6
3
  import { sleep } from '@aztec/foundation/sleep';
7
4
  import { DateProvider, elapsed } from '@aztec/foundation/timer';
8
5
  import { TxHash } from '@aztec/stdlib/tx';
9
- import { ReqRespSubProtocol } from '../reqresp/interface.js';
10
- import { chunkTxHashesRequest } from '../reqresp/protocols/tx.js';
11
6
  import { BatchTxRequesterCollector, SendBatchRequestCollector } from './proposal_tx_collector.js';
7
+ import { RequestTracker } from './request_tracker.js';
12
8
  export class FastTxCollection {
13
- p2pService;
14
9
  nodes;
15
10
  txCollectionSink;
16
11
  config;
@@ -18,9 +13,8 @@ export class FastTxCollection {
18
13
  log;
19
14
  // eslint-disable-next-line aztec-custom/no-non-primitive-in-collections
20
15
  requests;
21
- proposalTxCollector;
22
- constructor(p2pService, nodes, txCollectionSink, config, dateProvider = new DateProvider(), log = createLogger('p2p:tx_collection_service'), proposalTxCollector){
23
- this.p2pService = p2pService;
16
+ missingTxsCollector;
17
+ constructor(p2pService, nodes, txCollectionSink, config, dateProvider = new DateProvider(), log = createLogger('p2p:tx_collection_service'), missingTxsCollector){
24
18
  this.nodes = nodes;
25
19
  this.txCollectionSink = txCollectionSink;
26
20
  this.config = config;
@@ -28,11 +22,13 @@ export class FastTxCollection {
28
22
  this.log = log;
29
23
  this.requests = new Set();
30
24
  const batchTxRequesterConfig = this.config;
31
- const proposalCollectorType = this.config.txCollectionProposalTxCollectorType;
32
- this.proposalTxCollector = proposalTxCollector ?? (proposalCollectorType === 'old' ? new SendBatchRequestCollector(p2pService) : new BatchTxRequesterCollector(p2pService, log, dateProvider, undefined, batchTxRequesterConfig));
25
+ const missingTxsCollectorType = this.config.txCollectionMissingTxsCollectorType;
26
+ this.missingTxsCollector = missingTxsCollector ?? (missingTxsCollectorType === 'old' ? new SendBatchRequestCollector(p2pService) : new BatchTxRequesterCollector(p2pService, log, dateProvider, undefined, batchTxRequesterConfig));
33
27
  }
34
28
  async stop() {
35
- this.requests.forEach((request)=>request.promise.reject(new AbortError(`Stopped collection service`)));
29
+ this.requests.forEach((request)=>{
30
+ request.requestTracker.cancel();
31
+ });
36
32
  await Promise.resolve();
37
33
  }
38
34
  getFastCollectionRequests() {
@@ -53,85 +49,66 @@ export class FastTxCollection {
53
49
  } : {
54
50
  ...input.block.toBlockInfo()
55
51
  };
56
- // This promise is used to await for the collection to finish during the main collectFast method.
57
- // It gets resolved in `foundTxs` when all txs have been collected, or rejected if the request is aborted or hits the deadline.
58
- const promise = promiseWithResolvers();
59
- setTimeout(()=>promise.reject(new TimeoutError(`Timed out while collecting txs`)), timeout);
60
52
  const request = {
61
53
  ...input,
62
54
  blockInfo,
63
- promise,
64
- foundTxs: new Map(),
65
- missingTxHashes: new Set(txHashes.map((t)=>t.toString())),
66
- deadline: opts.deadline
55
+ requestTracker: RequestTracker.create(txHashes, opts.deadline, this.dateProvider)
67
56
  };
68
57
  const [duration] = await elapsed(()=>this.collectFast(request, {
69
58
  ...opts
70
59
  }));
71
- this.log.verbose(`Collected ${request.foundTxs.size} txs out of ${txHashes.length} for ${input.type} at slot ${blockInfo.slotNumber}`, {
60
+ this.log.verbose(`Collected ${request.requestTracker.collectedTxs.length} txs out of ${txHashes.length} for ${input.type} at slot ${blockInfo.slotNumber}`, {
72
61
  ...blockInfo,
73
62
  duration,
74
63
  requestType: input.type,
75
64
  missingTxs: [
76
- ...request.missingTxHashes
65
+ ...request.requestTracker.missingTxHashes
77
66
  ]
78
67
  });
79
- return [
80
- ...request.foundTxs.values()
81
- ];
68
+ return request.requestTracker.collectedTxs;
82
69
  }
83
70
  async collectFast(request, opts) {
84
71
  this.requests.add(request);
85
72
  const { blockInfo } = request;
86
- this.log.debug(`Starting fast collection of ${request.missingTxHashes.size} txs for ${request.type} at slot ${blockInfo.slotNumber}`, {
73
+ this.log.debug(`Starting fast collection of ${request.requestTracker.numberOfMissingTxs} txs for ${request.type} at slot ${blockInfo.slotNumber}`, {
87
74
  ...blockInfo,
88
75
  requestType: request.type,
89
- deadline: opts.deadline
76
+ deadline: request.requestTracker.deadline
90
77
  });
91
78
  try {
92
79
  // Start blasting all nodes for the txs. We give them a little time to respond before we start reqresp.
93
- // And keep an eye on the request promise to ensure we don't wait longer than the deadline or return as soon
94
- // as we have collected all txs, whatever the source.
95
- const nodeCollectionPromise = this.collectFastFromNodes(request, opts);
80
+ // We race against the cancellation token to exit as soon as all txs are collected, the deadline expires,
81
+ // or the request is externally cancelled.
82
+ const nodeCollectionPromise = this.collectFastFromNodes(request);
96
83
  const waitBeforeReqResp = sleep(this.config.txCollectionFastNodesTimeoutBeforeReqRespMs);
97
84
  await Promise.race([
98
- request.promise.promise,
85
+ request.requestTracker.cancellationToken,
99
86
  waitBeforeReqResp
100
87
  ]);
101
- // If we have collected all txs, we can stop here
102
- if (request.missingTxHashes.size === 0) {
103
- this.log.debug(`All txs collected for slot ${blockInfo.slotNumber} without reqresp`, blockInfo);
88
+ // If we have collected all txs or the request was cancelled, we can stop here.
89
+ // Wait for node collection to settle so inner tasks finish before we return.
90
+ if (request.requestTracker.checkCancelled()) {
91
+ if (request.requestTracker.allFetched()) {
92
+ this.log.debug(`All txs collected for slot ${blockInfo.slotNumber} without reqresp`, blockInfo);
93
+ }
94
+ await nodeCollectionPromise;
104
95
  return;
105
96
  }
106
97
  // Start blasting reqresp for the remaining txs. Note that node collection keeps running in parallel.
107
98
  // We stop when we have collected all txs, timed out, or both node collection and reqresp have given up.
108
- const collectionPromise = Promise.allSettled([
99
+ // Inner tasks observe requestTracker.checkCancelled() and stop themselves, so this settles shortly after cancellation.
100
+ await Promise.allSettled([
109
101
  this.collectFastViaReqResp(request, opts),
110
102
  nodeCollectionPromise
111
103
  ]);
112
- await Promise.race([
113
- collectionPromise,
114
- request.promise.promise
115
- ]);
116
104
  } catch (err) {
117
- // Log and swallow all errors
118
- const logCtx = {
105
+ this.log.error(`Error collecting txs for ${request.type} for slot ${blockInfo.slotNumber}`, err, {
119
106
  ...blockInfo,
120
- errorMessage: err instanceof Error ? err.message : undefined,
121
- missingTxs: [
122
- ...request.missingTxHashes
123
- ].map((txHash)=>txHash.toString())
124
- };
125
- if (err instanceof Error && err.name === 'TimeoutError') {
126
- this.log.warn(`Timed out collecting txs for ${request.type} at slot ${blockInfo.slotNumber}`, logCtx);
127
- } else if (err instanceof Error && err.name === 'AbortError') {
128
- this.log.warn(`Aborted collecting txs for ${request.type} at slot ${blockInfo.slotNumber}`, logCtx);
129
- } else {
130
- this.log.error(`Error collecting txs for ${request.type} for slot ${blockInfo.slotNumber}`, err, logCtx);
131
- }
107
+ missingTxs: request.requestTracker.missingTxHashes.values().map((txHash)=>txHash.toString())
108
+ });
132
109
  } finally{
133
110
  // Ensure no unresolved promises and remove the request from the set
134
- request.promise.resolve();
111
+ request.requestTracker.cancel();
135
112
  this.requests.delete(request);
136
113
  }
137
114
  }
@@ -140,23 +117,23 @@ export class FastTxCollection {
140
117
  * in parallel to each node. We keep track of the number of attempts made to collect each tx, so we can prioritize
141
118
  * the txs that have been requested less often whenever we need to send a new batch of requests. We ensure that no
142
119
  * tx is requested more than once at the same time to the same node.
143
- */ async collectFastFromNodes(request, opts) {
120
+ */ async collectFastFromNodes(request) {
144
121
  if (this.nodes.length === 0) {
145
122
  return;
146
123
  }
147
124
  // Keep a shared priority queue of all txs pending to be requested, sorted by the number of attempts made to collect them.
148
125
  const attemptsPerTx = [
149
- ...request.missingTxHashes
126
+ ...request.requestTracker.missingTxHashes
150
127
  ].map((txHash)=>({
151
128
  txHash,
152
129
  attempts: 0,
153
130
  found: false
154
131
  }));
155
132
  // Returns once we have finished all node loops. Each loop finishes when the deadline is hit, or all txs have been collected.
156
- await Promise.allSettled(this.nodes.map((node)=>this.collectFastFromNode(request, node, attemptsPerTx, opts)));
133
+ await Promise.allSettled(this.nodes.map((node)=>this.collectFastFromNode(request, node, attemptsPerTx)));
157
134
  }
158
- async collectFastFromNode(request, node, attemptsPerTx, opts) {
159
- const notFinished = ()=>this.dateProvider.now() <= +opts.deadline && request.missingTxHashes.size > 0 && this.requests.has(request);
135
+ async collectFastFromNode(request, node, attemptsPerTx) {
136
+ const notFinished = ()=>!request.requestTracker.checkCancelled();
160
137
  const maxParallelRequests = this.config.txCollectionFastMaxParallelRequestsPerNode;
161
138
  const maxBatchSize = this.config.txCollectionNodeRpcMaxBatchSize;
162
139
  const activeRequestsToThisNode = new Set(); // Track the txs being actively requested to this node
@@ -170,7 +147,7 @@ export class FastTxCollection {
170
147
  const txToRequest = attemptsPerTx[index++];
171
148
  if (!txToRequest) {
172
149
  break;
173
- } else if (!request.missingTxHashes.has(txToRequest.txHash)) {
150
+ } else if (!request.requestTracker.isMissing(txToRequest.txHash)) {
174
151
  // Mark as found if it was found somewhere else, we'll then remove it from the array.
175
152
  // We don't delete it now since 'array.splice' is pretty expensive, so we do it after sorting.
176
153
  txToRequest.found = true;
@@ -194,20 +171,30 @@ export class FastTxCollection {
194
171
  if (batch.length === 0) {
195
172
  return;
196
173
  }
174
+ const txHashes = batch.map(({ txHash })=>txHash);
197
175
  // Collect this batch from the node
198
- await this.txCollectionSink.collect((txHashes)=>node.getTxsByHash(txHashes), batch.map(({ txHash })=>TxHash.fromString(txHash)), {
176
+ await this.txCollectionSink.collect(async ()=>{
177
+ const result = await node.getTxsByHash(txHashes.map(TxHash.fromString));
178
+ for (const tx of result.validTxs){
179
+ request.requestTracker.markFetched(tx);
180
+ }
181
+ return result;
182
+ }, txHashes, {
199
183
  description: `fast ${node.getInfo()}`,
200
184
  node: node.getInfo(),
201
185
  method: 'fast-node-rpc',
202
186
  ...request.blockInfo
203
- });
187
+ }, this.getAddContext(request));
204
188
  // Clear from the active requests the txs we just requested
205
189
  for (const requestedTx of batch){
206
190
  activeRequestsToThisNode.delete(requestedTx.txHash);
207
191
  }
208
- // Sleep a bit until hitting the node again (or not, depending on config)
192
+ // Sleep a bit until hitting the node again, but wake up immediately on cancellation
209
193
  if (notFinished()) {
210
- await sleep(this.config.txCollectionFastNodeIntervalMs);
194
+ await Promise.race([
195
+ sleep(this.config.txCollectionFastNodeIntervalMs),
196
+ request.requestTracker.cancellationToken
197
+ ]);
211
198
  }
212
199
  }
213
200
  };
@@ -215,49 +202,67 @@ export class FastTxCollection {
215
202
  await Promise.all(times(maxParallelRequests, processBatch));
216
203
  }
217
204
  async collectFastViaReqResp(request, opts) {
218
- const timeoutMs = +request.deadline - this.dateProvider.now();
219
205
  const pinnedPeer = opts.pinnedPeer;
220
- const maxPeers = boundInclusive(Math.ceil(request.missingTxHashes.size / 2), 8, 32);
221
- const maxRetryAttempts = 5;
222
206
  const blockInfo = request.blockInfo;
223
207
  const slotNumber = blockInfo.slotNumber;
224
- if (timeoutMs < 100) {
208
+ if (request.requestTracker.timeoutMs < 100) {
225
209
  this.log.warn(`Not initiating fast reqresp for txs for ${request.type} at slot ${blockInfo.slotNumber} due to timeout`, {
226
- timeoutMs,
210
+ timeoutMs: request.requestTracker.timeoutMs,
227
211
  ...blockInfo
228
212
  });
229
213
  return;
230
214
  }
231
- this.log.debug(`Starting fast reqresp for ${request.missingTxHashes.size} txs for ${request.type} at slot ${blockInfo.slotNumber}`, {
215
+ this.log.debug(`Starting fast reqresp for ${request.requestTracker.numberOfMissingTxs} txs for ${request.type} at slot ${blockInfo.slotNumber}`, {
232
216
  ...blockInfo,
233
- timeoutMs,
217
+ timeoutMs: request.requestTracker.timeoutMs,
234
218
  pinnedPeer
235
219
  });
236
220
  try {
237
- await this.txCollectionSink.collect(async (txHashes)=>{
221
+ await this.txCollectionSink.collect(async ()=>{
222
+ let result;
238
223
  if (request.type === 'proposal') {
239
- return await this.proposalTxCollector.collectTxs(txHashes, request.blockProposal, pinnedPeer, timeoutMs);
224
+ result = await this.missingTxsCollector.collectTxs(request.requestTracker, request.blockProposal, pinnedPeer);
240
225
  } else if (request.type === 'block') {
241
- const txs = await this.p2pService.reqResp.sendBatchRequest(ReqRespSubProtocol.TX, chunkTxHashesRequest(txHashes), pinnedPeer, timeoutMs, maxPeers, maxRetryAttempts);
242
- return txs.flat();
226
+ const blockTxsSource = {
227
+ txHashes: request.block.body.txEffects.map((e)=>e.txHash),
228
+ archive: request.block.archive.root
229
+ };
230
+ result = await this.missingTxsCollector.collectTxs(request.requestTracker, blockTxsSource, pinnedPeer);
243
231
  } else {
244
232
  throw new Error(`Unknown request type: ${request.type}`);
245
233
  }
246
- }, Array.from(request.missingTxHashes).map((txHash)=>TxHash.fromString(txHash)), {
234
+ return {
235
+ validTxs: result,
236
+ invalidTxHashes: []
237
+ };
238
+ }, Array.from(request.requestTracker.missingTxHashes), {
247
239
  description: `reqresp for slot ${slotNumber}`,
248
240
  method: 'fast-req-resp',
249
241
  ...opts,
250
242
  ...request.blockInfo
251
- });
243
+ }, this.getAddContext(request));
252
244
  } catch (err) {
253
245
  this.log.error(`Error sending fast reqresp request for txs`, err, {
254
246
  txs: [
255
- ...request.missingTxHashes
247
+ ...request.requestTracker.missingTxHashes
256
248
  ],
257
249
  ...blockInfo
258
250
  });
259
251
  }
260
252
  }
253
+ /** Returns the TxAddContext for the given request, used by the sink to add txs to the pool correctly. */ getAddContext(request) {
254
+ if (request.type === 'proposal') {
255
+ return {
256
+ type: 'proposal',
257
+ blockHeader: request.blockProposal.blockHeader
258
+ };
259
+ } else {
260
+ return {
261
+ type: 'mined',
262
+ block: request.block
263
+ };
264
+ }
265
+ }
261
266
  /**
262
267
  * 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.
263
268
  * Called internally and from the main tx collection manager whenever the tx pool emits a tx-added event.
@@ -266,21 +271,18 @@ export class FastTxCollection {
266
271
  for (const tx of txs){
267
272
  const txHash = tx.txHash.toString();
268
273
  // Remove the tx hash from the missing set, and add it to the found set.
269
- if (request.missingTxHashes.has(txHash)) {
270
- request.missingTxHashes.delete(txHash);
271
- request.foundTxs.set(txHash, tx);
274
+ if (request.requestTracker.markFetched(tx)) {
272
275
  this.log.trace(`Found tx ${txHash} for fast collection request`, {
273
276
  ...request.blockInfo,
274
277
  txHash: tx.txHash.toString(),
275
278
  type: request.type
276
279
  });
277
- // If we found all txs for this request, we resolve the promise
278
- if (request.missingTxHashes.size === 0) {
280
+ if (request.requestTracker.allFetched()) {
279
281
  this.log.trace(`All txs found for fast collection request`, {
280
282
  ...request.blockInfo,
281
283
  type: request.type
282
284
  });
283
- request.promise.resolve();
285
+ break;
284
286
  }
285
287
  }
286
288
  }
@@ -292,8 +294,7 @@ export class FastTxCollection {
292
294
  */ stopCollectingForBlocksUpTo(blockNumber) {
293
295
  for (const request of this.requests){
294
296
  if (request.blockInfo.blockNumber <= blockNumber) {
295
- request.promise.reject(new AbortError(`Stopped collecting txs up to block ${blockNumber}`));
296
- this.requests.delete(request);
297
+ request.requestTracker.cancel();
297
298
  }
298
299
  }
299
300
  }
@@ -303,8 +304,7 @@ export class FastTxCollection {
303
304
  */ stopCollectingForBlocksAfter(blockNumber) {
304
305
  for (const request of this.requests){
305
306
  if (request.blockInfo.blockNumber > blockNumber) {
306
- request.promise.reject(new AbortError(`Stopped collecting txs after block ${blockNumber}`));
307
- this.requests.delete(request);
307
+ request.requestTracker.cancel();
308
308
  }
309
309
  }
310
310
  }
@@ -0,0 +1,53 @@
1
+ import { type Logger } from '@aztec/foundation/log';
2
+ import { DateProvider } from '@aztec/foundation/timer';
3
+ import { Tx, TxHash } from '@aztec/stdlib/tx';
4
+ import type { FileStoreTxSource } from './file_store_tx_source.js';
5
+ import type { TxAddContext, TxCollectionSink } from './tx_collection_sink.js';
6
+ /** Configuration for a FileStoreTxCollection instance. */
7
+ export type FileStoreCollectionConfig = {
8
+ workerCount: number;
9
+ backoffBaseMs: number;
10
+ backoffMaxMs: number;
11
+ };
12
+ /**
13
+ * Collects txs from file stores as a fallback after P2P methods have been tried.
14
+ * Uses a shared worker pool that pulls entries with priority (fewest attempts first),
15
+ * retries with round-robin across sources, and applies exponential backoff between
16
+ * full cycles through all sources.
17
+ */
18
+ export declare class FileStoreTxCollection {
19
+ private readonly sources;
20
+ private readonly txCollectionSink;
21
+ private readonly config;
22
+ private readonly dateProvider;
23
+ private readonly log;
24
+ /** Map from tx hash string to entry for all pending downloads. */
25
+ private entries;
26
+ /** Worker promises for the shared worker pool. */
27
+ private workers;
28
+ /** Whether the worker pool is running. */
29
+ private running;
30
+ /** Signal used to wake sleeping workers when new entries arrive or stop is called. */
31
+ private wakeSignal;
32
+ constructor(sources: FileStoreTxSource[], txCollectionSink: TxCollectionSink, config: FileStoreCollectionConfig, dateProvider?: DateProvider, log?: Logger);
33
+ /** Starts the shared worker pool. */
34
+ start(): void;
35
+ /** Stops all workers and clears state. */
36
+ stop(): Promise<void>;
37
+ /** Adds entries to the shared map and wakes workers. */
38
+ startCollecting(txHashes: TxHash[], context: TxAddContext, deadline: Date): void;
39
+ /** Removes entries for txs that have been found elsewhere. */
40
+ foundTxs(txs: Tx[]): void;
41
+ /** Clears all pending entries. */
42
+ clearPending(): void;
43
+ private workerLoop;
44
+ /** Single-pass scan: removes expired entries, finds the best ready entry, or computes sleep time. */
45
+ private getNextAction;
46
+ /** Computes backoff for an entry. Backoff applies after a full cycle through all sources. */
47
+ private getBackoffMs;
48
+ /** Resolves the current wake signal and creates a new one. */
49
+ private wake;
50
+ private waitForWake;
51
+ private sleepOrWake;
52
+ }
53
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZV9zdG9yZV90eF9jb2xsZWN0aW9uLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvdHhfY29sbGVjdGlvbi9maWxlX3N0b3JlX3R4X2NvbGxlY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssTUFBTSxFQUFnQixNQUFNLHVCQUF1QixDQUFDO0FBR2xFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRTlDLE9BQU8sS0FBSyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDbkUsT0FBTyxLQUFLLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFOUUsMERBQTBEO0FBQzFELE1BQU0sTUFBTSx5QkFBeUIsR0FBRztJQUN0QyxXQUFXLEVBQUUsTUFBTSxDQUFDO0lBQ3BCLGFBQWEsRUFBRSxNQUFNLENBQUM7SUFDdEIsWUFBWSxFQUFFLE1BQU0sQ0FBQztDQUN0QixDQUFDO0FBV0Y7Ozs7O0dBS0c7QUFDSCxxQkFBYSxxQkFBcUI7SUFjOUIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPO0lBQ3hCLE9BQU8sQ0FBQyxRQUFRLENBQUMsZ0JBQWdCO0lBQ2pDLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTTtJQUN2QixPQUFPLENBQUMsUUFBUSxDQUFDLFlBQVk7SUFDN0IsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHO0lBakJ0QixrRUFBa0U7SUFDbEUsT0FBTyxDQUFDLE9BQU8sQ0FBdUM7SUFFdEQsa0RBQWtEO0lBQ2xELE9BQU8sQ0FBQyxPQUFPLENBQXVCO0lBRXRDLDBDQUEwQztJQUMxQyxPQUFPLENBQUMsT0FBTyxDQUFTO0lBRXhCLHNGQUFzRjtJQUN0RixPQUFPLENBQUMsVUFBVSxDQUE2QjtJQUUvQyxZQUNtQixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsRUFDNUIsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQ2xDLE1BQU0sRUFBRSx5QkFBeUIsRUFDakMsWUFBWSxHQUFFLFlBQWlDLEVBQy9DLEdBQUcsR0FBRSxNQUFxRCxFQUc1RTtJQUVELHFDQUFxQztJQUM5QixLQUFLLElBQUksSUFBSSxDQVNuQjtJQUVELDBDQUEwQztJQUM3QixJQUFJLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxDQU1qQztJQUVELHdEQUF3RDtJQUNqRCxlQUFlLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLElBQUksR0FBRyxJQUFJLENBc0J0RjtJQUVELDhEQUE4RDtJQUN2RCxRQUFRLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FJL0I7SUFFRCxrQ0FBa0M7SUFDM0IsWUFBWSxJQUFJLElBQUksQ0FFMUI7WUFFYSxVQUFVO0lBa0N4QixxR0FBcUc7SUFDckcsT0FBTyxDQUFDLGFBQWE7SUE4QnJCLDZGQUE2RjtJQUM3RixPQUFPLENBQUMsWUFBWTtJQVFwQiw4REFBOEQ7SUFDOUQsT0FBTyxDQUFDLElBQUk7WUFNRSxXQUFXO1lBS1gsV0FBVztDQUcxQiJ9
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file_store_tx_collection.d.ts","sourceRoot":"","sources":["../../../src/services/tx_collection/file_store_tx_collection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAGlE,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE9E,0DAA0D;AAC1D,MAAM,MAAM,yBAAyB,GAAG;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAWF;;;;;GAKG;AACH,qBAAa,qBAAqB;IAc9B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,GAAG;IAjBtB,kEAAkE;IAClE,OAAO,CAAC,OAAO,CAAuC;IAEtD,kDAAkD;IAClD,OAAO,CAAC,OAAO,CAAuB;IAEtC,0CAA0C;IAC1C,OAAO,CAAC,OAAO,CAAS;IAExB,sFAAsF;IACtF,OAAO,CAAC,UAAU,CAA6B;IAE/C,YACmB,OAAO,EAAE,iBAAiB,EAAE,EAC5B,gBAAgB,EAAE,gBAAgB,EAClC,MAAM,EAAE,yBAAyB,EACjC,YAAY,GAAE,YAAiC,EAC/C,GAAG,GAAE,MAAqD,EAG5E;IAED,qCAAqC;IAC9B,KAAK,IAAI,IAAI,CASnB;IAED,0CAA0C;IAC7B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAMjC;IAED,wDAAwD;IACjD,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,GAAG,IAAI,CAsBtF;IAED,8DAA8D;IACvD,QAAQ,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,IAAI,CAI/B;IAED,kCAAkC;IAC3B,YAAY,IAAI,IAAI,CAE1B;YAEa,UAAU;IAkCxB,qGAAqG;IACrG,OAAO,CAAC,aAAa;IA8BrB,6FAA6F;IAC7F,OAAO,CAAC,YAAY;IAQpB,8DAA8D;IAC9D,OAAO,CAAC,IAAI;YAME,WAAW;YAKX,WAAW;CAG1B"}
@@ -0,0 +1,167 @@
1
+ import { createLogger } from '@aztec/foundation/log';
2
+ import { promiseWithResolvers } from '@aztec/foundation/promise';
3
+ import { sleep } from '@aztec/foundation/sleep';
4
+ import { DateProvider } from '@aztec/foundation/timer';
5
+ import { TxHash } from '@aztec/stdlib/tx';
6
+ /**
7
+ * Collects txs from file stores as a fallback after P2P methods have been tried.
8
+ * Uses a shared worker pool that pulls entries with priority (fewest attempts first),
9
+ * retries with round-robin across sources, and applies exponential backoff between
10
+ * full cycles through all sources.
11
+ */ export class FileStoreTxCollection {
12
+ sources;
13
+ txCollectionSink;
14
+ config;
15
+ dateProvider;
16
+ log;
17
+ /** Map from tx hash string to entry for all pending downloads. */ entries;
18
+ /** Worker promises for the shared worker pool. */ workers;
19
+ /** Whether the worker pool is running. */ running;
20
+ /** Signal used to wake sleeping workers when new entries arrive or stop is called. */ wakeSignal;
21
+ constructor(sources, txCollectionSink, config, dateProvider = new DateProvider(), log = createLogger('p2p:file_store_tx_collection')){
22
+ this.sources = sources;
23
+ this.txCollectionSink = txCollectionSink;
24
+ this.config = config;
25
+ this.dateProvider = dateProvider;
26
+ this.log = log;
27
+ this.entries = new Map();
28
+ this.workers = [];
29
+ this.running = false;
30
+ this.wakeSignal = promiseWithResolvers();
31
+ }
32
+ /** Starts the shared worker pool. */ start() {
33
+ if (this.sources.length === 0) {
34
+ this.log.debug('No file store sources configured');
35
+ return;
36
+ }
37
+ this.running = true;
38
+ for(let i = 0; i < this.config.workerCount; i++){
39
+ this.workers.push(this.workerLoop());
40
+ }
41
+ }
42
+ /** Stops all workers and clears state. */ async stop() {
43
+ this.running = false;
44
+ this.wake();
45
+ await Promise.all(this.workers);
46
+ this.workers = [];
47
+ this.entries.clear();
48
+ }
49
+ /** Adds entries to the shared map and wakes workers. */ startCollecting(txHashes, context, deadline) {
50
+ if (this.sources.length === 0 || txHashes.length === 0) {
51
+ return;
52
+ }
53
+ if (+deadline <= this.dateProvider.now()) {
54
+ return;
55
+ }
56
+ for (const txHash of txHashes){
57
+ const hashStr = txHash.toString();
58
+ if (!this.entries.has(hashStr)) {
59
+ this.entries.set(hashStr, {
60
+ txHash: hashStr,
61
+ context,
62
+ deadline,
63
+ attempts: 0,
64
+ lastAttemptTime: 0,
65
+ nextSourceIndex: Math.floor(Math.random() * this.sources.length)
66
+ });
67
+ }
68
+ }
69
+ this.wake();
70
+ }
71
+ /** Removes entries for txs that have been found elsewhere. */ foundTxs(txs) {
72
+ for (const tx of txs){
73
+ this.entries.delete(tx.getTxHash().toString());
74
+ }
75
+ }
76
+ /** Clears all pending entries. */ clearPending() {
77
+ this.entries.clear();
78
+ }
79
+ async workerLoop() {
80
+ while(this.running){
81
+ const action = this.getNextAction();
82
+ if (action.type === 'sleep') {
83
+ await action.promise;
84
+ continue;
85
+ }
86
+ const entry = action.entry;
87
+ const source = this.sources[entry.nextSourceIndex % this.sources.length];
88
+ entry.nextSourceIndex++;
89
+ entry.attempts++;
90
+ entry.lastAttemptTime = this.dateProvider.now();
91
+ try {
92
+ const result = await this.txCollectionSink.collect(()=>source.getTxsByHash([
93
+ TxHash.fromString(entry.txHash)
94
+ ]), [
95
+ entry.txHash
96
+ ], {
97
+ description: `file-store ${source.getInfo()}`,
98
+ method: 'file-store',
99
+ fileStore: source.getInfo()
100
+ }, entry.context);
101
+ if (result.txs.length > 0) {
102
+ this.entries.delete(entry.txHash);
103
+ }
104
+ } catch (err) {
105
+ this.log.trace(`Error downloading tx ${entry.txHash} from ${source.getInfo()}`, {
106
+ err
107
+ });
108
+ }
109
+ }
110
+ }
111
+ /** Single-pass scan: removes expired entries, finds the best ready entry, or computes sleep time. */ getNextAction() {
112
+ const now = this.dateProvider.now();
113
+ let best;
114
+ let earliestReadyAt = Infinity;
115
+ for (const [key, entry] of this.entries){
116
+ if (+entry.deadline <= now) {
117
+ this.entries.delete(key);
118
+ continue;
119
+ }
120
+ const backoffMs = this.getBackoffMs(entry);
121
+ const readyAt = entry.lastAttemptTime + backoffMs;
122
+ if (readyAt > now) {
123
+ earliestReadyAt = Math.min(earliestReadyAt, readyAt);
124
+ continue;
125
+ }
126
+ if (!best || entry.attempts < best.attempts) {
127
+ best = entry;
128
+ }
129
+ }
130
+ if (best) {
131
+ return {
132
+ type: 'process',
133
+ entry: best
134
+ };
135
+ }
136
+ if (earliestReadyAt < Infinity) {
137
+ return {
138
+ type: 'sleep',
139
+ promise: this.sleepOrWake(earliestReadyAt - now)
140
+ };
141
+ }
142
+ return {
143
+ type: 'sleep',
144
+ promise: this.waitForWake()
145
+ };
146
+ }
147
+ /** Computes backoff for an entry. Backoff applies after a full cycle through all sources. */ getBackoffMs(entry) {
148
+ const fullCycles = Math.floor(entry.attempts / this.sources.length);
149
+ if (fullCycles === 0) {
150
+ return 0;
151
+ }
152
+ return Math.min(this.config.backoffBaseMs * Math.pow(2, fullCycles - 1), this.config.backoffMaxMs);
153
+ }
154
+ /** Resolves the current wake signal and creates a new one. */ wake() {
155
+ this.wakeSignal.resolve();
156
+ this.wakeSignal = promiseWithResolvers();
157
+ }
158
+ /** Waits until the wake signal is resolved. */ async waitForWake() {
159
+ await this.wakeSignal.promise;
160
+ }
161
+ /** Sleeps for the given duration or until the wake signal is resolved. */ async sleepOrWake(ms) {
162
+ await Promise.race([
163
+ sleep(ms),
164
+ this.wakeSignal.promise
165
+ ]);
166
+ }
167
+ }