@aztec/p2p 0.0.1-commit.a072138 → 0.0.1-commit.a4600f49

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 (558) hide show
  1. package/README.md +130 -3
  2. package/dest/bootstrap/bootstrap.d.ts +1 -1
  3. package/dest/bootstrap/bootstrap.d.ts.map +1 -1
  4. package/dest/bootstrap/bootstrap.js +22 -6
  5. package/dest/client/factory.d.ts +13 -12
  6. package/dest/client/factory.d.ts.map +1 -1
  7. package/dest/client/factory.js +67 -18
  8. package/dest/client/interface.d.ts +90 -40
  9. package/dest/client/interface.d.ts.map +1 -1
  10. package/dest/client/p2p_client.d.ts +69 -64
  11. package/dest/client/p2p_client.d.ts.map +1 -1
  12. package/dest/client/p2p_client.js +240 -244
  13. package/dest/config.d.ts +168 -89
  14. package/dest/config.d.ts.map +1 -1
  15. package/dest/config.js +157 -45
  16. package/dest/errors/p2p-service.error.d.ts +9 -0
  17. package/dest/errors/p2p-service.error.d.ts.map +1 -0
  18. package/dest/errors/p2p-service.error.js +10 -0
  19. package/dest/errors/reqresp.error.d.ts +9 -16
  20. package/dest/errors/reqresp.error.d.ts.map +1 -1
  21. package/dest/errors/reqresp.error.js +10 -17
  22. package/dest/errors/tx-pool.error.d.ts +8 -0
  23. package/dest/errors/tx-pool.error.d.ts.map +1 -0
  24. package/dest/errors/tx-pool.error.js +9 -0
  25. package/dest/index.d.ts +2 -2
  26. package/dest/index.d.ts.map +1 -1
  27. package/dest/index.js +1 -1
  28. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +164 -106
  29. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  30. package/dest/mem_pools/attestation_pool/attestation_pool.js +518 -3
  31. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +2 -2
  32. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
  33. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +550 -125
  34. package/dest/mem_pools/attestation_pool/index.d.ts +2 -3
  35. package/dest/mem_pools/attestation_pool/index.d.ts.map +1 -1
  36. package/dest/mem_pools/attestation_pool/index.js +1 -2
  37. package/dest/mem_pools/attestation_pool/mocks.d.ts +2 -2
  38. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  39. package/dest/mem_pools/attestation_pool/mocks.js +7 -5
  40. package/dest/mem_pools/index.d.ts +3 -3
  41. package/dest/mem_pools/index.d.ts.map +1 -1
  42. package/dest/mem_pools/index.js +1 -1
  43. package/dest/mem_pools/instrumentation.d.ts +12 -5
  44. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  45. package/dest/mem_pools/instrumentation.js +38 -17
  46. package/dest/mem_pools/interface.d.ts +5 -5
  47. package/dest/mem_pools/interface.d.ts.map +1 -1
  48. package/dest/mem_pools/tx_pool_v2/archive/index.d.ts +2 -0
  49. package/dest/mem_pools/tx_pool_v2/archive/index.d.ts.map +1 -0
  50. package/dest/mem_pools/tx_pool_v2/archive/index.js +1 -0
  51. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts +39 -0
  52. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts.map +1 -0
  53. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.js +97 -0
  54. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +104 -0
  55. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -0
  56. package/dest/mem_pools/tx_pool_v2/deleted_pool.js +251 -0
  57. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts +47 -0
  58. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts.map +1 -0
  59. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.js +128 -0
  60. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +17 -0
  61. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -0
  62. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +94 -0
  63. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +19 -0
  64. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -0
  65. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +97 -0
  66. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +11 -0
  67. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -0
  68. package/dest/mem_pools/tx_pool_v2/eviction/index.js +12 -0
  69. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts +16 -0
  70. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts.map +1 -0
  71. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.js +62 -0
  72. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +180 -0
  73. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -0
  74. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.js +25 -0
  75. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts +15 -0
  76. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -0
  77. package/dest/mem_pools/{tx_pool → tx_pool_v2}/eviction/invalid_txs_after_mining_rule.js +16 -35
  78. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts +17 -0
  79. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -0
  80. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +93 -0
  81. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +16 -0
  82. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -0
  83. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +78 -0
  84. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +20 -0
  85. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -0
  86. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +75 -0
  87. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +15 -0
  88. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -0
  89. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +19 -0
  90. package/dest/mem_pools/tx_pool_v2/index.d.ts +6 -0
  91. package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -0
  92. package/dest/mem_pools/tx_pool_v2/index.js +5 -0
  93. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts +15 -0
  94. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts.map +1 -0
  95. package/dest/mem_pools/tx_pool_v2/instrumentation.js +43 -0
  96. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +243 -0
  97. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -0
  98. package/dest/mem_pools/tx_pool_v2/interfaces.js +11 -0
  99. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +137 -0
  100. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -0
  101. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +223 -0
  102. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts +26 -0
  103. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts.map +1 -0
  104. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.js +70 -0
  105. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +122 -0
  106. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -0
  107. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +368 -0
  108. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +68 -0
  109. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -0
  110. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +178 -0
  111. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +91 -0
  112. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -0
  113. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +1013 -0
  114. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +10 -3
  115. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  116. package/dest/msg_validators/attestation_validator/attestation_validator.js +38 -15
  117. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +8 -4
  118. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
  119. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +4 -5
  120. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +12 -5
  121. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
  122. package/dest/msg_validators/proposal_validator/block_proposal_validator.js +11 -3
  123. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +12 -5
  124. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
  125. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +23 -3
  126. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +36 -9
  127. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
  128. package/dest/msg_validators/proposal_validator/proposal_validator.js +130 -48
  129. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +4 -4
  130. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  131. package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +11 -18
  132. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +2 -1
  133. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -1
  134. package/dest/msg_validators/tx_validator/allowed_public_setup.js +25 -21
  135. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts +17 -0
  136. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts.map +1 -0
  137. package/dest/msg_validators/tx_validator/allowed_setup_helpers.js +24 -0
  138. package/dest/msg_validators/tx_validator/archive_cache.js +1 -1
  139. package/dest/msg_validators/tx_validator/block_header_validator.d.ts +16 -3
  140. package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
  141. package/dest/msg_validators/tx_validator/block_header_validator.js +1 -1
  142. package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts +15 -0
  143. package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts.map +1 -0
  144. package/dest/msg_validators/tx_validator/cached_tx_validator.js +19 -0
  145. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts +9 -0
  146. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts.map +1 -0
  147. package/dest/msg_validators/tx_validator/contract_instance_validator.js +48 -0
  148. package/dest/msg_validators/tx_validator/data_validator.d.ts +2 -1
  149. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  150. package/dest/msg_validators/tx_validator/data_validator.js +36 -2
  151. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +13 -3
  152. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
  153. package/dest/msg_validators/tx_validator/double_spend_validator.js +4 -4
  154. package/dest/msg_validators/tx_validator/factory.d.ts +133 -7
  155. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  156. package/dest/msg_validators/tx_validator/factory.js +261 -61
  157. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +1 -1
  158. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -1
  159. package/dest/msg_validators/tx_validator/fee_payer_balance.js +6 -2
  160. package/dest/msg_validators/tx_validator/gas_validator.d.ts +104 -3
  161. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  162. package/dest/msg_validators/tx_validator/gas_validator.js +137 -53
  163. package/dest/msg_validators/tx_validator/index.d.ts +5 -1
  164. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  165. package/dest/msg_validators/tx_validator/index.js +4 -0
  166. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +1 -1
  167. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  168. package/dest/msg_validators/tx_validator/metadata_validator.js +4 -4
  169. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts +14 -0
  170. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts.map +1 -0
  171. package/dest/msg_validators/tx_validator/nullifier_cache.js +24 -0
  172. package/dest/msg_validators/tx_validator/phases_validator.d.ts +22 -2
  173. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
  174. package/dest/msg_validators/tx_validator/phases_validator.js +72 -24
  175. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +20 -4
  176. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
  177. package/dest/msg_validators/tx_validator/timestamp_validator.js +6 -6
  178. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +2 -1
  179. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
  180. package/dest/msg_validators/tx_validator/tx_proof_validator.js +2 -0
  181. package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts +48 -0
  182. package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts.map +1 -0
  183. package/dest/msg_validators/tx_validator/tx_validation_cache.js +68 -0
  184. package/dest/services/data_store.d.ts +1 -1
  185. package/dest/services/data_store.d.ts.map +1 -1
  186. package/dest/services/data_store.js +5 -5
  187. package/dest/services/discv5/discV5_service.d.ts +13 -2
  188. package/dest/services/discv5/discV5_service.d.ts.map +1 -1
  189. package/dest/services/discv5/discV5_service.js +119 -23
  190. package/dest/services/discv5/persisted_enr_store.d.ts +38 -0
  191. package/dest/services/discv5/persisted_enr_store.d.ts.map +1 -0
  192. package/dest/services/discv5/persisted_enr_store.js +145 -0
  193. package/dest/services/dummy_service.d.ts +26 -18
  194. package/dest/services/dummy_service.d.ts.map +1 -1
  195. package/dest/services/dummy_service.js +25 -20
  196. package/dest/services/encoding.d.ts +24 -7
  197. package/dest/services/encoding.d.ts.map +1 -1
  198. package/dest/services/encoding.js +43 -26
  199. package/dest/services/gossipsub/index.d.ts +3 -0
  200. package/dest/services/gossipsub/index.d.ts.map +1 -0
  201. package/dest/services/gossipsub/index.js +2 -0
  202. package/dest/services/gossipsub/scoring.d.ts +21 -3
  203. package/dest/services/gossipsub/scoring.d.ts.map +1 -1
  204. package/dest/services/gossipsub/scoring.js +24 -7
  205. package/dest/services/gossipsub/topic_score_params.d.ts +167 -0
  206. package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -0
  207. package/dest/services/gossipsub/topic_score_params.js +336 -0
  208. package/dest/services/index.d.ts +2 -1
  209. package/dest/services/index.d.ts.map +1 -1
  210. package/dest/services/index.js +1 -0
  211. package/dest/services/libp2p/instrumentation.d.ts +3 -1
  212. package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
  213. package/dest/services/libp2p/instrumentation.js +14 -0
  214. package/dest/services/libp2p/libp2p_service.d.ts +111 -61
  215. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  216. package/dest/services/libp2p/libp2p_service.js +785 -580
  217. package/dest/services/peer-manager/metrics.d.ts +3 -1
  218. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  219. package/dest/services/peer-manager/metrics.js +6 -0
  220. package/dest/services/peer-manager/peer_manager.d.ts +20 -3
  221. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  222. package/dest/services/peer-manager/peer_manager.js +83 -26
  223. package/dest/services/peer-manager/peer_scoring.d.ts +34 -2
  224. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  225. package/dest/services/peer-manager/peer_scoring.js +127 -15
  226. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +7 -10
  227. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -1
  228. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +100 -132
  229. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +11 -11
  230. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
  231. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +11 -13
  232. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -1
  233. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +31 -46
  234. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +19 -11
  235. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -1
  236. package/dest/services/reqresp/batch-tx-requester/peer_collection.js +52 -15
  237. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +5 -14
  238. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -1
  239. package/dest/services/reqresp/batch-tx-requester/tx_validator.js +6 -20
  240. package/dest/services/reqresp/config.d.ts +15 -3
  241. package/dest/services/reqresp/config.d.ts.map +1 -1
  242. package/dest/services/reqresp/config.js +11 -0
  243. package/dest/services/reqresp/interface.d.ts +25 -18
  244. package/dest/services/reqresp/interface.d.ts.map +1 -1
  245. package/dest/services/reqresp/interface.js +23 -19
  246. package/dest/services/reqresp/metrics.d.ts +1 -1
  247. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  248. package/dest/services/reqresp/metrics.js +0 -1
  249. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +4 -3
  250. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -1
  251. package/dest/services/reqresp/protocols/block_txs/bitvector.js +3 -2
  252. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +7 -5
  253. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
  254. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +34 -26
  255. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +32 -16
  256. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
  257. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +68 -34
  258. package/dest/services/reqresp/protocols/index.d.ts +1 -2
  259. package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
  260. package/dest/services/reqresp/protocols/index.js +0 -1
  261. package/dest/services/reqresp/protocols/tx.d.ts +7 -1
  262. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  263. package/dest/services/reqresp/protocols/tx.js +21 -3
  264. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +5 -4
  265. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
  266. package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -8
  267. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
  268. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
  269. package/dest/services/reqresp/rate-limiter/rate_limits.js +3 -13
  270. package/dest/services/reqresp/reqresp.d.ts +7 -29
  271. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  272. package/dest/services/reqresp/reqresp.js +85 -219
  273. package/dest/services/service.d.ts +62 -13
  274. package/dest/services/service.d.ts.map +1 -1
  275. package/dest/services/tx_collection/config.d.ts +11 -14
  276. package/dest/services/tx_collection/config.d.ts.map +1 -1
  277. package/dest/services/tx_collection/config.js +26 -33
  278. package/dest/services/tx_collection/file_store_tx_collection.d.ts +37 -0
  279. package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -0
  280. package/dest/services/tx_collection/file_store_tx_collection.js +127 -0
  281. package/dest/services/tx_collection/file_store_tx_source.d.ts +38 -0
  282. package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -0
  283. package/dest/services/tx_collection/file_store_tx_source.js +100 -0
  284. package/dest/services/tx_collection/index.d.ts +3 -3
  285. package/dest/services/tx_collection/index.d.ts.map +1 -1
  286. package/dest/services/tx_collection/index.js +1 -1
  287. package/dest/services/tx_collection/instrumentation.js +1 -2
  288. package/dest/services/tx_collection/request_tracker.d.ts +53 -0
  289. package/dest/services/tx_collection/request_tracker.d.ts.map +1 -0
  290. package/dest/services/tx_collection/request_tracker.js +84 -0
  291. package/dest/services/tx_collection/tx_collection.d.ts +45 -51
  292. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  293. package/dest/services/tx_collection/tx_collection.js +296 -68
  294. package/dest/services/tx_collection/tx_collection_sink.d.ts +19 -9
  295. package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -1
  296. package/dest/services/tx_collection/tx_collection_sink.js +28 -31
  297. package/dest/services/tx_collection/tx_source.d.ts +13 -7
  298. package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
  299. package/dest/services/tx_collection/tx_source.js +29 -7
  300. package/dest/services/tx_file_store/config.d.ts +16 -0
  301. package/dest/services/tx_file_store/config.d.ts.map +1 -0
  302. package/dest/services/tx_file_store/config.js +22 -0
  303. package/dest/services/tx_file_store/index.d.ts +4 -0
  304. package/dest/services/tx_file_store/index.d.ts.map +1 -0
  305. package/dest/services/tx_file_store/index.js +3 -0
  306. package/dest/services/tx_file_store/instrumentation.d.ts +15 -0
  307. package/dest/services/tx_file_store/instrumentation.d.ts.map +1 -0
  308. package/dest/services/tx_file_store/instrumentation.js +29 -0
  309. package/dest/services/tx_file_store/tx_file_store.d.ts +46 -0
  310. package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -0
  311. package/dest/services/tx_file_store/tx_file_store.js +142 -0
  312. package/dest/services/tx_provider.d.ts +6 -4
  313. package/dest/services/tx_provider.d.ts.map +1 -1
  314. package/dest/services/tx_provider.js +12 -8
  315. package/dest/test-helpers/make-test-p2p-clients.d.ts +7 -8
  316. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  317. package/dest/test-helpers/make-test-p2p-clients.js +5 -3
  318. package/dest/test-helpers/mock-pubsub.d.ts +46 -6
  319. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  320. package/dest/test-helpers/mock-pubsub.js +115 -14
  321. package/dest/test-helpers/reqresp-nodes.d.ts +5 -7
  322. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  323. package/dest/test-helpers/reqresp-nodes.js +19 -20
  324. package/dest/test-helpers/test_tx_provider.d.ts +3 -1
  325. package/dest/test-helpers/test_tx_provider.d.ts.map +1 -1
  326. package/dest/test-helpers/test_tx_provider.js +3 -0
  327. package/dest/test-helpers/testbench-utils.d.ts +56 -50
  328. package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
  329. package/dest/test-helpers/testbench-utils.js +178 -75
  330. package/dest/testbench/p2p_client_testbench_worker.d.ts +3 -5
  331. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  332. package/dest/testbench/p2p_client_testbench_worker.js +113 -50
  333. package/dest/testbench/worker_client_manager.d.ts +12 -6
  334. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  335. package/dest/testbench/worker_client_manager.js +57 -11
  336. package/dest/util.d.ts +13 -8
  337. package/dest/util.d.ts.map +1 -1
  338. package/dest/util.js +35 -14
  339. package/dest/versioning.d.ts +3 -6
  340. package/dest/versioning.d.ts.map +1 -1
  341. package/dest/versioning.js +3 -24
  342. package/package.json +16 -16
  343. package/src/bootstrap/bootstrap.ts +17 -3
  344. package/src/client/factory.ts +135 -31
  345. package/src/client/interface.ts +97 -48
  346. package/src/client/p2p_client.ts +282 -310
  347. package/src/client/test/{tx_proposal_collector/README.md → p2p_client.batch_tx_requester.bench.README.md} +23 -53
  348. package/src/config.ts +282 -49
  349. package/src/errors/p2p-service.error.ts +11 -0
  350. package/src/errors/reqresp.error.ts +13 -19
  351. package/src/errors/tx-pool.error.ts +12 -0
  352. package/src/index.ts +1 -1
  353. package/src/mem_pools/attestation_pool/attestation_pool.ts +585 -94
  354. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +656 -141
  355. package/src/mem_pools/attestation_pool/index.ts +9 -2
  356. package/src/mem_pools/attestation_pool/mocks.ts +14 -8
  357. package/src/mem_pools/index.ts +2 -2
  358. package/src/mem_pools/instrumentation.ts +27 -17
  359. package/src/mem_pools/interface.ts +4 -4
  360. package/src/mem_pools/tx_pool_v2/README.md +283 -0
  361. package/src/mem_pools/tx_pool_v2/archive/index.ts +1 -0
  362. package/src/mem_pools/tx_pool_v2/archive/tx_archive.ts +112 -0
  363. package/src/mem_pools/tx_pool_v2/deleted_pool.ts +321 -0
  364. package/src/mem_pools/tx_pool_v2/eviction/eviction_manager.ts +160 -0
  365. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +122 -0
  366. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +125 -0
  367. package/src/mem_pools/tx_pool_v2/eviction/index.ts +28 -0
  368. package/src/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.ts +65 -0
  369. package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +219 -0
  370. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +74 -0
  371. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +101 -0
  372. package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +91 -0
  373. package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +99 -0
  374. package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +32 -0
  375. package/src/mem_pools/tx_pool_v2/index.ts +12 -0
  376. package/src/mem_pools/tx_pool_v2/instrumentation.ts +69 -0
  377. package/src/mem_pools/tx_pool_v2/interfaces.ts +274 -0
  378. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +349 -0
  379. package/src/mem_pools/tx_pool_v2/tx_pool_bench_metrics.ts +77 -0
  380. package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +465 -0
  381. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +252 -0
  382. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +1215 -0
  383. package/src/msg_validators/attestation_validator/README.md +49 -0
  384. package/src/msg_validators/attestation_validator/attestation_validator.ts +46 -14
  385. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +17 -9
  386. package/src/msg_validators/proposal_validator/README.md +123 -0
  387. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +26 -4
  388. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +43 -7
  389. package/src/msg_validators/proposal_validator/proposal_validator.ts +155 -49
  390. package/src/msg_validators/tx_validator/README.md +129 -0
  391. package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +8 -17
  392. package/src/msg_validators/tx_validator/allowed_public_setup.ts +22 -27
  393. package/src/msg_validators/tx_validator/allowed_setup_helpers.ts +31 -0
  394. package/src/msg_validators/tx_validator/archive_cache.ts +1 -1
  395. package/src/msg_validators/tx_validator/block_header_validator.ts +15 -3
  396. package/src/msg_validators/tx_validator/cached_tx_validator.ts +31 -0
  397. package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
  398. package/src/msg_validators/tx_validator/data_validator.ts +44 -1
  399. package/src/msg_validators/tx_validator/double_spend_validator.ts +11 -6
  400. package/src/msg_validators/tx_validator/factory.ts +413 -80
  401. package/src/msg_validators/tx_validator/fee_payer_balance.ts +6 -2
  402. package/src/msg_validators/tx_validator/gas_validator.ts +195 -54
  403. package/src/msg_validators/tx_validator/index.ts +4 -0
  404. package/src/msg_validators/tx_validator/metadata_validator.ts +12 -4
  405. package/src/msg_validators/tx_validator/nullifier_cache.ts +30 -0
  406. package/src/msg_validators/tx_validator/phases_validator.ts +82 -27
  407. package/src/msg_validators/tx_validator/timestamp_validator.ts +23 -18
  408. package/src/msg_validators/tx_validator/tx_proof_validator.ts +2 -0
  409. package/src/msg_validators/tx_validator/tx_validation_cache.ts +101 -0
  410. package/src/services/data_store.ts +5 -13
  411. package/src/services/discv5/discV5_service.ts +126 -14
  412. package/src/services/discv5/persisted_enr_store.ts +158 -0
  413. package/src/services/dummy_service.ts +38 -45
  414. package/src/services/encoding.ts +42 -26
  415. package/src/services/gossipsub/README.md +663 -0
  416. package/src/services/gossipsub/index.ts +2 -0
  417. package/src/services/gossipsub/scoring.ts +29 -5
  418. package/src/services/gossipsub/topic_score_params.ts +478 -0
  419. package/src/services/index.ts +1 -0
  420. package/src/services/libp2p/instrumentation.ts +14 -0
  421. package/src/services/libp2p/libp2p_service.ts +858 -637
  422. package/src/services/peer-manager/metrics.ts +7 -0
  423. package/src/services/peer-manager/peer_manager.ts +91 -25
  424. package/src/services/peer-manager/peer_scoring.ts +127 -8
  425. package/src/services/reqresp/README.md +194 -0
  426. package/src/services/reqresp/batch-tx-requester/README.md +53 -14
  427. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +101 -147
  428. package/src/services/reqresp/batch-tx-requester/interface.ts +14 -10
  429. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +30 -71
  430. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +68 -24
  431. package/src/services/reqresp/batch-tx-requester/tx_validator.ts +12 -25
  432. package/src/services/reqresp/config.ts +19 -2
  433. package/src/services/reqresp/interface.ts +45 -46
  434. package/src/services/reqresp/metrics.ts +0 -1
  435. package/src/services/reqresp/protocols/block_txs/bitvector.ts +3 -2
  436. package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +43 -30
  437. package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +84 -34
  438. package/src/services/reqresp/protocols/index.ts +0 -1
  439. package/src/services/reqresp/protocols/tx.ts +23 -3
  440. package/src/services/reqresp/rate-limiter/rate_limiter.ts +13 -9
  441. package/src/services/reqresp/rate-limiter/rate_limits.ts +3 -13
  442. package/src/services/reqresp/reqresp.ts +100 -263
  443. package/src/services/service.ts +81 -29
  444. package/src/services/tx_collection/config.ts +40 -49
  445. package/src/services/tx_collection/file_store_tx_collection.ts +153 -0
  446. package/src/services/tx_collection/file_store_tx_source.ts +129 -0
  447. package/src/services/tx_collection/index.ts +2 -6
  448. package/src/services/tx_collection/instrumentation.ts +1 -1
  449. package/src/services/tx_collection/request_tracker.ts +127 -0
  450. package/src/services/tx_collection/tx_collection.ts +362 -110
  451. package/src/services/tx_collection/tx_collection_sink.ts +32 -36
  452. package/src/services/tx_collection/tx_source.ts +29 -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 +163 -0
  457. package/src/services/tx_provider.ts +15 -9
  458. package/src/test-helpers/make-test-p2p-clients.ts +7 -6
  459. package/src/test-helpers/mock-pubsub.ts +137 -14
  460. package/src/test-helpers/reqresp-nodes.ts +17 -29
  461. package/src/test-helpers/test_tx_provider.ts +5 -0
  462. package/src/test-helpers/testbench-utils.ts +185 -94
  463. package/src/testbench/p2p_client_testbench_worker.ts +122 -65
  464. package/src/testbench/worker_client_manager.ts +72 -25
  465. package/src/util.ts +40 -19
  466. package/src/versioning.ts +3 -33
  467. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts +0 -2
  468. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts.map +0 -1
  469. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +0 -305
  470. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts +0 -73
  471. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts.map +0 -1
  472. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.js +0 -8
  473. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +0 -40
  474. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +0 -1
  475. package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +0 -218
  476. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +0 -31
  477. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +0 -1
  478. package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +0 -180
  479. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +0 -125
  480. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +0 -1
  481. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +0 -596
  482. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +0 -32
  483. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +0 -1
  484. package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +0 -112
  485. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +0 -157
  486. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +0 -1
  487. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +0 -52
  488. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +0 -16
  489. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +0 -1
  490. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +0 -122
  491. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +0 -17
  492. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +0 -1
  493. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +0 -19
  494. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +0 -1
  495. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +0 -78
  496. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +0 -26
  497. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +0 -1
  498. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +0 -84
  499. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +0 -25
  500. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +0 -1
  501. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +0 -57
  502. package/dest/mem_pools/tx_pool/index.d.ts +0 -3
  503. package/dest/mem_pools/tx_pool/index.d.ts.map +0 -1
  504. package/dest/mem_pools/tx_pool/index.js +0 -2
  505. package/dest/mem_pools/tx_pool/priority.d.ts +0 -12
  506. package/dest/mem_pools/tx_pool/priority.d.ts.map +0 -1
  507. package/dest/mem_pools/tx_pool/priority.js +0 -15
  508. package/dest/mem_pools/tx_pool/tx_pool.d.ts +0 -127
  509. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +0 -1
  510. package/dest/mem_pools/tx_pool/tx_pool.js +0 -3
  511. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +0 -7
  512. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +0 -1
  513. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +0 -400
  514. package/dest/msg_validators/clock_tolerance.d.ts +0 -21
  515. package/dest/msg_validators/clock_tolerance.d.ts.map +0 -1
  516. package/dest/msg_validators/clock_tolerance.js +0 -37
  517. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +0 -23
  518. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +0 -1
  519. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +0 -212
  520. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +0 -64
  521. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +0 -1
  522. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +0 -151
  523. package/dest/services/reqresp/protocols/block.d.ts +0 -9
  524. package/dest/services/reqresp/protocols/block.d.ts.map +0 -1
  525. package/dest/services/reqresp/protocols/block.js +0 -32
  526. package/dest/services/tx_collection/fast_tx_collection.d.ts +0 -53
  527. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +0 -1
  528. package/dest/services/tx_collection/fast_tx_collection.js +0 -311
  529. package/dest/services/tx_collection/proposal_tx_collector.d.ts +0 -48
  530. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +0 -1
  531. package/dest/services/tx_collection/proposal_tx_collector.js +0 -50
  532. package/dest/services/tx_collection/slow_tx_collection.d.ts +0 -53
  533. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +0 -1
  534. package/dest/services/tx_collection/slow_tx_collection.js +0 -177
  535. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +0 -336
  536. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.ts +0 -43
  537. package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +0 -320
  538. package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +0 -264
  539. package/src/mem_pools/tx_pool/README.md +0 -270
  540. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -746
  541. package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +0 -132
  542. package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +0 -208
  543. package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +0 -162
  544. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +0 -104
  545. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +0 -93
  546. package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +0 -106
  547. package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +0 -75
  548. package/src/mem_pools/tx_pool/index.ts +0 -2
  549. package/src/mem_pools/tx_pool/priority.ts +0 -20
  550. package/src/mem_pools/tx_pool/tx_pool.ts +0 -141
  551. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +0 -319
  552. package/src/msg_validators/clock_tolerance.ts +0 -51
  553. package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +0 -230
  554. package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +0 -161
  555. package/src/services/reqresp/protocols/block.ts +0 -37
  556. package/src/services/tx_collection/fast_tx_collection.ts +0 -364
  557. package/src/services/tx_collection/proposal_tx_collector.ts +0 -114
  558. package/src/services/tx_collection/slow_tx_collection.ts +0 -233
@@ -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
  │
@@ -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,17 @@
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';
8
- import { Tx, TxArray, TxHash } from '@aztec/stdlib/tx';
5
+ import { DateProvider } from '@aztec/foundation/timer';
6
+ import { PeerErrorSeverity } from '@aztec/stdlib/p2p';
7
+ import { Tx, TxArray, TxHash, type TxValidator } from '@aztec/stdlib/tx';
9
8
 
10
9
  import type { PeerId } from '@libp2p/interface';
11
- import { peerIdFromString } from '@libp2p/peer-id';
10
+ import { strict as assert } from 'assert';
12
11
 
12
+ import type { IRequestTracker } from '../../tx_collection/request_tracker.js';
13
13
  import { ReqRespSubProtocol } from '.././interface.js';
14
- import { BlockTxsRequest, BlockTxsResponse } from '.././protocols/index.js';
14
+ import { BlockTxsRequest, BlockTxsResponse, type BlockTxsSource } from '.././protocols/index.js';
15
15
  import { ReqRespStatus } from '.././status.js';
16
16
  import {
17
17
  DEFAULT_BATCH_TX_REQUESTER_BAD_PEER_THRESHOLD,
@@ -20,9 +20,9 @@ import {
20
20
  DEFAULT_BATCH_TX_REQUESTER_TX_BATCH_SIZE,
21
21
  } from './config.js';
22
22
  import type { BatchTxRequesterLibP2PService, BatchTxRequesterOptions, ITxMetadataCollection } from './interface.js';
23
- import { MissingTxMetadata, MissingTxMetadataCollection } from './missing_txs.js';
23
+ import { MissingTxMetadataCollection } from './missing_txs.js';
24
24
  import { type IPeerCollection, PeerCollection } from './peer_collection.js';
25
- import { BatchRequestTxValidator, type IBatchRequestTxValidator } from './tx_validator.js';
25
+ import { createBatchRequestTxValidator } from './tx_validator.js';
26
26
 
27
27
  /*
28
28
  * Tries to fetch all missing transaction until deadline is hit.
@@ -42,39 +42,35 @@ import { BatchRequestTxValidator, type IBatchRequestTxValidator } from './tx_val
42
42
  * - Is the peer which was unable to send us successful response N times in a row
43
43
  * */
44
44
  export class BatchTxRequester {
45
- private readonly blockProposal: BlockProposal;
45
+ private readonly requestTracker: IRequestTracker;
46
+ private readonly blockTxsSource: BlockTxsSource;
46
47
  private readonly pinnedPeer: PeerId | undefined;
47
- private readonly timeoutMs: number;
48
48
  private readonly p2pService: BatchTxRequesterLibP2PService;
49
49
  private readonly logger: Logger;
50
- private readonly dateProvider: DateProvider;
51
50
  private readonly opts: BatchTxRequesterOptions;
52
51
  private readonly peers: IPeerCollection;
53
52
  private readonly txsMetadata: ITxMetadataCollection;
54
- private readonly deadline: number;
55
53
  private readonly smartRequesterSemaphore: ISemaphore;
56
54
  private readonly txQueue: FifoMemoryQueue<Tx>;
57
- private readonly txValidator: IBatchRequestTxValidator;
55
+ private readonly txValidator: TxValidator;
58
56
  private readonly smartParallelWorkerCount: number;
59
57
  private readonly dumbParallelWorkerCount: number;
60
58
  private readonly txBatchSize: number;
61
59
 
62
60
  constructor(
63
- missingTxs: TxHash[],
64
- blockProposal: BlockProposal,
61
+ requestTracker: IRequestTracker,
62
+ blockTxsSource: BlockTxsSource,
65
63
  pinnedPeer: PeerId | undefined,
66
- timeoutMs: number,
67
64
  p2pService: BatchTxRequesterLibP2PService,
68
65
  logger?: Logger,
69
66
  dateProvider?: DateProvider,
70
67
  opts?: BatchTxRequesterOptions,
71
68
  ) {
72
- this.blockProposal = blockProposal;
69
+ this.requestTracker = requestTracker;
70
+ this.blockTxsSource = blockTxsSource;
73
71
  this.pinnedPeer = pinnedPeer;
74
- this.timeoutMs = timeoutMs;
75
72
  this.p2pService = p2pService;
76
73
  this.logger = logger ?? createLogger('p2p:reqresp_batch');
77
- this.dateProvider = dateProvider ?? new DateProvider();
78
74
  this.opts = opts ?? {};
79
75
 
80
76
  this.smartParallelWorkerCount =
@@ -82,66 +78,53 @@ export class BatchTxRequester {
82
78
  this.dumbParallelWorkerCount =
83
79
  this.opts.dumbParallelWorkerCount ?? DEFAULT_BATCH_TX_REQUESTER_DUMB_PARALLEL_WORKER_COUNT;
84
80
  this.txBatchSize = this.opts.txBatchSize ?? DEFAULT_BATCH_TX_REQUESTER_TX_BATCH_SIZE;
85
- this.deadline = this.dateProvider.now() + this.timeoutMs;
86
81
  this.txQueue = new FifoMemoryQueue(this.logger);
87
- this.txValidator = this.opts.txValidator ?? new BatchRequestTxValidator(this.p2pService.txValidatorConfig);
82
+ this.txValidator = this.opts.txValidator ?? createBatchRequestTxValidator(this.p2pService.txValidatorConfig);
88
83
 
89
84
  if (this.opts.peerCollection) {
90
85
  this.peers = this.opts.peerCollection;
91
86
  } else {
92
- const initialPeers = this.p2pService.connectionSampler.getPeerListSortedByConnectionCountAsc();
93
87
  const badPeerThreshold = this.opts.badPeerThreshold ?? DEFAULT_BATCH_TX_REQUESTER_BAD_PEER_THRESHOLD;
94
88
  this.peers = new PeerCollection(
95
- initialPeers,
89
+ this.p2pService.connectionSampler,
96
90
  this.pinnedPeer,
97
- this.dateProvider,
91
+ dateProvider ?? new DateProvider(),
98
92
  badPeerThreshold,
99
93
  this.p2pService.peerScoring,
100
94
  );
101
95
  }
102
- const entries: Array<[string, MissingTxMetadata]> = missingTxs.map(h => [h.toString(), new MissingTxMetadata(h)]);
103
- this.txsMetadata = new MissingTxMetadataCollection(entries, this.txBatchSize);
96
+ this.txsMetadata = new MissingTxMetadataCollection(requestTracker, this.txBatchSize);
104
97
  this.smartRequesterSemaphore = this.opts.semaphore ?? new Semaphore(0);
105
98
  }
106
99
 
107
100
  /*
108
- * Fetches all missing transactions and yields them one by one
101
+ * Fetches all missing transactions and yields them one by one
109
102
  * */
110
103
  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
104
  try {
115
105
  if (this.txsMetadata.getMissingTxHashes().size === 0) {
116
106
  return undefined;
117
107
  }
118
108
 
119
- // Start workers in background
120
- const workersPromise = executeTimeout(
121
- () => Promise.allSettled([this.smartRequester(), this.dumbRequester(), this.pinnedPeerRequester()]),
122
- this.timeoutMs,
123
- ).finally(() => {
109
+ // Start workers in background. Workers stop themselves via requestTracker.checkCancelled().
110
+ const workersPromise = Promise.allSettled([
111
+ this.smartRequester(),
112
+ this.dumbRequester(),
113
+ this.pinnedPeerRequester(),
114
+ ]).finally(() => {
124
115
  this.txQueue.end();
125
116
  });
126
117
 
118
+ // Yield txs as workers put them on the queue. The queue's end() drains remaining items
119
+ // before returning null, so we don't lose any txs.
127
120
  while (true) {
128
- const tx = await this.txQueue.get(timeoutQueueAfter);
121
+ const tx = await this.txQueue.get();
129
122
 
130
- // null indicates that the queue has ended
131
123
  if (tx === null) {
132
124
  break;
133
125
  }
134
126
 
135
127
  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
128
  }
146
129
 
147
130
  this.unlockSmartRequesterSemaphores();
@@ -205,7 +188,7 @@ export class BatchTxRequester {
205
188
  return;
206
189
  }
207
190
 
208
- const request = BlockTxsRequest.fromBlockProposalAndMissingTxs(this.blockProposal, txs);
191
+ const request = BlockTxsRequest.fromTxsSourceAndMissingTxs(this.blockTxsSource, txs);
209
192
  if (!request) {
210
193
  return;
211
194
  }
@@ -227,7 +210,6 @@ export class BatchTxRequester {
227
210
  * Starts dumb worker loops
228
211
  * */
229
212
  private async dumbRequester() {
230
- const nextPeerIndex = this.makeRoundRobinIndexer();
231
213
  const nextBatchIndex = this.makeRoundRobinIndexer();
232
214
 
233
215
  // Chunk missing tx hashes into batches of txBatchSize, wrapping around to ensure no peer gets less than txBatchSize
@@ -249,8 +231,8 @@ export class BatchTxRequester {
249
231
  // If peer is dumb peer, we don't know yet if they received full blockProposal
250
232
  // there is solid chance that peer didn't receive proposal yet, thus we must send full hashes
251
233
  const includeFullHashesInRequestNotJustIndices = true;
252
- const blockRequest = BlockTxsRequest.fromBlockProposalAndMissingTxs(
253
- this.blockProposal,
234
+ const blockRequest = BlockTxsRequest.fromTxsSourceAndMissingTxs(
235
+ this.blockTxsSource,
254
236
  txs,
255
237
  includeFullHashesInRequestNotJustIndices,
256
238
  );
@@ -263,15 +245,9 @@ export class BatchTxRequester {
263
245
  return { blockRequest, txs };
264
246
  };
265
247
 
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);
248
+ const workerCount = this.dumbParallelWorkerCount;
273
249
  const workers = Array.from({ length: workerCount }, (_, index) =>
274
- this.dumbWorkerLoop(nextPeer, makeRequest, index + 1),
250
+ this.dumbWorkerLoop(this.peers.nextDumbPeerToQuery.bind(this.peers), makeRequest, index + 1),
275
251
  );
276
252
 
277
253
  await Promise.allSettled(workers);
@@ -332,17 +308,9 @@ export class BatchTxRequester {
332
308
  * Starts smart worker loops
333
309
  * */
334
310
  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
311
  const makeRequest = (pid: PeerId) => {
344
312
  const txs = this.txsMetadata.getTxsToRequestFromThePeer(pid);
345
- const blockRequest = BlockTxsRequest.fromBlockProposalAndMissingTxs(this.blockProposal, txs);
313
+ const blockRequest = BlockTxsRequest.fromTxsSourceAndMissingTxs(this.blockTxsSource, txs);
346
314
  if (!blockRequest) {
347
315
  return undefined;
348
316
  }
@@ -350,9 +318,8 @@ export class BatchTxRequester {
350
318
  return { blockRequest, txs };
351
319
  };
352
320
 
353
- const workers = Array.from(
354
- { length: Math.min(this.smartParallelWorkerCount, this.peers.getAllPeers().size) },
355
- (_, index) => this.smartWorkerLoop(nextPeer, makeRequest, index + 1),
321
+ const workers = Array.from({ length: this.smartParallelWorkerCount }, (_, index) =>
322
+ this.smartWorkerLoop(this.peers.nextSmartPeerToQuery.bind(this.peers), makeRequest, index + 1),
356
323
  );
357
324
 
358
325
  await Promise.allSettled(workers);
@@ -378,7 +345,10 @@ export class BatchTxRequester {
378
345
  ) {
379
346
  try {
380
347
  this.logger.trace(`Smart worker ${workerIndex} started`);
381
- await executeTimeout((_: AbortSignal) => this.smartRequesterSemaphore.acquire(), this.timeoutMs);
348
+ await Promise.race([this.smartRequesterSemaphore.acquire(), this.requestTracker.cancellationToken]);
349
+ if (this.requestTracker.checkCancelled()) {
350
+ return;
351
+ }
382
352
  this.logger.trace(`Smart worker ${workerIndex} acquired semaphore`);
383
353
 
384
354
  while (!this.shouldStop()) {
@@ -387,30 +357,25 @@ export class BatchTxRequester {
387
357
  if (weRanOutOfPeersToQuery) {
388
358
  this.logger.debug(`Worker loop smart: No more peers to query`);
389
359
 
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;
360
+ // If we have rate limited peers wait for them.
361
+ const nextSmartPeerDelay = this.peers.getNextSmartPeerAvailabilityDelayMs();
362
+ const thereAreSomeRateLimitedSmartPeers = nextSmartPeerDelay !== undefined;
363
+ if (thereAreSomeRateLimitedSmartPeers) {
364
+ await this.sleepClampedToDeadline(nextSmartPeerDelay);
365
+ continue;
404
366
  }
405
367
 
406
- // Otherwise there are still some dumb peers that could become smart.
407
368
  // We end up here when all known smart peers became temporarily unavailable via combination of
408
369
  // (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.
370
+ // but there are dumb peers that could be promoted
371
+ // or new peer can join as dumb and be promoted later
410
372
  //
411
373
  // When a dumb peer responds with valid txIndices, it gets
412
374
  // promoted to smart and releases the semaphore, waking this worker.
413
- await executeTimeout((_: AbortSignal) => this.smartRequesterSemaphore.acquire(), this.timeoutMs);
375
+ await Promise.race([this.smartRequesterSemaphore.acquire(), this.requestTracker.cancellationToken]);
376
+ if (this.requestTracker.checkCancelled()) {
377
+ break;
378
+ }
414
379
  this.logger.debug(`Worker loop smart: acquired next smart peer`);
415
380
  continue;
416
381
  }
@@ -437,11 +402,7 @@ export class BatchTxRequester {
437
402
  });
438
403
  }
439
404
  } 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
- }
405
+ this.logger.error(`Smart worker ${workerIndex} encountered an error: ${err}`);
445
406
  } finally {
446
407
  this.logger.debug(`Smart worker ${workerIndex} finished`);
447
408
  }
@@ -468,6 +429,15 @@ export class BatchTxRequester {
468
429
  }
469
430
 
470
431
  const blockResponse = BlockTxsResponse.fromBuffer(response.data);
432
+
433
+ // Validate response. Peers will be penalised by the validator if they send invalid response.
434
+ const isValid = await this.p2pService.validateRequestedBlockTxsConsistency(request, blockResponse, peerId);
435
+ if (!isValid) {
436
+ this.logger.debug(`Peer ${peerId.toString()} sent invalid response`);
437
+ this.handleFailResponseFromPeer(peerId, ReqRespStatus.INTERNAL_ERROR);
438
+ return;
439
+ }
440
+
471
441
  await this.handleSuccessResponseFromPeer(peerId, blockResponse);
472
442
  } catch (err: any) {
473
443
  this.logger.error(`Failed to get valid response from peer ${peerId.toString()}: ${err.message}`, {
@@ -485,18 +455,24 @@ export class BatchTxRequester {
485
455
  * Handles failed response form the peer
486
456
  * There are 3 scenarios
487
457
  * - RATE_LIMIT_EXCEEDED: We mark this and don't query this peer again for some_time
458
+ * - INTERNAL_ERROR: We use this to cover cases where the request-response consistency validation fails.
488
459
  * - FAILURE and UNKNOWN: We penalise this, if peer has been penalised this way N times they are not queried again
489
460
  * this implies we will query these peers couple of more times and give them a chance to "redeem" themselves before completely ignoring them
490
461
  */
491
462
  private handleFailResponseFromPeer(peerId: PeerId, responseStatus: ReqRespStatus) {
492
- //TODO: Should we ban these peers?
493
- if (responseStatus === ReqRespStatus.FAILURE || responseStatus === ReqRespStatus.UNKNOWN) {
494
- this.peers.penalisePeer(peerId, PeerErrorSeverity.HighToleranceError);
495
- return;
496
- }
497
-
498
- if (responseStatus === ReqRespStatus.RATE_LIMIT_EXCEEDED) {
499
- this.peers.markPeerRateLimitExceeded(peerId);
463
+ switch (responseStatus) {
464
+ case ReqRespStatus.RATE_LIMIT_EXCEEDED:
465
+ this.peers.markPeerRateLimitExceeded(peerId);
466
+ return;
467
+ case ReqRespStatus.INTERNAL_ERROR:
468
+ this.peers.markPeerDumb(peerId);
469
+ this.txsMetadata.clearPeerData(peerId);
470
+ return;
471
+ default: // includes FAILURE, UNKNOWN
472
+ this.peers.penalisePeer(peerId, PeerErrorSeverity.HighToleranceError);
473
+ this.peers.markPeerDumb(peerId);
474
+ this.txsMetadata.clearPeerData(peerId);
475
+ return;
500
476
  }
501
477
  }
502
478
 
@@ -516,7 +492,7 @@ export class BatchTxRequester {
516
492
  * Handles received txs.
517
493
  * Transactions are validated and then put on async queue
518
494
  * to be yielded by main running loop
519
- * */
495
+ */
520
496
  private async handleReceivedTxs(peerId: PeerId, txs: TxArray) {
521
497
  const newTxs = txs.filter(tx => !this.txsMetadata.alreadyFetched(tx.txHash));
522
498
 
@@ -524,12 +500,12 @@ export class BatchTxRequester {
524
500
  return;
525
501
  }
526
502
 
527
- //TODO: this validation can be slow, maybe spawn worker just for validation
503
+ // TODO: this validation can be slow, maybe spawn worker just for validation
528
504
  // We could use the async queue for communication.
529
505
  const validationResults = await Promise.allSettled(
530
506
  newTxs.map(async tx => ({
531
507
  tx,
532
- isValid: (await this.txValidator.validateRequestedTx(tx)).result === 'valid',
508
+ isValid: (await this.txValidator.validateTx(tx)).result === 'valid',
533
509
  })),
534
510
  );
535
511
 
@@ -545,6 +521,9 @@ export class BatchTxRequester {
545
521
  });
546
522
 
547
523
  if (hasInvalidTx) {
524
+ this.logger.warn(`Penalizing peer ${peerId.toString()} for sending invalid transactions in batch response`, {
525
+ peerId,
526
+ });
548
527
  this.peers.penalisePeer(peerId, PeerErrorSeverity.LowToleranceError);
549
528
  } else {
550
529
  // If we have received successful response from the peer, they have "redeemed" themselves and not considered bad anymore
@@ -581,10 +560,10 @@ export class BatchTxRequester {
581
560
  return;
582
561
  }
583
562
 
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)) {
563
+ // If the peer doesn't have the block, we mark them as dumb.
564
+ if (!response.peerHasBlock()) {
565
+ this.peers.markPeerDumb(peerId);
566
+ this.txsMetadata.clearPeerData(peerId);
588
567
  return;
589
568
  }
590
569
 
@@ -599,18 +578,13 @@ export class BatchTxRequester {
599
578
  this.markTxsPeerHas(peerId, response);
600
579
 
601
580
  // Unblock smart workers
602
- if (this.peers.getSmartPeersToQuery().length <= this.smartParallelWorkerCount) {
603
- this.smartRequesterSemaphore.release();
604
- }
605
- }
606
-
607
- private isBlockResponseValid(response: BlockTxsResponse): boolean {
608
- const archiveRootsMatch = this.blockProposal.archive.toString() === response.archiveRoot.toString();
609
- const peerHasSomeTxsFromProposal = !response.txIndices.isEmpty();
610
- return archiveRootsMatch && peerHasSomeTxsFromProposal;
581
+ this.smartRequesterSemaphore.release();
611
582
  }
612
583
 
613
584
  private peerHasSomeTxsWeAreMissing(_peerId: PeerId, response: BlockTxsResponse): boolean {
585
+ if (response.txIndices.isEmpty()) {
586
+ return false;
587
+ }
614
588
  const txsPeerHas = new Set(this.extractHashesPeerHasFromResponse(response).map(h => h.toString()));
615
589
  return this.txsMetadata.getMissingTxHashes().intersection(txsPeerHas).size > 0;
616
590
  }
@@ -622,15 +596,9 @@ export class BatchTxRequester {
622
596
  }
623
597
 
624
598
  private extractHashesPeerHasFromResponse(response: BlockTxsResponse): Array<TxHash> {
625
- const hashes: TxHash[] = [];
626
- const indicesOfHashesPeerHas = new Set(response.txIndices.getTrueIndices());
627
- this.blockProposal.txHashes.forEach((hash, idx) => {
628
- if (indicesOfHashesPeerHas.has(idx)) {
629
- hashes.push(hash);
630
- }
631
- });
632
-
633
- return hashes;
599
+ // Should already have been validated, but just in case.
600
+ assert(response.txIndices.getLength() === this.blockTxsSource.txHashes.length);
601
+ return response.txIndices.getTrueIndices().map(idx => this.blockTxsSource.txHashes[idx]);
634
602
  }
635
603
 
636
604
  /*
@@ -659,27 +627,14 @@ export class BatchTxRequester {
659
627
  }
660
628
 
661
629
  /*
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*/
630
+ * Checks if the BatchTxRequester should stop fetching missing txs.
631
+ * Delegates to requestTracker which covers: deadline hit, all txs fetched, or external cancellation. */
676
632
  private shouldStop() {
677
- const aborted = this.opts.abortSignal?.aborted ?? false;
678
- if (aborted) {
633
+ if (this.requestTracker.checkCancelled()) {
679
634
  this.unlockSmartRequesterSemaphores();
680
635
  }
681
636
 
682
- return aborted || this.txsMetadata.size === 0 || this.fetchedAllTxs() || this.dateProvider.now() > this.deadline;
637
+ return this.requestTracker.checkCancelled();
683
638
  }
684
639
 
685
640
  /*
@@ -697,10 +652,9 @@ export class BatchTxRequester {
697
652
  * This ensures we don't sleep past the deadline.
698
653
  * */
699
654
  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));
655
+ if (this.requestTracker.checkCancelled()) {
656
+ return;
704
657
  }
658
+ await Promise.race([sleep(durationMs), this.requestTracker.cancellationToken]);
705
659
  }
706
660
  }