@aztec/p2p 0.0.1-commit.c80b6263 → 0.0.1-commit.cd76b27

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 (330) hide show
  1. package/dest/client/factory.d.ts +7 -6
  2. package/dest/client/factory.d.ts.map +1 -1
  3. package/dest/client/factory.js +47 -10
  4. package/dest/client/interface.d.ts +43 -23
  5. package/dest/client/interface.d.ts.map +1 -1
  6. package/dest/client/p2p_client.d.ts +40 -42
  7. package/dest/client/p2p_client.d.ts.map +1 -1
  8. package/dest/client/p2p_client.js +156 -145
  9. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +7 -7
  10. package/dest/config.d.ts +29 -4
  11. package/dest/config.d.ts.map +1 -1
  12. package/dest/config.js +19 -2
  13. package/dest/errors/tx-pool.error.d.ts +8 -0
  14. package/dest/errors/tx-pool.error.d.ts.map +1 -0
  15. package/dest/errors/tx-pool.error.js +9 -0
  16. package/dest/index.d.ts +2 -1
  17. package/dest/index.d.ts.map +1 -1
  18. package/dest/index.js +1 -0
  19. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +104 -88
  20. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  21. package/dest/mem_pools/attestation_pool/attestation_pool.js +441 -3
  22. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +2 -2
  23. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
  24. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +353 -87
  25. package/dest/mem_pools/attestation_pool/index.d.ts +2 -3
  26. package/dest/mem_pools/attestation_pool/index.d.ts.map +1 -1
  27. package/dest/mem_pools/attestation_pool/index.js +1 -2
  28. package/dest/mem_pools/attestation_pool/mocks.d.ts +2 -2
  29. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  30. package/dest/mem_pools/attestation_pool/mocks.js +2 -2
  31. package/dest/mem_pools/index.d.ts +3 -2
  32. package/dest/mem_pools/index.d.ts.map +1 -1
  33. package/dest/mem_pools/index.js +1 -1
  34. package/dest/mem_pools/interface.d.ts +5 -5
  35. package/dest/mem_pools/interface.d.ts.map +1 -1
  36. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +3 -3
  37. package/dest/mem_pools/tx_pool_v2/archive/index.d.ts +2 -0
  38. package/dest/mem_pools/tx_pool_v2/archive/index.d.ts.map +1 -0
  39. package/dest/mem_pools/tx_pool_v2/archive/index.js +1 -0
  40. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts +43 -0
  41. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts.map +1 -0
  42. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.js +103 -0
  43. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +104 -0
  44. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -0
  45. package/dest/mem_pools/tx_pool_v2/deleted_pool.js +251 -0
  46. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts +47 -0
  47. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts.map +1 -0
  48. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.js +128 -0
  49. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +17 -0
  50. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -0
  51. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +93 -0
  52. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +19 -0
  53. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -0
  54. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +95 -0
  55. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +10 -0
  56. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -0
  57. package/dest/mem_pools/tx_pool_v2/eviction/index.js +11 -0
  58. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +174 -0
  59. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -0
  60. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.js +25 -0
  61. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts +15 -0
  62. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -0
  63. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +65 -0
  64. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts +17 -0
  65. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -0
  66. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +93 -0
  67. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +16 -0
  68. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -0
  69. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +74 -0
  70. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +20 -0
  71. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -0
  72. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +73 -0
  73. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +15 -0
  74. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -0
  75. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +19 -0
  76. package/dest/mem_pools/tx_pool_v2/index.d.ts +6 -0
  77. package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -0
  78. package/dest/mem_pools/tx_pool_v2/index.js +5 -0
  79. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts +15 -0
  80. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts.map +1 -0
  81. package/dest/mem_pools/tx_pool_v2/instrumentation.js +43 -0
  82. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +209 -0
  83. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -0
  84. package/dest/mem_pools/tx_pool_v2/interfaces.js +8 -0
  85. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +97 -0
  86. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -0
  87. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +152 -0
  88. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts +26 -0
  89. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts.map +1 -0
  90. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.js +70 -0
  91. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +108 -0
  92. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -0
  93. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +355 -0
  94. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +60 -0
  95. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -0
  96. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +161 -0
  97. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +77 -0
  98. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -0
  99. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +878 -0
  100. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +3 -3
  101. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
  102. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +3 -3
  103. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  104. package/dest/msg_validators/tx_validator/archive_cache.d.ts +3 -3
  105. package/dest/msg_validators/tx_validator/archive_cache.d.ts.map +1 -1
  106. package/dest/msg_validators/tx_validator/archive_cache.js +1 -1
  107. package/dest/msg_validators/tx_validator/block_header_validator.d.ts +18 -5
  108. package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
  109. package/dest/msg_validators/tx_validator/block_header_validator.js +2 -2
  110. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +13 -3
  111. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
  112. package/dest/msg_validators/tx_validator/double_spend_validator.js +4 -4
  113. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +20 -4
  114. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
  115. package/dest/msg_validators/tx_validator/timestamp_validator.js +6 -6
  116. package/dest/services/data_store.d.ts +1 -1
  117. package/dest/services/data_store.d.ts.map +1 -1
  118. package/dest/services/data_store.js +10 -6
  119. package/dest/services/dummy_service.d.ts +12 -3
  120. package/dest/services/dummy_service.d.ts.map +1 -1
  121. package/dest/services/dummy_service.js +9 -0
  122. package/dest/services/encoding.d.ts +2 -2
  123. package/dest/services/encoding.d.ts.map +1 -1
  124. package/dest/services/encoding.js +4 -3
  125. package/dest/services/gossipsub/index.d.ts +3 -0
  126. package/dest/services/gossipsub/index.d.ts.map +1 -0
  127. package/dest/services/gossipsub/index.js +2 -0
  128. package/dest/services/gossipsub/scoring.d.ts +21 -3
  129. package/dest/services/gossipsub/scoring.d.ts.map +1 -1
  130. package/dest/services/gossipsub/scoring.js +24 -7
  131. package/dest/services/gossipsub/topic_score_params.d.ts +173 -0
  132. package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -0
  133. package/dest/services/gossipsub/topic_score_params.js +346 -0
  134. package/dest/services/index.d.ts +2 -1
  135. package/dest/services/index.d.ts.map +1 -1
  136. package/dest/services/index.js +1 -0
  137. package/dest/services/libp2p/libp2p_service.d.ts +85 -35
  138. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  139. package/dest/services/libp2p/libp2p_service.js +379 -280
  140. package/dest/services/peer-manager/peer_scoring.d.ts +1 -1
  141. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  142. package/dest/services/peer-manager/peer_scoring.js +25 -2
  143. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +6 -5
  144. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -1
  145. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +13 -17
  146. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +2 -6
  147. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
  148. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +10 -13
  149. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -1
  150. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +25 -46
  151. package/dest/services/reqresp/interface.d.ts +10 -1
  152. package/dest/services/reqresp/interface.d.ts.map +1 -1
  153. package/dest/services/reqresp/interface.js +15 -1
  154. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +7 -5
  155. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
  156. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +17 -12
  157. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +25 -14
  158. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
  159. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +40 -24
  160. package/dest/services/reqresp/protocols/tx.d.ts +7 -1
  161. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  162. package/dest/services/reqresp/protocols/tx.js +20 -0
  163. package/dest/services/reqresp/reqresp.d.ts +1 -1
  164. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  165. package/dest/services/reqresp/reqresp.js +11 -4
  166. package/dest/services/service.d.ts +38 -2
  167. package/dest/services/service.d.ts.map +1 -1
  168. package/dest/services/tx_collection/config.d.ts +22 -4
  169. package/dest/services/tx_collection/config.d.ts.map +1 -1
  170. package/dest/services/tx_collection/config.js +49 -3
  171. package/dest/services/tx_collection/fast_tx_collection.d.ts +6 -5
  172. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
  173. package/dest/services/tx_collection/fast_tx_collection.js +64 -48
  174. package/dest/services/tx_collection/file_store_tx_collection.d.ts +53 -0
  175. package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -0
  176. package/dest/services/tx_collection/file_store_tx_collection.js +167 -0
  177. package/dest/services/tx_collection/file_store_tx_source.d.ts +37 -0
  178. package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -0
  179. package/dest/services/tx_collection/file_store_tx_source.js +90 -0
  180. package/dest/services/tx_collection/index.d.ts +3 -2
  181. package/dest/services/tx_collection/index.d.ts.map +1 -1
  182. package/dest/services/tx_collection/index.js +1 -0
  183. package/dest/services/tx_collection/instrumentation.d.ts +1 -1
  184. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
  185. package/dest/services/tx_collection/instrumentation.js +2 -1
  186. package/dest/services/tx_collection/missing_txs_tracker.d.ts +32 -0
  187. package/dest/services/tx_collection/missing_txs_tracker.d.ts.map +1 -0
  188. package/dest/services/tx_collection/missing_txs_tracker.js +27 -0
  189. package/dest/services/tx_collection/proposal_tx_collector.d.ts +15 -14
  190. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -1
  191. package/dest/services/tx_collection/proposal_tx_collector.js +6 -6
  192. package/dest/services/tx_collection/slow_tx_collection.d.ts +7 -3
  193. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -1
  194. package/dest/services/tx_collection/slow_tx_collection.js +60 -26
  195. package/dest/services/tx_collection/tx_collection.d.ts +23 -10
  196. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  197. package/dest/services/tx_collection/tx_collection.js +75 -3
  198. package/dest/services/tx_collection/tx_collection_sink.d.ts +18 -8
  199. package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -1
  200. package/dest/services/tx_collection/tx_collection_sink.js +26 -29
  201. package/dest/services/tx_collection/tx_source.d.ts +8 -3
  202. package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
  203. package/dest/services/tx_collection/tx_source.js +19 -2
  204. package/dest/services/tx_file_store/config.d.ts +16 -0
  205. package/dest/services/tx_file_store/config.d.ts.map +1 -0
  206. package/dest/services/tx_file_store/config.js +22 -0
  207. package/dest/services/tx_file_store/index.d.ts +4 -0
  208. package/dest/services/tx_file_store/index.d.ts.map +1 -0
  209. package/dest/services/tx_file_store/index.js +3 -0
  210. package/dest/services/tx_file_store/instrumentation.d.ts +15 -0
  211. package/dest/services/tx_file_store/instrumentation.d.ts.map +1 -0
  212. package/dest/services/tx_file_store/instrumentation.js +29 -0
  213. package/dest/services/tx_file_store/tx_file_store.d.ts +48 -0
  214. package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -0
  215. package/dest/services/tx_file_store/tx_file_store.js +152 -0
  216. package/dest/services/tx_provider.d.ts +3 -3
  217. package/dest/services/tx_provider.d.ts.map +1 -1
  218. package/dest/services/tx_provider.js +5 -4
  219. package/dest/test-helpers/make-test-p2p-clients.d.ts +3 -3
  220. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  221. package/dest/test-helpers/mock-pubsub.d.ts +29 -2
  222. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  223. package/dest/test-helpers/mock-pubsub.js +103 -2
  224. package/dest/test-helpers/reqresp-nodes.d.ts +1 -1
  225. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  226. package/dest/test-helpers/reqresp-nodes.js +2 -1
  227. package/dest/test-helpers/testbench-utils.d.ts +45 -38
  228. package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
  229. package/dest/test-helpers/testbench-utils.js +130 -60
  230. package/dest/testbench/p2p_client_testbench_worker.d.ts +2 -2
  231. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  232. package/dest/testbench/p2p_client_testbench_worker.js +11 -11
  233. package/dest/util.d.ts +2 -2
  234. package/dest/util.d.ts.map +1 -1
  235. package/package.json +14 -14
  236. package/src/client/factory.ts +89 -14
  237. package/src/client/interface.ts +59 -23
  238. package/src/client/p2p_client.ts +196 -167
  239. package/src/client/test/tx_proposal_collector/README.md +4 -4
  240. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +20 -10
  241. package/src/config.ts +41 -2
  242. package/src/errors/tx-pool.error.ts +12 -0
  243. package/src/index.ts +1 -0
  244. package/src/mem_pools/attestation_pool/attestation_pool.ts +496 -91
  245. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +442 -102
  246. package/src/mem_pools/attestation_pool/index.ts +9 -2
  247. package/src/mem_pools/attestation_pool/mocks.ts +2 -1
  248. package/src/mem_pools/index.ts +4 -1
  249. package/src/mem_pools/interface.ts +4 -4
  250. package/src/mem_pools/tx_pool/README.md +1 -1
  251. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +3 -3
  252. package/src/mem_pools/tx_pool_v2/README.md +275 -0
  253. package/src/mem_pools/tx_pool_v2/archive/index.ts +1 -0
  254. package/src/mem_pools/tx_pool_v2/archive/tx_archive.ts +120 -0
  255. package/src/mem_pools/tx_pool_v2/deleted_pool.ts +321 -0
  256. package/src/mem_pools/tx_pool_v2/eviction/eviction_manager.ts +160 -0
  257. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +121 -0
  258. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +122 -0
  259. package/src/mem_pools/tx_pool_v2/eviction/index.ts +27 -0
  260. package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +209 -0
  261. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +74 -0
  262. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +101 -0
  263. package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +87 -0
  264. package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +90 -0
  265. package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +31 -0
  266. package/src/mem_pools/tx_pool_v2/index.ts +12 -0
  267. package/src/mem_pools/tx_pool_v2/instrumentation.ts +69 -0
  268. package/src/mem_pools/tx_pool_v2/interfaces.ts +239 -0
  269. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +242 -0
  270. package/src/mem_pools/tx_pool_v2/tx_pool_bench_metrics.ts +77 -0
  271. package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +444 -0
  272. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +223 -0
  273. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +1052 -0
  274. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +2 -2
  275. package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +2 -2
  276. package/src/msg_validators/tx_validator/archive_cache.ts +3 -3
  277. package/src/msg_validators/tx_validator/block_header_validator.ts +18 -8
  278. package/src/msg_validators/tx_validator/double_spend_validator.ts +11 -6
  279. package/src/msg_validators/tx_validator/timestamp_validator.ts +23 -18
  280. package/src/services/data_store.ts +10 -7
  281. package/src/services/dummy_service.ts +17 -1
  282. package/src/services/encoding.ts +4 -3
  283. package/src/services/gossipsub/README.md +641 -0
  284. package/src/services/gossipsub/index.ts +2 -0
  285. package/src/services/gossipsub/scoring.ts +29 -5
  286. package/src/services/gossipsub/topic_score_params.ts +487 -0
  287. package/src/services/index.ts +1 -0
  288. package/src/services/libp2p/libp2p_service.ts +382 -282
  289. package/src/services/peer-manager/peer_scoring.ts +25 -0
  290. package/src/services/reqresp/batch-tx-requester/README.md +14 -14
  291. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +18 -18
  292. package/src/services/reqresp/batch-tx-requester/interface.ts +1 -5
  293. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +23 -71
  294. package/src/services/reqresp/interface.ts +26 -1
  295. package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +24 -15
  296. package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +47 -24
  297. package/src/services/reqresp/protocols/tx.ts +22 -0
  298. package/src/services/reqresp/reqresp.ts +13 -3
  299. package/src/services/service.ts +50 -1
  300. package/src/services/tx_collection/config.ts +74 -6
  301. package/src/services/tx_collection/fast_tx_collection.ts +74 -51
  302. package/src/services/tx_collection/file_store_tx_collection.ts +202 -0
  303. package/src/services/tx_collection/file_store_tx_source.ts +117 -0
  304. package/src/services/tx_collection/index.ts +2 -1
  305. package/src/services/tx_collection/instrumentation.ts +7 -1
  306. package/src/services/tx_collection/missing_txs_tracker.ts +52 -0
  307. package/src/services/tx_collection/proposal_tx_collector.ts +20 -21
  308. package/src/services/tx_collection/slow_tx_collection.ts +66 -33
  309. package/src/services/tx_collection/tx_collection.ts +113 -16
  310. package/src/services/tx_collection/tx_collection_sink.ts +30 -34
  311. package/src/services/tx_collection/tx_source.ts +22 -3
  312. package/src/services/tx_file_store/config.ts +37 -0
  313. package/src/services/tx_file_store/index.ts +3 -0
  314. package/src/services/tx_file_store/instrumentation.ts +36 -0
  315. package/src/services/tx_file_store/tx_file_store.ts +175 -0
  316. package/src/services/tx_provider.ts +8 -7
  317. package/src/test-helpers/make-test-p2p-clients.ts +3 -3
  318. package/src/test-helpers/mock-pubsub.ts +143 -3
  319. package/src/test-helpers/reqresp-nodes.ts +2 -1
  320. package/src/test-helpers/testbench-utils.ts +129 -71
  321. package/src/testbench/p2p_client_testbench_worker.ts +23 -16
  322. package/src/util.ts +7 -1
  323. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +0 -40
  324. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +0 -1
  325. package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +0 -218
  326. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +0 -31
  327. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +0 -1
  328. package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +0 -180
  329. package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +0 -320
  330. package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +0 -264
@@ -0,0 +1,90 @@
1
+ import { createLogger } from '@aztec/foundation/log';
2
+ import { Timer } from '@aztec/foundation/timer';
3
+ import { createReadOnlyFileStore } from '@aztec/stdlib/file-store';
4
+ import { Tx } from '@aztec/stdlib/tx';
5
+ import { Metrics, getTelemetryClient } from '@aztec/telemetry-client';
6
+ /** TxSource implementation that downloads txs from a file store. */ export class FileStoreTxSource {
7
+ fileStore;
8
+ baseUrl;
9
+ basePath;
10
+ log;
11
+ downloadsSuccess;
12
+ downloadsFailed;
13
+ downloadDuration;
14
+ downloadSize;
15
+ constructor(fileStore, baseUrl, basePath, log, telemetry){
16
+ this.fileStore = fileStore;
17
+ this.baseUrl = baseUrl;
18
+ this.basePath = basePath;
19
+ this.log = log;
20
+ const meter = telemetry.getMeter('file-store-tx-source');
21
+ this.downloadsSuccess = meter.createUpDownCounter(Metrics.TX_FILE_STORE_DOWNLOADS_SUCCESS);
22
+ this.downloadsFailed = meter.createUpDownCounter(Metrics.TX_FILE_STORE_DOWNLOADS_FAILED);
23
+ this.downloadDuration = meter.createHistogram(Metrics.TX_FILE_STORE_DOWNLOAD_DURATION);
24
+ this.downloadSize = meter.createHistogram(Metrics.TX_FILE_STORE_DOWNLOAD_SIZE);
25
+ }
26
+ /**
27
+ * Creates a FileStoreTxSource from a URL.
28
+ * @param url - The file store URL (s3://, gs://, file://, http://, https://).
29
+ * @param basePath - Base path for tx files within the store.
30
+ * @param log - Optional logger.
31
+ * @param telemetry - Optional telemetry client.
32
+ * @returns The FileStoreTxSource instance, or undefined if creation fails.
33
+ */ static async create(url, basePath, log = createLogger('p2p:file_store_tx_source'), telemetry = getTelemetryClient()) {
34
+ try {
35
+ const fileStore = await createReadOnlyFileStore(url, log);
36
+ if (!fileStore) {
37
+ log.warn(`Failed to create file store for URL: ${url}`);
38
+ return undefined;
39
+ }
40
+ return new FileStoreTxSource(fileStore, url, basePath, log, telemetry);
41
+ } catch (err) {
42
+ log.warn(`Error creating file store for URL: ${url}`, {
43
+ error: err
44
+ });
45
+ return undefined;
46
+ }
47
+ }
48
+ getInfo() {
49
+ return `file-store:${this.baseUrl}`;
50
+ }
51
+ async getTxsByHash(txHashes) {
52
+ const invalidTxHashes = [];
53
+ return {
54
+ validTxs: (await Promise.all(txHashes.map(async (txHash)=>{
55
+ const path = `${this.basePath}/txs/${txHash.toString()}.bin`;
56
+ const timer = new Timer();
57
+ try {
58
+ const buffer = await this.fileStore.read(path);
59
+ const tx = Tx.fromBuffer(buffer);
60
+ if (await tx.validateTxHash() && txHash.equals(tx.txHash)) {
61
+ this.downloadsSuccess.add(1);
62
+ this.downloadDuration.record(Math.ceil(timer.ms()));
63
+ this.downloadSize.record(buffer.length);
64
+ return tx;
65
+ } else {
66
+ invalidTxHashes.push(tx.txHash.toString());
67
+ this.downloadsFailed.add(1);
68
+ return undefined;
69
+ }
70
+ } catch {
71
+ // Tx not found or error reading - return undefined
72
+ this.downloadsFailed.add(1);
73
+ return undefined;
74
+ }
75
+ }))).filter((tx)=>tx !== undefined),
76
+ invalidTxHashes: invalidTxHashes
77
+ };
78
+ }
79
+ }
80
+ /**
81
+ * Creates FileStoreTxSource instances from URLs.
82
+ * @param urls - Array of file store URLs.
83
+ * @param basePath - Base path for tx files within each store.
84
+ * @param log - Optional logger.
85
+ * @param telemetry - Optional telemetry client.
86
+ * @returns Array of successfully created FileStoreTxSource instances.
87
+ */ export async function createFileStoreTxSources(urls, basePath, log = createLogger('p2p:file_store_tx_source'), telemetry = getTelemetryClient()) {
88
+ const sources = await Promise.all(urls.map((url)=>FileStoreTxSource.create(url, basePath, log, telemetry)));
89
+ return sources.filter((s)=>s !== undefined);
90
+ }
@@ -1,4 +1,5 @@
1
1
  export { TxCollection, type FastCollectionRequestInput } from './tx_collection.js';
2
2
  export { type TxSource, createNodeRpcTxSources, NodeRpcTxSource } from './tx_source.js';
3
- export { type ProposalTxCollector, BatchTxRequesterCollector, SendBatchRequestCollector, } from './proposal_tx_collector.js';
4
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZXJ2aWNlcy90eF9jb2xsZWN0aW9uL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsS0FBSywwQkFBMEIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ25GLE9BQU8sRUFBRSxLQUFLLFFBQVEsRUFBRSxzQkFBc0IsRUFBRSxlQUFlLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4RixPQUFPLEVBQ0wsS0FBSyxtQkFBbUIsRUFDeEIseUJBQXlCLEVBQ3pCLHlCQUF5QixHQUMxQixNQUFNLDRCQUE0QixDQUFDIn0=
3
+ export { type MissingTxsCollector, BatchTxRequesterCollector, SendBatchRequestCollector, } from './proposal_tx_collector.js';
4
+ export { FileStoreTxSource, createFileStoreTxSources } from './file_store_tx_source.js';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZXJ2aWNlcy90eF9jb2xsZWN0aW9uL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsS0FBSywwQkFBMEIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ25GLE9BQU8sRUFBRSxLQUFLLFFBQVEsRUFBRSxzQkFBc0IsRUFBRSxlQUFlLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4RixPQUFPLEVBQ0wsS0FBSyxtQkFBbUIsRUFDeEIseUJBQXlCLEVBQ3pCLHlCQUF5QixHQUMxQixNQUFNLDRCQUE0QixDQUFDO0FBQ3BDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSx3QkFBd0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDIn0=
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/tx_collection/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,KAAK,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AACnF,OAAO,EAAE,KAAK,QAAQ,EAAE,sBAAsB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACxF,OAAO,EACL,KAAK,mBAAmB,EACxB,yBAAyB,EACzB,yBAAyB,GAC1B,MAAM,4BAA4B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/tx_collection/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,KAAK,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AACnF,OAAO,EAAE,KAAK,QAAQ,EAAE,sBAAsB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACxF,OAAO,EACL,KAAK,mBAAmB,EACxB,yBAAyB,EACzB,yBAAyB,GAC1B,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC"}
@@ -1,3 +1,4 @@
1
1
  export { TxCollection } from './tx_collection.js';
2
2
  export { createNodeRpcTxSources, NodeRpcTxSource } from './tx_source.js';
3
3
  export { BatchTxRequesterCollector, SendBatchRequestCollector } from './proposal_tx_collector.js';
4
+ export { FileStoreTxSource, createFileStoreTxSources } from './file_store_tx_source.js';
@@ -7,4 +7,4 @@ export declare class TxCollectionInstrumentation {
7
7
  constructor(client: TelemetryClient, name: string);
8
8
  increaseTxsFor(what: CollectionMethod, count: number, duration: number): void;
9
9
  }
10
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdHJ1bWVudGF0aW9uLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvdHhfY29sbGVjdGlvbi9pbnN0cnVtZW50YXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUlMLEtBQUssZUFBZSxFQUdyQixNQUFNLHlCQUF5QixDQUFDO0FBRWpDLE9BQU8sS0FBSyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFM0QscUJBQWEsMkJBQTJCO0lBQ3RDLE9BQU8sQ0FBQyxZQUFZLENBQWdCO0lBQ3BDLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBWTtJQUMzQyxPQUFPLENBQUMsNEJBQTRCLENBQVk7SUFFaEQsWUFBWSxNQUFNLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxNQUFNLEVBVWhEO0lBRUQsY0FBYyxDQUFDLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLFFBS3JFO0NBQ0YifQ==
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdHJ1bWVudGF0aW9uLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvdHhfY29sbGVjdGlvbi9pbnN0cnVtZW50YXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUlMLEtBQUssZUFBZSxFQUdyQixNQUFNLHlCQUF5QixDQUFDO0FBRWpDLE9BQU8sS0FBSyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFM0QscUJBQWEsMkJBQTJCO0lBQ3RDLE9BQU8sQ0FBQyxZQUFZLENBQWdCO0lBQ3BDLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBWTtJQUMzQyxPQUFPLENBQUMsNEJBQTRCLENBQVk7SUFFaEQsWUFBWSxNQUFNLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxNQUFNLEVBZ0JoRDtJQUVELGNBQWMsQ0FBQyxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxRQUtyRTtDQUNGIn0=
@@ -1 +1 @@
1
- {"version":3,"file":"instrumentation.d.ts","sourceRoot":"","sources":["../../../src/services/tx_collection/instrumentation.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,eAAe,EAGrB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,qBAAa,2BAA2B;IACtC,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,uBAAuB,CAAY;IAC3C,OAAO,CAAC,4BAA4B,CAAY;IAEhD,YAAY,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,EAUhD;IAED,cAAc,CAAC,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,QAKrE;CACF"}
1
+ {"version":3,"file":"instrumentation.d.ts","sourceRoot":"","sources":["../../../src/services/tx_collection/instrumentation.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,eAAe,EAGrB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,qBAAa,2BAA2B;IACtC,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,uBAAuB,CAAY;IAC3C,OAAO,CAAC,4BAA4B,CAAY;IAEhD,YAAY,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,EAgBhD;IAED,cAAc,CAAC,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,QAKrE;CACF"}
@@ -10,7 +10,8 @@ export class TxCollectionInstrumentation {
10
10
  'fast-req-resp',
11
11
  'fast-node-rpc',
12
12
  'slow-req-resp',
13
- 'slow-node-rpc'
13
+ 'slow-node-rpc',
14
+ 'file-store'
14
15
  ]
15
16
  });
16
17
  this.collectionDurationPerTx = meter.createHistogram(Metrics.TX_COLLECTOR_DURATION_PER_TX);
@@ -0,0 +1,32 @@
1
+ import { TxHash } from '@aztec/stdlib/tx';
2
+ import type { Tx } from '@aztec/stdlib/tx';
3
+ /**
4
+ * Tracks which transactions are still missing and need to be fetched.
5
+ * Allows external code to mark transactions as fetched, enabling coordination
6
+ * between multiple fetching mechanisms (e.g., BatchTxRequester and Rpc Node requests).
7
+ */
8
+ export interface IMissingTxsTracker {
9
+ /** Returns the set of transaction hashes that are still missing. */
10
+ get missingTxHashes(): Set<string>;
11
+ /** Size of this.missingTxHashes */
12
+ get numberOfMissingTxs(): number;
13
+ /** Are all requested txs are fetched */
14
+ allFetched(): boolean;
15
+ /** Checks that transaction is still missing */
16
+ isMissing(txHash: string): boolean;
17
+ /** Marks a transaction as fetched. Returns true if it was previously missing. */
18
+ markFetched(tx: Tx): boolean;
19
+ /** Get list of collected txs */
20
+ get collectedTxs(): Tx[];
21
+ }
22
+ export declare class MissingTxsTracker implements IMissingTxsTracker {
23
+ readonly missingTxHashes: Set<string>;
24
+ readonly collectedTxs: Tx[];
25
+ private constructor();
26
+ static fromArray(hashes: TxHash[] | string[]): MissingTxsTracker;
27
+ markFetched(tx: Tx): boolean;
28
+ get numberOfMissingTxs(): number;
29
+ allFetched(): boolean;
30
+ isMissing(txHash: string): boolean;
31
+ }
32
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlzc2luZ190eHNfdHJhY2tlci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NlcnZpY2VzL3R4X2NvbGxlY3Rpb24vbWlzc2luZ190eHNfdHJhY2tlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDMUMsT0FBTyxLQUFLLEVBQUUsRUFBRSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFM0M7Ozs7R0FJRztBQUNILE1BQU0sV0FBVyxrQkFBa0I7SUFDakMsb0VBQW9FO0lBQ3BFLElBQUksZUFBZSxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNuQyxtQ0FBbUM7SUFDbkMsSUFBSSxrQkFBa0IsSUFBSSxNQUFNLENBQUM7SUFDakMsd0NBQXdDO0lBQ3hDLFVBQVUsSUFBSSxPQUFPLENBQUM7SUFDdEIsK0NBQStDO0lBQy9DLFNBQVMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLE9BQU8sQ0FBQztJQUNuQyxpRkFBaUY7SUFDakYsV0FBVyxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsT0FBTyxDQUFDO0lBQzdCLGdDQUFnQztJQUNoQyxJQUFJLFlBQVksSUFBSSxFQUFFLEVBQUUsQ0FBQztDQUMxQjtBQUVELHFCQUFhLGlCQUFrQixZQUFXLGtCQUFrQjthQUd0QixlQUFlLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQztJQUZoRSxTQUFnQixZQUFZLEVBQUUsRUFBRSxFQUFFLENBQU07SUFFeEMsT0FBTyxlQUE2RDtJQUVwRSxPQUFjLFNBQVMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsTUFBTSxFQUFFLHFCQUVsRDtJQUVELFdBQVcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLE9BQU8sQ0FNM0I7SUFFRCxJQUFJLGtCQUFrQixJQUFJLE1BQU0sQ0FFL0I7SUFFRCxVQUFVLElBQUksT0FBTyxDQUVwQjtJQUVELFNBQVMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLE9BQU8sQ0FFakM7Q0FDRiJ9
@@ -0,0 +1 @@
1
+ {"version":3,"file":"missing_txs_tracker.d.ts","sourceRoot":"","sources":["../../../src/services/tx_collection/missing_txs_tracker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAE3C;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IACjC,oEAAoE;IACpE,IAAI,eAAe,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;IACnC,mCAAmC;IACnC,IAAI,kBAAkB,IAAI,MAAM,CAAC;IACjC,wCAAwC;IACxC,UAAU,IAAI,OAAO,CAAC;IACtB,+CAA+C;IAC/C,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IACnC,iFAAiF;IACjF,WAAW,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC;IAC7B,gCAAgC;IAChC,IAAI,YAAY,IAAI,EAAE,EAAE,CAAC;CAC1B;AAED,qBAAa,iBAAkB,YAAW,kBAAkB;aAGtB,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC;IAFhE,SAAgB,YAAY,EAAE,EAAE,EAAE,CAAM;IAExC,OAAO,eAA6D;IAEpE,OAAc,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,qBAElD;IAED,WAAW,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAM3B;IAED,IAAI,kBAAkB,IAAI,MAAM,CAE/B;IAED,UAAU,IAAI,OAAO,CAEpB;IAED,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEjC;CACF"}
@@ -0,0 +1,27 @@
1
+ export class MissingTxsTracker {
2
+ missingTxHashes;
3
+ collectedTxs;
4
+ constructor(missingTxHashes){
5
+ this.missingTxHashes = missingTxHashes;
6
+ this.collectedTxs = [];
7
+ }
8
+ static fromArray(hashes) {
9
+ return new MissingTxsTracker(new Set(hashes.map((hash)=>hash.toString())));
10
+ }
11
+ markFetched(tx) {
12
+ if (this.missingTxHashes.delete(tx.txHash.toString())) {
13
+ this.collectedTxs.push(tx);
14
+ return true;
15
+ }
16
+ return false;
17
+ }
18
+ get numberOfMissingTxs() {
19
+ return this.missingTxHashes.size;
20
+ }
21
+ allFetched() {
22
+ return this.numberOfMissingTxs === 0;
23
+ }
24
+ isMissing(txHash) {
25
+ return this.missingTxHashes.has(txHash.toString());
26
+ }
27
+ }
@@ -1,48 +1,49 @@
1
1
  import type { Logger } from '@aztec/foundation/log';
2
2
  import type { DateProvider } from '@aztec/foundation/timer';
3
- import type { BlockProposal } from '@aztec/stdlib/p2p';
4
- import type { Tx, TxHash } from '@aztec/stdlib/tx';
3
+ import { type Tx } from '@aztec/stdlib/tx';
5
4
  import type { PeerId } from '@libp2p/interface';
6
5
  import type { BatchTxRequesterConfig } from '../reqresp/batch-tx-requester/config.js';
7
6
  import type { BatchTxRequesterLibP2PService } from '../reqresp/batch-tx-requester/interface.js';
8
7
  import type { IBatchRequestTxValidator } from '../reqresp/batch-tx-requester/tx_validator.js';
8
+ import { type BlockTxsSource } from '../reqresp/index.js';
9
+ import type { IMissingTxsTracker } from './missing_txs_tracker.js';
9
10
  /**
10
- * Strategy interface for collecting transactions for block proposals.
11
+ * Strategy interface for collecting missing transactions for a block or proposal.
11
12
  * Allows swapping between different tx collection implementations for benchmarking.
12
13
  */
13
- export interface ProposalTxCollector {
14
+ export interface MissingTxsCollector {
14
15
  /**
15
- * Collect transactions for a block proposal.
16
- * @param txHashes - The transaction hashes to collect
17
- * @param blockProposal - The block proposal containing the transactions
18
- * @param pinnedPeer - Optional peer that sent the proposal (expected to have all txs)
16
+ * Collect missing transactions for a block or proposal.
17
+ * @param missingTxsTracker - The missing transactions tracker
18
+ * @param blockTxsSource - The block or proposal containing the transactions
19
+ * @param pinnedPeer - Optional peer expected to have the transactions
19
20
  * @param timeoutMs - Timeout in milliseconds
20
21
  * @returns The collected transactions
21
22
  */
22
- collectTxs(txHashes: TxHash[], blockProposal: BlockProposal, pinnedPeer: PeerId | undefined, timeoutMs: number): Promise<Tx[]>;
23
+ collectTxs(missingTxsTracker: IMissingTxsTracker, blockTxsSource: BlockTxsSource, pinnedPeer: PeerId | undefined, timeoutMs: number): Promise<Tx[]>;
23
24
  }
24
25
  /**
25
26
  * Collects transactions using the BatchTxRequester implementation.
26
27
  * This uses a smart/dumb peer strategy with parallel workers.
27
28
  */
28
- export declare class BatchTxRequesterCollector implements ProposalTxCollector {
29
+ export declare class BatchTxRequesterCollector implements MissingTxsCollector {
29
30
  private p2pService;
30
31
  private log;
31
32
  private dateProvider;
32
33
  private txValidator?;
33
34
  private batchTxRequesterConfig?;
34
35
  constructor(p2pService: BatchTxRequesterLibP2PService, log: Logger, dateProvider: DateProvider, txValidator?: IBatchRequestTxValidator | undefined, batchTxRequesterConfig?: Partial<BatchTxRequesterConfig> | undefined);
35
- collectTxs(txHashes: TxHash[], blockProposal: BlockProposal, pinnedPeer: PeerId | undefined, timeoutMs: number): Promise<Tx[]>;
36
+ collectTxs(missingTxsTracker: IMissingTxsTracker, blockTxsSource: BlockTxsSource, pinnedPeer: PeerId | undefined, timeoutMs: number): Promise<Tx[]>;
36
37
  }
37
38
  /**
38
39
  * Collects transactions using the sendBatchRequest implementation from ReqResp.
39
40
  * This is the original implementation that balances requests across peers.
40
41
  */
41
- export declare class SendBatchRequestCollector implements ProposalTxCollector {
42
+ export declare class SendBatchRequestCollector implements MissingTxsCollector {
42
43
  private p2pService;
43
44
  private maxPeers;
44
45
  private maxRetryAttempts;
45
46
  constructor(p2pService: BatchTxRequesterLibP2PService, maxPeers?: number, maxRetryAttempts?: number);
46
- collectTxs(txHashes: TxHash[], _blockProposal: BlockProposal, pinnedPeer: PeerId | undefined, timeoutMs: number): Promise<Tx[]>;
47
+ collectTxs(missingTxsTracker: IMissingTxsTracker, _blockTxsSource: BlockTxsSource, pinnedPeer: PeerId | undefined, timeoutMs: number): Promise<Tx[]>;
47
48
  }
48
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcG9zYWxfdHhfY29sbGVjdG9yLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvdHhfY29sbGVjdGlvbi9wcm9wb3NhbF90eF9jb2xsZWN0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDcEQsT0FBTyxLQUFLLEVBQUUsWUFBWSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDNUQsT0FBTyxLQUFLLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDdkQsT0FBTyxLQUFLLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRW5ELE9BQU8sS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBR2hELE9BQU8sS0FBSyxFQUFFLHNCQUFzQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDdEYsT0FBTyxLQUFLLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUNoRyxPQUFPLEtBQUssRUFBRSx3QkFBd0IsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBSTlGOzs7R0FHRztBQUNILE1BQU0sV0FBVyxtQkFBbUI7SUFDbEM7Ozs7Ozs7T0FPRztJQUNILFVBQVUsQ0FDUixRQUFRLEVBQUUsTUFBTSxFQUFFLEVBQ2xCLGFBQWEsRUFBRSxhQUFhLEVBQzVCLFVBQVUsRUFBRSxNQUFNLEdBQUcsU0FBUyxFQUM5QixTQUFTLEVBQUUsTUFBTSxHQUNoQixPQUFPLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztDQUNsQjtBQUVEOzs7R0FHRztBQUNILHFCQUFhLHlCQUEwQixZQUFXLG1CQUFtQjtJQUVqRSxPQUFPLENBQUMsVUFBVTtJQUNsQixPQUFPLENBQUMsR0FBRztJQUNYLE9BQU8sQ0FBQyxZQUFZO0lBQ3BCLE9BQU8sQ0FBQyxXQUFXLENBQUM7SUFDcEIsT0FBTyxDQUFDLHNCQUFzQixDQUFDO0lBTGpDLFlBQ1UsVUFBVSxFQUFFLDZCQUE2QixFQUN6QyxHQUFHLEVBQUUsTUFBTSxFQUNYLFlBQVksRUFBRSxZQUFZLEVBQzFCLFdBQVcsQ0FBQyxzQ0FBMEIsRUFDdEMsc0JBQXNCLENBQUMsNkNBQWlDLEVBQzlEO0lBRUUsVUFBVSxDQUNkLFFBQVEsRUFBRSxNQUFNLEVBQUUsRUFDbEIsYUFBYSxFQUFFLGFBQWEsRUFDNUIsVUFBVSxFQUFFLE1BQU0sR0FBRyxTQUFTLEVBQzlCLFNBQVMsRUFBRSxNQUFNLEdBQ2hCLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQTBCZjtDQUNGO0FBS0Q7OztHQUdHO0FBQ0gscUJBQWEseUJBQTBCLFlBQVcsbUJBQW1CO0lBRWpFLE9BQU8sQ0FBQyxVQUFVO0lBQ2xCLE9BQU8sQ0FBQyxRQUFRO0lBQ2hCLE9BQU8sQ0FBQyxnQkFBZ0I7SUFIMUIsWUFDVSxVQUFVLEVBQUUsNkJBQTZCLEVBQ3pDLFFBQVEsR0FBRSxNQUEwQixFQUNwQyxnQkFBZ0IsR0FBRSxNQUFtQyxFQUMzRDtJQUVFLFVBQVUsQ0FDZCxRQUFRLEVBQUUsTUFBTSxFQUFFLEVBQ2xCLGNBQWMsRUFBRSxhQUFhLEVBQzdCLFVBQVUsRUFBRSxNQUFNLEdBQUcsU0FBUyxFQUM5QixTQUFTLEVBQUUsTUFBTSxHQUNoQixPQUFPLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FXZjtDQUNGIn0=
49
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcG9zYWxfdHhfY29sbGVjdG9yLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvdHhfY29sbGVjdGlvbi9wcm9wb3NhbF90eF9jb2xsZWN0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDcEQsT0FBTyxLQUFLLEVBQUUsWUFBWSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDNUQsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFVLE1BQU0sa0JBQWtCLENBQUM7QUFFbkQsT0FBTyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFHaEQsT0FBTyxLQUFLLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUN0RixPQUFPLEtBQUssRUFBRSw2QkFBNkIsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQ2hHLE9BQU8sS0FBSyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDOUYsT0FBTyxFQUFFLEtBQUssY0FBYyxFQUE0QyxNQUFNLHFCQUFxQixDQUFDO0FBQ3BHLE9BQU8sS0FBSyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFbkU7OztHQUdHO0FBQ0gsTUFBTSxXQUFXLG1CQUFtQjtJQUNsQzs7Ozs7OztPQU9HO0lBQ0gsVUFBVSxDQUNSLGlCQUFpQixFQUFFLGtCQUFrQixFQUNyQyxjQUFjLEVBQUUsY0FBYyxFQUM5QixVQUFVLEVBQUUsTUFBTSxHQUFHLFNBQVMsRUFDOUIsU0FBUyxFQUFFLE1BQU0sR0FDaEIsT0FBTyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7Q0FDbEI7QUFFRDs7O0dBR0c7QUFDSCxxQkFBYSx5QkFBMEIsWUFBVyxtQkFBbUI7SUFFakUsT0FBTyxDQUFDLFVBQVU7SUFDbEIsT0FBTyxDQUFDLEdBQUc7SUFDWCxPQUFPLENBQUMsWUFBWTtJQUNwQixPQUFPLENBQUMsV0FBVyxDQUFDO0lBQ3BCLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQztJQUxqQyxZQUNVLFVBQVUsRUFBRSw2QkFBNkIsRUFDekMsR0FBRyxFQUFFLE1BQU0sRUFDWCxZQUFZLEVBQUUsWUFBWSxFQUMxQixXQUFXLENBQUMsc0NBQTBCLEVBQ3RDLHNCQUFzQixDQUFDLDZDQUFpQyxFQUM5RDtJQUVFLFVBQVUsQ0FDZCxpQkFBaUIsRUFBRSxrQkFBa0IsRUFDckMsY0FBYyxFQUFFLGNBQWMsRUFDOUIsVUFBVSxFQUFFLE1BQU0sR0FBRyxTQUFTLEVBQzlCLFNBQVMsRUFBRSxNQUFNLEdBQ2hCLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQTBCZjtDQUNGO0FBS0Q7OztHQUdHO0FBQ0gscUJBQWEseUJBQTBCLFlBQVcsbUJBQW1CO0lBRWpFLE9BQU8sQ0FBQyxVQUFVO0lBQ2xCLE9BQU8sQ0FBQyxRQUFRO0lBQ2hCLE9BQU8sQ0FBQyxnQkFBZ0I7SUFIMUIsWUFDVSxVQUFVLEVBQUUsNkJBQTZCLEVBQ3pDLFFBQVEsR0FBRSxNQUEwQixFQUNwQyxnQkFBZ0IsR0FBRSxNQUFtQyxFQUMzRDtJQUVFLFVBQVUsQ0FDZCxpQkFBaUIsRUFBRSxrQkFBa0IsRUFDckMsZUFBZSxFQUFFLGNBQWMsRUFDL0IsVUFBVSxFQUFFLE1BQU0sR0FBRyxTQUFTLEVBQzlCLFNBQVMsRUFBRSxNQUFNLEdBQ2hCLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQVdmO0NBQ0YifQ==
@@ -1 +1 @@
1
- {"version":3,"file":"proposal_tx_collector.d.ts","sourceRoot":"","sources":["../../../src/services/tx_collection/proposal_tx_collector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAEnD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAGhD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,yCAAyC,CAAC;AACtF,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,4CAA4C,CAAC;AAChG,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,+CAA+C,CAAC;AAI9F;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;;;;;OAOG;IACH,UAAU,CACR,QAAQ,EAAE,MAAM,EAAE,EAClB,aAAa,EAAE,aAAa,EAC5B,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;CAClB;AAED;;;GAGG;AACH,qBAAa,yBAA0B,YAAW,mBAAmB;IAEjE,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,GAAG;IACX,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,WAAW,CAAC;IACpB,OAAO,CAAC,sBAAsB,CAAC;IALjC,YACU,UAAU,EAAE,6BAA6B,EACzC,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,YAAY,EAC1B,WAAW,CAAC,sCAA0B,EACtC,sBAAsB,CAAC,6CAAiC,EAC9D;IAEE,UAAU,CACd,QAAQ,EAAE,MAAM,EAAE,EAClB,aAAa,EAAE,aAAa,EAC5B,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,EAAE,EAAE,CAAC,CA0Bf;CACF;AAKD;;;GAGG;AACH,qBAAa,yBAA0B,YAAW,mBAAmB;IAEjE,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,gBAAgB;IAH1B,YACU,UAAU,EAAE,6BAA6B,EACzC,QAAQ,GAAE,MAA0B,EACpC,gBAAgB,GAAE,MAAmC,EAC3D;IAEE,UAAU,CACd,QAAQ,EAAE,MAAM,EAAE,EAClB,cAAc,EAAE,aAAa,EAC7B,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,EAAE,EAAE,CAAC,CAWf;CACF"}
1
+ {"version":3,"file":"proposal_tx_collector.d.ts","sourceRoot":"","sources":["../../../src/services/tx_collection/proposal_tx_collector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,KAAK,EAAE,EAAU,MAAM,kBAAkB,CAAC;AAEnD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAGhD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,yCAAyC,CAAC;AACtF,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,4CAA4C,CAAC;AAChG,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,+CAA+C,CAAC;AAC9F,OAAO,EAAE,KAAK,cAAc,EAA4C,MAAM,qBAAqB,CAAC;AACpG,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAEnE;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;;;;;OAOG;IACH,UAAU,CACR,iBAAiB,EAAE,kBAAkB,EACrC,cAAc,EAAE,cAAc,EAC9B,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;CAClB;AAED;;;GAGG;AACH,qBAAa,yBAA0B,YAAW,mBAAmB;IAEjE,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,GAAG;IACX,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,WAAW,CAAC;IACpB,OAAO,CAAC,sBAAsB,CAAC;IALjC,YACU,UAAU,EAAE,6BAA6B,EACzC,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,YAAY,EAC1B,WAAW,CAAC,sCAA0B,EACtC,sBAAsB,CAAC,6CAAiC,EAC9D;IAEE,UAAU,CACd,iBAAiB,EAAE,kBAAkB,EACrC,cAAc,EAAE,cAAc,EAC9B,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,EAAE,EAAE,CAAC,CA0Bf;CACF;AAKD;;;GAGG;AACH,qBAAa,yBAA0B,YAAW,mBAAmB;IAEjE,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,gBAAgB;IAH1B,YACU,UAAU,EAAE,6BAA6B,EACzC,QAAQ,GAAE,MAA0B,EACpC,gBAAgB,GAAE,MAAmC,EAC3D;IAEE,UAAU,CACd,iBAAiB,EAAE,kBAAkB,EACrC,eAAe,EAAE,cAAc,EAC/B,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,EAAE,EAAE,CAAC,CAWf;CACF"}
@@ -1,6 +1,6 @@
1
+ import { TxHash } from '@aztec/stdlib/tx';
1
2
  import { BatchTxRequester } from '../reqresp/batch-tx-requester/batch_tx_requester.js';
2
- import { ReqRespSubProtocol } from '../reqresp/interface.js';
3
- import { chunkTxHashesRequest } from '../reqresp/protocols/tx.js';
3
+ import { ReqRespSubProtocol, chunkTxHashesRequest } from '../reqresp/index.js';
4
4
  /**
5
5
  * Collects transactions using the BatchTxRequester implementation.
6
6
  * This uses a smart/dumb peer strategy with parallel workers.
@@ -17,9 +17,9 @@ import { chunkTxHashesRequest } from '../reqresp/protocols/tx.js';
17
17
  this.txValidator = txValidator;
18
18
  this.batchTxRequesterConfig = batchTxRequesterConfig;
19
19
  }
20
- async collectTxs(txHashes, blockProposal, pinnedPeer, timeoutMs) {
20
+ async collectTxs(missingTxsTracker, blockTxsSource, pinnedPeer, timeoutMs) {
21
21
  const { batchTxRequesterSmartParallelWorkerCount: smartParallelWorkerCount, batchTxRequesterDumbParallelWorkerCount: dumbParallelWorkerCount, batchTxRequesterTxBatchSize: txBatchSize, batchTxRequesterBadPeerThreshold: badPeerThreshold } = this.batchTxRequesterConfig ?? {};
22
- const batchRequester = new BatchTxRequester(txHashes, blockProposal, pinnedPeer, timeoutMs, this.p2pService, this.log, this.dateProvider, {
22
+ const batchRequester = new BatchTxRequester(missingTxsTracker, blockTxsSource, pinnedPeer, timeoutMs, this.p2pService, this.log, this.dateProvider, {
23
23
  smartParallelWorkerCount,
24
24
  dumbParallelWorkerCount,
25
25
  txBatchSize,
@@ -43,8 +43,8 @@ const DEFAULT_MAX_RETRY_ATTEMPTS = 3;
43
43
  this.maxPeers = maxPeers;
44
44
  this.maxRetryAttempts = maxRetryAttempts;
45
45
  }
46
- async collectTxs(txHashes, _blockProposal, pinnedPeer, timeoutMs) {
47
- const txs = await this.p2pService.reqResp.sendBatchRequest(ReqRespSubProtocol.TX, chunkTxHashesRequest(txHashes), pinnedPeer, timeoutMs, this.maxPeers, this.maxRetryAttempts);
46
+ async collectTxs(missingTxsTracker, _blockTxsSource, pinnedPeer, timeoutMs) {
47
+ const txs = await this.p2pService.reqResp.sendBatchRequest(ReqRespSubProtocol.TX, chunkTxHashesRequest(Array.from(missingTxsTracker.missingTxHashes).map(TxHash.fromString)), pinnedPeer, timeoutMs, this.maxPeers, this.maxRetryAttempts);
48
48
  return txs.flat();
49
49
  }
50
50
  }
@@ -1,10 +1,10 @@
1
- import { BlockNumber } from '@aztec/foundation/branded-types';
1
+ import { BlockNumber, SlotNumber } from '@aztec/foundation/branded-types';
2
2
  import { type Logger } from '@aztec/foundation/log';
3
3
  import { DateProvider } from '@aztec/foundation/timer';
4
4
  import type { L2Block } from '@aztec/stdlib/block';
5
5
  import { type L1RollupConstants } from '@aztec/stdlib/epoch-helpers';
6
6
  import { type Tx, TxHash } from '@aztec/stdlib/tx';
7
- import { type ReqRespInterface } from '../reqresp/interface.js';
7
+ import { type ReqRespInterface } from '../reqresp/index.js';
8
8
  import type { TxCollectionConfig } from './config.js';
9
9
  import type { FastTxCollection } from './fast_tx_collection.js';
10
10
  import type { TxCollectionSink } from './tx_collection_sink.js';
@@ -47,7 +47,11 @@ export declare class SlowTxCollection {
47
47
  * To be called when there is a chain prune and previously mined txs are no longer relevant.
48
48
  */
49
49
  stopCollectingForBlocksAfter(blockNumber: BlockNumber): void;
50
+ /** Groups missing tx entries by block number. */
51
+ private groupByBlock;
50
52
  /** Computes the proof submission deadline for a given slot, a tx mined in this slot is no longer interesting after this deadline */
51
53
  private getDeadlineForSlot;
52
54
  }
53
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xvd190eF9jb2xsZWN0aW9uLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvdHhfY29sbGVjdGlvbi9zbG93X3R4X2NvbGxlY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFdBQVcsRUFBMkIsTUFBTSxpQ0FBaUMsQ0FBQztBQUV2RixPQUFPLEVBQUUsS0FBSyxNQUFNLEVBQWdCLE1BQU0sdUJBQXVCLENBQUM7QUFHbEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3ZELE9BQU8sS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxLQUFLLGlCQUFpQixFQUE2QyxNQUFNLDZCQUE2QixDQUFDO0FBQ2hILE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUVuRCxPQUFPLEVBQUUsS0FBSyxnQkFBZ0IsRUFBc0IsTUFBTSx5QkFBeUIsQ0FBQztBQUVwRixPQUFPLEtBQUssRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN0RCxPQUFPLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRWhFLE9BQU8sS0FBSyxFQUFFLGdCQUFnQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDaEUsT0FBTyxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFL0MscUJBQWEsZ0JBQWdCO0lBV3pCLE9BQU8sQ0FBQyxPQUFPO0lBQ2YsT0FBTyxDQUFDLEtBQUs7SUFDYixPQUFPLENBQUMsZ0JBQWdCO0lBQ3hCLE9BQU8sQ0FBQyxjQUFjO0lBQ3RCLE9BQU8sQ0FBQyxTQUFTO0lBQ2pCLE9BQU8sQ0FBQyxNQUFNO0lBQ2QsT0FBTyxDQUFDLFlBQVk7SUFDcEIsT0FBTyxDQUFDLEdBQUc7SUFqQmIsbUVBQW1FO0lBQ25FLE9BQU8sQ0FBQyxVQUFVLENBQXlDO0lBRTNELCtEQUErRDtJQUMvRCxPQUFPLENBQUMsd0JBQXdCLENBQW1CO0lBRW5ELHFFQUFxRTtJQUNyRSxPQUFPLENBQUMseUJBQXlCLENBQWlCO0lBRWxELFlBQ1UsT0FBTyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxrQkFBa0IsQ0FBQyxFQUNuRCxLQUFLLEVBQUUsUUFBUSxFQUFFLEVBQ2pCLGdCQUFnQixFQUFFLGdCQUFnQixFQUNsQyxjQUFjLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixFQUFFLDJCQUEyQixDQUFDLEVBQ25FLFNBQVMsRUFBRSxpQkFBaUIsRUFDNUIsTUFBTSxFQUFFLGtCQUFrQixFQUMxQixZQUFZLEdBQUUsWUFBaUMsRUFDL0MsR0FBRyxHQUFFLE1BQWtELEVBZ0JoRTtJQUVNLGtCQUFrQixhQUV4QjtJQUVNLEtBQUssU0FHWDtJQUVZLElBQUksa0JBS2hCO0lBRVksT0FBTyxrQkFLbkI7SUFFRCxtRkFBbUY7SUFDNUUsZUFBZSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxRQW9CeEQ7WUFHYSx5QkFBeUI7WUFpQ3pCLDJCQUEyQjtJQXNDekMsK0hBQStIO0lBQy9ILE9BQU8sQ0FBQyw4QkFBOEI7SUFxQnRDLDhHQUE4RztJQUN2RyxRQUFRLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FJL0I7SUFFRDs7O09BR0c7SUFDSSwyQkFBMkIsQ0FBQyxXQUFXLEVBQUUsV0FBVyxHQUFHLElBQUksQ0FNakU7SUFFRDs7O09BR0c7SUFDSSw0QkFBNEIsQ0FBQyxXQUFXLEVBQUUsV0FBVyxHQUFHLElBQUksQ0FNbEU7SUFFRCxvSUFBb0k7SUFDcEksT0FBTyxDQUFDLGtCQUFrQjtDQU0zQiJ9
55
+ /** Computes the proof submission deadline for a given slot. A tx mined in this slot is no longer interesting after this deadline. */
56
+ export declare function getProofDeadlineForSlot(slotNumber: SlotNumber, constants: L1RollupConstants): Date;
57
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xvd190eF9jb2xsZWN0aW9uLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvdHhfY29sbGVjdGlvbi9zbG93X3R4X2NvbGxlY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFdBQVcsRUFBZSxVQUFVLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUV2RixPQUFPLEVBQUUsS0FBSyxNQUFNLEVBQWdCLE1BQU0sdUJBQXVCLENBQUM7QUFHbEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3ZELE9BQU8sS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxLQUFLLGlCQUFpQixFQUE2QyxNQUFNLDZCQUE2QixDQUFDO0FBQ2hILE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUVuRCxPQUFPLEVBQUUsS0FBSyxnQkFBZ0IsRUFBNEMsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RyxPQUFPLEtBQUssRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN0RCxPQUFPLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRWhFLE9BQU8sS0FBSyxFQUFFLGdCQUFnQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDaEUsT0FBTyxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFL0MscUJBQWEsZ0JBQWdCO0lBV3pCLE9BQU8sQ0FBQyxPQUFPO0lBQ2YsT0FBTyxDQUFDLEtBQUs7SUFDYixPQUFPLENBQUMsZ0JBQWdCO0lBQ3hCLE9BQU8sQ0FBQyxjQUFjO0lBQ3RCLE9BQU8sQ0FBQyxTQUFTO0lBQ2pCLE9BQU8sQ0FBQyxNQUFNO0lBQ2QsT0FBTyxDQUFDLFlBQVk7SUFDcEIsT0FBTyxDQUFDLEdBQUc7SUFqQmIsbUVBQW1FO0lBQ25FLE9BQU8sQ0FBQyxVQUFVLENBQXlDO0lBRTNELCtEQUErRDtJQUMvRCxPQUFPLENBQUMsd0JBQXdCLENBQW1CO0lBRW5ELHFFQUFxRTtJQUNyRSxPQUFPLENBQUMseUJBQXlCLENBQWlCO0lBRWxELFlBQ1UsT0FBTyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxrQkFBa0IsQ0FBQyxFQUNuRCxLQUFLLEVBQUUsUUFBUSxFQUFFLEVBQ2pCLGdCQUFnQixFQUFFLGdCQUFnQixFQUNsQyxjQUFjLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixFQUFFLDJCQUEyQixDQUFDLEVBQ25FLFNBQVMsRUFBRSxpQkFBaUIsRUFDNUIsTUFBTSxFQUFFLGtCQUFrQixFQUMxQixZQUFZLEdBQUUsWUFBaUMsRUFDL0MsR0FBRyxHQUFFLE1BQWtELEVBZ0JoRTtJQUVNLGtCQUFrQixhQUV4QjtJQUVNLEtBQUssU0FHWDtJQUVZLElBQUksa0JBS2hCO0lBRVksT0FBTyxrQkFLbkI7SUFFRCxtRkFBbUY7SUFDNUUsZUFBZSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxRQXFCeEQ7WUFHYSx5QkFBeUI7WUF5Q3pCLDJCQUEyQjtJQTJDekMsK0hBQStIO0lBQy9ILE9BQU8sQ0FBQyw4QkFBOEI7SUFxQnRDLDhHQUE4RztJQUN2RyxRQUFRLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FJL0I7SUFFRDs7O09BR0c7SUFDSSwyQkFBMkIsQ0FBQyxXQUFXLEVBQUUsV0FBVyxHQUFHLElBQUksQ0FNakU7SUFFRDs7O09BR0c7SUFDSSw0QkFBNEIsQ0FBQyxXQUFXLEVBQUUsV0FBVyxHQUFHLElBQUksQ0FNbEU7SUFFRCxpREFBaUQ7SUFDakQsT0FBTyxDQUFDLFlBQVk7SUFjcEIsb0lBQW9JO0lBQ3BJLE9BQU8sQ0FBQyxrQkFBa0I7Q0FHM0I7QUFFRCxxSUFBcUk7QUFDckksd0JBQWdCLHVCQUF1QixDQUFDLFVBQVUsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLGlCQUFpQixHQUFHLElBQUksQ0FLbEcifQ==
@@ -1 +1 @@
1
- {"version":3,"file":"slow_tx_collection.d.ts","sourceRoot":"","sources":["../../../src/services/tx_collection/slow_tx_collection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAA2B,MAAM,iCAAiC,CAAC;AAEvF,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAGlE,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,KAAK,iBAAiB,EAA6C,MAAM,6BAA6B,CAAC;AAChH,OAAO,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAEnD,OAAO,EAAE,KAAK,gBAAgB,EAAsB,MAAM,yBAAyB,CAAC;AAEpF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE/C,qBAAa,gBAAgB;IAWzB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,gBAAgB;IACxB,OAAO,CAAC,cAAc;IACtB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,GAAG;IAjBb,mEAAmE;IACnE,OAAO,CAAC,UAAU,CAAyC;IAE3D,+DAA+D;IAC/D,OAAO,CAAC,wBAAwB,CAAmB;IAEnD,qEAAqE;IACrE,OAAO,CAAC,yBAAyB,CAAiB;IAElD,YACU,OAAO,EAAE,IAAI,CAAC,gBAAgB,EAAE,kBAAkB,CAAC,EACnD,KAAK,EAAE,QAAQ,EAAE,EACjB,gBAAgB,EAAE,gBAAgB,EAClC,cAAc,EAAE,IAAI,CAAC,gBAAgB,EAAE,2BAA2B,CAAC,EACnE,SAAS,EAAE,iBAAiB,EAC5B,MAAM,EAAE,kBAAkB,EAC1B,YAAY,GAAE,YAAiC,EAC/C,GAAG,GAAE,MAAkD,EAgBhE;IAEM,kBAAkB,aAExB;IAEM,KAAK,SAGX;IAEY,IAAI,kBAKhB;IAEY,OAAO,kBAKnB;IAED,mFAAmF;IAC5E,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,QAoBxD;YAGa,yBAAyB;YAiCzB,2BAA2B;IAsCzC,+HAA+H;IAC/H,OAAO,CAAC,8BAA8B;IAqBtC,8GAA8G;IACvG,QAAQ,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,IAAI,CAI/B;IAED;;;OAGG;IACI,2BAA2B,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI,CAMjE;IAED;;;OAGG;IACI,4BAA4B,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI,CAMlE;IAED,oIAAoI;IACpI,OAAO,CAAC,kBAAkB;CAM3B"}
1
+ {"version":3,"file":"slow_tx_collection.d.ts","sourceRoot":"","sources":["../../../src/services/tx_collection/slow_tx_collection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAe,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAEvF,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAGlE,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,KAAK,iBAAiB,EAA6C,MAAM,6BAA6B,CAAC;AAChH,OAAO,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAEnD,OAAO,EAAE,KAAK,gBAAgB,EAA4C,MAAM,qBAAqB,CAAC;AACtG,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE/C,qBAAa,gBAAgB;IAWzB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,gBAAgB;IACxB,OAAO,CAAC,cAAc;IACtB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,GAAG;IAjBb,mEAAmE;IACnE,OAAO,CAAC,UAAU,CAAyC;IAE3D,+DAA+D;IAC/D,OAAO,CAAC,wBAAwB,CAAmB;IAEnD,qEAAqE;IACrE,OAAO,CAAC,yBAAyB,CAAiB;IAElD,YACU,OAAO,EAAE,IAAI,CAAC,gBAAgB,EAAE,kBAAkB,CAAC,EACnD,KAAK,EAAE,QAAQ,EAAE,EACjB,gBAAgB,EAAE,gBAAgB,EAClC,cAAc,EAAE,IAAI,CAAC,gBAAgB,EAAE,2BAA2B,CAAC,EACnE,SAAS,EAAE,iBAAiB,EAC5B,MAAM,EAAE,kBAAkB,EAC1B,YAAY,GAAE,YAAiC,EAC/C,GAAG,GAAE,MAAkD,EAgBhE;IAEM,kBAAkB,aAExB;IAEM,KAAK,SAGX;IAEY,IAAI,kBAKhB;IAEY,OAAO,kBAKnB;IAED,mFAAmF;IAC5E,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,QAqBxD;YAGa,yBAAyB;YAyCzB,2BAA2B;IA2CzC,+HAA+H;IAC/H,OAAO,CAAC,8BAA8B;IAqBtC,8GAA8G;IACvG,QAAQ,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,IAAI,CAI/B;IAED;;;OAGG;IACI,2BAA2B,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI,CAMjE;IAED;;;OAGG;IACI,4BAA4B,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI,CAMlE;IAED,iDAAiD;IACjD,OAAO,CAAC,YAAY;IAcpB,oIAAoI;IACpI,OAAO,CAAC,kBAAkB;CAG3B;AAED,qIAAqI;AACrI,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,iBAAiB,GAAG,IAAI,CAKlG"}
@@ -6,8 +6,7 @@ import { RunningPromise } from '@aztec/foundation/promise';
6
6
  import { DateProvider } from '@aztec/foundation/timer';
7
7
  import { getEpochAtSlot, getTimestampRangeForEpoch } from '@aztec/stdlib/epoch-helpers';
8
8
  import { TxHash } from '@aztec/stdlib/tx';
9
- import { ReqRespSubProtocol } from '../reqresp/interface.js';
10
- import { chunkTxHashesRequest } from '../reqresp/protocols/tx.js';
9
+ import { ReqRespSubProtocol, chunkTxHashesRequest } from '../reqresp/index.js';
11
10
  export class SlowTxCollection {
12
11
  reqResp;
13
12
  nodes;
@@ -66,6 +65,7 @@ export class SlowTxCollection {
66
65
  }
67
66
  for (const txHash of txHashes){
68
67
  this.missingTxs.set(txHash.toString(), {
68
+ block,
69
69
  blockNumber: block.number,
70
70
  deadline: this.getDeadlineForSlot(block.header.getSlot()),
71
71
  readyForReqResp: this.nodes.length === 0
@@ -81,17 +81,23 @@ export class SlowTxCollection {
81
81
  }
82
82
  // Gather all missing txs that are not in fast collection and request them from the node
83
83
  const missingTxs = this.getMissingTxsForSlowCollection();
84
- const missingTxHashes = missingTxs.map(([txHash])=>txHash).map(TxHash.fromString);
85
- if (missingTxHashes.length === 0) {
84
+ if (missingTxs.length === 0) {
86
85
  return;
87
86
  }
88
- // Request in chunks to avoid hitting RPC limits
89
- for (const batch of chunk(missingTxHashes, this.config.txCollectionNodeRpcMaxBatchSize)){
90
- await this.txCollectionSink.collect((txHashes)=>node.getTxsByHash(txHashes), batch, {
91
- description: `node ${node.getInfo()}`,
92
- node: node.getInfo(),
93
- method: 'slow-node-rpc'
94
- });
87
+ // Group by block so we pass the correct mined context to the sink
88
+ for (const entries of this.groupByBlock(missingTxs)){
89
+ const block = entries[0][1].block;
90
+ const txHashes = entries.map(([txHash])=>TxHash.fromString(txHash));
91
+ for (const batch of chunk(txHashes, this.config.txCollectionNodeRpcMaxBatchSize)){
92
+ await this.txCollectionSink.collect(()=>node.getTxsByHash(batch), batch.map((h)=>h.toString()), {
93
+ description: `node ${node.getInfo()}`,
94
+ node: node.getInfo(),
95
+ method: 'slow-node-rpc'
96
+ }, {
97
+ type: 'mined',
98
+ block
99
+ });
100
+ }
95
101
  }
96
102
  // Mark every tx that is still missing as ready for reqresp.
97
103
  // Note that we can just mark all requested txs as ready for reqresp, without filtering out the ones
@@ -117,17 +123,27 @@ export class SlowTxCollection {
117
123
  }
118
124
  const pinnedPeer = undefined;
119
125
  const timeoutMs = this.config.txCollectionSlowReqRespTimeoutMs;
120
- const maxPeers = boundInclusive(Math.ceil(missingTxs.length / 3), 4, 16);
121
126
  const maxRetryAttempts = 3;
122
- // Send a batch request via reqresp for the missing txs
123
- await this.txCollectionSink.collect(async (txHashes)=>{
124
- const txs = await this.reqResp.sendBatchRequest(ReqRespSubProtocol.TX, chunkTxHashesRequest(txHashes), pinnedPeer, timeoutMs, maxPeers, maxRetryAttempts);
125
- return txs.flat();
126
- }, missingTxs.map(([txHash])=>TxHash.fromString(txHash)), {
127
- description: 'slow reqresp',
128
- timeoutMs,
129
- method: 'slow-req-resp'
130
- });
127
+ // Group by block so we pass the correct mined context to the sink
128
+ for (const entries of this.groupByBlock(missingTxs)){
129
+ const block = entries[0][1].block;
130
+ const txHashes = entries.map(([txHash])=>TxHash.fromString(txHash));
131
+ const maxPeers = boundInclusive(Math.ceil(txHashes.length / 3), 4, 16);
132
+ await this.txCollectionSink.collect(async ()=>{
133
+ const txs = await this.reqResp.sendBatchRequest(ReqRespSubProtocol.TX, chunkTxHashesRequest(txHashes), pinnedPeer, timeoutMs, maxPeers, maxRetryAttempts);
134
+ return {
135
+ validTxs: txs.flat(),
136
+ invalidTxHashes: []
137
+ };
138
+ }, txHashes.map((h)=>h.toString()), {
139
+ description: 'slow reqresp',
140
+ timeoutMs,
141
+ method: 'slow-req-resp'
142
+ }, {
143
+ type: 'mined',
144
+ block
145
+ });
146
+ }
131
147
  }
132
148
  /** Retrieves all missing txs for the slow collection process. This is, all missing txs that are not part of a fast request. */ getMissingTxsForSlowCollection(opts = {}) {
133
149
  // Remove expired txs from missingTxs
@@ -139,7 +155,7 @@ export class SlowTxCollection {
139
155
  // is fast-collecting missing txs for proving an epoch, and still has the tx in the slow collection loops
140
156
  // from mined unproven blocks it has seen in the past.
141
157
  const fastRequests = this.fastCollection.getFastCollectionRequests();
142
- const fastCollectionTxs = new Set(...Array.from(fastRequests.values()).flatMap((r)=>r.missingTxHashes));
158
+ const fastCollectionTxs = new Set(fastRequests.values().flatMap((r)=>Array.from(r.missingTxTracker.missingTxHashes)));
143
159
  // Return all missing txs that are not in fastCollectionTxs and are ready for reqresp if requested
144
160
  return Array.from(this.missingTxs.entries()).filter(([txHash, _])=>!fastCollectionTxs.has(txHash)).filter(([_, value])=>!opts.onlyReqRespReady || value.readyForReqResp);
145
161
  }
@@ -168,10 +184,28 @@ export class SlowTxCollection {
168
184
  }
169
185
  }
170
186
  }
187
+ /** Groups missing tx entries by block number. */ groupByBlock(entries) {
188
+ const groups = new Map();
189
+ for (const entry of entries){
190
+ const bn = +entry[1].blockNumber;
191
+ let group = groups.get(bn);
192
+ if (!group) {
193
+ group = [];
194
+ groups.set(bn, group);
195
+ }
196
+ group.push(entry);
197
+ }
198
+ return [
199
+ ...groups.values()
200
+ ];
201
+ }
171
202
  /** Computes the proof submission deadline for a given slot, a tx mined in this slot is no longer interesting after this deadline */ getDeadlineForSlot(slotNumber) {
172
- const epoch = getEpochAtSlot(slotNumber, this.constants);
173
- const submissionEndEpoch = EpochNumber(epoch + this.constants.proofSubmissionEpochs);
174
- const submissionEndTimestamp = getTimestampRangeForEpoch(submissionEndEpoch, this.constants)[1];
175
- return new Date(Number(submissionEndTimestamp) * 1000);
203
+ return getProofDeadlineForSlot(slotNumber, this.constants);
176
204
  }
177
205
  }
206
+ /** Computes the proof submission deadline for a given slot. A tx mined in this slot is no longer interesting after this deadline. */ export function getProofDeadlineForSlot(slotNumber, constants) {
207
+ const epoch = getEpochAtSlot(slotNumber, constants);
208
+ const submissionEndEpoch = EpochNumber(epoch + constants.proofSubmissionEpochs);
209
+ const submissionEndTimestamp = getTimestampRangeForEpoch(submissionEndEpoch, constants)[1];
210
+ return new Date(Number(submissionEndTimestamp) * 1000);
211
+ }
@@ -5,18 +5,22 @@ import { DateProvider } from '@aztec/foundation/timer';
5
5
  import type { L2Block, L2BlockInfo } from '@aztec/stdlib/block';
6
6
  import type { L1RollupConstants } from '@aztec/stdlib/epoch-helpers';
7
7
  import type { BlockProposal } from '@aztec/stdlib/p2p';
8
- import { Tx, TxHash } from '@aztec/stdlib/tx';
8
+ import type { Tx } from '@aztec/stdlib/tx';
9
+ import { TxHash } from '@aztec/stdlib/tx';
9
10
  import { type TelemetryClient } from '@aztec/telemetry-client';
10
11
  import type { PeerId } from '@libp2p/interface';
11
- import type { TxPool } from '../../mem_pools/index.js';
12
- import type { TxPoolEvents } from '../../mem_pools/tx_pool/tx_pool.js';
12
+ import type { TxPoolV2, TxPoolV2Events } from '../../mem_pools/tx_pool_v2/interfaces.js';
13
13
  import type { BatchTxRequesterLibP2PService } from '../reqresp/batch-tx-requester/interface.js';
14
14
  import type { TxCollectionConfig } from './config.js';
15
15
  import { FastTxCollection } from './fast_tx_collection.js';
16
+ import { FileStoreTxCollection } from './file_store_tx_collection.js';
17
+ import type { FileStoreTxSource } from './file_store_tx_source.js';
18
+ import type { IMissingTxsTracker } from './missing_txs_tracker.js';
16
19
  import { SlowTxCollection } from './slow_tx_collection.js';
17
20
  import type { TxSource } from './tx_source.js';
18
- export type CollectionMethod = 'fast-req-resp' | 'fast-node-rpc' | 'slow-req-resp' | 'slow-node-rpc';
21
+ export type CollectionMethod = 'fast-req-resp' | 'fast-node-rpc' | 'slow-req-resp' | 'slow-node-rpc' | 'file-store';
19
22
  export type MissingTxInfo = {
23
+ block: L2Block;
20
24
  blockNumber: BlockNumber;
21
25
  deadline: Date;
22
26
  readyForReqResp: boolean;
@@ -30,11 +34,10 @@ export type FastCollectionRequestInput = {
30
34
  blockNumber: BlockNumber;
31
35
  };
32
36
  export type FastCollectionRequest = FastCollectionRequestInput & {
33
- missingTxHashes: Set<string>;
37
+ missingTxTracker: IMissingTxsTracker;
34
38
  deadline: Date;
35
39
  blockInfo: L2BlockInfo;
36
40
  promise: PromiseWithResolvers<void>;
37
- foundTxs: Map<string, Tx>;
38
41
  };
39
42
  /**
40
43
  * Coordinates tx collection from remote RPC nodes and reqresp.
@@ -59,15 +62,23 @@ export declare class TxCollection {
59
62
  protected readonly slowCollection: SlowTxCollection;
60
63
  /** Fast collection methods */
61
64
  protected readonly fastCollection: FastTxCollection;
65
+ /** File store collection for slow (mined block) path */
66
+ protected readonly fileStoreSlowCollection: FileStoreTxCollection;
67
+ /** File store collection for fast (proposal/proving) path */
68
+ protected readonly fileStoreFastCollection: FileStoreTxCollection;
62
69
  /** Loop for periodically reconciling found transactions from the tx pool in case we missed some */
63
70
  private readonly reconcileFoundTxsLoop;
64
71
  /** Handles txs found by the slow and fast collection loops */
65
72
  private readonly txCollectionSink;
66
73
  /** Handler for the txs-added event from the tx pool */
67
- protected readonly handleTxsAddedToPool: TxPoolEvents['txs-added'];
74
+ protected readonly handleTxsAddedToPool: TxPoolV2Events['txs-added'];
68
75
  /** Handler for the txs-added event from the tx collection sink */
69
- protected readonly handleTxsFound: TxPoolEvents['txs-added'];
70
- constructor(p2pService: BatchTxRequesterLibP2PService, nodes: TxSource[], constants: L1RollupConstants, txPool: TxPool, config: TxCollectionConfig, dateProvider?: DateProvider, telemetryClient?: TelemetryClient, log?: Logger);
76
+ protected readonly handleTxsFound: TxPoolV2Events['txs-added'];
77
+ /** Whether the service has been started. */
78
+ private started;
79
+ /** Whether file store sources are configured. */
80
+ private readonly hasFileStoreSources;
81
+ constructor(p2pService: BatchTxRequesterLibP2PService, nodes: TxSource[], constants: L1RollupConstants, txPool: TxPoolV2, config: TxCollectionConfig, fileStoreSources?: FileStoreTxSource[], dateProvider?: DateProvider, telemetryClient?: TelemetryClient, log?: Logger);
71
82
  /** Starts all collection loops. */
72
83
  start(): Promise<void>;
73
84
  /** Stops all activity. */
@@ -93,6 +104,8 @@ export declare class TxCollection {
93
104
  deadline: Date;
94
105
  pinnedPeer?: PeerId;
95
106
  }): Promise<Tx[]>;
107
+ /** Returns the TxAddContext for the given fast collection request input */
108
+ private getAddContextForInput;
96
109
  /** Mark the given txs as found. Stops collecting them. */
97
110
  private foundTxs;
98
111
  /**
@@ -107,4 +120,4 @@ export declare class TxCollection {
107
120
  stopCollectingForBlocksAfter(blockNumber: BlockNumber): void;
108
121
  private reconcileFoundTxsWithPool;
109
122
  }
110
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhfY29sbGVjdGlvbi5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NlcnZpY2VzL3R4X2NvbGxlY3Rpb24vdHhfY29sbGVjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFOUQsT0FBTyxFQUFFLEtBQUssTUFBTSxFQUFnQixNQUFNLHVCQUF1QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxLQUFLLG9CQUFvQixFQUFrQixNQUFNLDJCQUEyQixDQUFDO0FBQ3RGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN2RCxPQUFPLEtBQUssRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDaEUsT0FBTyxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNyRSxPQUFPLEtBQUssRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxLQUFLLGVBQWUsRUFBc0IsTUFBTSx5QkFBeUIsQ0FBQztBQUVuRixPQUFPLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUVoRCxPQUFPLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN2RCxPQUFPLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN2RSxPQUFPLEtBQUssRUFBRSw2QkFBNkIsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQ2hHLE9BQU8sS0FBSyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3RELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzNELE9BQU8sRUFBRSxnQkFBZ0Is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
123
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhfY29sbGVjdGlvbi5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NlcnZpY2VzL3R4X2NvbGxlY3Rpb24vdHhfY29sbGVjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFOUQsT0FBTyxFQUFFLEtBQUssTUFBTSxFQUFnQixNQUFNLHVCQUF1QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxLQUFLLG9CQUFvQixFQUFrQixNQUFNLDJCQUEyQixDQUFDO0FBRXRGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN2RCxPQUFPLEtBQUssRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDaEUsT0FBTyxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNyRSxPQUFPLEtBQUssRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUN2RCxPQUFPLEtBQUssRUFBRSxFQUFFLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDMUMsT0FBTyxFQUFFLEtBQUssZUFBZSxFQUFzQixNQUFNLHlCQUF5QixDQUFDO0FBRW5GLE9BQU8sS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRWhELE9BQU8sS0FBSyxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUN6RixPQUFPLEtBQUssRUFBRSw2QkFBNkIsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQ2hHLE9BQU8sS0FBSyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3RELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzNELE9BQU8sRUFBRSxxQkFBcUIs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