@aztec/p2p 0.0.1-commit.29c6b1a3 → 0.0.1-commit.2c0ee1788

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 (529) hide show
  1. package/README.md +129 -3
  2. package/dest/bootstrap/bootstrap.d.ts +4 -3
  3. package/dest/bootstrap/bootstrap.d.ts.map +1 -1
  4. package/dest/bootstrap/bootstrap.js +4 -4
  5. package/dest/client/factory.d.ts +12 -11
  6. package/dest/client/factory.d.ts.map +1 -1
  7. package/dest/client/factory.js +61 -19
  8. package/dest/client/interface.d.ts +54 -34
  9. package/dest/client/interface.d.ts.map +1 -1
  10. package/dest/client/p2p_client.d.ts +43 -52
  11. package/dest/client/p2p_client.d.ts.map +1 -1
  12. package/dest/client/p2p_client.js +190 -226
  13. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +25 -12
  14. package/dest/config.d.ts +138 -87
  15. package/dest/config.d.ts.map +1 -1
  16. package/dest/config.js +116 -41
  17. package/dest/errors/p2p-service.error.d.ts +9 -0
  18. package/dest/errors/p2p-service.error.d.ts.map +1 -0
  19. package/dest/errors/p2p-service.error.js +10 -0
  20. package/dest/errors/tx-pool.error.d.ts +8 -0
  21. package/dest/errors/tx-pool.error.d.ts.map +1 -0
  22. package/dest/errors/tx-pool.error.js +9 -0
  23. package/dest/index.d.ts +2 -2
  24. package/dest/index.d.ts.map +1 -1
  25. package/dest/index.js +1 -1
  26. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +106 -88
  27. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  28. package/dest/mem_pools/attestation_pool/attestation_pool.js +448 -3
  29. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +2 -2
  30. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
  31. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +353 -87
  32. package/dest/mem_pools/attestation_pool/index.d.ts +2 -3
  33. package/dest/mem_pools/attestation_pool/index.d.ts.map +1 -1
  34. package/dest/mem_pools/attestation_pool/index.js +1 -2
  35. package/dest/mem_pools/attestation_pool/mocks.d.ts +2 -2
  36. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  37. package/dest/mem_pools/attestation_pool/mocks.js +7 -5
  38. package/dest/mem_pools/index.d.ts +3 -3
  39. package/dest/mem_pools/index.d.ts.map +1 -1
  40. package/dest/mem_pools/index.js +1 -1
  41. package/dest/mem_pools/instrumentation.d.ts +4 -2
  42. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  43. package/dest/mem_pools/instrumentation.js +35 -17
  44. package/dest/mem_pools/interface.d.ts +5 -5
  45. package/dest/mem_pools/interface.d.ts.map +1 -1
  46. package/dest/mem_pools/tx_pool_v2/archive/index.d.ts +2 -0
  47. package/dest/mem_pools/tx_pool_v2/archive/index.d.ts.map +1 -0
  48. package/dest/mem_pools/tx_pool_v2/archive/index.js +1 -0
  49. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts +43 -0
  50. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts.map +1 -0
  51. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.js +103 -0
  52. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +104 -0
  53. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -0
  54. package/dest/mem_pools/tx_pool_v2/deleted_pool.js +251 -0
  55. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts +47 -0
  56. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts.map +1 -0
  57. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.js +128 -0
  58. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +17 -0
  59. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -0
  60. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +94 -0
  61. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +19 -0
  62. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -0
  63. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +97 -0
  64. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +11 -0
  65. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -0
  66. package/dest/mem_pools/tx_pool_v2/eviction/index.js +12 -0
  67. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts +16 -0
  68. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts.map +1 -0
  69. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.js +62 -0
  70. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +180 -0
  71. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -0
  72. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.js +25 -0
  73. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts +15 -0
  74. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -0
  75. package/dest/mem_pools/{tx_pool → tx_pool_v2}/eviction/invalid_txs_after_mining_rule.js +16 -35
  76. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts +17 -0
  77. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -0
  78. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +93 -0
  79. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +16 -0
  80. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -0
  81. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +78 -0
  82. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +20 -0
  83. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -0
  84. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +75 -0
  85. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +15 -0
  86. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -0
  87. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +19 -0
  88. package/dest/mem_pools/tx_pool_v2/index.d.ts +6 -0
  89. package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -0
  90. package/dest/mem_pools/tx_pool_v2/index.js +5 -0
  91. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts +15 -0
  92. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts.map +1 -0
  93. package/dest/mem_pools/tx_pool_v2/instrumentation.js +43 -0
  94. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +218 -0
  95. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -0
  96. package/dest/mem_pools/tx_pool_v2/interfaces.js +10 -0
  97. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +137 -0
  98. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -0
  99. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +223 -0
  100. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts +26 -0
  101. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts.map +1 -0
  102. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.js +70 -0
  103. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +108 -0
  104. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -0
  105. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +337 -0
  106. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +62 -0
  107. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -0
  108. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +167 -0
  109. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +78 -0
  110. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -0
  111. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +924 -0
  112. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +9 -3
  113. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  114. package/dest/msg_validators/attestation_validator/attestation_validator.js +37 -12
  115. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +8 -4
  116. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
  117. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +9 -4
  118. package/dest/msg_validators/clock_tolerance.d.ts +12 -1
  119. package/dest/msg_validators/clock_tolerance.d.ts.map +1 -1
  120. package/dest/msg_validators/clock_tolerance.js +61 -3
  121. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +9 -4
  122. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
  123. package/dest/msg_validators/proposal_validator/block_proposal_validator.js +10 -2
  124. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +9 -4
  125. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
  126. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +16 -2
  127. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +19 -8
  128. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
  129. package/dest/msg_validators/proposal_validator/proposal_validator.js +88 -44
  130. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +4 -4
  131. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  132. package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +3 -3
  133. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +2 -1
  134. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -1
  135. package/dest/msg_validators/tx_validator/allowed_public_setup.js +24 -20
  136. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts +17 -0
  137. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts.map +1 -0
  138. package/dest/msg_validators/tx_validator/allowed_setup_helpers.js +24 -0
  139. package/dest/msg_validators/tx_validator/archive_cache.d.ts +3 -3
  140. package/dest/msg_validators/tx_validator/archive_cache.d.ts.map +1 -1
  141. package/dest/msg_validators/tx_validator/block_header_validator.d.ts +20 -6
  142. package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
  143. package/dest/msg_validators/tx_validator/block_header_validator.js +5 -4
  144. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts +9 -0
  145. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts.map +1 -0
  146. package/dest/msg_validators/tx_validator/contract_instance_validator.js +48 -0
  147. package/dest/msg_validators/tx_validator/data_validator.d.ts +3 -1
  148. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  149. package/dest/msg_validators/tx_validator/data_validator.js +39 -3
  150. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +15 -4
  151. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
  152. package/dest/msg_validators/tx_validator/double_spend_validator.js +7 -6
  153. package/dest/msg_validators/tx_validator/factory.d.ts +135 -7
  154. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  155. package/dest/msg_validators/tx_validator/factory.js +247 -60
  156. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +1 -1
  157. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -1
  158. package/dest/msg_validators/tx_validator/fee_payer_balance.js +6 -2
  159. package/dest/msg_validators/tx_validator/gas_validator.d.ts +100 -3
  160. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  161. package/dest/msg_validators/tx_validator/gas_validator.js +138 -53
  162. package/dest/msg_validators/tx_validator/index.d.ts +3 -1
  163. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  164. package/dest/msg_validators/tx_validator/index.js +2 -0
  165. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +3 -2
  166. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  167. package/dest/msg_validators/tx_validator/metadata_validator.js +6 -6
  168. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts +14 -0
  169. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts.map +1 -0
  170. package/dest/msg_validators/tx_validator/nullifier_cache.js +24 -0
  171. package/dest/msg_validators/tx_validator/phases_validator.d.ts +24 -3
  172. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
  173. package/dest/msg_validators/tx_validator/phases_validator.js +75 -27
  174. package/dest/msg_validators/tx_validator/size_validator.d.ts +3 -1
  175. package/dest/msg_validators/tx_validator/size_validator.d.ts.map +1 -1
  176. package/dest/msg_validators/tx_validator/size_validator.js +4 -1
  177. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +22 -5
  178. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
  179. package/dest/msg_validators/tx_validator/timestamp_validator.js +8 -8
  180. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts +3 -2
  181. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts.map +1 -1
  182. package/dest/msg_validators/tx_validator/tx_permitted_validator.js +2 -2
  183. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +3 -2
  184. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
  185. package/dest/msg_validators/tx_validator/tx_proof_validator.js +2 -2
  186. package/dest/services/data_store.d.ts +1 -1
  187. package/dest/services/data_store.d.ts.map +1 -1
  188. package/dest/services/data_store.js +14 -10
  189. package/dest/services/discv5/discV5_service.js +1 -1
  190. package/dest/services/dummy_service.d.ts +17 -6
  191. package/dest/services/dummy_service.d.ts.map +1 -1
  192. package/dest/services/dummy_service.js +16 -5
  193. package/dest/services/encoding.d.ts +7 -3
  194. package/dest/services/encoding.d.ts.map +1 -1
  195. package/dest/services/encoding.js +18 -11
  196. package/dest/services/gossipsub/index.d.ts +3 -0
  197. package/dest/services/gossipsub/index.d.ts.map +1 -0
  198. package/dest/services/gossipsub/index.js +2 -0
  199. package/dest/services/gossipsub/scoring.d.ts +21 -3
  200. package/dest/services/gossipsub/scoring.d.ts.map +1 -1
  201. package/dest/services/gossipsub/scoring.js +24 -7
  202. package/dest/services/gossipsub/topic_score_params.d.ts +184 -0
  203. package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -0
  204. package/dest/services/gossipsub/topic_score_params.js +363 -0
  205. package/dest/services/index.d.ts +2 -1
  206. package/dest/services/index.d.ts.map +1 -1
  207. package/dest/services/index.js +1 -0
  208. package/dest/services/libp2p/instrumentation.d.ts +3 -1
  209. package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
  210. package/dest/services/libp2p/instrumentation.js +28 -3
  211. package/dest/services/libp2p/libp2p_service.d.ts +96 -52
  212. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  213. package/dest/services/libp2p/libp2p_service.js +590 -452
  214. package/dest/services/peer-manager/metrics.d.ts +4 -2
  215. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  216. package/dest/services/peer-manager/metrics.js +26 -5
  217. package/dest/services/peer-manager/peer_manager.d.ts +6 -2
  218. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  219. package/dest/services/peer-manager/peer_manager.js +39 -11
  220. package/dest/services/peer-manager/peer_scoring.d.ts +7 -2
  221. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  222. package/dest/services/peer-manager/peer_scoring.js +65 -14
  223. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +14 -10
  224. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -1
  225. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +89 -112
  226. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +4 -7
  227. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
  228. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +11 -13
  229. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -1
  230. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +31 -46
  231. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +19 -11
  232. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -1
  233. package/dest/services/reqresp/batch-tx-requester/peer_collection.js +52 -15
  234. package/dest/services/reqresp/batch-tx-requester/tx_validator.js +2 -2
  235. package/dest/services/reqresp/config.d.ts +3 -3
  236. package/dest/services/reqresp/config.d.ts.map +1 -1
  237. package/dest/services/reqresp/interface.d.ts +23 -9
  238. package/dest/services/reqresp/interface.d.ts.map +1 -1
  239. package/dest/services/reqresp/interface.js +23 -10
  240. package/dest/services/reqresp/metrics.d.ts +6 -5
  241. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  242. package/dest/services/reqresp/metrics.js +16 -5
  243. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +7 -5
  244. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
  245. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +17 -12
  246. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +25 -14
  247. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
  248. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +40 -24
  249. package/dest/services/reqresp/protocols/index.d.ts +1 -2
  250. package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
  251. package/dest/services/reqresp/protocols/index.js +0 -1
  252. package/dest/services/reqresp/protocols/tx.d.ts +7 -1
  253. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  254. package/dest/services/reqresp/protocols/tx.js +21 -3
  255. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +5 -4
  256. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
  257. package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -8
  258. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
  259. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
  260. package/dest/services/reqresp/rate-limiter/rate_limits.js +0 -10
  261. package/dest/services/reqresp/reqresp.d.ts +4 -2
  262. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  263. package/dest/services/reqresp/reqresp.js +40 -15
  264. package/dest/services/service.d.ts +43 -4
  265. package/dest/services/service.d.ts.map +1 -1
  266. package/dest/services/tx_collection/config.d.ts +22 -4
  267. package/dest/services/tx_collection/config.d.ts.map +1 -1
  268. package/dest/services/tx_collection/config.js +49 -3
  269. package/dest/services/tx_collection/fast_tx_collection.d.ts +6 -8
  270. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
  271. package/dest/services/tx_collection/fast_tx_collection.js +88 -88
  272. package/dest/services/tx_collection/file_store_tx_collection.d.ts +53 -0
  273. package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -0
  274. package/dest/services/tx_collection/file_store_tx_collection.js +167 -0
  275. package/dest/services/tx_collection/file_store_tx_source.d.ts +38 -0
  276. package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -0
  277. package/dest/services/tx_collection/file_store_tx_source.js +100 -0
  278. package/dest/services/tx_collection/index.d.ts +3 -2
  279. package/dest/services/tx_collection/index.d.ts.map +1 -1
  280. package/dest/services/tx_collection/index.js +1 -0
  281. package/dest/services/tx_collection/instrumentation.d.ts +1 -1
  282. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
  283. package/dest/services/tx_collection/instrumentation.js +10 -2
  284. package/dest/services/tx_collection/proposal_tx_collector.d.ts +15 -15
  285. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -1
  286. package/dest/services/tx_collection/proposal_tx_collector.js +6 -6
  287. package/dest/services/tx_collection/request_tracker.d.ts +53 -0
  288. package/dest/services/tx_collection/request_tracker.d.ts.map +1 -0
  289. package/dest/services/tx_collection/request_tracker.js +84 -0
  290. package/dest/services/tx_collection/slow_tx_collection.d.ts +7 -3
  291. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -1
  292. package/dest/services/tx_collection/slow_tx_collection.js +60 -26
  293. package/dest/services/tx_collection/tx_collection.d.ts +23 -13
  294. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  295. package/dest/services/tx_collection/tx_collection.js +75 -3
  296. package/dest/services/tx_collection/tx_collection_sink.d.ts +18 -8
  297. package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -1
  298. package/dest/services/tx_collection/tx_collection_sink.js +26 -29
  299. package/dest/services/tx_collection/tx_source.d.ts +13 -7
  300. package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
  301. package/dest/services/tx_collection/tx_source.js +26 -7
  302. package/dest/services/tx_file_store/config.d.ts +16 -0
  303. package/dest/services/tx_file_store/config.d.ts.map +1 -0
  304. package/dest/services/tx_file_store/config.js +22 -0
  305. package/dest/services/tx_file_store/index.d.ts +4 -0
  306. package/dest/services/tx_file_store/index.d.ts.map +1 -0
  307. package/dest/services/tx_file_store/index.js +3 -0
  308. package/dest/services/tx_file_store/instrumentation.d.ts +15 -0
  309. package/dest/services/tx_file_store/instrumentation.d.ts.map +1 -0
  310. package/dest/services/tx_file_store/instrumentation.js +29 -0
  311. package/dest/services/tx_file_store/tx_file_store.d.ts +48 -0
  312. package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -0
  313. package/dest/services/tx_file_store/tx_file_store.js +152 -0
  314. package/dest/services/tx_provider.d.ts +4 -4
  315. package/dest/services/tx_provider.d.ts.map +1 -1
  316. package/dest/services/tx_provider.js +9 -8
  317. package/dest/services/tx_provider_instrumentation.d.ts +1 -1
  318. package/dest/services/tx_provider_instrumentation.d.ts.map +1 -1
  319. package/dest/services/tx_provider_instrumentation.js +5 -5
  320. package/dest/test-helpers/make-test-p2p-clients.d.ts +7 -8
  321. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  322. package/dest/test-helpers/make-test-p2p-clients.js +4 -2
  323. package/dest/test-helpers/mock-pubsub.d.ts +40 -6
  324. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  325. package/dest/test-helpers/mock-pubsub.js +139 -13
  326. package/dest/test-helpers/reqresp-nodes.d.ts +2 -3
  327. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  328. package/dest/test-helpers/reqresp-nodes.js +8 -5
  329. package/dest/test-helpers/testbench-utils.d.ts +45 -38
  330. package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
  331. package/dest/test-helpers/testbench-utils.js +152 -62
  332. package/dest/testbench/p2p_client_testbench_worker.d.ts +2 -2
  333. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  334. package/dest/testbench/p2p_client_testbench_worker.js +86 -29
  335. package/dest/testbench/worker_client_manager.d.ts +10 -1
  336. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  337. package/dest/testbench/worker_client_manager.js +55 -3
  338. package/dest/util.d.ts +3 -3
  339. package/dest/util.d.ts.map +1 -1
  340. package/package.json +14 -14
  341. package/src/bootstrap/bootstrap.ts +7 -4
  342. package/src/client/factory.ts +118 -37
  343. package/src/client/interface.ts +65 -35
  344. package/src/client/p2p_client.ts +228 -272
  345. package/src/client/test/tx_proposal_collector/README.md +4 -4
  346. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +37 -16
  347. package/src/config.ts +188 -46
  348. package/src/errors/p2p-service.error.ts +11 -0
  349. package/src/errors/tx-pool.error.ts +12 -0
  350. package/src/index.ts +1 -1
  351. package/src/mem_pools/attestation_pool/attestation_pool.ts +501 -91
  352. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +442 -102
  353. package/src/mem_pools/attestation_pool/index.ts +9 -2
  354. package/src/mem_pools/attestation_pool/mocks.ts +14 -8
  355. package/src/mem_pools/index.ts +2 -2
  356. package/src/mem_pools/instrumentation.ts +24 -15
  357. package/src/mem_pools/interface.ts +4 -4
  358. package/src/mem_pools/tx_pool_v2/README.md +283 -0
  359. package/src/mem_pools/tx_pool_v2/archive/index.ts +1 -0
  360. package/src/mem_pools/tx_pool_v2/archive/tx_archive.ts +120 -0
  361. package/src/mem_pools/tx_pool_v2/deleted_pool.ts +321 -0
  362. package/src/mem_pools/tx_pool_v2/eviction/eviction_manager.ts +160 -0
  363. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +122 -0
  364. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +125 -0
  365. package/src/mem_pools/tx_pool_v2/eviction/index.ts +28 -0
  366. package/src/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.ts +65 -0
  367. package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +219 -0
  368. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +74 -0
  369. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +101 -0
  370. package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +91 -0
  371. package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +99 -0
  372. package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +32 -0
  373. package/src/mem_pools/tx_pool_v2/index.ts +12 -0
  374. package/src/mem_pools/tx_pool_v2/instrumentation.ts +69 -0
  375. package/src/mem_pools/tx_pool_v2/interfaces.ts +250 -0
  376. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +349 -0
  377. package/src/mem_pools/tx_pool_v2/tx_pool_bench_metrics.ts +77 -0
  378. package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +430 -0
  379. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +238 -0
  380. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +1107 -0
  381. package/src/msg_validators/attestation_validator/README.md +49 -0
  382. package/src/msg_validators/attestation_validator/attestation_validator.ts +41 -9
  383. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +22 -6
  384. package/src/msg_validators/clock_tolerance.ts +79 -3
  385. package/src/msg_validators/proposal_validator/README.md +123 -0
  386. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +23 -4
  387. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +34 -7
  388. package/src/msg_validators/proposal_validator/proposal_validator.ts +111 -47
  389. package/src/msg_validators/tx_validator/README.md +127 -0
  390. package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +5 -5
  391. package/src/msg_validators/tx_validator/allowed_public_setup.ts +22 -27
  392. package/src/msg_validators/tx_validator/allowed_setup_helpers.ts +31 -0
  393. package/src/msg_validators/tx_validator/archive_cache.ts +2 -2
  394. package/src/msg_validators/tx_validator/block_header_validator.ts +22 -11
  395. package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
  396. package/src/msg_validators/tx_validator/data_validator.ts +48 -3
  397. package/src/msg_validators/tx_validator/double_spend_validator.ts +15 -9
  398. package/src/msg_validators/tx_validator/factory.ts +403 -69
  399. package/src/msg_validators/tx_validator/fee_payer_balance.ts +6 -2
  400. package/src/msg_validators/tx_validator/gas_validator.ts +203 -52
  401. package/src/msg_validators/tx_validator/index.ts +2 -0
  402. package/src/msg_validators/tx_validator/metadata_validator.ts +18 -7
  403. package/src/msg_validators/tx_validator/nullifier_cache.ts +30 -0
  404. package/src/msg_validators/tx_validator/phases_validator.ts +87 -30
  405. package/src/msg_validators/tx_validator/size_validator.ts +6 -2
  406. package/src/msg_validators/tx_validator/timestamp_validator.ts +29 -21
  407. package/src/msg_validators/tx_validator/tx_permitted_validator.ts +8 -3
  408. package/src/msg_validators/tx_validator/tx_proof_validator.ts +8 -3
  409. package/src/services/data_store.ts +14 -19
  410. package/src/services/discv5/discV5_service.ts +1 -1
  411. package/src/services/dummy_service.ts +25 -7
  412. package/src/services/encoding.ts +18 -10
  413. package/src/services/gossipsub/README.md +641 -0
  414. package/src/services/gossipsub/index.ts +2 -0
  415. package/src/services/gossipsub/scoring.ts +29 -5
  416. package/src/services/gossipsub/topic_score_params.ts +519 -0
  417. package/src/services/index.ts +1 -0
  418. package/src/services/libp2p/instrumentation.ts +29 -2
  419. package/src/services/libp2p/libp2p_service.ts +632 -494
  420. package/src/services/peer-manager/metrics.ts +28 -4
  421. package/src/services/peer-manager/peer_manager.ts +45 -11
  422. package/src/services/peer-manager/peer_scoring.ts +56 -6
  423. package/src/services/reqresp/README.md +229 -0
  424. package/src/services/reqresp/batch-tx-requester/README.md +60 -21
  425. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +89 -122
  426. package/src/services/reqresp/batch-tx-requester/interface.ts +3 -6
  427. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +30 -71
  428. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +68 -24
  429. package/src/services/reqresp/batch-tx-requester/tx_validator.ts +2 -2
  430. package/src/services/reqresp/config.ts +2 -2
  431. package/src/services/reqresp/interface.ts +45 -10
  432. package/src/services/reqresp/metrics.ts +33 -9
  433. package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +24 -15
  434. package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +47 -24
  435. package/src/services/reqresp/protocols/index.ts +0 -1
  436. package/src/services/reqresp/protocols/tx.ts +23 -3
  437. package/src/services/reqresp/rate-limiter/rate_limiter.ts +13 -9
  438. package/src/services/reqresp/rate-limiter/rate_limits.ts +0 -10
  439. package/src/services/reqresp/reqresp.ts +53 -16
  440. package/src/services/service.ts +57 -3
  441. package/src/services/tx_collection/config.ts +74 -6
  442. package/src/services/tx_collection/fast_tx_collection.ts +94 -97
  443. package/src/services/tx_collection/file_store_tx_collection.ts +202 -0
  444. package/src/services/tx_collection/file_store_tx_source.ts +129 -0
  445. package/src/services/tx_collection/index.ts +2 -1
  446. package/src/services/tx_collection/instrumentation.ts +17 -2
  447. package/src/services/tx_collection/proposal_tx_collector.ts +21 -27
  448. package/src/services/tx_collection/request_tracker.ts +127 -0
  449. package/src/services/tx_collection/slow_tx_collection.ts +66 -33
  450. package/src/services/tx_collection/tx_collection.ts +114 -19
  451. package/src/services/tx_collection/tx_collection_sink.ts +30 -34
  452. package/src/services/tx_collection/tx_source.ts +28 -8
  453. package/src/services/tx_file_store/config.ts +37 -0
  454. package/src/services/tx_file_store/index.ts +3 -0
  455. package/src/services/tx_file_store/instrumentation.ts +36 -0
  456. package/src/services/tx_file_store/tx_file_store.ts +175 -0
  457. package/src/services/tx_provider.ts +10 -9
  458. package/src/services/tx_provider_instrumentation.ts +11 -5
  459. package/src/test-helpers/make-test-p2p-clients.ts +6 -6
  460. package/src/test-helpers/mock-pubsub.ts +180 -14
  461. package/src/test-helpers/reqresp-nodes.ts +9 -9
  462. package/src/test-helpers/testbench-utils.ts +159 -74
  463. package/src/testbench/p2p_client_testbench_worker.ts +95 -32
  464. package/src/testbench/worker_client_manager.ts +68 -6
  465. package/src/util.ts +8 -2
  466. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +0 -40
  467. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +0 -1
  468. package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +0 -218
  469. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +0 -31
  470. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +0 -1
  471. package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +0 -180
  472. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +0 -125
  473. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +0 -1
  474. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +0 -596
  475. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +0 -32
  476. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +0 -1
  477. package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +0 -112
  478. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +0 -157
  479. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +0 -1
  480. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +0 -52
  481. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +0 -16
  482. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +0 -1
  483. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +0 -122
  484. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +0 -17
  485. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +0 -1
  486. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +0 -19
  487. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +0 -1
  488. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +0 -78
  489. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +0 -26
  490. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +0 -1
  491. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +0 -84
  492. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +0 -25
  493. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +0 -1
  494. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +0 -57
  495. package/dest/mem_pools/tx_pool/index.d.ts +0 -3
  496. package/dest/mem_pools/tx_pool/index.d.ts.map +0 -1
  497. package/dest/mem_pools/tx_pool/index.js +0 -2
  498. package/dest/mem_pools/tx_pool/priority.d.ts +0 -12
  499. package/dest/mem_pools/tx_pool/priority.d.ts.map +0 -1
  500. package/dest/mem_pools/tx_pool/priority.js +0 -15
  501. package/dest/mem_pools/tx_pool/tx_pool.d.ts +0 -127
  502. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +0 -1
  503. package/dest/mem_pools/tx_pool/tx_pool.js +0 -3
  504. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +0 -7
  505. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +0 -1
  506. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +0 -400
  507. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +0 -23
  508. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +0 -1
  509. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +0 -212
  510. package/dest/services/reqresp/protocols/block.d.ts +0 -9
  511. package/dest/services/reqresp/protocols/block.d.ts.map +0 -1
  512. package/dest/services/reqresp/protocols/block.js +0 -32
  513. package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +0 -320
  514. package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +0 -264
  515. package/src/mem_pools/tx_pool/README.md +0 -270
  516. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -746
  517. package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +0 -132
  518. package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +0 -208
  519. package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +0 -162
  520. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +0 -104
  521. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +0 -93
  522. package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +0 -106
  523. package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +0 -75
  524. package/src/mem_pools/tx_pool/index.ts +0 -2
  525. package/src/mem_pools/tx_pool/priority.ts +0 -20
  526. package/src/mem_pools/tx_pool/tx_pool.ts +0 -141
  527. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +0 -319
  528. package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +0 -230
  529. package/src/services/reqresp/protocols/block.ts +0 -37
@@ -1,14 +1,14 @@
1
1
  # BatchTxRequester
2
2
 
3
- The `BatchTxRequester` is a specialized P2P service that aggressively fetches missing transactions from peers when a node receives a block proposal but lacks some of the referenced transactions. This is critical for validators who need all transactions to attest to a proposal.
3
+ The `BatchTxRequester` is a specialized P2P service that aggressively fetches missing transactions from peers when a node lacks some of the referenced transactions. It serves two pathways: (1) block proposals, where validators need all transactions to attest, and (2) block proving, where provers need all transactions to generate proofs.
4
4
 
5
5
  ## Overview
6
6
 
7
- When a validator receives a block proposal, they must verify all transactions in the block. If some transactions are missing from the local mempool (e.g., due to gossip delays), the `BatchTxRequester` kicks in to fetch them via direct peer-to-peer requests before the attestation deadline.
7
+ When a validator receives a block proposal or a prover needs to prove a block, they must have all transactions. If some transactions are missing from the local mempool (e.g., due to gossip delays), the `BatchTxRequester` kicks in to fetch them via direct peer-to-peer requests before the deadline.
8
8
 
9
9
  ```
10
10
  ┌─────────────────────────────────────────────────────────────────────────────┐
11
- │ Block Proposal Received │
11
+ │ Block Proposal or Block Received │
12
12
  │ (contains hashes of N transactions) │
13
13
  └─────────────────────────────────────────────────────────────────────────────┘
14
14
  │
@@ -71,7 +71,7 @@ The requester classifies peers into three categories to optimize fetching:
71
71
  ### Blind Phase → Smart Phase Transition
72
72
 
73
73
  Peers transition from "dumb" to "smart" when they respond with a valid `BlockTxsResponse` containing:
74
- 1. A matching `blockHash`
74
+ 1. A matching `archiveRoot`
75
75
  2. A non-empty `txIndices` BitVector indicating which transactions they have
76
76
  3. At least one transaction we're still missing
77
77
 
@@ -81,10 +81,10 @@ Peers transition from "dumb" to "smart" when they respond with a valid `BlockTxs
81
81
  │ ┌────────────────────────────────────────────────────────────────────────┐ │
82
82
  │ │ Initial State: All peers are "dumb" (except pinned peer) │ │
83
83
  │ │ │ │
84
- │ │ Request: [blockHash, txHashes (full list), txIndices (BitVector)] │ │
84
+ │ │ Request: [archiveRoot, txHashes (full list), txIndices (BitVector)] │ │
85
85
  │ │ └─ Include full hashes because peer may not have proposal │ │
86
86
  │ │ │ │
87
- │ │ Response: [blockHash, txs[], txIndices (what peer has)] │ │
87
+ │ │ Response: [archiveRoot, txs[], txIndices (what peer has)] │ │
88
88
  │ │ └─ Tells us exactly which txs this peer can provide │ │
89
89
  │ └────────────────────────────────────────────────────────────────────────┘ │
90
90
  └──────────────────────────────────────────────────────────────────────────────┘
@@ -97,10 +97,10 @@ Peers transition from "dumb" to "smart" when they respond with a valid `BlockTxs
97
97
  │ ┌────────────────────────────────────────────────────────────────────────┐ │
98
98
  │ │ Peer promoted to "smart" - we know exactly what they have │ │
99
99
  │ │ │ │
100
- │ │ Request: [blockHash, txIndices (BitVector only)] │ │
100
+ │ │ Request: [archiveRoot, txIndices (BitVector only)] │ │
101
101
  │ │ └─ No need for full hashes, peer has the proposal │ │
102
102
  │ │ │ │
103
- │ │ Response: [blockHash, txs[], txIndices (updated availability)] │ │
103
+ │ │ Response: [archiveRoot, txs[], txIndices (updated availability)] │ │
104
104
  │ │ └─ May have received more txs since last response │ │
105
105
  │ └────────────────────────────────────────────────────────────────────────┘ │
106
106
  └──────────────────────────────────────────────────────────────────────────────┘
@@ -152,7 +152,7 @@ The `BatchTxRequester` runs three types of workers concurrently:
152
152
 
153
153
  ```typescript
154
154
  class BlockTxsRequest {
155
- blockHash: Fr; // 32-byte hash of the proposed block header
155
+ archiveRoot: Fr; // Archive root after the proposed block is applied
156
156
  txHashes: TxHashArray; // Full tx hashes (for dumb peers without proposal)
157
157
  txIndices: BitVector; // Which txs from proposal we're requesting (1 = want)
158
158
  }
@@ -162,7 +162,7 @@ class BlockTxsRequest {
162
162
 
163
163
  ```typescript
164
164
  class BlockTxsResponse {
165
- blockHash: Fr; // Echo back the block hash
165
+ archiveRoot: Fr; // Echo back the proposal archive root
166
166
  txs: TxArray; // Actual transaction data
167
167
  txIndices: BitVector; // Which txs the peer has available (1 = have)
168
168
  }
@@ -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
233
- blockProposal, // BlockProposal - the proposal we're attesting to
234
- pinnedPeer, // PeerId | undefined - who sent us the proposal
235
- timeoutMs, // number - how long to try
269
+ requestTracker, // IRequestTracker - tracks missing txs, deadline, and cancellation
270
+ blockTxsSource, // BlockTxsSource - the proposal or block we need txs for
271
+ pinnedPeer, // PeerId | undefined - peer expected to have the txs
236
272
  p2pService, // BatchTxRequesterLibP2PService
237
273
  );
238
274
 
@@ -268,19 +304,22 @@ const txs = await BatchTxRequester.collectAllTxs(requester.run());
268
304
  ┌───────────────────────────────────┐ ┌─────────────────────────────────────┐
269
305
  │ FastTxCollection │ │ SlowTxCollection │
270
306
  │ │ │ │
271
- │ Time-critical: attestations │ │ Background: unproven blocks │
307
+ │ Time-critical: proposals/proving │ │ Background: unproven blocks │
272
308
  │ │ │ │
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
- │ For 'proposal' requests
316
+ │ For 'proposal' and 'block' requests
279
317
  ▼
280
318
  ┌─────────────────────────────────────────────────────────────────────────────┐
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
  │
@@ -1,17 +1,16 @@
1
1
  import { chunkWrapAround } from '@aztec/foundation/collection';
2
- import { TimeoutError } from '@aztec/foundation/error';
3
2
  import { type Logger, createLogger } from '@aztec/foundation/log';
4
3
  import { FifoMemoryQueue, type ISemaphore, Semaphore } from '@aztec/foundation/queue';
5
4
  import { sleep } from '@aztec/foundation/sleep';
6
- import { DateProvider, executeTimeout } from '@aztec/foundation/timer';
7
- import { type BlockProposal, PeerErrorSeverity } from '@aztec/stdlib/p2p';
5
+ import { DateProvider } from '@aztec/foundation/timer';
6
+ import { PeerErrorSeverity } from '@aztec/stdlib/p2p';
8
7
  import { Tx, TxArray, TxHash } from '@aztec/stdlib/tx';
9
8
 
10
9
  import type { PeerId } from '@libp2p/interface';
11
- import { peerIdFromString } from '@libp2p/peer-id';
12
10
 
11
+ import type { IRequestTracker } from '../../tx_collection/request_tracker.js';
13
12
  import { ReqRespSubProtocol } from '.././interface.js';
14
- import { BlockTxsRequest, BlockTxsResponse } from '.././protocols/index.js';
13
+ import { BlockTxsRequest, BlockTxsResponse, type BlockTxsSource } from '.././protocols/index.js';
15
14
  import { ReqRespStatus } from '.././status.js';
16
15
  import {
17
16
  DEFAULT_BATCH_TX_REQUESTER_BAD_PEER_THRESHOLD,
@@ -20,7 +19,7 @@ import {
20
19
  DEFAULT_BATCH_TX_REQUESTER_TX_BATCH_SIZE,
21
20
  } from './config.js';
22
21
  import type { BatchTxRequesterLibP2PService, BatchTxRequesterOptions, ITxMetadataCollection } from './interface.js';
23
- import { MissingTxMetadata, MissingTxMetadataCollection } from './missing_txs.js';
22
+ import { MissingTxMetadataCollection } from './missing_txs.js';
24
23
  import { type IPeerCollection, PeerCollection } from './peer_collection.js';
25
24
  import { BatchRequestTxValidator, type IBatchRequestTxValidator } from './tx_validator.js';
26
25
 
@@ -42,16 +41,14 @@ import { BatchRequestTxValidator, type IBatchRequestTxValidator } from './tx_val
42
41
  * - Is the peer which was unable to send us successful response N times in a row
43
42
  * */
44
43
  export class BatchTxRequester {
45
- private readonly blockProposal: BlockProposal;
44
+ private readonly requestTracker: IRequestTracker;
45
+ private readonly blockTxsSource: BlockTxsSource;
46
46
  private readonly pinnedPeer: PeerId | undefined;
47
- private readonly timeoutMs: number;
48
47
  private readonly p2pService: BatchTxRequesterLibP2PService;
49
48
  private readonly logger: Logger;
50
- private readonly dateProvider: DateProvider;
51
49
  private readonly opts: BatchTxRequesterOptions;
52
50
  private readonly peers: IPeerCollection;
53
51
  private readonly txsMetadata: ITxMetadataCollection;
54
- private readonly deadline: number;
55
52
  private readonly smartRequesterSemaphore: ISemaphore;
56
53
  private readonly txQueue: FifoMemoryQueue<Tx>;
57
54
  private readonly txValidator: IBatchRequestTxValidator;
@@ -60,21 +57,19 @@ export class BatchTxRequester {
60
57
  private readonly txBatchSize: number;
61
58
 
62
59
  constructor(
63
- missingTxs: TxHash[],
64
- blockProposal: BlockProposal,
60
+ requestTracker: IRequestTracker,
61
+ blockTxsSource: BlockTxsSource,
65
62
  pinnedPeer: PeerId | undefined,
66
- timeoutMs: number,
67
63
  p2pService: BatchTxRequesterLibP2PService,
68
64
  logger?: Logger,
69
65
  dateProvider?: DateProvider,
70
66
  opts?: BatchTxRequesterOptions,
71
67
  ) {
72
- this.blockProposal = blockProposal;
68
+ this.requestTracker = requestTracker;
69
+ this.blockTxsSource = blockTxsSource;
73
70
  this.pinnedPeer = pinnedPeer;
74
- this.timeoutMs = timeoutMs;
75
71
  this.p2pService = p2pService;
76
72
  this.logger = logger ?? createLogger('p2p:reqresp_batch');
77
- this.dateProvider = dateProvider ?? new DateProvider();
78
73
  this.opts = opts ?? {};
79
74
 
80
75
  this.smartParallelWorkerCount =
@@ -82,25 +77,22 @@ export class BatchTxRequester {
82
77
  this.dumbParallelWorkerCount =
83
78
  this.opts.dumbParallelWorkerCount ?? DEFAULT_BATCH_TX_REQUESTER_DUMB_PARALLEL_WORKER_COUNT;
84
79
  this.txBatchSize = this.opts.txBatchSize ?? DEFAULT_BATCH_TX_REQUESTER_TX_BATCH_SIZE;
85
- this.deadline = this.dateProvider.now() + this.timeoutMs;
86
80
  this.txQueue = new FifoMemoryQueue(this.logger);
87
81
  this.txValidator = this.opts.txValidator ?? new BatchRequestTxValidator(this.p2pService.txValidatorConfig);
88
82
 
89
83
  if (this.opts.peerCollection) {
90
84
  this.peers = this.opts.peerCollection;
91
85
  } else {
92
- const initialPeers = this.p2pService.connectionSampler.getPeerListSortedByConnectionCountAsc();
93
86
  const badPeerThreshold = this.opts.badPeerThreshold ?? DEFAULT_BATCH_TX_REQUESTER_BAD_PEER_THRESHOLD;
94
87
  this.peers = new PeerCollection(
95
- initialPeers,
88
+ this.p2pService.connectionSampler,
96
89
  this.pinnedPeer,
97
- this.dateProvider,
90
+ dateProvider ?? new DateProvider(),
98
91
  badPeerThreshold,
99
92
  this.p2pService.peerScoring,
100
93
  );
101
94
  }
102
- const entries: Array<[string, MissingTxMetadata]> = missingTxs.map(h => [h.toString(), new MissingTxMetadata(h)]);
103
- this.txsMetadata = new MissingTxMetadataCollection(entries, this.txBatchSize);
95
+ this.txsMetadata = new MissingTxMetadataCollection(requestTracker, this.txBatchSize);
104
96
  this.smartRequesterSemaphore = this.opts.semaphore ?? new Semaphore(0);
105
97
  }
106
98
 
@@ -108,40 +100,30 @@ export class BatchTxRequester {
108
100
  * Fetches all missing transactions and yields them one by one
109
101
  * */
110
102
  public async *run(): AsyncGenerator<Tx, Tx | undefined, unknown> {
111
- // Our timeout is represented in milliseconds but queue expects seconds
112
- // We also want to make sure we wait at least 1 second in case of very low timeouts
113
- const timeoutQueueAfter = Math.max(Math.ceil(this.timeoutMs / 1_000), 1);
114
103
  try {
115
104
  if (this.txsMetadata.getMissingTxHashes().size === 0) {
116
105
  return undefined;
117
106
  }
118
107
 
119
- // Start workers in background
120
- const workersPromise = executeTimeout(
121
- () => Promise.allSettled([this.smartRequester(), this.dumbRequester(), this.pinnedPeerRequester()]),
122
- this.timeoutMs,
123
- ).finally(() => {
108
+ // Start workers in background. Workers stop themselves via requestTracker.checkCancelled().
109
+ const workersPromise = Promise.allSettled([
110
+ this.smartRequester(),
111
+ this.dumbRequester(),
112
+ this.pinnedPeerRequester(),
113
+ ]).finally(() => {
124
114
  this.txQueue.end();
125
115
  });
126
116
 
117
+ // Yield txs as workers put them on the queue. The queue's end() drains remaining items
118
+ // before returning null, so we don't lose any txs.
127
119
  while (true) {
128
- const tx = await this.txQueue.get(timeoutQueueAfter);
120
+ const tx = await this.txQueue.get();
129
121
 
130
- // null indicates that the queue has ended
131
122
  if (tx === null) {
132
123
  break;
133
124
  }
134
125
 
135
126
  yield tx;
136
-
137
- if (this.shouldStop()) {
138
- // Drain queue before ending
139
- let remaining;
140
- while ((remaining = this.txQueue.getImmediate()) !== undefined) {
141
- yield remaining;
142
- }
143
- break;
144
- }
145
127
  }
146
128
 
147
129
  this.unlockSmartRequesterSemaphores();
@@ -205,7 +187,7 @@ export class BatchTxRequester {
205
187
  return;
206
188
  }
207
189
 
208
- const request = BlockTxsRequest.fromBlockProposalAndMissingTxs(this.blockProposal, txs);
190
+ const request = BlockTxsRequest.fromTxsSourceAndMissingTxs(this.blockTxsSource, txs);
209
191
  if (!request) {
210
192
  return;
211
193
  }
@@ -227,7 +209,6 @@ export class BatchTxRequester {
227
209
  * Starts dumb worker loops
228
210
  * */
229
211
  private async dumbRequester() {
230
- const nextPeerIndex = this.makeRoundRobinIndexer();
231
212
  const nextBatchIndex = this.makeRoundRobinIndexer();
232
213
 
233
214
  // Chunk missing tx hashes into batches of txBatchSize, wrapping around to ensure no peer gets less than txBatchSize
@@ -249,8 +230,8 @@ export class BatchTxRequester {
249
230
  // If peer is dumb peer, we don't know yet if they received full blockProposal
250
231
  // there is solid chance that peer didn't receive proposal yet, thus we must send full hashes
251
232
  const includeFullHashesInRequestNotJustIndices = true;
252
- const blockRequest = BlockTxsRequest.fromBlockProposalAndMissingTxs(
253
- this.blockProposal,
233
+ const blockRequest = BlockTxsRequest.fromTxsSourceAndMissingTxs(
234
+ this.blockTxsSource,
254
235
  txs,
255
236
  includeFullHashesInRequestNotJustIndices,
256
237
  );
@@ -263,15 +244,9 @@ export class BatchTxRequester {
263
244
  return { blockRequest, txs };
264
245
  };
265
246
 
266
- const nextPeer = () => {
267
- const peers = this.peers.getDumbPeersToQuery();
268
- const idx = nextPeerIndex(() => peers.length);
269
- return idx === undefined ? undefined : peerIdFromString(peers[idx]);
270
- };
271
-
272
- const workerCount = Math.min(this.dumbParallelWorkerCount, this.peers.getAllPeers().size);
247
+ const workerCount = this.dumbParallelWorkerCount;
273
248
  const workers = Array.from({ length: workerCount }, (_, index) =>
274
- this.dumbWorkerLoop(nextPeer, makeRequest, index + 1),
249
+ this.dumbWorkerLoop(this.peers.nextDumbPeerToQuery.bind(this.peers), makeRequest, index + 1),
275
250
  );
276
251
 
277
252
  await Promise.allSettled(workers);
@@ -332,17 +307,9 @@ export class BatchTxRequester {
332
307
  * Starts smart worker loops
333
308
  * */
334
309
  private async smartRequester() {
335
- const nextPeerIndex = this.makeRoundRobinIndexer();
336
-
337
- const nextPeer = () => {
338
- const peers = this.peers.getSmartPeersToQuery();
339
- const idx = nextPeerIndex(() => peers.length);
340
- return idx === undefined ? undefined : peerIdFromString(peers[idx]);
341
- };
342
-
343
310
  const makeRequest = (pid: PeerId) => {
344
311
  const txs = this.txsMetadata.getTxsToRequestFromThePeer(pid);
345
- const blockRequest = BlockTxsRequest.fromBlockProposalAndMissingTxs(this.blockProposal, txs);
312
+ const blockRequest = BlockTxsRequest.fromTxsSourceAndMissingTxs(this.blockTxsSource, txs);
346
313
  if (!blockRequest) {
347
314
  return undefined;
348
315
  }
@@ -350,9 +317,8 @@ export class BatchTxRequester {
350
317
  return { blockRequest, txs };
351
318
  };
352
319
 
353
- const workers = Array.from(
354
- { length: Math.min(this.smartParallelWorkerCount, this.peers.getAllPeers().size) },
355
- (_, index) => this.smartWorkerLoop(nextPeer, makeRequest, index + 1),
320
+ const workers = Array.from({ length: this.smartParallelWorkerCount }, (_, index) =>
321
+ this.smartWorkerLoop(this.peers.nextSmartPeerToQuery.bind(this.peers), makeRequest, index + 1),
356
322
  );
357
323
 
358
324
  await Promise.allSettled(workers);
@@ -378,7 +344,10 @@ export class BatchTxRequester {
378
344
  ) {
379
345
  try {
380
346
  this.logger.trace(`Smart worker ${workerIndex} started`);
381
- await executeTimeout((_: AbortSignal) => this.smartRequesterSemaphore.acquire(), this.timeoutMs);
347
+ await Promise.race([this.smartRequesterSemaphore.acquire(), this.requestTracker.cancellationToken]);
348
+ if (this.requestTracker.checkCancelled()) {
349
+ return;
350
+ }
382
351
  this.logger.trace(`Smart worker ${workerIndex} acquired semaphore`);
383
352
 
384
353
  while (!this.shouldStop()) {
@@ -387,30 +356,25 @@ export class BatchTxRequester {
387
356
  if (weRanOutOfPeersToQuery) {
388
357
  this.logger.debug(`Worker loop smart: No more peers to query`);
389
358
 
390
- // If there are no more dumb peers to query then none of our peers can become smart,
391
- // thus we can simply exit this worker
392
- const noMoreDumbPeersToQuery = this.peers.getDumbPeersToQuery().length === 0;
393
- if (noMoreDumbPeersToQuery) {
394
- // These might be either smart peers that will get unblocked after _some time_
395
- const nextSmartPeerDelay = this.peers.getNextSmartPeerAvailabilityDelayMs();
396
- const thereAreSomeRateLimitedSmartPeers = nextSmartPeerDelay !== undefined;
397
- if (thereAreSomeRateLimitedSmartPeers) {
398
- await this.sleepClampedToDeadline(nextSmartPeerDelay);
399
- continue;
400
- }
401
-
402
- this.logger.debug(`Worker loop smart: No more smart peers to query killing ${workerIndex}`);
403
- break;
359
+ // If we have rate limited peers wait for them.
360
+ const nextSmartPeerDelay = this.peers.getNextSmartPeerAvailabilityDelayMs();
361
+ const thereAreSomeRateLimitedSmartPeers = nextSmartPeerDelay !== undefined;
362
+ if (thereAreSomeRateLimitedSmartPeers) {
363
+ await this.sleepClampedToDeadline(nextSmartPeerDelay);
364
+ continue;
404
365
  }
405
366
 
406
- // Otherwise there are still some dumb peers that could become smart.
407
367
  // We end up here when all known smart peers became temporarily unavailable via combination of
408
368
  // (bad, in-flight, or rate-limited) or in some weird scenario all current smart peers turn bad which is permanent
409
- // but dumb peers still exist that could become smart.
369
+ // but there are dumb peers that could be promoted
370
+ // or new peer can join as dumb and be promoted later
410
371
  //
411
372
  // When a dumb peer responds with valid txIndices, it gets
412
373
  // promoted to smart and releases the semaphore, waking this worker.
413
- await executeTimeout((_: AbortSignal) => this.smartRequesterSemaphore.acquire(), this.timeoutMs);
374
+ await Promise.race([this.smartRequesterSemaphore.acquire(), this.requestTracker.cancellationToken]);
375
+ if (this.requestTracker.checkCancelled()) {
376
+ break;
377
+ }
414
378
  this.logger.debug(`Worker loop smart: acquired next smart peer`);
415
379
  continue;
416
380
  }
@@ -437,11 +401,7 @@ export class BatchTxRequester {
437
401
  });
438
402
  }
439
403
  } catch (err: any) {
440
- if (err instanceof TimeoutError) {
441
- this.logger.debug(`Smart worker ${workerIndex} timed out waiting for semaphore`);
442
- } else {
443
- this.logger.error(`Smart worker ${workerIndex} encountered an error: ${err}`);
444
- }
404
+ this.logger.error(`Smart worker ${workerIndex} encountered an error: ${err}`);
445
405
  } finally {
446
406
  this.logger.debug(`Smart worker ${workerIndex} finished`);
447
407
  }
@@ -489,9 +449,18 @@ export class BatchTxRequester {
489
449
  * this implies we will query these peers couple of more times and give them a chance to "redeem" themselves before completely ignoring them
490
450
  */
491
451
  private handleFailResponseFromPeer(peerId: PeerId, responseStatus: ReqRespStatus) {
492
- //TODO: Should we ban these peers?
493
452
  if (responseStatus === ReqRespStatus.FAILURE || responseStatus === ReqRespStatus.UNKNOWN) {
494
453
  this.peers.penalisePeer(peerId, PeerErrorSeverity.HighToleranceError);
454
+ this.peers.markPeerDumb(peerId);
455
+ this.txsMetadata.clearPeerData(peerId);
456
+ return;
457
+ }
458
+
459
+ // NOT_FOUND means the peer pruned its block proposal — it can no longer serve
460
+ // index-based requests, but this is a legitimate state so we don't penalize.
461
+ if (responseStatus === ReqRespStatus.NOT_FOUND) {
462
+ this.peers.markPeerDumb(peerId);
463
+ this.txsMetadata.clearPeerData(peerId);
495
464
  return;
496
465
  }
497
466
 
@@ -545,6 +514,9 @@ export class BatchTxRequester {
545
514
  });
546
515
 
547
516
  if (hasInvalidTx) {
517
+ this.logger.warn(`Penalizing peer ${peerId.toString()} for sending invalid transactions in batch response`, {
518
+ peerId,
519
+ });
548
520
  this.peers.penalisePeer(peerId, PeerErrorSeverity.LowToleranceError);
549
521
  } else {
550
522
  // If we have received successful response from the peer, they have "redeemed" themselves and not considered bad anymore
@@ -581,10 +553,9 @@ export class BatchTxRequester {
581
553
  return;
582
554
  }
583
555
 
584
- // If block response is invalid we still want to query this peer in the future
585
- // Because they sent successful response, so they might become smart peer in the future
586
- // Or send us needed txs
587
- if (!this.isBlockResponseValid(response)) {
556
+ const hasArchiveRootMismatch = this.blockTxsSource.archive.toString() !== response.archiveRoot.toString();
557
+ if (hasArchiveRootMismatch) {
558
+ this.handleArchiveRootMismatch(peerId, response);
588
559
  return;
589
560
  }
590
561
 
@@ -599,18 +570,28 @@ export class BatchTxRequester {
599
570
  this.markTxsPeerHas(peerId, response);
600
571
 
601
572
  // Unblock smart workers
602
- if (this.peers.getSmartPeersToQuery().length <= this.smartParallelWorkerCount) {
603
- this.smartRequesterSemaphore.release();
604
- }
573
+ this.smartRequesterSemaphore.release();
605
574
  }
606
575
 
607
- private isBlockResponseValid(response: BlockTxsResponse): boolean {
608
- const blockIdsMatch = this.blockProposal.archive.toString() === response.blockHash.toString();
609
- const peerHasSomeTxsFromProposal = !response.txIndices.isEmpty();
610
- return blockIdsMatch && peerHasSomeTxsFromProposal;
576
+ /**
577
+ * Handles an archive root mismatch between local state and peer response.
578
+ *
579
+ * - Response archive is Fr.ZERO (peer pruned proposal, legitimate): marks peer dumb.
580
+ * - Non-zero archive mismatch (malicious response): penalises + marks dumb.
581
+ */
582
+ private handleArchiveRootMismatch(peerId: PeerId, response: BlockTxsResponse): void {
583
+ if (!response.archiveRoot.isZero()) {
584
+ this.peers.penalisePeer(peerId, PeerErrorSeverity.LowToleranceError);
585
+ }
586
+
587
+ this.peers.markPeerDumb(peerId);
588
+ this.txsMetadata.clearPeerData(peerId);
611
589
  }
612
590
 
613
591
  private peerHasSomeTxsWeAreMissing(_peerId: PeerId, response: BlockTxsResponse): boolean {
592
+ if (response.txIndices.isEmpty()) {
593
+ return false;
594
+ }
614
595
  const txsPeerHas = new Set(this.extractHashesPeerHasFromResponse(response).map(h => h.toString()));
615
596
  return this.txsMetadata.getMissingTxHashes().intersection(txsPeerHas).size > 0;
616
597
  }
@@ -624,7 +605,7 @@ export class BatchTxRequester {
624
605
  private extractHashesPeerHasFromResponse(response: BlockTxsResponse): Array<TxHash> {
625
606
  const hashes: TxHash[] = [];
626
607
  const indicesOfHashesPeerHas = new Set(response.txIndices.getTrueIndices());
627
- this.blockProposal.txHashes.forEach((hash, idx) => {
608
+ this.blockTxsSource.txHashes.forEach((hash, idx) => {
628
609
  if (indicesOfHashesPeerHas.has(idx)) {
629
610
  hashes.push(hash);
630
611
  }
@@ -659,27 +640,14 @@ export class BatchTxRequester {
659
640
  }
660
641
 
661
642
  /*
662
- * @returns true if all missing txs have been fetched */
663
- private fetchedAllTxs() {
664
- return Array.from(this.txsMetadata.values()).every(tx => tx.fetched);
665
- }
666
-
667
- /*
668
- * Checks if the BatchTxRequester should stop fetching missing txs
669
- * Conditions for stopping are:
670
- * - There have been no missing transactions to start with
671
- * - All transactions have been fetched
672
- * - The deadline has been hit (no more time to fetch)
673
- * - This process has been cancelled via abortSignal
674
- *
675
- * @returns true if BatchTxRequester should stop, otherwise false*/
643
+ * Checks if the BatchTxRequester should stop fetching missing txs.
644
+ * Delegates to requestTracker which covers: deadline hit, all txs fetched, or external cancellation. */
676
645
  private shouldStop() {
677
- const aborted = this.opts.abortSignal?.aborted ?? false;
678
- if (aborted) {
646
+ if (this.requestTracker.checkCancelled()) {
679
647
  this.unlockSmartRequesterSemaphores();
680
648
  }
681
649
 
682
- return aborted || this.txsMetadata.size === 0 || this.fetchedAllTxs() || this.dateProvider.now() > this.deadline;
650
+ return this.requestTracker.checkCancelled();
683
651
  }
684
652
 
685
653
  /*
@@ -697,10 +665,9 @@ export class BatchTxRequester {
697
665
  * This ensures we don't sleep past the deadline.
698
666
  * */
699
667
  private async sleepClampedToDeadline(durationMs: number) {
700
- const remaining = this.deadline - this.dateProvider.now();
701
- const thereIsTimeRemaining = remaining > 0;
702
- if (thereIsTimeRemaining) {
703
- await sleep(Math.min(durationMs, remaining));
668
+ if (this.requestTracker.checkCancelled()) {
669
+ return;
704
670
  }
671
+ await Promise.race([sleep(durationMs), this.requestTracker.cancellationToken]);
705
672
  }
706
673
  }
@@ -6,7 +6,6 @@ import type { PeerId } from '@libp2p/interface';
6
6
 
7
7
  import type { ConnectionSampler } from '../connection-sampler/connection_sampler.js';
8
8
  import type { ReqRespInterface } from '../interface.js';
9
- import type { MissingTxMetadata } from './missing_txs.js';
10
9
  import type { IPeerCollection } from './peer_collection.js';
11
10
  import type { BatchRequestTxValidatorConfig, IBatchRequestTxValidator } from './tx_validator.js';
12
11
 
@@ -15,18 +14,17 @@ export interface IPeerPenalizer {
15
14
  }
16
15
 
17
16
  export interface ITxMetadataCollection {
18
- size: number;
19
- values(): IterableIterator<MissingTxMetadata>;
20
17
  getMissingTxHashes(): Set<string>;
18
+ markFetched(peerId: PeerId, tx: Tx): boolean;
21
19
  getTxsToRequestFromThePeer(peer: PeerId): TxHash[];
22
20
  markRequested(txHash: TxHash): void;
23
21
  markInFlightBySmartPeer(txHash: TxHash): void;
24
22
  markNotInFlightBySmartPeer(txHash: TxHash): void;
25
23
  alreadyFetched(txHash: TxHash): boolean;
26
24
  // Returns true if tx was marked as fetched, false if it was already marked as fetched
27
- markFetched(peerId: PeerId, tx: Tx): boolean;
28
25
  markPeerHas(peerId: PeerId, txHashes: TxHash[]): void;
29
- getFetchedTxs(): Tx[];
26
+ /** Remove all tx metadata associations for a peer (e.g. on demotion from smart to dumb). */
27
+ clearPeerData(peerId: PeerId): void;
30
28
  }
31
29
 
32
30
  /**
@@ -51,7 +49,6 @@ export interface BatchTxRequesterOptions {
51
49
  //Injectable for testing purposes
52
50
  semaphore?: ISemaphore;
53
51
  peerCollection?: IPeerCollection;
54
- abortSignal?: AbortSignal;
55
52
  /** Optional tx validator for testing - if not provided, one is created from p2pService.txValidatorConfig */
56
53
  txValidator?: IBatchRequestTxValidator;
57
54
  }