@aztec/p2p 0.0.1-commit.1bb068fb5 → 0.0.1-commit.1dcfe2301

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 (413) hide show
  1. package/README.md +129 -3
  2. package/dest/client/factory.d.ts +7 -7
  3. package/dest/client/factory.d.ts.map +1 -1
  4. package/dest/client/factory.js +32 -28
  5. package/dest/client/interface.d.ts +18 -20
  6. package/dest/client/interface.d.ts.map +1 -1
  7. package/dest/client/p2p_client.d.ts +9 -19
  8. package/dest/client/p2p_client.d.ts.map +1 -1
  9. package/dest/client/p2p_client.js +81 -104
  10. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +20 -10
  11. package/dest/config.d.ts +126 -103
  12. package/dest/config.d.ts.map +1 -1
  13. package/dest/config.js +93 -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 +1 -2
  21. package/dest/index.d.ts.map +1 -1
  22. package/dest/index.js +0 -1
  23. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +7 -5
  24. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  25. package/dest/mem_pools/attestation_pool/attestation_pool.js +16 -9
  26. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +6 -6
  27. package/dest/mem_pools/index.d.ts +1 -2
  28. package/dest/mem_pools/index.d.ts.map +1 -1
  29. package/dest/mem_pools/instrumentation.d.ts +4 -2
  30. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  31. package/dest/mem_pools/instrumentation.js +16 -14
  32. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +3 -1
  33. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -1
  34. package/dest/mem_pools/tx_pool_v2/deleted_pool.js +9 -0
  35. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts +3 -3
  36. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts.map +1 -1
  37. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.js +18 -9
  38. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +1 -1
  39. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -1
  40. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +5 -4
  41. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +3 -3
  42. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -1
  43. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +12 -4
  44. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +2 -2
  45. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -1
  46. package/dest/mem_pools/tx_pool_v2/eviction/index.js +1 -1
  47. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +54 -5
  48. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -1
  49. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.js +8 -0
  50. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +4 -4
  51. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +7 -7
  52. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +2 -2
  53. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -1
  54. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +12 -6
  55. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +4 -4
  56. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -1
  57. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +16 -4
  58. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +3 -3
  59. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -1
  60. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +3 -3
  61. package/dest/mem_pools/tx_pool_v2/index.d.ts +2 -2
  62. package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -1
  63. package/dest/mem_pools/tx_pool_v2/index.js +1 -1
  64. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts +15 -0
  65. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts.map +1 -0
  66. package/dest/mem_pools/tx_pool_v2/instrumentation.js +43 -0
  67. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +24 -10
  68. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
  69. package/dest/mem_pools/tx_pool_v2/interfaces.js +4 -1
  70. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +54 -15
  71. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
  72. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +112 -20
  73. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +5 -2
  74. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -1
  75. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +38 -46
  76. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +9 -4
  77. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -1
  78. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +12 -5
  79. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +12 -5
  80. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -1
  81. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +296 -153
  82. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +5 -2
  83. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  84. package/dest/msg_validators/attestation_validator/attestation_validator.js +20 -11
  85. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +4 -2
  86. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
  87. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +2 -2
  88. package/dest/msg_validators/clock_tolerance.d.ts +12 -1
  89. package/dest/msg_validators/clock_tolerance.d.ts.map +1 -1
  90. package/dest/msg_validators/clock_tolerance.js +54 -3
  91. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +7 -4
  92. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
  93. package/dest/msg_validators/proposal_validator/block_proposal_validator.js +10 -2
  94. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +7 -4
  95. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
  96. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +16 -2
  97. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +15 -8
  98. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
  99. package/dest/msg_validators/proposal_validator/proposal_validator.js +67 -47
  100. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +2 -2
  101. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  102. package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +3 -3
  103. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +2 -1
  104. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -1
  105. package/dest/msg_validators/tx_validator/allowed_public_setup.js +24 -20
  106. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts +17 -0
  107. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts.map +1 -0
  108. package/dest/msg_validators/tx_validator/allowed_setup_helpers.js +24 -0
  109. package/dest/msg_validators/tx_validator/archive_cache.js +1 -1
  110. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts +9 -0
  111. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts.map +1 -0
  112. package/dest/msg_validators/tx_validator/contract_instance_validator.js +48 -0
  113. package/dest/msg_validators/tx_validator/data_validator.d.ts +1 -1
  114. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  115. package/dest/msg_validators/tx_validator/data_validator.js +35 -2
  116. package/dest/msg_validators/tx_validator/factory.d.ts +133 -6
  117. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  118. package/dest/msg_validators/tx_validator/factory.js +247 -60
  119. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +1 -1
  120. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -1
  121. package/dest/msg_validators/tx_validator/fee_payer_balance.js +6 -2
  122. package/dest/msg_validators/tx_validator/gas_validator.d.ts +67 -3
  123. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  124. package/dest/msg_validators/tx_validator/gas_validator.js +112 -43
  125. package/dest/msg_validators/tx_validator/index.d.ts +3 -1
  126. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  127. package/dest/msg_validators/tx_validator/index.js +2 -0
  128. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +1 -1
  129. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  130. package/dest/msg_validators/tx_validator/metadata_validator.js +4 -4
  131. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts +14 -0
  132. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts.map +1 -0
  133. package/dest/msg_validators/tx_validator/nullifier_cache.js +24 -0
  134. package/dest/msg_validators/tx_validator/phases_validator.d.ts +22 -2
  135. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
  136. package/dest/msg_validators/tx_validator/phases_validator.js +72 -24
  137. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +2 -2
  138. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
  139. package/dest/msg_validators/tx_validator/timestamp_validator.js +6 -6
  140. package/dest/services/data_store.d.ts +1 -1
  141. package/dest/services/data_store.d.ts.map +1 -1
  142. package/dest/services/data_store.js +5 -5
  143. package/dest/services/dummy_service.d.ts +8 -5
  144. package/dest/services/dummy_service.d.ts.map +1 -1
  145. package/dest/services/dummy_service.js +10 -5
  146. package/dest/services/encoding.d.ts +6 -2
  147. package/dest/services/encoding.d.ts.map +1 -1
  148. package/dest/services/encoding.js +16 -9
  149. package/dest/services/gossipsub/topic_score_params.d.ts +30 -7
  150. package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -1
  151. package/dest/services/gossipsub/topic_score_params.js +53 -14
  152. package/dest/services/libp2p/instrumentation.d.ts +3 -1
  153. package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
  154. package/dest/services/libp2p/instrumentation.js +14 -0
  155. package/dest/services/libp2p/libp2p_service.d.ts +29 -36
  156. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  157. package/dest/services/libp2p/libp2p_service.js +236 -197
  158. package/dest/services/peer-manager/metrics.d.ts +3 -1
  159. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  160. package/dest/services/peer-manager/metrics.js +6 -0
  161. package/dest/services/peer-manager/peer_manager.d.ts +6 -2
  162. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  163. package/dest/services/peer-manager/peer_manager.js +39 -11
  164. package/dest/services/peer-manager/peer_scoring.d.ts +7 -2
  165. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  166. package/dest/services/peer-manager/peer_scoring.js +32 -10
  167. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +12 -8
  168. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -1
  169. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +83 -106
  170. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +4 -7
  171. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
  172. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +11 -13
  173. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -1
  174. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +31 -46
  175. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +19 -11
  176. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -1
  177. package/dest/services/reqresp/batch-tx-requester/peer_collection.js +52 -15
  178. package/dest/services/reqresp/batch-tx-requester/tx_validator.js +2 -2
  179. package/dest/services/reqresp/config.d.ts +3 -3
  180. package/dest/services/reqresp/config.d.ts.map +1 -1
  181. package/dest/services/reqresp/interface.d.ts +14 -9
  182. package/dest/services/reqresp/interface.d.ts.map +1 -1
  183. package/dest/services/reqresp/interface.js +10 -11
  184. package/dest/services/reqresp/metrics.d.ts +1 -1
  185. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  186. package/dest/services/reqresp/metrics.js +0 -1
  187. package/dest/services/reqresp/protocols/index.d.ts +1 -2
  188. package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
  189. package/dest/services/reqresp/protocols/index.js +0 -1
  190. package/dest/services/reqresp/protocols/tx.d.ts +1 -1
  191. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  192. package/dest/services/reqresp/protocols/tx.js +1 -3
  193. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +5 -4
  194. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
  195. package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -8
  196. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
  197. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
  198. package/dest/services/reqresp/rate-limiter/rate_limits.js +0 -10
  199. package/dest/services/reqresp/reqresp.d.ts +4 -2
  200. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  201. package/dest/services/reqresp/reqresp.js +30 -12
  202. package/dest/services/service.d.ts +9 -4
  203. package/dest/services/service.d.ts.map +1 -1
  204. package/dest/services/tx_collection/fast_tx_collection.d.ts +1 -4
  205. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
  206. package/dest/services/tx_collection/fast_tx_collection.js +65 -75
  207. package/dest/services/tx_collection/file_store_tx_collection.d.ts +1 -1
  208. package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -1
  209. package/dest/services/tx_collection/file_store_tx_collection.js +4 -2
  210. package/dest/services/tx_collection/file_store_tx_source.d.ts +16 -6
  211. package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -1
  212. package/dest/services/tx_collection/file_store_tx_source.js +50 -9
  213. package/dest/services/tx_collection/instrumentation.d.ts +1 -1
  214. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
  215. package/dest/services/tx_collection/instrumentation.js +2 -1
  216. package/dest/services/tx_collection/proposal_tx_collector.d.ts +7 -7
  217. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -1
  218. package/dest/services/tx_collection/proposal_tx_collector.js +5 -4
  219. package/dest/services/tx_collection/request_tracker.d.ts +53 -0
  220. package/dest/services/tx_collection/request_tracker.d.ts.map +1 -0
  221. package/dest/services/tx_collection/request_tracker.js +84 -0
  222. package/dest/services/tx_collection/slow_tx_collection.d.ts +2 -2
  223. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -1
  224. package/dest/services/tx_collection/slow_tx_collection.js +10 -8
  225. package/dest/services/tx_collection/tx_collection.d.ts +5 -7
  226. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  227. package/dest/services/tx_collection/tx_collection_sink.d.ts +6 -5
  228. package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -1
  229. package/dest/services/tx_collection/tx_collection_sink.js +13 -22
  230. package/dest/services/tx_collection/tx_source.d.ts +13 -7
  231. package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
  232. package/dest/services/tx_collection/tx_source.js +26 -7
  233. package/dest/services/tx_file_store/tx_file_store.js +1 -1
  234. package/dest/services/tx_provider.d.ts +3 -3
  235. package/dest/services/tx_provider.d.ts.map +1 -1
  236. package/dest/services/tx_provider.js +4 -4
  237. package/dest/test-helpers/make-test-p2p-clients.d.ts +5 -6
  238. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  239. package/dest/test-helpers/make-test-p2p-clients.js +1 -2
  240. package/dest/test-helpers/mock-pubsub.d.ts +14 -6
  241. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  242. package/dest/test-helpers/mock-pubsub.js +43 -12
  243. package/dest/test-helpers/reqresp-nodes.d.ts +2 -3
  244. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  245. package/dest/test-helpers/reqresp-nodes.js +3 -4
  246. package/dest/test-helpers/testbench-utils.d.ts +6 -3
  247. package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
  248. package/dest/test-helpers/testbench-utils.js +24 -4
  249. package/dest/testbench/p2p_client_testbench_worker.d.ts +2 -2
  250. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  251. package/dest/testbench/p2p_client_testbench_worker.js +78 -26
  252. package/dest/testbench/worker_client_manager.d.ts +10 -1
  253. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  254. package/dest/testbench/worker_client_manager.js +55 -3
  255. package/dest/util.d.ts +3 -3
  256. package/dest/util.d.ts.map +1 -1
  257. package/package.json +14 -14
  258. package/src/client/factory.ts +55 -47
  259. package/src/client/interface.ts +20 -21
  260. package/src/client/p2p_client.ts +89 -135
  261. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +33 -14
  262. package/src/config.ts +139 -45
  263. package/src/errors/p2p-service.error.ts +11 -0
  264. package/src/errors/tx-pool.error.ts +12 -0
  265. package/src/index.ts +0 -1
  266. package/src/mem_pools/attestation_pool/attestation_pool.ts +17 -12
  267. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +6 -6
  268. package/src/mem_pools/index.ts +0 -3
  269. package/src/mem_pools/instrumentation.ts +17 -13
  270. package/src/mem_pools/tx_pool_v2/README.md +10 -2
  271. package/src/mem_pools/tx_pool_v2/deleted_pool.ts +11 -0
  272. package/src/mem_pools/tx_pool_v2/eviction/eviction_manager.ts +21 -8
  273. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +5 -4
  274. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +18 -4
  275. package/src/mem_pools/tx_pool_v2/eviction/index.ts +4 -0
  276. package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +59 -4
  277. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +4 -4
  278. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +8 -8
  279. package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +12 -9
  280. package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +33 -6
  281. package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +4 -3
  282. package/src/mem_pools/tx_pool_v2/index.ts +1 -1
  283. package/src/mem_pools/tx_pool_v2/instrumentation.ts +69 -0
  284. package/src/mem_pools/tx_pool_v2/interfaces.ts +24 -10
  285. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +160 -28
  286. package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +43 -46
  287. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +28 -8
  288. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +330 -149
  289. package/src/msg_validators/attestation_validator/README.md +49 -0
  290. package/src/msg_validators/attestation_validator/attestation_validator.ts +21 -9
  291. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +4 -1
  292. package/src/msg_validators/clock_tolerance.ts +72 -3
  293. package/src/msg_validators/proposal_validator/README.md +123 -0
  294. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +17 -4
  295. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +23 -7
  296. package/src/msg_validators/proposal_validator/proposal_validator.ts +79 -49
  297. package/src/msg_validators/tx_validator/README.md +119 -0
  298. package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +3 -3
  299. package/src/msg_validators/tx_validator/allowed_public_setup.ts +22 -27
  300. package/src/msg_validators/tx_validator/allowed_setup_helpers.ts +31 -0
  301. package/src/msg_validators/tx_validator/archive_cache.ts +1 -1
  302. package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
  303. package/src/msg_validators/tx_validator/data_validator.ts +42 -1
  304. package/src/msg_validators/tx_validator/factory.ts +394 -78
  305. package/src/msg_validators/tx_validator/fee_payer_balance.ts +6 -2
  306. package/src/msg_validators/tx_validator/gas_validator.ts +145 -33
  307. package/src/msg_validators/tx_validator/index.ts +2 -0
  308. package/src/msg_validators/tx_validator/metadata_validator.ts +12 -4
  309. package/src/msg_validators/tx_validator/nullifier_cache.ts +30 -0
  310. package/src/msg_validators/tx_validator/phases_validator.ts +82 -27
  311. package/src/msg_validators/tx_validator/timestamp_validator.ts +7 -7
  312. package/src/services/data_store.ts +5 -13
  313. package/src/services/dummy_service.ts +13 -7
  314. package/src/services/encoding.ts +16 -8
  315. package/src/services/gossipsub/README.md +29 -14
  316. package/src/services/gossipsub/topic_score_params.ts +85 -17
  317. package/src/services/libp2p/instrumentation.ts +14 -0
  318. package/src/services/libp2p/libp2p_service.ts +251 -225
  319. package/src/services/peer-manager/metrics.ts +7 -0
  320. package/src/services/peer-manager/peer_manager.ts +45 -11
  321. package/src/services/peer-manager/peer_scoring.ts +27 -5
  322. package/src/services/reqresp/README.md +229 -0
  323. package/src/services/reqresp/batch-tx-requester/README.md +46 -7
  324. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +79 -112
  325. package/src/services/reqresp/batch-tx-requester/interface.ts +3 -6
  326. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +30 -71
  327. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +68 -24
  328. package/src/services/reqresp/batch-tx-requester/tx_validator.ts +2 -2
  329. package/src/services/reqresp/config.ts +2 -2
  330. package/src/services/reqresp/interface.ts +21 -11
  331. package/src/services/reqresp/metrics.ts +0 -1
  332. package/src/services/reqresp/protocols/index.ts +0 -1
  333. package/src/services/reqresp/protocols/tx.ts +1 -3
  334. package/src/services/reqresp/rate-limiter/rate_limiter.ts +13 -9
  335. package/src/services/reqresp/rate-limiter/rate_limits.ts +0 -10
  336. package/src/services/reqresp/reqresp.ts +40 -13
  337. package/src/services/service.ts +17 -3
  338. package/src/services/tx_collection/fast_tx_collection.ts +71 -76
  339. package/src/services/tx_collection/file_store_tx_collection.ts +7 -3
  340. package/src/services/tx_collection/file_store_tx_source.ts +65 -9
  341. package/src/services/tx_collection/instrumentation.ts +7 -1
  342. package/src/services/tx_collection/proposal_tx_collector.ts +9 -13
  343. package/src/services/tx_collection/request_tracker.ts +127 -0
  344. package/src/services/tx_collection/slow_tx_collection.ts +8 -9
  345. package/src/services/tx_collection/tx_collection.ts +5 -6
  346. package/src/services/tx_collection/tx_collection_sink.ts +15 -29
  347. package/src/services/tx_collection/tx_source.ts +28 -8
  348. package/src/services/tx_file_store/tx_file_store.ts +1 -1
  349. package/src/services/tx_provider.ts +2 -2
  350. package/src/test-helpers/make-test-p2p-clients.ts +1 -3
  351. package/src/test-helpers/mock-pubsub.ts +44 -11
  352. package/src/test-helpers/reqresp-nodes.ts +5 -8
  353. package/src/test-helpers/testbench-utils.ts +33 -6
  354. package/src/testbench/p2p_client_testbench_worker.ts +89 -29
  355. package/src/testbench/worker_client_manager.ts +68 -6
  356. package/src/util.ts +8 -2
  357. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +0 -125
  358. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +0 -1
  359. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +0 -596
  360. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +0 -32
  361. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +0 -1
  362. package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +0 -112
  363. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +0 -157
  364. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +0 -1
  365. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +0 -52
  366. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +0 -16
  367. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +0 -1
  368. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +0 -122
  369. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +0 -17
  370. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +0 -1
  371. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +0 -84
  372. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +0 -19
  373. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +0 -1
  374. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +0 -78
  375. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +0 -26
  376. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +0 -1
  377. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +0 -84
  378. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +0 -25
  379. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +0 -1
  380. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +0 -57
  381. package/dest/mem_pools/tx_pool/index.d.ts +0 -3
  382. package/dest/mem_pools/tx_pool/index.d.ts.map +0 -1
  383. package/dest/mem_pools/tx_pool/index.js +0 -2
  384. package/dest/mem_pools/tx_pool/priority.d.ts +0 -12
  385. package/dest/mem_pools/tx_pool/priority.d.ts.map +0 -1
  386. package/dest/mem_pools/tx_pool/priority.js +0 -15
  387. package/dest/mem_pools/tx_pool/tx_pool.d.ts +0 -127
  388. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +0 -1
  389. package/dest/mem_pools/tx_pool/tx_pool.js +0 -3
  390. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +0 -7
  391. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +0 -1
  392. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +0 -400
  393. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +0 -23
  394. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +0 -1
  395. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +0 -212
  396. package/dest/services/reqresp/protocols/block.d.ts +0 -9
  397. package/dest/services/reqresp/protocols/block.d.ts.map +0 -1
  398. package/dest/services/reqresp/protocols/block.js +0 -32
  399. package/src/mem_pools/tx_pool/README.md +0 -270
  400. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -746
  401. package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +0 -132
  402. package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +0 -208
  403. package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +0 -162
  404. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +0 -104
  405. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +0 -93
  406. package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +0 -106
  407. package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +0 -75
  408. package/src/mem_pools/tx_pool/index.ts +0 -2
  409. package/src/mem_pools/tx_pool/priority.ts +0 -20
  410. package/src/mem_pools/tx_pool/tx_pool.ts +0 -141
  411. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +0 -319
  412. package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +0 -230
  413. package/src/services/reqresp/protocols/block.ts +0 -37
@@ -1,12 +1,9 @@
1
1
  import { BlockNumber } from '@aztec/foundation/branded-types';
2
2
  import { times } from '@aztec/foundation/collection';
3
- import { AbortError, TimeoutError } from '@aztec/foundation/error';
4
3
  import { type Logger, createLogger } from '@aztec/foundation/log';
5
- import { promiseWithResolvers } from '@aztec/foundation/promise';
6
4
  import { sleep } from '@aztec/foundation/sleep';
7
5
  import { DateProvider, elapsed } from '@aztec/foundation/timer';
8
6
  import type { L2BlockInfo } from '@aztec/stdlib/block';
9
- import type { BlockProposal } from '@aztec/stdlib/p2p';
10
7
  import { type Tx, TxHash } from '@aztec/stdlib/tx';
11
8
 
12
9
  import type { PeerId } from '@libp2p/interface';
@@ -19,6 +16,7 @@ import {
19
16
  type MissingTxsCollector,
20
17
  SendBatchRequestCollector,
21
18
  } from './proposal_tx_collector.js';
19
+ import { RequestTracker } from './request_tracker.js';
22
20
  import type { FastCollectionRequest, FastCollectionRequestInput } from './tx_collection.js';
23
21
  import type { TxAddContext, TxCollectionSink } from './tx_collection_sink.js';
24
22
  import type { TxSource } from './tx_source.js';
@@ -47,7 +45,9 @@ export class FastTxCollection {
47
45
  }
48
46
 
49
47
  public async stop() {
50
- this.requests.forEach(request => request.promise.reject(new AbortError(`Stopped collection service`)));
48
+ this.requests.forEach(request => {
49
+ request.requestTracker.cancel();
50
+ });
51
51
  await Promise.resolve();
52
52
  }
53
53
 
@@ -74,82 +74,65 @@ export class FastTxCollection {
74
74
  ? { ...input.blockProposal.toBlockInfo(), blockNumber: input.blockNumber }
75
75
  : { ...input.block.toBlockInfo() };
76
76
 
77
- // This promise is used to await for the collection to finish during the main collectFast method.
78
- // It gets resolved in `foundTxs` when all txs have been collected, or rejected if the request is aborted or hits the deadline.
79
- const promise = promiseWithResolvers<void>();
80
- const timeoutTimer = setTimeout(() => promise.reject(new TimeoutError(`Timed out while collecting txs`)), timeout);
81
-
82
77
  const request: FastCollectionRequest = {
83
78
  ...input,
84
79
  blockInfo,
85
- promise,
86
- foundTxs: new Map<string, Tx>(),
87
- missingTxHashes: new Set(txHashes.map(t => t.toString())),
88
- deadline: opts.deadline,
80
+ requestTracker: RequestTracker.create(txHashes, opts.deadline, this.dateProvider),
89
81
  };
90
82
 
91
83
  const [duration] = await elapsed(() => this.collectFast(request, { ...opts }));
92
- clearTimeout(timeoutTimer);
93
84
 
94
85
  this.log.verbose(
95
- `Collected ${request.foundTxs.size} txs out of ${txHashes.length} for ${input.type} at slot ${blockInfo.slotNumber}`,
86
+ `Collected ${request.requestTracker.collectedTxs.length} txs out of ${txHashes.length} for ${input.type} at slot ${blockInfo.slotNumber}`,
96
87
  {
97
88
  ...blockInfo,
98
89
  duration,
99
90
  requestType: input.type,
100
- missingTxs: [...request.missingTxHashes],
91
+ missingTxs: [...request.requestTracker.missingTxHashes],
101
92
  },
102
93
  );
103
- return [...request.foundTxs.values()];
94
+ return request.requestTracker.collectedTxs;
104
95
  }
105
96
 
106
- protected async collectFast(
107
- request: FastCollectionRequest,
108
- opts: { proposal?: BlockProposal; deadline: Date; pinnedPeer?: PeerId },
109
- ) {
97
+ protected async collectFast(request: FastCollectionRequest, opts: { pinnedPeer?: PeerId }) {
110
98
  this.requests.add(request);
111
99
  const { blockInfo } = request;
112
100
 
113
101
  this.log.debug(
114
- `Starting fast collection of ${request.missingTxHashes.size} txs for ${request.type} at slot ${blockInfo.slotNumber}`,
115
- { ...blockInfo, requestType: request.type, deadline: opts.deadline },
102
+ `Starting fast collection of ${request.requestTracker.numberOfMissingTxs} txs for ${request.type} at slot ${blockInfo.slotNumber}`,
103
+ { ...blockInfo, requestType: request.type, deadline: request.requestTracker.deadline },
116
104
  );
117
105
 
118
106
  try {
119
107
  // Start blasting all nodes for the txs. We give them a little time to respond before we start reqresp.
120
- // And keep an eye on the request promise to ensure we don't wait longer than the deadline or return as soon
121
- // as we have collected all txs, whatever the source.
122
- const nodeCollectionPromise = this.collectFastFromNodes(request, opts);
108
+ // We race against the cancellation token to exit as soon as all txs are collected, the deadline expires,
109
+ // or the request is externally cancelled.
110
+ const nodeCollectionPromise = this.collectFastFromNodes(request);
123
111
  const waitBeforeReqResp = sleep(this.config.txCollectionFastNodesTimeoutBeforeReqRespMs);
124
- await Promise.race([request.promise.promise, waitBeforeReqResp]);
112
+ await Promise.race([request.requestTracker.cancellationToken, waitBeforeReqResp]);
125
113
 
126
- // If we have collected all txs, we can stop here
127
- if (request.missingTxHashes.size === 0) {
128
- this.log.debug(`All txs collected for slot ${blockInfo.slotNumber} without reqresp`, blockInfo);
114
+ // If we have collected all txs or the request was cancelled, we can stop here.
115
+ // Wait for node collection to settle so inner tasks finish before we return.
116
+ if (request.requestTracker.checkCancelled()) {
117
+ if (request.requestTracker.allFetched()) {
118
+ this.log.debug(`All txs collected for slot ${blockInfo.slotNumber} without reqresp`, blockInfo);
119
+ }
120
+ await nodeCollectionPromise;
129
121
  return;
130
122
  }
131
123
 
132
124
  // Start blasting reqresp for the remaining txs. Note that node collection keeps running in parallel.
133
125
  // We stop when we have collected all txs, timed out, or both node collection and reqresp have given up.
134
- const collectionPromise = Promise.allSettled([this.collectFastViaReqResp(request, opts), nodeCollectionPromise]);
135
- await Promise.race([collectionPromise, request.promise.promise]);
126
+ // Inner tasks observe requestTracker.checkCancelled() and stop themselves, so this settles shortly after cancellation.
127
+ await Promise.allSettled([this.collectFastViaReqResp(request, opts), nodeCollectionPromise]);
136
128
  } catch (err) {
137
- // Log and swallow all errors
138
- const logCtx = {
129
+ this.log.error(`Error collecting txs for ${request.type} for slot ${blockInfo.slotNumber}`, err, {
139
130
  ...blockInfo,
140
- errorMessage: err instanceof Error ? err.message : undefined,
141
- missingTxs: [...request.missingTxHashes].map(txHash => txHash.toString()),
142
- };
143
- if (err instanceof Error && err.name === 'TimeoutError') {
144
- this.log.warn(`Timed out collecting txs for ${request.type} at slot ${blockInfo.slotNumber}`, logCtx);
145
- } else if (err instanceof Error && err.name === 'AbortError') {
146
- this.log.warn(`Aborted collecting txs for ${request.type} at slot ${blockInfo.slotNumber}`, logCtx);
147
- } else {
148
- this.log.error(`Error collecting txs for ${request.type} for slot ${blockInfo.slotNumber}`, err, logCtx);
149
- }
131
+ missingTxs: request.requestTracker.missingTxHashes.values().map(txHash => txHash.toString()),
132
+ });
150
133
  } finally {
151
134
  // Ensure no unresolved promises and remove the request from the set
152
- request.promise.resolve();
135
+ request.requestTracker.cancel();
153
136
  this.requests.delete(request);
154
137
  }
155
138
  }
@@ -160,26 +143,28 @@ export class FastTxCollection {
160
143
  * the txs that have been requested less often whenever we need to send a new batch of requests. We ensure that no
161
144
  * tx is requested more than once at the same time to the same node.
162
145
  */
163
- private async collectFastFromNodes(request: FastCollectionRequest, opts: { deadline: Date }): Promise<void> {
146
+ private async collectFastFromNodes(request: FastCollectionRequest): Promise<void> {
164
147
  if (this.nodes.length === 0) {
165
148
  return;
166
149
  }
167
150
 
168
151
  // Keep a shared priority queue of all txs pending to be requested, sorted by the number of attempts made to collect them.
169
- const attemptsPerTx = [...request.missingTxHashes].map(txHash => ({ txHash, attempts: 0, found: false }));
152
+ const attemptsPerTx = [...request.requestTracker.missingTxHashes].map(txHash => ({
153
+ txHash,
154
+ attempts: 0,
155
+ found: false,
156
+ }));
170
157
 
171
158
  // Returns once we have finished all node loops. Each loop finishes when the deadline is hit, or all txs have been collected.
172
- await Promise.allSettled(this.nodes.map(node => this.collectFastFromNode(request, node, attemptsPerTx, opts)));
159
+ await Promise.allSettled(this.nodes.map(node => this.collectFastFromNode(request, node, attemptsPerTx)));
173
160
  }
174
161
 
175
162
  private async collectFastFromNode(
176
163
  request: FastCollectionRequest,
177
164
  node: TxSource,
178
165
  attemptsPerTx: { txHash: string; attempts: number; found: boolean }[],
179
- opts: { deadline: Date },
180
166
  ) {
181
- const notFinished = () =>
182
- this.dateProvider.now() <= +opts.deadline && request.missingTxHashes.size > 0 && this.requests.has(request);
167
+ const notFinished = () => !request.requestTracker.checkCancelled();
183
168
 
184
169
  const maxParallelRequests = this.config.txCollectionFastMaxParallelRequestsPerNode;
185
170
  const maxBatchSize = this.config.txCollectionNodeRpcMaxBatchSize;
@@ -196,7 +181,7 @@ export class FastTxCollection {
196
181
  if (!txToRequest) {
197
182
  // No more txs to process
198
183
  break;
199
- } else if (!request.missingTxHashes.has(txToRequest.txHash)) {
184
+ } else if (!request.requestTracker.isMissing(txToRequest.txHash)) {
200
185
  // Mark as found if it was found somewhere else, we'll then remove it from the array.
201
186
  // We don't delete it now since 'array.splice' is pretty expensive, so we do it after sorting.
202
187
  txToRequest.found = true;
@@ -225,10 +210,17 @@ export class FastTxCollection {
225
210
  return;
226
211
  }
227
212
 
213
+ const txHashes = batch.map(({ txHash }) => txHash);
228
214
  // Collect this batch from the node
229
215
  await this.txCollectionSink.collect(
230
- txHashes => node.getTxsByHash(txHashes),
231
- batch.map(({ txHash }) => TxHash.fromString(txHash)),
216
+ async () => {
217
+ const result = await node.getTxsByHash(txHashes.map(TxHash.fromString));
218
+ for (const tx of result.validTxs) {
219
+ request.requestTracker.markFetched(tx);
220
+ }
221
+ return result;
222
+ },
223
+ txHashes,
232
224
  {
233
225
  description: `fast ${node.getInfo()}`,
234
226
  node: node.getInfo(),
@@ -243,9 +235,12 @@ export class FastTxCollection {
243
235
  activeRequestsToThisNode.delete(requestedTx.txHash);
244
236
  }
245
237
 
246
- // Sleep a bit until hitting the node again (or not, depending on config)
238
+ // Sleep a bit until hitting the node again, but wake up immediately on cancellation
247
239
  if (notFinished()) {
248
- await sleep(this.config.txCollectionFastNodeIntervalMs);
240
+ await Promise.race([
241
+ sleep(this.config.txCollectionFastNodeIntervalMs),
242
+ request.requestTracker.cancellationToken,
243
+ ]);
249
244
  }
250
245
  }
251
246
  };
@@ -255,45 +250,50 @@ export class FastTxCollection {
255
250
  }
256
251
 
257
252
  private async collectFastViaReqResp(request: FastCollectionRequest, opts: { pinnedPeer?: PeerId }) {
258
- const timeoutMs = +request.deadline - this.dateProvider.now();
259
253
  const pinnedPeer = opts.pinnedPeer;
260
254
  const blockInfo = request.blockInfo;
261
255
  const slotNumber = blockInfo.slotNumber;
262
- if (timeoutMs < 100) {
256
+ if (request.requestTracker.timeoutMs < 100) {
263
257
  this.log.warn(
264
258
  `Not initiating fast reqresp for txs for ${request.type} at slot ${blockInfo.slotNumber} due to timeout`,
265
- { timeoutMs, ...blockInfo },
259
+ { timeoutMs: request.requestTracker.timeoutMs, ...blockInfo },
266
260
  );
267
261
  return;
268
262
  }
269
263
 
270
264
  this.log.debug(
271
- `Starting fast reqresp for ${request.missingTxHashes.size} txs for ${request.type} at slot ${blockInfo.slotNumber}`,
272
- { ...blockInfo, timeoutMs, pinnedPeer },
265
+ `Starting fast reqresp for ${request.requestTracker.numberOfMissingTxs} txs for ${request.type} at slot ${blockInfo.slotNumber}`,
266
+ { ...blockInfo, timeoutMs: request.requestTracker.timeoutMs, pinnedPeer },
273
267
  );
274
268
 
275
269
  try {
276
270
  await this.txCollectionSink.collect(
277
- async txHashes => {
271
+ async () => {
272
+ let result: Tx[];
278
273
  if (request.type === 'proposal') {
279
- return await this.missingTxsCollector.collectTxs(txHashes, request.blockProposal, pinnedPeer, timeoutMs);
274
+ result = await this.missingTxsCollector.collectTxs(
275
+ request.requestTracker,
276
+ request.blockProposal,
277
+ pinnedPeer,
278
+ );
280
279
  } else if (request.type === 'block') {
281
280
  const blockTxsSource = {
282
281
  txHashes: request.block.body.txEffects.map(e => e.txHash),
283
282
  archive: request.block.archive.root,
284
283
  };
285
- return await this.missingTxsCollector.collectTxs(txHashes, blockTxsSource, pinnedPeer, timeoutMs);
284
+ result = await this.missingTxsCollector.collectTxs(request.requestTracker, blockTxsSource, pinnedPeer);
286
285
  } else {
287
286
  throw new Error(`Unknown request type: ${(request as any).type}`);
288
287
  }
288
+ return { validTxs: result, invalidTxHashes: [] };
289
289
  },
290
- Array.from(request.missingTxHashes).map(txHash => TxHash.fromString(txHash)),
290
+ Array.from(request.requestTracker.missingTxHashes),
291
291
  { description: `reqresp for slot ${slotNumber}`, method: 'fast-req-resp', ...opts, ...request.blockInfo },
292
292
  this.getAddContext(request),
293
293
  );
294
294
  } catch (err) {
295
295
  this.log.error(`Error sending fast reqresp request for txs`, err, {
296
- txs: [...request.missingTxHashes],
296
+ txs: [...request.requestTracker.missingTxHashes],
297
297
  ...blockInfo,
298
298
  });
299
299
  }
@@ -317,21 +317,18 @@ export class FastTxCollection {
317
317
  for (const tx of txs) {
318
318
  const txHash = tx.txHash.toString();
319
319
  // Remove the tx hash from the missing set, and add it to the found set.
320
- if (request.missingTxHashes.has(txHash)) {
321
- request.missingTxHashes.delete(txHash);
322
- request.foundTxs.set(txHash, tx);
320
+ if (request.requestTracker.markFetched(tx)) {
323
321
  this.log.trace(`Found tx ${txHash} for fast collection request`, {
324
322
  ...request.blockInfo,
325
323
  txHash: tx.txHash.toString(),
326
324
  type: request.type,
327
325
  });
328
- // If we found all txs for this request, we resolve the promise
329
- if (request.missingTxHashes.size === 0) {
326
+ if (request.requestTracker.allFetched()) {
330
327
  this.log.trace(`All txs found for fast collection request`, {
331
328
  ...request.blockInfo,
332
329
  type: request.type,
333
330
  });
334
- request.promise.resolve();
331
+ break;
335
332
  }
336
333
  }
337
334
  }
@@ -345,8 +342,7 @@ export class FastTxCollection {
345
342
  public stopCollectingForBlocksUpTo(blockNumber: BlockNumber): void {
346
343
  for (const request of this.requests) {
347
344
  if (request.blockInfo.blockNumber <= blockNumber) {
348
- request.promise.reject(new AbortError(`Stopped collecting txs up to block ${blockNumber}`));
349
- this.requests.delete(request);
345
+ request.requestTracker.cancel();
350
346
  }
351
347
  }
352
348
  }
@@ -358,8 +354,7 @@ export class FastTxCollection {
358
354
  public stopCollectingForBlocksAfter(blockNumber: BlockNumber): void {
359
355
  for (const request of this.requests) {
360
356
  if (request.blockInfo.blockNumber > blockNumber) {
361
- request.promise.reject(new AbortError(`Stopped collecting txs after block ${blockNumber}`));
362
- this.requests.delete(request);
357
+ request.requestTracker.cancel();
363
358
  }
364
359
  }
365
360
  }
@@ -126,9 +126,13 @@ export class FileStoreTxCollection {
126
126
 
127
127
  try {
128
128
  const result = await this.txCollectionSink.collect(
129
- hashes => source.getTxsByHash(hashes),
130
- [TxHash.fromString(entry.txHash)],
131
- { description: `file-store ${source.getInfo()}`, method: 'file-store', fileStore: source.getInfo() },
129
+ () => source.getTxsByHash([TxHash.fromString(entry.txHash)]),
130
+ [entry.txHash],
131
+ {
132
+ description: `file-store ${source.getInfo()}`,
133
+ method: 'file-store',
134
+ fileStore: source.getInfo(),
135
+ },
132
136
  entry.context,
133
137
  );
134
138
  if (result.txs.length > 0) {
@@ -1,28 +1,54 @@
1
+ import { partitionAsync } from '@aztec/foundation/collection';
1
2
  import { type Logger, createLogger } from '@aztec/foundation/log';
3
+ import { Timer } from '@aztec/foundation/timer';
2
4
  import { type ReadOnlyFileStore, createReadOnlyFileStore } from '@aztec/stdlib/file-store';
3
- import { Tx, type TxHash } from '@aztec/stdlib/tx';
5
+ import { Tx, type TxHash, type TxValidator } from '@aztec/stdlib/tx';
6
+ import {
7
+ type Histogram,
8
+ Metrics,
9
+ type TelemetryClient,
10
+ type UpDownCounter,
11
+ getTelemetryClient,
12
+ } from '@aztec/telemetry-client';
4
13
 
5
- import type { TxSource } from './tx_source.js';
14
+ import type { TxSource, TxSourceCollectionResult } from './tx_source.js';
6
15
 
7
16
  /** TxSource implementation that downloads txs from a file store. */
8
17
  export class FileStoreTxSource implements TxSource {
18
+ private downloadsSuccess: UpDownCounter;
19
+ private downloadsFailed: UpDownCounter;
20
+ private downloadDuration: Histogram;
21
+ private downloadSize: Histogram;
22
+
9
23
  private constructor(
10
24
  private readonly fileStore: ReadOnlyFileStore,
11
25
  private readonly baseUrl: string,
12
26
  private readonly basePath: string,
27
+ private readonly txValidator: TxValidator,
13
28
  private readonly log: Logger,
14
- ) {}
29
+ telemetry: TelemetryClient,
30
+ ) {
31
+ const meter = telemetry.getMeter('file-store-tx-source');
32
+ this.downloadsSuccess = meter.createUpDownCounter(Metrics.TX_FILE_STORE_DOWNLOADS_SUCCESS);
33
+ this.downloadsFailed = meter.createUpDownCounter(Metrics.TX_FILE_STORE_DOWNLOADS_FAILED);
34
+ this.downloadDuration = meter.createHistogram(Metrics.TX_FILE_STORE_DOWNLOAD_DURATION);
35
+ this.downloadSize = meter.createHistogram(Metrics.TX_FILE_STORE_DOWNLOAD_SIZE);
36
+ }
15
37
 
16
38
  /**
17
39
  * Creates a FileStoreTxSource from a URL.
18
40
  * @param url - The file store URL (s3://, gs://, file://, http://, https://).
41
+ * @param basePath - Base path for tx files within the store.
19
42
  * @param log - Optional logger.
43
+ * @param telemetry - Optional telemetry client.
20
44
  * @returns The FileStoreTxSource instance, or undefined if creation fails.
21
45
  */
22
46
  public static async create(
23
47
  url: string,
24
48
  basePath: string,
49
+ txValidator: TxValidator,
25
50
  log: Logger = createLogger('p2p:file_store_tx_source'),
51
+ telemetry: TelemetryClient = getTelemetryClient(),
26
52
  ): Promise<FileStoreTxSource | undefined> {
27
53
  try {
28
54
  const fileStore = await createReadOnlyFileStore(url, log);
@@ -30,7 +56,7 @@ export class FileStoreTxSource implements TxSource {
30
56
  log.warn(`Failed to create file store for URL: ${url}`);
31
57
  return undefined;
32
58
  }
33
- return new FileStoreTxSource(fileStore, url, basePath, log);
59
+ return new FileStoreTxSource(fileStore, url, basePath, txValidator, log, telemetry);
34
60
  } catch (err) {
35
61
  log.warn(`Error creating file store for URL: ${url}`, { error: err });
36
62
  return undefined;
@@ -41,33 +67,63 @@ export class FileStoreTxSource implements TxSource {
41
67
  return `file-store:${this.baseUrl}`;
42
68
  }
43
69
 
44
- public getTxsByHash(txHashes: TxHash[]): Promise<(Tx | undefined)[]> {
45
- return Promise.all(
70
+ public async getTxsByHash(txHashes: TxHash[]): Promise<TxSourceCollectionResult> {
71
+ const results = await Promise.all(
46
72
  txHashes.map(async txHash => {
47
73
  const path = `${this.basePath}/txs/${txHash.toString()}.bin`;
74
+ const timer = new Timer();
48
75
  try {
49
76
  const buffer = await this.fileStore.read(path);
50
- return Tx.fromBuffer(buffer);
77
+ const tx = Tx.fromBuffer(buffer);
78
+ return { tx, downloadDuration: timer.ms(), downloadSize: buffer.length };
51
79
  } catch {
52
- // Tx not found or error reading - return undefined
80
+ this.downloadsFailed.add(1);
53
81
  return undefined;
54
82
  }
55
83
  }),
56
84
  );
85
+
86
+ const txs = results.filter(tx => tx !== undefined);
87
+ const [validTxs, invalidTxs] = await partitionAsync(
88
+ txs,
89
+ async ({ tx, downloadDuration, downloadSize }): Promise<boolean> => {
90
+ const valid = await this.txValidator.validateTx(tx);
91
+ if (valid.result === 'valid') {
92
+ this.downloadsSuccess.add(1);
93
+ this.downloadDuration.record(Math.ceil(downloadDuration));
94
+ this.downloadSize.record(downloadSize);
95
+ return true;
96
+ } else {
97
+ this.downloadsFailed.add(1);
98
+ return false;
99
+ }
100
+ },
101
+ );
102
+
103
+ return {
104
+ validTxs: validTxs.map(({ tx }) => tx),
105
+ invalidTxHashes: invalidTxs.map(({ tx }) => tx.getTxHash().toString()),
106
+ };
57
107
  }
58
108
  }
59
109
 
60
110
  /**
61
111
  * Creates FileStoreTxSource instances from URLs.
62
112
  * @param urls - Array of file store URLs.
113
+ * @param basePath - Base path for tx files within each store.
63
114
  * @param log - Optional logger.
115
+ * @param telemetry - Optional telemetry client.
64
116
  * @returns Array of successfully created FileStoreTxSource instances.
65
117
  */
66
118
  export async function createFileStoreTxSources(
67
119
  urls: string[],
68
120
  basePath: string,
121
+ txValidator: TxValidator,
69
122
  log: Logger = createLogger('p2p:file_store_tx_source'),
123
+ telemetry: TelemetryClient = getTelemetryClient(),
70
124
  ): Promise<FileStoreTxSource[]> {
71
- const sources = await Promise.all(urls.map(url => FileStoreTxSource.create(url, basePath, log)));
125
+ const sources = await Promise.all(
126
+ urls.map(url => FileStoreTxSource.create(url, basePath, txValidator, log, telemetry)),
127
+ );
72
128
  return sources.filter((s): s is FileStoreTxSource => s !== undefined);
73
129
  }
@@ -18,7 +18,13 @@ export class TxCollectionInstrumentation {
18
18
  const meter = client.getMeter(name);
19
19
 
20
20
  this.txsCollected = createUpDownCounterWithDefault(meter, Metrics.TX_COLLECTOR_COUNT, {
21
- [Attributes.TX_COLLECTION_METHOD]: ['fast-req-resp', 'fast-node-rpc', 'slow-req-resp', 'slow-node-rpc'],
21
+ [Attributes.TX_COLLECTION_METHOD]: [
22
+ 'fast-req-resp',
23
+ 'fast-node-rpc',
24
+ 'slow-req-resp',
25
+ 'slow-node-rpc',
26
+ 'file-store',
27
+ ],
22
28
  });
23
29
 
24
30
  this.collectionDurationPerTx = meter.createHistogram(Metrics.TX_COLLECTOR_DURATION_PER_TX);
@@ -1,6 +1,6 @@
1
1
  import type { Logger } from '@aztec/foundation/log';
2
2
  import type { DateProvider } from '@aztec/foundation/timer';
3
- import type { Tx, TxHash } from '@aztec/stdlib/tx';
3
+ import { type Tx, TxHash } from '@aztec/stdlib/tx';
4
4
 
5
5
  import type { PeerId } from '@libp2p/interface';
6
6
 
@@ -9,6 +9,7 @@ import type { BatchTxRequesterConfig } from '../reqresp/batch-tx-requester/confi
9
9
  import type { BatchTxRequesterLibP2PService } from '../reqresp/batch-tx-requester/interface.js';
10
10
  import type { IBatchRequestTxValidator } from '../reqresp/batch-tx-requester/tx_validator.js';
11
11
  import { type BlockTxsSource, ReqRespSubProtocol, chunkTxHashesRequest } from '../reqresp/index.js';
12
+ import type { IRequestTracker } from './request_tracker.js';
12
13
 
13
14
  /**
14
15
  * Strategy interface for collecting missing transactions for a block or proposal.
@@ -17,17 +18,15 @@ import { type BlockTxsSource, ReqRespSubProtocol, chunkTxHashesRequest } from '.
17
18
  export interface MissingTxsCollector {
18
19
  /**
19
20
  * Collect missing transactions for a block or proposal.
20
- * @param txHashes - The transaction hashes to collect
21
+ * @param requestTracker - The missing transactions tracker
21
22
  * @param blockTxsSource - The block or proposal containing the transactions
22
23
  * @param pinnedPeer - Optional peer expected to have the transactions
23
- * @param timeoutMs - Timeout in milliseconds
24
24
  * @returns The collected transactions
25
25
  */
26
26
  collectTxs(
27
- txHashes: TxHash[],
27
+ requestTracker: IRequestTracker,
28
28
  blockTxsSource: BlockTxsSource,
29
29
  pinnedPeer: PeerId | undefined,
30
- timeoutMs: number,
31
30
  ): Promise<Tx[]>;
32
31
  }
33
32
 
@@ -45,10 +44,9 @@ export class BatchTxRequesterCollector implements MissingTxsCollector {
45
44
  ) {}
46
45
 
47
46
  async collectTxs(
48
- txHashes: TxHash[],
47
+ requestTracker: IRequestTracker,
49
48
  blockTxsSource: BlockTxsSource,
50
49
  pinnedPeer: PeerId | undefined,
51
- timeoutMs: number,
52
50
  ): Promise<Tx[]> {
53
51
  const {
54
52
  batchTxRequesterSmartParallelWorkerCount: smartParallelWorkerCount,
@@ -58,10 +56,9 @@ export class BatchTxRequesterCollector implements MissingTxsCollector {
58
56
  } = this.batchTxRequesterConfig ?? {};
59
57
 
60
58
  const batchRequester = new BatchTxRequester(
61
- txHashes,
59
+ requestTracker,
62
60
  blockTxsSource,
63
61
  pinnedPeer,
64
- timeoutMs,
65
62
  this.p2pService,
66
63
  this.log,
67
64
  this.dateProvider,
@@ -93,16 +90,15 @@ export class SendBatchRequestCollector implements MissingTxsCollector {
93
90
  ) {}
94
91
 
95
92
  async collectTxs(
96
- txHashes: TxHash[],
93
+ requestTracker: IRequestTracker,
97
94
  _blockTxsSource: BlockTxsSource,
98
95
  pinnedPeer: PeerId | undefined,
99
- timeoutMs: number,
100
96
  ): Promise<Tx[]> {
101
97
  const txs = await this.p2pService.reqResp.sendBatchRequest<ReqRespSubProtocol.TX>(
102
98
  ReqRespSubProtocol.TX,
103
- chunkTxHashesRequest(txHashes),
99
+ chunkTxHashesRequest(Array.from(requestTracker.missingTxHashes).map(TxHash.fromString)),
104
100
  pinnedPeer,
105
- timeoutMs,
101
+ requestTracker.timeoutMs,
106
102
  this.maxPeers,
107
103
  this.maxRetryAttempts,
108
104
  );