@aztec/p2p 0.0.1-commit.2448fdb → 0.0.1-commit.2606882

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 (402) hide show
  1. package/dest/bootstrap/bootstrap.d.ts +1 -1
  2. package/dest/bootstrap/bootstrap.d.ts.map +1 -1
  3. package/dest/bootstrap/bootstrap.js +9 -1
  4. package/dest/client/factory.d.ts +5 -4
  5. package/dest/client/factory.d.ts.map +1 -1
  6. package/dest/client/factory.js +26 -21
  7. package/dest/client/interface.d.ts +14 -5
  8. package/dest/client/interface.d.ts.map +1 -1
  9. package/dest/client/p2p_client.d.ts +13 -9
  10. package/dest/client/p2p_client.d.ts.map +1 -1
  11. package/dest/client/p2p_client.js +78 -20
  12. package/dest/config.d.ts +135 -105
  13. package/dest/config.d.ts.map +1 -1
  14. package/dest/config.js +59 -14
  15. package/dest/errors/p2p-service.error.d.ts +9 -0
  16. package/dest/errors/p2p-service.error.d.ts.map +1 -0
  17. package/dest/errors/p2p-service.error.js +10 -0
  18. package/dest/errors/reqresp.error.d.ts +1 -20
  19. package/dest/errors/reqresp.error.d.ts.map +1 -1
  20. package/dest/errors/reqresp.error.js +0 -21
  21. package/dest/index.d.ts +1 -2
  22. package/dest/index.d.ts.map +1 -1
  23. package/dest/index.js +0 -1
  24. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +99 -59
  25. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  26. package/dest/mem_pools/attestation_pool/attestation_pool.js +267 -197
  27. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +1 -1
  28. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
  29. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +181 -65
  30. package/dest/mem_pools/attestation_pool/mocks.d.ts +1 -1
  31. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  32. package/dest/mem_pools/attestation_pool/mocks.js +6 -4
  33. package/dest/mem_pools/index.d.ts +1 -2
  34. package/dest/mem_pools/index.d.ts.map +1 -1
  35. package/dest/mem_pools/instrumentation.d.ts +4 -2
  36. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  37. package/dest/mem_pools/instrumentation.js +33 -15
  38. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts +1 -5
  39. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts.map +1 -1
  40. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.js +1 -7
  41. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +2 -1
  42. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -1
  43. package/dest/mem_pools/tx_pool_v2/eviction/index.js +1 -0
  44. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts +16 -0
  45. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts.map +1 -0
  46. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.js +62 -0
  47. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +2 -2
  48. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +10 -5
  49. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
  50. package/dest/mem_pools/tx_pool_v2/interfaces.js +1 -0
  51. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +9 -7
  52. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
  53. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +13 -6
  54. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +1 -1
  55. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -1
  56. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +26 -43
  57. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +1 -1
  58. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -1
  59. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +3 -0
  60. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +2 -1
  61. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -1
  62. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +93 -85
  63. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +9 -3
  64. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  65. package/dest/msg_validators/attestation_validator/attestation_validator.js +37 -12
  66. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +7 -3
  67. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
  68. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +4 -5
  69. package/dest/msg_validators/clock_tolerance.d.ts +12 -1
  70. package/dest/msg_validators/clock_tolerance.d.ts.map +1 -1
  71. package/dest/msg_validators/clock_tolerance.js +56 -3
  72. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +6 -2
  73. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
  74. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +6 -2
  75. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
  76. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +10 -2
  77. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
  78. package/dest/msg_validators/proposal_validator/proposal_validator.js +46 -12
  79. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +1 -1
  80. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  81. package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +8 -15
  82. package/dest/msg_validators/tx_validator/allowed_public_setup.js +3 -3
  83. package/dest/msg_validators/tx_validator/archive_cache.js +1 -1
  84. package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts +15 -0
  85. package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts.map +1 -0
  86. package/dest/msg_validators/tx_validator/cached_tx_validator.js +19 -0
  87. package/dest/msg_validators/tx_validator/data_validator.d.ts +2 -1
  88. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  89. package/dest/msg_validators/tx_validator/data_validator.js +1 -0
  90. package/dest/msg_validators/tx_validator/factory.d.ts +6 -5
  91. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  92. package/dest/msg_validators/tx_validator/factory.js +14 -10
  93. package/dest/msg_validators/tx_validator/gas_validator.d.ts +36 -4
  94. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  95. package/dest/msg_validators/tx_validator/gas_validator.js +50 -33
  96. package/dest/msg_validators/tx_validator/index.d.ts +3 -1
  97. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  98. package/dest/msg_validators/tx_validator/index.js +2 -0
  99. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +1 -1
  100. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  101. package/dest/msg_validators/tx_validator/metadata_validator.js +4 -4
  102. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +2 -1
  103. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
  104. package/dest/msg_validators/tx_validator/tx_proof_validator.js +2 -0
  105. package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts +48 -0
  106. package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts.map +1 -0
  107. package/dest/msg_validators/tx_validator/tx_validation_cache.js +68 -0
  108. package/dest/services/data_store.d.ts +1 -1
  109. package/dest/services/data_store.d.ts.map +1 -1
  110. package/dest/services/data_store.js +5 -5
  111. package/dest/services/discv5/discV5_service.d.ts +2 -1
  112. package/dest/services/discv5/discV5_service.d.ts.map +1 -1
  113. package/dest/services/discv5/discV5_service.js +35 -8
  114. package/dest/services/dummy_service.d.ts +11 -15
  115. package/dest/services/dummy_service.d.ts.map +1 -1
  116. package/dest/services/dummy_service.js +12 -16
  117. package/dest/services/gossipsub/topic_score_params.d.ts +13 -2
  118. package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -1
  119. package/dest/services/gossipsub/topic_score_params.js +21 -4
  120. package/dest/services/libp2p/instrumentation.d.ts +3 -1
  121. package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
  122. package/dest/services/libp2p/instrumentation.js +14 -0
  123. package/dest/services/libp2p/libp2p_service.d.ts +36 -46
  124. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  125. package/dest/services/libp2p/libp2p_service.js +289 -265
  126. package/dest/services/peer-manager/metrics.d.ts +3 -1
  127. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  128. package/dest/services/peer-manager/metrics.js +6 -0
  129. package/dest/services/peer-manager/peer_manager.d.ts +6 -2
  130. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  131. package/dest/services/peer-manager/peer_manager.js +40 -11
  132. package/dest/services/peer-manager/peer_scoring.d.ts +7 -2
  133. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  134. package/dest/services/peer-manager/peer_scoring.js +32 -10
  135. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +4 -8
  136. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -1
  137. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +94 -122
  138. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +10 -6
  139. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
  140. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +5 -4
  141. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -1
  142. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +13 -7
  143. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +19 -11
  144. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -1
  145. package/dest/services/reqresp/batch-tx-requester/peer_collection.js +52 -15
  146. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +5 -14
  147. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -1
  148. package/dest/services/reqresp/batch-tx-requester/tx_validator.js +6 -20
  149. package/dest/services/reqresp/config.d.ts +3 -3
  150. package/dest/services/reqresp/config.d.ts.map +1 -1
  151. package/dest/services/reqresp/interface.d.ts +16 -18
  152. package/dest/services/reqresp/interface.d.ts.map +1 -1
  153. package/dest/services/reqresp/interface.js +10 -20
  154. package/dest/services/reqresp/metrics.d.ts +1 -1
  155. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  156. package/dest/services/reqresp/metrics.js +0 -1
  157. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +4 -3
  158. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -1
  159. package/dest/services/reqresp/protocols/block_txs/bitvector.js +3 -2
  160. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +1 -1
  161. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
  162. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +31 -28
  163. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +12 -7
  164. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
  165. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +42 -24
  166. package/dest/services/reqresp/protocols/index.d.ts +1 -2
  167. package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
  168. package/dest/services/reqresp/protocols/index.js +0 -1
  169. package/dest/services/reqresp/protocols/tx.d.ts +1 -1
  170. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  171. package/dest/services/reqresp/protocols/tx.js +1 -3
  172. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
  173. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
  174. package/dest/services/reqresp/rate-limiter/rate_limits.js +0 -10
  175. package/dest/services/reqresp/reqresp.d.ts +7 -29
  176. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  177. package/dest/services/reqresp/reqresp.js +27 -207
  178. package/dest/services/service.d.ts +9 -12
  179. package/dest/services/service.d.ts.map +1 -1
  180. package/dest/services/tx_collection/config.d.ts +2 -23
  181. package/dest/services/tx_collection/config.d.ts.map +1 -1
  182. package/dest/services/tx_collection/config.js +2 -55
  183. package/dest/services/tx_collection/file_store_tx_collection.d.ts +12 -28
  184. package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -1
  185. package/dest/services/tx_collection/file_store_tx_collection.js +43 -83
  186. package/dest/services/tx_collection/index.d.ts +2 -3
  187. package/dest/services/tx_collection/index.d.ts.map +1 -1
  188. package/dest/services/tx_collection/index.js +0 -1
  189. package/dest/services/tx_collection/instrumentation.d.ts +1 -1
  190. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
  191. package/dest/services/tx_collection/instrumentation.js +0 -2
  192. package/dest/services/tx_collection/request_tracker.d.ts +53 -0
  193. package/dest/services/tx_collection/request_tracker.d.ts.map +1 -0
  194. package/dest/services/tx_collection/request_tracker.js +84 -0
  195. package/dest/services/tx_collection/tx_collection.d.ts +36 -55
  196. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  197. package/dest/services/tx_collection/tx_collection.js +275 -119
  198. package/dest/services/tx_collection/tx_collection_sink.d.ts +1 -1
  199. package/dest/services/tx_collection/tx_collection_sink.js +2 -2
  200. package/dest/services/tx_file_store/tx_file_store.d.ts +1 -3
  201. package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -1
  202. package/dest/services/tx_file_store/tx_file_store.js +4 -14
  203. package/dest/services/tx_provider.d.ts +3 -1
  204. package/dest/services/tx_provider.d.ts.map +1 -1
  205. package/dest/services/tx_provider.js +3 -0
  206. package/dest/test-helpers/make-test-p2p-clients.d.ts +1 -1
  207. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  208. package/dest/test-helpers/make-test-p2p-clients.js +5 -2
  209. package/dest/test-helpers/mock-pubsub.d.ts +23 -9
  210. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  211. package/dest/test-helpers/mock-pubsub.js +44 -44
  212. package/dest/test-helpers/reqresp-nodes.d.ts +4 -5
  213. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  214. package/dest/test-helpers/reqresp-nodes.js +16 -18
  215. package/dest/test-helpers/test_tx_provider.d.ts +3 -1
  216. package/dest/test-helpers/test_tx_provider.d.ts.map +1 -1
  217. package/dest/test-helpers/test_tx_provider.js +3 -0
  218. package/dest/test-helpers/testbench-utils.d.ts +12 -14
  219. package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
  220. package/dest/test-helpers/testbench-utils.js +38 -14
  221. package/dest/testbench/p2p_client_testbench_worker.d.ts +3 -5
  222. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  223. package/dest/testbench/p2p_client_testbench_worker.js +83 -38
  224. package/dest/testbench/worker_client_manager.d.ts +10 -6
  225. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  226. package/dest/testbench/worker_client_manager.js +53 -10
  227. package/dest/util.d.ts +12 -7
  228. package/dest/util.d.ts.map +1 -1
  229. package/dest/util.js +35 -14
  230. package/dest/versioning.d.ts +3 -6
  231. package/dest/versioning.d.ts.map +1 -1
  232. package/dest/versioning.js +3 -24
  233. package/package.json +15 -14
  234. package/src/bootstrap/bootstrap.ts +9 -1
  235. package/src/client/factory.ts +45 -24
  236. package/src/client/interface.ts +15 -11
  237. package/src/client/p2p_client.ts +91 -41
  238. package/src/client/test/{tx_proposal_collector/README.md → p2p_client.batch_tx_requester.bench.README.md} +23 -53
  239. package/src/config.ts +117 -17
  240. package/src/errors/p2p-service.error.ts +11 -0
  241. package/src/errors/reqresp.error.ts +0 -25
  242. package/src/index.ts +0 -1
  243. package/src/mem_pools/attestation_pool/attestation_pool.ts +318 -242
  244. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +204 -68
  245. package/src/mem_pools/attestation_pool/mocks.ts +13 -8
  246. package/src/mem_pools/index.ts +0 -3
  247. package/src/mem_pools/instrumentation.ts +22 -14
  248. package/src/mem_pools/tx_pool_v2/archive/tx_archive.ts +1 -9
  249. package/src/mem_pools/tx_pool_v2/eviction/index.ts +1 -0
  250. package/src/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.ts +65 -0
  251. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +3 -3
  252. package/src/mem_pools/tx_pool_v2/interfaces.ts +10 -4
  253. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +24 -12
  254. package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +29 -43
  255. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +3 -0
  256. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +94 -91
  257. package/src/msg_validators/attestation_validator/README.md +1 -1
  258. package/src/msg_validators/attestation_validator/attestation_validator.ts +41 -9
  259. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +14 -7
  260. package/src/msg_validators/clock_tolerance.ts +73 -3
  261. package/src/msg_validators/proposal_validator/README.md +4 -4
  262. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +12 -2
  263. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +17 -2
  264. package/src/msg_validators/proposal_validator/proposal_validator.ts +54 -10
  265. package/src/msg_validators/tx_validator/README.md +11 -3
  266. package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +3 -12
  267. package/src/msg_validators/tx_validator/allowed_public_setup.ts +3 -3
  268. package/src/msg_validators/tx_validator/archive_cache.ts +1 -1
  269. package/src/msg_validators/tx_validator/cached_tx_validator.ts +31 -0
  270. package/src/msg_validators/tx_validator/data_validator.ts +2 -0
  271. package/src/msg_validators/tx_validator/factory.ts +18 -7
  272. package/src/msg_validators/tx_validator/gas_validator.ts +82 -33
  273. package/src/msg_validators/tx_validator/index.ts +2 -0
  274. package/src/msg_validators/tx_validator/metadata_validator.ts +12 -4
  275. package/src/msg_validators/tx_validator/tx_proof_validator.ts +2 -0
  276. package/src/msg_validators/tx_validator/tx_validation_cache.ts +101 -0
  277. package/src/services/data_store.ts +5 -13
  278. package/src/services/discv5/discV5_service.ts +38 -5
  279. package/src/services/dummy_service.ts +14 -39
  280. package/src/services/gossipsub/topic_score_params.ts +36 -4
  281. package/src/services/libp2p/instrumentation.ts +14 -0
  282. package/src/services/libp2p/libp2p_service.ts +315 -302
  283. package/src/services/peer-manager/metrics.ts +7 -0
  284. package/src/services/peer-manager/peer_manager.ts +46 -11
  285. package/src/services/peer-manager/peer_scoring.ts +27 -5
  286. package/src/services/reqresp/README.md +0 -14
  287. package/src/services/reqresp/batch-tx-requester/README.md +46 -7
  288. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +91 -137
  289. package/src/services/reqresp/batch-tx-requester/interface.ts +13 -5
  290. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +13 -6
  291. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +68 -24
  292. package/src/services/reqresp/batch-tx-requester/tx_validator.ts +12 -25
  293. package/src/services/reqresp/config.ts +2 -2
  294. package/src/services/reqresp/interface.ts +21 -47
  295. package/src/services/reqresp/metrics.ts +0 -1
  296. package/src/services/reqresp/protocols/block_txs/bitvector.ts +3 -2
  297. package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +34 -30
  298. package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +47 -20
  299. package/src/services/reqresp/protocols/index.ts +0 -1
  300. package/src/services/reqresp/protocols/tx.ts +1 -3
  301. package/src/services/reqresp/rate-limiter/rate_limits.ts +0 -10
  302. package/src/services/reqresp/reqresp.ts +31 -252
  303. package/src/services/service.ts +12 -28
  304. package/src/services/tx_collection/config.ts +3 -80
  305. package/src/services/tx_collection/file_store_tx_collection.ts +54 -103
  306. package/src/services/tx_collection/index.ts +1 -6
  307. package/src/services/tx_collection/instrumentation.ts +1 -7
  308. package/src/services/tx_collection/request_tracker.ts +127 -0
  309. package/src/services/tx_collection/tx_collection.ts +331 -176
  310. package/src/services/tx_collection/tx_collection_sink.ts +2 -2
  311. package/src/services/tx_file_store/tx_file_store.ts +5 -17
  312. package/src/services/tx_provider.ts +5 -0
  313. package/src/test-helpers/make-test-p2p-clients.ts +4 -1
  314. package/src/test-helpers/mock-pubsub.ts +46 -60
  315. package/src/test-helpers/reqresp-nodes.ts +13 -23
  316. package/src/test-helpers/test_tx_provider.ts +5 -0
  317. package/src/test-helpers/testbench-utils.ts +50 -28
  318. package/src/testbench/p2p_client_testbench_worker.ts +88 -55
  319. package/src/testbench/worker_client_manager.ts +61 -21
  320. package/src/util.ts +33 -18
  321. package/src/versioning.ts +3 -33
  322. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts +0 -2
  323. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts.map +0 -1
  324. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +0 -304
  325. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts +0 -73
  326. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts.map +0 -1
  327. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.js +0 -8
  328. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +0 -125
  329. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +0 -1
  330. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +0 -596
  331. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +0 -32
  332. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +0 -1
  333. package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +0 -112
  334. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +0 -157
  335. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +0 -1
  336. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +0 -52
  337. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +0 -16
  338. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +0 -1
  339. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +0 -123
  340. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +0 -17
  341. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +0 -1
  342. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +0 -84
  343. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +0 -19
  344. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +0 -1
  345. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +0 -78
  346. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +0 -26
  347. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +0 -1
  348. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +0 -84
  349. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +0 -25
  350. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +0 -1
  351. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +0 -57
  352. package/dest/mem_pools/tx_pool/index.d.ts +0 -3
  353. package/dest/mem_pools/tx_pool/index.d.ts.map +0 -1
  354. package/dest/mem_pools/tx_pool/index.js +0 -2
  355. package/dest/mem_pools/tx_pool/priority.d.ts +0 -12
  356. package/dest/mem_pools/tx_pool/priority.d.ts.map +0 -1
  357. package/dest/mem_pools/tx_pool/priority.js +0 -15
  358. package/dest/mem_pools/tx_pool/tx_pool.d.ts +0 -127
  359. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +0 -1
  360. package/dest/mem_pools/tx_pool/tx_pool.js +0 -3
  361. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +0 -7
  362. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +0 -1
  363. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +0 -402
  364. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +0 -64
  365. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +0 -1
  366. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +0 -151
  367. package/dest/services/reqresp/protocols/block.d.ts +0 -9
  368. package/dest/services/reqresp/protocols/block.d.ts.map +0 -1
  369. package/dest/services/reqresp/protocols/block.js +0 -32
  370. package/dest/services/tx_collection/fast_tx_collection.d.ts +0 -54
  371. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +0 -1
  372. package/dest/services/tx_collection/fast_tx_collection.js +0 -327
  373. package/dest/services/tx_collection/missing_txs_tracker.d.ts +0 -32
  374. package/dest/services/tx_collection/missing_txs_tracker.d.ts.map +0 -1
  375. package/dest/services/tx_collection/missing_txs_tracker.js +0 -27
  376. package/dest/services/tx_collection/proposal_tx_collector.d.ts +0 -49
  377. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +0 -1
  378. package/dest/services/tx_collection/proposal_tx_collector.js +0 -50
  379. package/dest/services/tx_collection/slow_tx_collection.d.ts +0 -57
  380. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +0 -1
  381. package/dest/services/tx_collection/slow_tx_collection.js +0 -211
  382. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +0 -345
  383. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.ts +0 -43
  384. package/src/mem_pools/tx_pool/README.md +0 -270
  385. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -746
  386. package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +0 -132
  387. package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +0 -208
  388. package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +0 -163
  389. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +0 -104
  390. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +0 -93
  391. package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +0 -106
  392. package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +0 -75
  393. package/src/mem_pools/tx_pool/index.ts +0 -2
  394. package/src/mem_pools/tx_pool/priority.ts +0 -20
  395. package/src/mem_pools/tx_pool/tx_pool.ts +0 -141
  396. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +0 -321
  397. package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +0 -161
  398. package/src/services/reqresp/protocols/block.ts +0 -37
  399. package/src/services/tx_collection/fast_tx_collection.ts +0 -387
  400. package/src/services/tx_collection/missing_txs_tracker.ts +0 -52
  401. package/src/services/tx_collection/proposal_tx_collector.ts +0 -113
  402. package/src/services/tx_collection/slow_tx_collection.ts +0 -266
@@ -18,6 +18,7 @@ export class PeerManagerMetrics {
18
18
  private sentGoodbyes: UpDownCounter;
19
19
  private receivedGoodbyes: UpDownCounter;
20
20
  private peerCount: Gauge;
21
+ private healthyPeerCount: Gauge;
21
22
  private lowScoreDisconnects: UpDownCounter;
22
23
  private peerConnectionDuration: Histogram;
23
24
 
@@ -49,6 +50,7 @@ export class PeerManagerMetrics {
49
50
  goodbyeReasonAttrs,
50
51
  );
51
52
  this.peerCount = meter.createGauge(Metrics.PEER_MANAGER_PEER_COUNT);
53
+ this.healthyPeerCount = meter.createGauge(Metrics.PEER_MANAGER_HEALTHY_PEER_COUNT);
52
54
  this.lowScoreDisconnects = createUpDownCounterWithDefault(meter, Metrics.PEER_MANAGER_LOW_SCORE_DISCONNECTS, {
53
55
  [Attributes.P2P_PEER_SCORE_STATE]: ['Banned', 'Disconnect'],
54
56
  });
@@ -67,6 +69,10 @@ export class PeerManagerMetrics {
67
69
  this.peerCount.record(count);
68
70
  }
69
71
 
72
+ public recordHealthyPeerCount(count: number) {
73
+ this.healthyPeerCount.record(count);
74
+ }
75
+
70
76
  public recordLowScoreDisconnect(scoreState: 'Banned' | 'Disconnect') {
71
77
  this.lowScoreDisconnects.add(1, { [Attributes.P2P_PEER_SCORE_STATE]: scoreState });
72
78
  }
@@ -79,6 +85,7 @@ export class PeerManagerMetrics {
79
85
  const connectedAt = this.peerConnectedAt.get(id.toString());
80
86
  if (connectedAt) {
81
87
  this.peerConnectionDuration.record(Date.now() - connectedAt);
88
+ this.peerConnectedAt.delete(id.toString());
82
89
  }
83
90
  }
84
91
  }
@@ -32,7 +32,7 @@ import { PeerScoreState, type PeerScoring } from './peer_scoring.js';
32
32
  const MAX_DIAL_ATTEMPTS = 3;
33
33
  const MAX_CACHED_PEERS = 100;
34
34
  const MAX_CACHED_PEER_AGE_MS = 5 * 60 * 1000; // 5 minutes
35
- const FAILED_PEER_BAN_TIME_MS = 5 * 60 * 1000; // 5 minutes timeout after failing MAX_DIAL_ATTEMPTS
35
+ const DEFAULT_FAILED_PEER_BAN_TIME_MS = 5 * 60 * 1000; // 5 minutes timeout after failing MAX_DIAL_ATTEMPTS
36
36
  const GOODBYE_DIAL_TIMEOUT_MS = 1000;
37
37
  const FAILED_AUTH_HANDSHAKE_EXPIRY_MS = 60 * 60 * 1000; // 1 hour
38
38
 
@@ -226,20 +226,30 @@ export class PeerManager implements PeerManagerInterface {
226
226
  }
227
227
 
228
228
  /**
229
- * Cleans up expired timeouts.
229
+ * Cleans up expired timeouts and stale failed-auth-handshake entries.
230
230
  *
231
231
  * When peers fail to dial after a number of retries, they are temporarily timed out.
232
232
  * This function removes any peers that have been in the timed out state for too long.
233
233
  * To give them a chance to reconnect.
234
+ *
235
+ * Also evicts entries from the failed-auth-handshake map whose expiry window has passed.
236
+ * Without this, peers that probe once and never reconnect would leave their entries in the
237
+ * map forever, causing an unbounded memory leak.
234
238
  */
235
239
  private cleanupExpiredTimeouts() {
236
- // Clean up expired timeouts
237
240
  const now = this.dateProvider.now();
241
+
238
242
  for (const [peerId, timedOutPeer] of this.timedOutPeers.entries()) {
239
243
  if (now >= timedOutPeer.timeoutUntilMs) {
240
244
  this.timedOutPeers.delete(peerId);
241
245
  }
242
246
  }
247
+
248
+ for (const [id, entry] of this.failedAuthHandshakes.entries()) {
249
+ if (now - entry.lastFailureTimestamp > FAILED_AUTH_HANDSHAKE_EXPIRY_MS) {
250
+ this.failedAuthHandshakes.delete(id);
251
+ }
252
+ }
243
253
  }
244
254
 
245
255
  /**
@@ -303,15 +313,20 @@ export class PeerManager implements PeerManagerInterface {
303
313
  */
304
314
  private handleDisconnectedPeerEvent(e: CustomEvent<PeerId>) {
305
315
  const peerId = e.detail;
316
+ const peerIdStr = peerId.toString();
306
317
  this.metrics.peerDisconnected(peerId);
307
- this.logger.verbose(`Disconnected from peer ${peerId.toString()}`);
308
- const validatorAddress = this.authenticatedPeerIdToValidatorAddress.get(peerId.toString());
318
+ this.logger.verbose(`Disconnected from peer ${peerIdStr}`);
319
+ const validatorAddress = this.authenticatedPeerIdToValidatorAddress.get(peerIdStr);
309
320
  if (validatorAddress !== undefined) {
310
321
  this.logger.info(
311
- `Removing authentication for validator ${validatorAddress} at peer id ${peerId.toString()} due to disconnection`,
322
+ `Removing authentication for validator ${validatorAddress} at peer id ${peerIdStr} due to disconnection`,
312
323
  );
313
324
  this.authenticatedValidatorAddressToPeerId.delete(validatorAddress.toString());
314
- this.authenticatedPeerIdToValidatorAddress.delete(peerId.toString());
325
+ this.authenticatedPeerIdToValidatorAddress.delete(peerIdStr);
326
+ }
327
+
328
+ if (this.peerScoring.getScoreState(peerIdStr) === PeerScoreState.Healthy) {
329
+ this.peerScoring.removePeer(peerIdStr);
315
330
  }
316
331
  }
317
332
 
@@ -512,10 +527,12 @@ export class PeerManager implements PeerManagerInterface {
512
527
  protectedConnections: protectedPeerCount,
513
528
  maxPeerCount: this.config.maxPeerCount,
514
529
  cachedPeers: this.cachedPeers.size,
530
+ discv5KadPeers: this.peerDiscoveryService.getKadValues().length,
515
531
  ...this.peerScoring.getStats(),
516
532
  });
517
533
 
518
- this.metrics.recordPeerCount(healthyConnections.length);
534
+ this.metrics.recordPeerCount(connections.length);
535
+ this.metrics.recordHealthyPeerCount(healthyConnections.length);
519
536
 
520
537
  // Exit if no peers to connect
521
538
  if (peersToConnect <= 0) {
@@ -712,6 +729,12 @@ export class PeerManager implements PeerManagerInterface {
712
729
  return;
713
730
  }
714
731
 
732
+ // Don't dial peers that have exceeded the auth failure threshold
733
+ if (!this.isNodeAllowedToConnect(peerId)) {
734
+ this.logger.trace(`Skipping peer ${peerId} due to failed auth handshake attempts`);
735
+ return;
736
+ }
737
+
715
738
  const [multiaddrTcp] = await Promise.all([enr.getFullMultiaddr('tcp')]);
716
739
 
717
740
  this.logger.trace(`Handling discovered peer ${peerId} at ${multiaddrTcp?.toString() ?? 'undefined address'}`);
@@ -775,7 +798,8 @@ export class PeerManager implements PeerManagerInterface {
775
798
  // Add to timed out peers
776
799
  this.timedOutPeers.set(id, {
777
800
  peerId: id,
778
- timeoutUntilMs: this.dateProvider.now() + FAILED_PEER_BAN_TIME_MS,
801
+ timeoutUntilMs:
802
+ this.dateProvider.now() + (this.config.peerFailedBanTimeMs ?? DEFAULT_FAILED_PEER_BAN_TIME_MS),
779
803
  });
780
804
  }
781
805
  }
@@ -937,6 +961,8 @@ export class PeerManager implements PeerManagerInterface {
937
961
  `Received auth for validator ${sender.toString()} from peer ${peerIdString}, but this validator is already authenticated to peer ${peerForAddress.toString()}`,
938
962
  { ...logData, address: sender.toString() },
939
963
  );
964
+ this.markAuthHandshakeFailed(peerId);
965
+ this.markPeerForDisconnect(peerId);
940
966
  return;
941
967
  }
942
968
 
@@ -966,14 +992,14 @@ export class PeerManager implements PeerManagerInterface {
966
992
  const peerIdStr = peerId.toString();
967
993
 
968
994
  const existingEntry = this.failedAuthHandshakes.get(peerIdStr);
995
+ const failureCount = (existingEntry?.count || 0) + 1;
969
996
  this.failedAuthHandshakes.set(peerIdStr, {
970
- count: (existingEntry?.count || 0) + 1,
997
+ count: failureCount,
971
998
  lastFailureTimestamp: now,
972
999
  });
973
1000
 
974
1001
  const connections = this.libP2PNode.getConnections(peerId);
975
1002
  connections.forEach(conn => {
976
- // We mark the IP address
977
1003
  const address = conn.remoteAddr.nodeAddress().address;
978
1004
  const existingAddressEntry = this.failedAuthHandshakes.get(address);
979
1005
  this.failedAuthHandshakes.set(address, {
@@ -981,6 +1007,15 @@ export class PeerManager implements PeerManagerInterface {
981
1007
  lastFailureTimestamp: now,
982
1008
  });
983
1009
  });
1010
+
1011
+ // Ban the peer from being re-dialed for a cooldown period (exponential backoff)
1012
+ const banTimeMs = this.config.peerFailedBanTimeMs ?? DEFAULT_FAILED_PEER_BAN_TIME_MS;
1013
+ const backoffMs = banTimeMs * Math.pow(2, Math.min(failureCount - 1, 5));
1014
+ this.timedOutPeers.set(peerIdStr, {
1015
+ peerId: peerIdStr,
1016
+ timeoutUntilMs: now + backoffMs,
1017
+ });
1018
+ this.cachedPeers.delete(peerIdStr);
984
1019
  }
985
1020
 
986
1021
  /*
@@ -1,5 +1,6 @@
1
1
  import { median } from '@aztec/foundation/collection';
2
2
  import { createLogger } from '@aztec/foundation/log';
3
+ import { DateProvider } from '@aztec/foundation/timer';
3
4
  import { PeerErrorSeverity } from '@aztec/stdlib/p2p';
4
5
  import {
5
6
  Attributes,
@@ -54,6 +55,7 @@ export enum PeerScoreState {
54
55
  // TODO: move into config / constants
55
56
  const MIN_SCORE_BEFORE_BAN = -100;
56
57
  const MIN_SCORE_BEFORE_DISCONNECT = -50;
58
+ const SCORE_CLEANUP_THRESHOLD = 0.1;
57
59
 
58
60
  export class PeerScoring {
59
61
  private logger = createLogger('p2p:peer-scoring');
@@ -65,7 +67,11 @@ export class PeerScoring {
65
67
 
66
68
  private peerStateCounter: UpDownCounter;
67
69
 
68
- constructor(config: P2PConfig, telemetry: TelemetryClient = getTelemetryClient()) {
70
+ constructor(
71
+ config: P2PConfig,
72
+ telemetry: TelemetryClient = getTelemetryClient(),
73
+ private readonly dateProvider: DateProvider = new DateProvider(),
74
+ ) {
69
75
  const orderedValues = config.peerPenaltyValues?.sort((a, b) => a - b);
70
76
  this.peerPenalties = {
71
77
  [PeerErrorSeverity.HighToleranceError]:
@@ -92,7 +98,7 @@ export class PeerScoring {
92
98
  }
93
99
 
94
100
  updateScore(peerId: string, scoreDelta: number): number {
95
- const currentTime = Date.now();
101
+ const currentTime = this.dateProvider.now();
96
102
  const lastUpdate = this.lastUpdateTime.get(peerId) || currentTime;
97
103
  const timePassed = currentTime - lastUpdate;
98
104
  const decayPeriods = Math.floor(timePassed / this.decayInterval);
@@ -111,19 +117,35 @@ export class PeerScoring {
111
117
  }
112
118
 
113
119
  decayAllScores(): void {
114
- const currentTime = Date.now();
120
+ const currentTime = this.dateProvider.now();
115
121
  for (const [peerId, lastUpdate] of this.lastUpdateTime.entries()) {
116
122
  const timePassed = currentTime - lastUpdate;
117
123
  const decayPeriods = Math.floor(timePassed / this.decayInterval);
118
124
  if (decayPeriods > 0) {
119
125
  let score = this.scores.get(peerId) || 0;
120
126
  score *= Math.pow(this.decayFactor, decayPeriods);
121
- this.scores.set(peerId, score);
122
- this.lastUpdateTime.set(peerId, currentTime);
127
+ if (Math.abs(score) < SCORE_CLEANUP_THRESHOLD) {
128
+ this.scores.delete(peerId);
129
+ this.lastUpdateTime.delete(peerId);
130
+ } else {
131
+ this.scores.set(peerId, score);
132
+ this.lastUpdateTime.set(peerId, currentTime);
133
+ }
123
134
  }
124
135
  }
125
136
  }
126
137
 
138
+ /** Resets all peer scores. Useful for benchmarks to prevent cross-case contamination. */
139
+ resetAllScores(): void {
140
+ this.scores.clear();
141
+ this.lastUpdateTime.clear();
142
+ }
143
+
144
+ removePeer(peerId: string): void {
145
+ this.scores.delete(peerId);
146
+ this.lastUpdateTime.delete(peerId);
147
+ }
148
+
127
149
  getScore(peerId: string): number {
128
150
  return this.scores.get(peerId) || 0;
129
151
  }
@@ -46,7 +46,6 @@ Per-protocol size limits checked via preamble before decompression.
46
46
  | Error Type | Severity |
47
47
  |------------|----------|
48
48
  | GOODBYE subprotocol errors | None |
49
- | `CollectiveReqRespTimeoutError` / `InvalidResponseError` | None |
50
49
  | `AbortError` / connection close / muxer closed | None |
51
50
  | `ECONNRESET` / `EPIPE` / `ECONNREFUSED` / `ERR_UNEXPECTED_EOF` | HighToleranceError |
52
51
  | `ERR_UNSUPPORTED_PROTOCOL` | HighToleranceError |
@@ -183,19 +182,6 @@ Protected peers (private/trusted/preferred) are always considered "authenticated
183
182
 
184
183
  Conditional registration: BLOCK_TXS handler only registered when `config.disableTransactions` is false. Otherwise peers get `ERR_UNSUPPORTED_PROTOCOL`.
185
184
 
186
- **Requester side via `sendBatchRequest`** (Snappy limit: `max(N, 1) * 512 + 1` KB):
187
-
188
- | Rule | Consequence | File |
189
- |------|-------------|------|
190
- | Archive root must match request | MidToleranceError | `libp2p_service.ts` (`validateRequestedBlockTxs`) |
191
- | BitVector length must match request | MidToleranceError | same |
192
- | No duplicate tx hashes | MidToleranceError | same |
193
- | Tx count within bounds | MidToleranceError | same |
194
- | Local block proposal must exist for archive root | Rejected (no penalty) | same |
195
- | All tx hashes must be in proposal's tx list at allowed indices | LowToleranceError | same |
196
- | Txs in strictly increasing index order | LowToleranceError | same |
197
- | Each tx passes well-formedness (Metadata [4 fields], Size, Data, Proof) | LowToleranceError | same |
198
-
199
185
  **Requester side via `BatchTxRequester`** (separate validation path):
200
186
 
201
187
  | Rule | Consequence | File |
@@ -170,6 +170,37 @@ class BlockTxsResponse {
170
170
 
171
171
  The `BitVector` is a compact representation where each bit corresponds to a transaction index in the block proposal. This allows efficient capability advertisement without repeating full hashes.
172
172
 
173
+ ## Cancellation
174
+
175
+ All cancellation is managed by a single `RequestTracker` instance, shared across the entire collection
176
+ flow. The `RequestTracker` owns the deadline, tracks which txs are still missing, and exposes a
177
+ `cancellationToken` promise that resolves when the request should stop (deadline hit, all txs fetched,
178
+ or external `cancel()` call).
179
+
180
+ Cancellation propagates from the deepest stack level upward:
181
+
182
+ ```
183
+ RequestTracker.finish()
184
+ ├── resolves cancellationToken promise
185
+ │
186
+ ├── BatchTxRequester workers (deepest)
187
+ │ ├── shouldStop() checks requestTracker.cancelled → exit loop
188
+ │ ├── sleepClampedToDeadline races sleep vs cancellationToken → wakes
189
+ │ └── semaphore.acquire races vs cancellationToken → wakes
190
+ │ │
191
+ │ ▼ workers settle → txQueue.end() → generator returns
192
+ │
193
+ ├── Node collection loops
194
+ │ ├── notFinished() checks requestTracker.cancelled → exit loop
195
+ │ └── inter-retry sleep races vs cancellationToken → wakes
196
+ │ │
197
+ │ ▼ all node loops settle
198
+ │
199
+ └── collectFast (outermost)
200
+ awaits Promise.allSettled([reqresp, nodes]) → settles after inner tasks
201
+ finally: requestTracker.cancel() (idempotent), cleanup
202
+ ```
203
+
173
204
  ## Key Files
174
205
 
175
206
  | File | Description |
@@ -179,15 +210,16 @@ The `BitVector` is a compact representation where each bit corresponds to a tran
179
210
  | `peer_collection.ts` | Manages peer classification (dumb/smart/bad) and rate limiting |
180
211
  | `interface.ts` | Type definitions for dependencies |
181
212
  | `../protocols/block_txs/` | Wire protocol definitions (`BlockTxsRequest`, `BlockTxsResponse`, `BitVector`) |
213
+ | `../../tx_collection/request_tracker.ts` | Centralized deadline, missing tx tracking, and cancellation signal |
182
214
 
183
215
  ## Stopping Conditions
184
216
 
185
- The `BatchTxRequester` stops when any of these conditions are met:
217
+ The `BatchTxRequester` stops when any of these conditions are met, all managed by the `RequestTracker`:
186
218
 
187
- 1. **All transactions fetched** - Success!
188
- 2. **Deadline exceeded** - Timeout configured by caller
189
- 3. **Abort signal** - External cancellation
190
- 4. **No transactions to fetch** - Nothing was missing
219
+ 1. **All transactions fetched** - `markFetched()` removes the last missing tx, triggering `finish()`
220
+ 2. **Deadline exceeded** - `setTimeout` in `RequestTracker` fires, triggering `finish()`
221
+ 3. **External cancellation** - `RequestTracker.cancel()` called (e.g., from `stop()`, `stopCollectingForBlocksUpTo`)
222
+ 4. **No transactions to fetch** - Empty hash set at construction, `RequestTracker` finishes immediately
191
223
 
192
224
  ## Configuration
193
225
 
@@ -228,11 +260,15 @@ Request to peer fails
228
260
  ## Usage Example
229
261
 
230
262
  ```typescript
263
+ const requestTracker = RequestTracker.create(
264
+ missingTxHashes, // TxHash[] - what we need
265
+ new Date(Date.now() + 5_000), // deadline
266
+ );
267
+
231
268
  const requester = new BatchTxRequester(
232
- missingTxHashes, // TxHash[] - what we need
269
+ requestTracker, // IRequestTracker - tracks missing txs, deadline, and cancellation
233
270
  blockTxsSource, // BlockTxsSource - the proposal or block we need txs for
234
271
  pinnedPeer, // PeerId | undefined - peer expected to have the txs
235
- timeoutMs, // number - how long to try
236
272
  p2pService, // BatchTxRequesterLibP2PService
237
273
  );
238
274
 
@@ -273,6 +309,8 @@ const txs = await BatchTxRequester.collectAllTxs(requester.run());
273
309
  │ 1. Try RPC nodes first (fast) │ │ Periodic polling of RPC nodes │
274
310
  │ 2. Fall back to BatchTxRequester │ │ and peers for missing txs │
275
311
  │ │ │ │
312
+ │ Creates RequestTracker per │ │ │
313
+ │ request with deadline │ │ │
276
314
  └───────────────────┬───────────────┘ └─────────────────────────────────────┘
277
315
  │
278
316
  │ For 'proposal' and 'block' requests
@@ -281,6 +319,7 @@ const txs = await BatchTxRequester.collectAllTxs(requester.run());
281
319
  │ BatchTxRequester │
282
320
  │ │
283
321
  │ Aggressive parallel fetching from multiple peers │
322
+ │ Shares RequestTracker with FastTxCollection for unified cancellation │
284
323
  │ Uses BLOCK_TXS sub-protocol for efficient batching │
285
324
  └───────────────────┬─────────────────────────────────────────────────────────┘
286
325
  │