@aztec/p2p 0.0.1-commit.7b97ef96e → 0.0.1-commit.7cbc774

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 (463) hide show
  1. package/README.md +129 -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 +9 -1
  5. package/dest/client/factory.d.ts +7 -7
  6. package/dest/client/factory.d.ts.map +1 -1
  7. package/dest/client/factory.js +39 -32
  8. package/dest/client/interface.d.ts +19 -17
  9. package/dest/client/interface.d.ts.map +1 -1
  10. package/dest/client/p2p_client.d.ts +16 -20
  11. package/dest/client/p2p_client.d.ts.map +1 -1
  12. package/dest/client/p2p_client.js +94 -105
  13. package/dest/config.d.ts +154 -106
  14. package/dest/config.d.ts.map +1 -1
  15. package/dest/config.js +134 -40
  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 +1 -20
  20. package/dest/errors/reqresp.error.d.ts.map +1 -1
  21. package/dest/errors/reqresp.error.js +0 -21
  22. package/dest/index.d.ts +1 -2
  23. package/dest/index.d.ts.map +1 -1
  24. package/dest/index.js +0 -1
  25. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +99 -59
  26. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  27. package/dest/mem_pools/attestation_pool/attestation_pool.js +267 -197
  28. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +1 -1
  29. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
  30. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +181 -65
  31. package/dest/mem_pools/attestation_pool/mocks.d.ts +1 -1
  32. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  33. package/dest/mem_pools/attestation_pool/mocks.js +6 -4
  34. package/dest/mem_pools/index.d.ts +1 -2
  35. package/dest/mem_pools/index.d.ts.map +1 -1
  36. package/dest/mem_pools/instrumentation.d.ts +4 -2
  37. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  38. package/dest/mem_pools/instrumentation.js +33 -15
  39. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +1 -1
  40. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -1
  41. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +3 -2
  42. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +1 -1
  43. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -1
  44. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +2 -0
  45. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +2 -1
  46. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -1
  47. package/dest/mem_pools/tx_pool_v2/eviction/index.js +1 -0
  48. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts +16 -0
  49. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts.map +1 -0
  50. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.js +62 -0
  51. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +7 -1
  52. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -1
  53. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +4 -4
  54. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +2 -2
  55. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -1
  56. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +10 -6
  57. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +1 -1
  58. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -1
  59. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +8 -6
  60. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +2 -2
  61. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -1
  62. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +2 -2
  63. package/dest/mem_pools/tx_pool_v2/index.d.ts +2 -2
  64. package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -1
  65. package/dest/mem_pools/tx_pool_v2/index.js +1 -1
  66. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +18 -9
  67. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
  68. package/dest/mem_pools/tx_pool_v2/interfaces.js +3 -1
  69. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +51 -11
  70. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
  71. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +90 -19
  72. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +1 -1
  73. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -1
  74. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +26 -44
  75. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +5 -3
  76. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -1
  77. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +6 -0
  78. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +3 -2
  79. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -1
  80. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +256 -220
  81. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +9 -3
  82. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  83. package/dest/msg_validators/attestation_validator/attestation_validator.js +37 -12
  84. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +7 -3
  85. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
  86. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +4 -5
  87. package/dest/msg_validators/clock_tolerance.d.ts +12 -1
  88. package/dest/msg_validators/clock_tolerance.d.ts.map +1 -1
  89. package/dest/msg_validators/clock_tolerance.js +61 -3
  90. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +10 -4
  91. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
  92. package/dest/msg_validators/proposal_validator/block_proposal_validator.js +10 -2
  93. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +10 -4
  94. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
  95. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +16 -2
  96. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +21 -8
  97. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
  98. package/dest/msg_validators/proposal_validator/proposal_validator.js +90 -44
  99. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +2 -2
  100. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  101. package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +11 -18
  102. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +2 -1
  103. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -1
  104. package/dest/msg_validators/tx_validator/allowed_public_setup.js +25 -21
  105. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts +17 -0
  106. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts.map +1 -0
  107. package/dest/msg_validators/tx_validator/allowed_setup_helpers.js +24 -0
  108. package/dest/msg_validators/tx_validator/archive_cache.js +1 -1
  109. package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts +15 -0
  110. package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts.map +1 -0
  111. package/dest/msg_validators/tx_validator/cached_tx_validator.js +19 -0
  112. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts +9 -0
  113. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts.map +1 -0
  114. package/dest/msg_validators/tx_validator/contract_instance_validator.js +48 -0
  115. package/dest/msg_validators/tx_validator/data_validator.d.ts +2 -1
  116. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  117. package/dest/msg_validators/tx_validator/data_validator.js +36 -2
  118. package/dest/msg_validators/tx_validator/factory.d.ts +135 -7
  119. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  120. package/dest/msg_validators/tx_validator/factory.js +252 -61
  121. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +1 -1
  122. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -1
  123. package/dest/msg_validators/tx_validator/fee_payer_balance.js +6 -2
  124. package/dest/msg_validators/tx_validator/gas_validator.d.ts +99 -3
  125. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  126. package/dest/msg_validators/tx_validator/gas_validator.js +137 -53
  127. package/dest/msg_validators/tx_validator/index.d.ts +5 -1
  128. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  129. package/dest/msg_validators/tx_validator/index.js +4 -0
  130. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +1 -1
  131. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  132. package/dest/msg_validators/tx_validator/metadata_validator.js +4 -4
  133. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts +14 -0
  134. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts.map +1 -0
  135. package/dest/msg_validators/tx_validator/nullifier_cache.js +24 -0
  136. package/dest/msg_validators/tx_validator/phases_validator.d.ts +22 -2
  137. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
  138. package/dest/msg_validators/tx_validator/phases_validator.js +72 -24
  139. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +2 -1
  140. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
  141. package/dest/msg_validators/tx_validator/tx_proof_validator.js +2 -0
  142. package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts +48 -0
  143. package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts.map +1 -0
  144. package/dest/msg_validators/tx_validator/tx_validation_cache.js +69 -0
  145. package/dest/services/data_store.d.ts +1 -1
  146. package/dest/services/data_store.d.ts.map +1 -1
  147. package/dest/services/data_store.js +5 -5
  148. package/dest/services/discv5/discV5_service.d.ts +2 -1
  149. package/dest/services/discv5/discV5_service.d.ts.map +1 -1
  150. package/dest/services/discv5/discV5_service.js +35 -8
  151. package/dest/services/dummy_service.d.ts +12 -17
  152. package/dest/services/dummy_service.d.ts.map +1 -1
  153. package/dest/services/dummy_service.js +13 -20
  154. package/dest/services/encoding.d.ts +6 -2
  155. package/dest/services/encoding.d.ts.map +1 -1
  156. package/dest/services/encoding.js +14 -8
  157. package/dest/services/gossipsub/topic_score_params.d.ts +13 -2
  158. package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -1
  159. package/dest/services/gossipsub/topic_score_params.js +21 -4
  160. package/dest/services/libp2p/instrumentation.d.ts +3 -1
  161. package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
  162. package/dest/services/libp2p/instrumentation.js +14 -0
  163. package/dest/services/libp2p/libp2p_service.d.ts +47 -55
  164. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  165. package/dest/services/libp2p/libp2p_service.js +344 -308
  166. package/dest/services/peer-manager/metrics.d.ts +3 -1
  167. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  168. package/dest/services/peer-manager/metrics.js +6 -0
  169. package/dest/services/peer-manager/peer_manager.d.ts +6 -2
  170. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  171. package/dest/services/peer-manager/peer_manager.js +40 -11
  172. package/dest/services/peer-manager/peer_scoring.d.ts +7 -2
  173. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  174. package/dest/services/peer-manager/peer_scoring.js +32 -10
  175. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +11 -8
  176. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -1
  177. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +97 -107
  178. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +10 -6
  179. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
  180. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +5 -4
  181. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -1
  182. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +13 -7
  183. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +19 -11
  184. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -1
  185. package/dest/services/reqresp/batch-tx-requester/peer_collection.js +52 -15
  186. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +5 -14
  187. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -1
  188. package/dest/services/reqresp/batch-tx-requester/tx_validator.js +6 -20
  189. package/dest/services/reqresp/config.d.ts +3 -3
  190. package/dest/services/reqresp/config.d.ts.map +1 -1
  191. package/dest/services/reqresp/interface.d.ts +16 -18
  192. package/dest/services/reqresp/interface.d.ts.map +1 -1
  193. package/dest/services/reqresp/interface.js +10 -20
  194. package/dest/services/reqresp/metrics.d.ts +1 -1
  195. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  196. package/dest/services/reqresp/metrics.js +0 -1
  197. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +1 -1
  198. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
  199. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +4 -2
  200. package/dest/services/reqresp/protocols/index.d.ts +1 -2
  201. package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
  202. package/dest/services/reqresp/protocols/index.js +0 -1
  203. package/dest/services/reqresp/protocols/tx.d.ts +1 -1
  204. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  205. package/dest/services/reqresp/protocols/tx.js +1 -3
  206. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +5 -4
  207. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
  208. package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -8
  209. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
  210. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
  211. package/dest/services/reqresp/rate-limiter/rate_limits.js +0 -10
  212. package/dest/services/reqresp/reqresp.d.ts +7 -29
  213. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  214. package/dest/services/reqresp/reqresp.js +43 -215
  215. package/dest/services/service.d.ts +10 -13
  216. package/dest/services/service.d.ts.map +1 -1
  217. package/dest/services/tx_collection/config.d.ts +2 -23
  218. package/dest/services/tx_collection/config.d.ts.map +1 -1
  219. package/dest/services/tx_collection/config.js +2 -55
  220. package/dest/services/tx_collection/file_store_tx_collection.d.ts +12 -28
  221. package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -1
  222. package/dest/services/tx_collection/file_store_tx_collection.js +43 -83
  223. package/dest/services/tx_collection/file_store_tx_source.d.ts +5 -4
  224. package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -1
  225. package/dest/services/tx_collection/file_store_tx_source.js +39 -29
  226. package/dest/services/tx_collection/index.d.ts +2 -3
  227. package/dest/services/tx_collection/index.d.ts.map +1 -1
  228. package/dest/services/tx_collection/index.js +0 -1
  229. package/dest/services/tx_collection/instrumentation.d.ts +1 -1
  230. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
  231. package/dest/services/tx_collection/instrumentation.js +0 -2
  232. package/dest/services/tx_collection/request_tracker.d.ts +53 -0
  233. package/dest/services/tx_collection/request_tracker.d.ts.map +1 -0
  234. package/dest/services/tx_collection/request_tracker.js +84 -0
  235. package/dest/services/tx_collection/tx_collection.d.ts +36 -55
  236. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  237. package/dest/services/tx_collection/tx_collection.js +275 -119
  238. package/dest/services/tx_collection/tx_collection_sink.d.ts +1 -1
  239. package/dest/services/tx_collection/tx_collection_sink.js +2 -2
  240. package/dest/services/tx_collection/tx_source.d.ts +6 -5
  241. package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
  242. package/dest/services/tx_collection/tx_source.js +9 -7
  243. package/dest/services/tx_file_store/tx_file_store.d.ts +1 -3
  244. package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -1
  245. package/dest/services/tx_file_store/tx_file_store.js +4 -14
  246. package/dest/services/tx_provider.d.ts +5 -3
  247. package/dest/services/tx_provider.d.ts.map +1 -1
  248. package/dest/services/tx_provider.js +7 -4
  249. package/dest/test-helpers/make-test-p2p-clients.d.ts +5 -6
  250. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  251. package/dest/test-helpers/make-test-p2p-clients.js +5 -3
  252. package/dest/test-helpers/mock-pubsub.d.ts +24 -11
  253. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  254. package/dest/test-helpers/mock-pubsub.js +45 -45
  255. package/dest/test-helpers/reqresp-nodes.d.ts +5 -7
  256. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  257. package/dest/test-helpers/reqresp-nodes.js +17 -19
  258. package/dest/test-helpers/test_tx_provider.d.ts +3 -1
  259. package/dest/test-helpers/test_tx_provider.d.ts.map +1 -1
  260. package/dest/test-helpers/test_tx_provider.js +3 -0
  261. package/dest/test-helpers/testbench-utils.d.ts +13 -15
  262. package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
  263. package/dest/test-helpers/testbench-utils.js +42 -15
  264. package/dest/testbench/p2p_client_testbench_worker.d.ts +3 -5
  265. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  266. package/dest/testbench/p2p_client_testbench_worker.js +88 -42
  267. package/dest/testbench/worker_client_manager.d.ts +12 -6
  268. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  269. package/dest/testbench/worker_client_manager.js +57 -11
  270. package/dest/util.d.ts +12 -7
  271. package/dest/util.d.ts.map +1 -1
  272. package/dest/util.js +35 -14
  273. package/dest/versioning.d.ts +3 -6
  274. package/dest/versioning.d.ts.map +1 -1
  275. package/dest/versioning.js +3 -24
  276. package/package.json +15 -14
  277. package/src/bootstrap/bootstrap.ts +9 -1
  278. package/src/client/factory.ts +74 -49
  279. package/src/client/interface.ts +20 -30
  280. package/src/client/p2p_client.ts +108 -156
  281. package/src/client/test/{tx_proposal_collector/README.md → p2p_client.batch_tx_requester.bench.README.md} +23 -53
  282. package/src/config.ts +227 -45
  283. package/src/errors/p2p-service.error.ts +11 -0
  284. package/src/errors/reqresp.error.ts +0 -25
  285. package/src/index.ts +0 -1
  286. package/src/mem_pools/attestation_pool/attestation_pool.ts +318 -242
  287. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +204 -68
  288. package/src/mem_pools/attestation_pool/mocks.ts +13 -8
  289. package/src/mem_pools/index.ts +0 -3
  290. package/src/mem_pools/instrumentation.ts +22 -14
  291. package/src/mem_pools/tx_pool_v2/README.md +9 -1
  292. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +3 -2
  293. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +3 -0
  294. package/src/mem_pools/tx_pool_v2/eviction/index.ts +1 -0
  295. package/src/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.ts +65 -0
  296. package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +11 -1
  297. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +5 -5
  298. package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +10 -6
  299. package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +15 -6
  300. package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +2 -1
  301. package/src/mem_pools/tx_pool_v2/index.ts +1 -1
  302. package/src/mem_pools/tx_pool_v2/interfaces.ts +19 -8
  303. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +130 -23
  304. package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +29 -43
  305. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +17 -2
  306. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +267 -229
  307. package/src/msg_validators/attestation_validator/README.md +49 -0
  308. package/src/msg_validators/attestation_validator/attestation_validator.ts +41 -9
  309. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +14 -7
  310. package/src/msg_validators/clock_tolerance.ts +79 -3
  311. package/src/msg_validators/proposal_validator/README.md +123 -0
  312. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +24 -4
  313. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +35 -7
  314. package/src/msg_validators/proposal_validator/proposal_validator.ts +114 -47
  315. package/src/msg_validators/tx_validator/README.md +127 -0
  316. package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +6 -15
  317. package/src/msg_validators/tx_validator/allowed_public_setup.ts +22 -27
  318. package/src/msg_validators/tx_validator/allowed_setup_helpers.ts +31 -0
  319. package/src/msg_validators/tx_validator/archive_cache.ts +1 -1
  320. package/src/msg_validators/tx_validator/cached_tx_validator.ts +31 -0
  321. package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
  322. package/src/msg_validators/tx_validator/data_validator.ts +44 -1
  323. package/src/msg_validators/tx_validator/factory.ts +407 -80
  324. package/src/msg_validators/tx_validator/fee_payer_balance.ts +6 -2
  325. package/src/msg_validators/tx_validator/gas_validator.ts +199 -54
  326. package/src/msg_validators/tx_validator/index.ts +4 -0
  327. package/src/msg_validators/tx_validator/metadata_validator.ts +12 -4
  328. package/src/msg_validators/tx_validator/nullifier_cache.ts +30 -0
  329. package/src/msg_validators/tx_validator/phases_validator.ts +82 -27
  330. package/src/msg_validators/tx_validator/tx_proof_validator.ts +2 -0
  331. package/src/msg_validators/tx_validator/tx_validation_cache.ts +102 -0
  332. package/src/services/data_store.ts +5 -13
  333. package/src/services/discv5/discV5_service.ts +38 -5
  334. package/src/services/dummy_service.ts +15 -44
  335. package/src/services/encoding.ts +14 -7
  336. package/src/services/gossipsub/topic_score_params.ts +36 -4
  337. package/src/services/libp2p/instrumentation.ts +14 -0
  338. package/src/services/libp2p/libp2p_service.ts +390 -360
  339. package/src/services/peer-manager/metrics.ts +7 -0
  340. package/src/services/peer-manager/peer_manager.ts +46 -11
  341. package/src/services/peer-manager/peer_scoring.ts +27 -5
  342. package/src/services/reqresp/README.md +215 -0
  343. package/src/services/reqresp/batch-tx-requester/README.md +46 -7
  344. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +97 -119
  345. package/src/services/reqresp/batch-tx-requester/interface.ts +13 -5
  346. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +13 -6
  347. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +68 -24
  348. package/src/services/reqresp/batch-tx-requester/tx_validator.ts +12 -25
  349. package/src/services/reqresp/config.ts +2 -2
  350. package/src/services/reqresp/interface.ts +21 -47
  351. package/src/services/reqresp/metrics.ts +0 -1
  352. package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +4 -2
  353. package/src/services/reqresp/protocols/index.ts +0 -1
  354. package/src/services/reqresp/protocols/tx.ts +1 -3
  355. package/src/services/reqresp/rate-limiter/rate_limiter.ts +13 -9
  356. package/src/services/reqresp/rate-limiter/rate_limits.ts +0 -10
  357. package/src/services/reqresp/reqresp.ts +48 -261
  358. package/src/services/service.ts +13 -29
  359. package/src/services/tx_collection/config.ts +3 -80
  360. package/src/services/tx_collection/file_store_tx_collection.ts +54 -103
  361. package/src/services/tx_collection/file_store_tx_source.ts +43 -31
  362. package/src/services/tx_collection/index.ts +1 -6
  363. package/src/services/tx_collection/instrumentation.ts +1 -7
  364. package/src/services/tx_collection/request_tracker.ts +127 -0
  365. package/src/services/tx_collection/tx_collection.ts +331 -176
  366. package/src/services/tx_collection/tx_collection_sink.ts +2 -2
  367. package/src/services/tx_collection/tx_source.ts +8 -7
  368. package/src/services/tx_file_store/tx_file_store.ts +5 -17
  369. package/src/services/tx_provider.ts +7 -2
  370. package/src/test-helpers/make-test-p2p-clients.ts +4 -3
  371. package/src/test-helpers/mock-pubsub.ts +49 -66
  372. package/src/test-helpers/reqresp-nodes.ts +15 -28
  373. package/src/test-helpers/test_tx_provider.ts +5 -0
  374. package/src/test-helpers/testbench-utils.ts +54 -29
  375. package/src/testbench/p2p_client_testbench_worker.ts +91 -61
  376. package/src/testbench/worker_client_manager.ts +72 -25
  377. package/src/util.ts +33 -18
  378. package/src/versioning.ts +3 -33
  379. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts +0 -2
  380. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts.map +0 -1
  381. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +0 -305
  382. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts +0 -73
  383. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts.map +0 -1
  384. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.js +0 -8
  385. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +0 -125
  386. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +0 -1
  387. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +0 -596
  388. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +0 -32
  389. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +0 -1
  390. package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +0 -112
  391. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +0 -157
  392. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +0 -1
  393. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +0 -52
  394. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +0 -16
  395. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +0 -1
  396. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +0 -122
  397. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +0 -17
  398. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +0 -1
  399. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +0 -84
  400. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +0 -19
  401. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +0 -1
  402. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +0 -78
  403. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +0 -26
  404. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +0 -1
  405. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +0 -84
  406. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +0 -25
  407. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +0 -1
  408. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +0 -57
  409. package/dest/mem_pools/tx_pool/index.d.ts +0 -3
  410. package/dest/mem_pools/tx_pool/index.d.ts.map +0 -1
  411. package/dest/mem_pools/tx_pool/index.js +0 -2
  412. package/dest/mem_pools/tx_pool/priority.d.ts +0 -12
  413. package/dest/mem_pools/tx_pool/priority.d.ts.map +0 -1
  414. package/dest/mem_pools/tx_pool/priority.js +0 -15
  415. package/dest/mem_pools/tx_pool/tx_pool.d.ts +0 -127
  416. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +0 -1
  417. package/dest/mem_pools/tx_pool/tx_pool.js +0 -3
  418. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +0 -7
  419. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +0 -1
  420. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +0 -400
  421. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +0 -23
  422. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +0 -1
  423. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +0 -212
  424. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +0 -64
  425. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +0 -1
  426. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +0 -151
  427. package/dest/services/reqresp/protocols/block.d.ts +0 -9
  428. package/dest/services/reqresp/protocols/block.d.ts.map +0 -1
  429. package/dest/services/reqresp/protocols/block.js +0 -32
  430. package/dest/services/tx_collection/fast_tx_collection.d.ts +0 -54
  431. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +0 -1
  432. package/dest/services/tx_collection/fast_tx_collection.js +0 -327
  433. package/dest/services/tx_collection/missing_txs_tracker.d.ts +0 -32
  434. package/dest/services/tx_collection/missing_txs_tracker.d.ts.map +0 -1
  435. package/dest/services/tx_collection/missing_txs_tracker.js +0 -27
  436. package/dest/services/tx_collection/proposal_tx_collector.d.ts +0 -49
  437. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +0 -1
  438. package/dest/services/tx_collection/proposal_tx_collector.js +0 -50
  439. package/dest/services/tx_collection/slow_tx_collection.d.ts +0 -57
  440. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +0 -1
  441. package/dest/services/tx_collection/slow_tx_collection.js +0 -211
  442. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +0 -346
  443. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.ts +0 -43
  444. package/src/mem_pools/tx_pool/README.md +0 -270
  445. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -746
  446. package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +0 -132
  447. package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +0 -208
  448. package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +0 -162
  449. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +0 -104
  450. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +0 -93
  451. package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +0 -106
  452. package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +0 -75
  453. package/src/mem_pools/tx_pool/index.ts +0 -2
  454. package/src/mem_pools/tx_pool/priority.ts +0 -20
  455. package/src/mem_pools/tx_pool/tx_pool.ts +0 -141
  456. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +0 -319
  457. package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +0 -230
  458. package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +0 -161
  459. package/src/services/reqresp/protocols/block.ts +0 -37
  460. package/src/services/tx_collection/fast_tx_collection.ts +0 -387
  461. package/src/services/tx_collection/missing_txs_tracker.ts +0 -52
  462. package/src/services/tx_collection/proposal_tx_collector.ts +0 -113
  463. package/src/services/tx_collection/slow_tx_collection.ts +0 -266
@@ -1,16 +1,14 @@
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';
5
+ import { DateProvider } from '@aztec/foundation/timer';
7
6
  import { PeerErrorSeverity } from '@aztec/stdlib/p2p';
8
- import { Tx, TxArray, TxHash } from '@aztec/stdlib/tx';
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';
12
10
 
13
- import type { IMissingTxsTracker } from '../../tx_collection/missing_txs_tracker.js';
11
+ import type { IRequestTracker } from '../../tx_collection/request_tracker.js';
14
12
  import { ReqRespSubProtocol } from '.././interface.js';
15
13
  import { BlockTxsRequest, BlockTxsResponse, type BlockTxsSource } from '.././protocols/index.js';
16
14
  import { ReqRespStatus } from '.././status.js';
@@ -23,7 +21,7 @@ import {
23
21
  import type { BatchTxRequesterLibP2PService, BatchTxRequesterOptions, ITxMetadataCollection } from './interface.js';
24
22
  import { MissingTxMetadataCollection } from './missing_txs.js';
25
23
  import { type IPeerCollection, PeerCollection } from './peer_collection.js';
26
- import { BatchRequestTxValidator, type IBatchRequestTxValidator } from './tx_validator.js';
24
+ import { createBatchRequestTxValidator } from './tx_validator.js';
27
25
 
28
26
  /*
29
27
  * Tries to fetch all missing transaction until deadline is hit.
@@ -43,39 +41,35 @@ import { BatchRequestTxValidator, type IBatchRequestTxValidator } from './tx_val
43
41
  * - Is the peer which was unable to send us successful response N times in a row
44
42
  * */
45
43
  export class BatchTxRequester {
44
+ private readonly requestTracker: IRequestTracker;
46
45
  private readonly blockTxsSource: BlockTxsSource;
47
46
  private readonly pinnedPeer: PeerId | undefined;
48
- private readonly timeoutMs: number;
49
47
  private readonly p2pService: BatchTxRequesterLibP2PService;
50
48
  private readonly logger: Logger;
51
- private readonly dateProvider: DateProvider;
52
49
  private readonly opts: BatchTxRequesterOptions;
53
50
  private readonly peers: IPeerCollection;
54
51
  private readonly txsMetadata: ITxMetadataCollection;
55
- private readonly deadline: number;
56
52
  private readonly smartRequesterSemaphore: ISemaphore;
57
53
  private readonly txQueue: FifoMemoryQueue<Tx>;
58
- private readonly txValidator: IBatchRequestTxValidator;
54
+ private readonly txValidator: TxValidator;
59
55
  private readonly smartParallelWorkerCount: number;
60
56
  private readonly dumbParallelWorkerCount: number;
61
57
  private readonly txBatchSize: number;
62
58
 
63
59
  constructor(
64
- missingTxsTracker: IMissingTxsTracker,
60
+ requestTracker: IRequestTracker,
65
61
  blockTxsSource: BlockTxsSource,
66
62
  pinnedPeer: PeerId | undefined,
67
- timeoutMs: number,
68
63
  p2pService: BatchTxRequesterLibP2PService,
69
64
  logger?: Logger,
70
65
  dateProvider?: DateProvider,
71
66
  opts?: BatchTxRequesterOptions,
72
67
  ) {
68
+ this.requestTracker = requestTracker;
73
69
  this.blockTxsSource = blockTxsSource;
74
70
  this.pinnedPeer = pinnedPeer;
75
- this.timeoutMs = timeoutMs;
76
71
  this.p2pService = p2pService;
77
72
  this.logger = logger ?? createLogger('p2p:reqresp_batch');
78
- this.dateProvider = dateProvider ?? new DateProvider();
79
73
  this.opts = opts ?? {};
80
74
 
81
75
  this.smartParallelWorkerCount =
@@ -83,65 +77,53 @@ export class BatchTxRequester {
83
77
  this.dumbParallelWorkerCount =
84
78
  this.opts.dumbParallelWorkerCount ?? DEFAULT_BATCH_TX_REQUESTER_DUMB_PARALLEL_WORKER_COUNT;
85
79
  this.txBatchSize = this.opts.txBatchSize ?? DEFAULT_BATCH_TX_REQUESTER_TX_BATCH_SIZE;
86
- this.deadline = this.dateProvider.now() + this.timeoutMs;
87
80
  this.txQueue = new FifoMemoryQueue(this.logger);
88
- this.txValidator = this.opts.txValidator ?? new BatchRequestTxValidator(this.p2pService.txValidatorConfig);
81
+ this.txValidator = this.opts.txValidator ?? createBatchRequestTxValidator(this.p2pService.txValidatorConfig);
89
82
 
90
83
  if (this.opts.peerCollection) {
91
84
  this.peers = this.opts.peerCollection;
92
85
  } else {
93
- const initialPeers = this.p2pService.connectionSampler.getPeerListSortedByConnectionCountAsc();
94
86
  const badPeerThreshold = this.opts.badPeerThreshold ?? DEFAULT_BATCH_TX_REQUESTER_BAD_PEER_THRESHOLD;
95
87
  this.peers = new PeerCollection(
96
- initialPeers,
88
+ this.p2pService.connectionSampler,
97
89
  this.pinnedPeer,
98
- this.dateProvider,
90
+ dateProvider ?? new DateProvider(),
99
91
  badPeerThreshold,
100
92
  this.p2pService.peerScoring,
101
93
  );
102
94
  }
103
- this.txsMetadata = new MissingTxMetadataCollection(missingTxsTracker, this.txBatchSize);
95
+ this.txsMetadata = new MissingTxMetadataCollection(requestTracker, this.txBatchSize);
104
96
  this.smartRequesterSemaphore = this.opts.semaphore ?? new Semaphore(0);
105
97
  }
106
98
 
107
99
  /*
108
- * Fetches all missing transactions and yields them one by one
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();
@@ -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
@@ -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,14 +307,6 @@ 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
312
  const blockRequest = BlockTxsRequest.fromTxsSourceAndMissingTxs(this.blockTxsSource, txs);
@@ -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
  }
@@ -468,6 +428,15 @@ export class BatchTxRequester {
468
428
  }
469
429
 
470
430
  const blockResponse = BlockTxsResponse.fromBuffer(response.data);
431
+
432
+ // Validate response. Peers will be penalised by the validator if they send invalid response.
433
+ const isValid = await this.p2pService.validateRequestedBlockTxsConsistency(request, blockResponse, peerId);
434
+ if (!isValid) {
435
+ this.logger.debug(`Peer ${peerId.toString()} sent invalid response`);
436
+ this.handleFailResponseFromPeer(peerId, ReqRespStatus.INTERNAL_ERROR);
437
+ return;
438
+ }
439
+
471
440
  await this.handleSuccessResponseFromPeer(peerId, blockResponse);
472
441
  } catch (err: any) {
473
442
  this.logger.error(`Failed to get valid response from peer ${peerId.toString()}: ${err.message}`, {
@@ -485,13 +454,24 @@ export class BatchTxRequester {
485
454
  * Handles failed response form the peer
486
455
  * There are 3 scenarios
487
456
  * - RATE_LIMIT_EXCEEDED: We mark this and don't query this peer again for some_time
457
+ * - INTERNAL_ERROR: We use this to cover cases where the request-response consistency validation fails.
488
458
  * - FAILURE and UNKNOWN: We penalise this, if peer has been penalised this way N times they are not queried again
489
459
  * this implies we will query these peers couple of more times and give them a chance to "redeem" themselves before completely ignoring them
490
460
  */
491
461
  private handleFailResponseFromPeer(peerId: PeerId, responseStatus: ReqRespStatus) {
492
- //TODO: Should we ban these peers?
493
462
  if (responseStatus === ReqRespStatus.FAILURE || responseStatus === ReqRespStatus.UNKNOWN) {
494
463
  this.peers.penalisePeer(peerId, PeerErrorSeverity.HighToleranceError);
464
+ this.peers.markPeerDumb(peerId);
465
+ this.txsMetadata.clearPeerData(peerId);
466
+ return;
467
+ }
468
+
469
+ // NOT_FOUND means the peer pruned its block proposal — it can no longer serve
470
+ // index-based requests, but this is a legitimate state so we don't penalize.
471
+ // We use INTERNAL_ERROR to cover cases where the request-response consistency validation fails.
472
+ if (responseStatus === ReqRespStatus.NOT_FOUND || responseStatus === ReqRespStatus.INTERNAL_ERROR) {
473
+ this.peers.markPeerDumb(peerId);
474
+ this.txsMetadata.clearPeerData(peerId);
495
475
  return;
496
476
  }
497
477
 
@@ -516,7 +496,7 @@ export class BatchTxRequester {
516
496
  * Handles received txs.
517
497
  * Transactions are validated and then put on async queue
518
498
  * to be yielded by main running loop
519
- * */
499
+ */
520
500
  private async handleReceivedTxs(peerId: PeerId, txs: TxArray) {
521
501
  const newTxs = txs.filter(tx => !this.txsMetadata.alreadyFetched(tx.txHash));
522
502
 
@@ -524,12 +504,12 @@ export class BatchTxRequester {
524
504
  return;
525
505
  }
526
506
 
527
- //TODO: this validation can be slow, maybe spawn worker just for validation
507
+ // TODO: this validation can be slow, maybe spawn worker just for validation
528
508
  // We could use the async queue for communication.
529
509
  const validationResults = await Promise.allSettled(
530
510
  newTxs.map(async tx => ({
531
511
  tx,
532
- isValid: (await this.txValidator.validateRequestedTx(tx)).result === 'valid',
512
+ isValid: (await this.txValidator.validateTx(tx)).result === 'valid',
533
513
  })),
534
514
  );
535
515
 
@@ -545,6 +525,9 @@ export class BatchTxRequester {
545
525
  });
546
526
 
547
527
  if (hasInvalidTx) {
528
+ this.logger.warn(`Penalizing peer ${peerId.toString()} for sending invalid transactions in batch response`, {
529
+ peerId,
530
+ });
548
531
  this.peers.penalisePeer(peerId, PeerErrorSeverity.LowToleranceError);
549
532
  } else {
550
533
  // If we have received successful response from the peer, they have "redeemed" themselves and not considered bad anymore
@@ -581,10 +564,9 @@ export class BatchTxRequester {
581
564
  return;
582
565
  }
583
566
 
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)) {
567
+ const hasArchiveRootMismatch = this.blockTxsSource.archive.toString() !== response.archiveRoot.toString();
568
+ if (hasArchiveRootMismatch) {
569
+ this.handleArchiveRootMismatch(peerId, response);
588
570
  return;
589
571
  }
590
572
 
@@ -599,18 +581,28 @@ export class BatchTxRequester {
599
581
  this.markTxsPeerHas(peerId, response);
600
582
 
601
583
  // Unblock smart workers
602
- if (this.peers.getSmartPeersToQuery().length <= this.smartParallelWorkerCount) {
603
- this.smartRequesterSemaphore.release();
604
- }
584
+ this.smartRequesterSemaphore.release();
605
585
  }
606
586
 
607
- private isBlockResponseValid(response: BlockTxsResponse): boolean {
608
- const archiveRootsMatch = this.blockTxsSource.archive.toString() === response.archiveRoot.toString();
609
- const peerHasSomeTxsFromProposal = !response.txIndices.isEmpty();
610
- return archiveRootsMatch && peerHasSomeTxsFromProposal;
587
+ /**
588
+ * Handles an archive root mismatch between local state and peer response.
589
+ *
590
+ * - Response archive is Fr.ZERO (peer pruned proposal, legitimate): marks peer dumb.
591
+ * - Non-zero archive mismatch (malicious response): penalises + marks dumb.
592
+ */
593
+ private handleArchiveRootMismatch(peerId: PeerId, response: BlockTxsResponse): void {
594
+ if (!response.archiveRoot.isZero()) {
595
+ this.peers.penalisePeer(peerId, PeerErrorSeverity.LowToleranceError);
596
+ }
597
+
598
+ this.peers.markPeerDumb(peerId);
599
+ this.txsMetadata.clearPeerData(peerId);
611
600
  }
612
601
 
613
602
  private peerHasSomeTxsWeAreMissing(_peerId: PeerId, response: BlockTxsResponse): boolean {
603
+ if (response.txIndices.isEmpty()) {
604
+ return false;
605
+ }
614
606
  const txsPeerHas = new Set(this.extractHashesPeerHasFromResponse(response).map(h => h.toString()));
615
607
  return this.txsMetadata.getMissingTxHashes().intersection(txsPeerHas).size > 0;
616
608
  }
@@ -659,27 +651,14 @@ export class BatchTxRequester {
659
651
  }
660
652
 
661
653
  /*
662
- * @returns true if all missing txs have been fetched */
663
- private fetchedAllTxs() {
664
- return this.txsMetadata.getMissingTxHashes().size == 0;
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*/
654
+ * Checks if the BatchTxRequester should stop fetching missing txs.
655
+ * Delegates to requestTracker which covers: deadline hit, all txs fetched, or external cancellation. */
676
656
  private shouldStop() {
677
- const aborted = this.opts.abortSignal?.aborted ?? false;
678
- if (aborted) {
657
+ if (this.requestTracker.checkCancelled()) {
679
658
  this.unlockSmartRequesterSemaphores();
680
659
  }
681
660
 
682
- return aborted || this.fetchedAllTxs() || this.dateProvider.now() > this.deadline;
661
+ return this.requestTracker.checkCancelled();
683
662
  }
684
663
 
685
664
  /*
@@ -697,10 +676,9 @@ export class BatchTxRequester {
697
676
  * This ensures we don't sleep past the deadline.
698
677
  * */
699
678
  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));
679
+ if (this.requestTracker.checkCancelled()) {
680
+ return;
704
681
  }
682
+ await Promise.race([sleep(durationMs), this.requestTracker.cancellationToken]);
705
683
  }
706
684
  }
@@ -1,13 +1,14 @@
1
1
  import type { ISemaphore } from '@aztec/foundation/queue';
2
2
  import type { PeerErrorSeverity } from '@aztec/stdlib/p2p';
3
- import type { Tx, TxHash } from '@aztec/stdlib/tx';
3
+ import type { Tx, TxHash, TxValidator } from '@aztec/stdlib/tx';
4
4
 
5
5
  import type { PeerId } from '@libp2p/interface';
6
6
 
7
7
  import type { ConnectionSampler } from '../connection-sampler/connection_sampler.js';
8
+ import type { BlockTxsRequest, BlockTxsResponse } from '../index.js';
8
9
  import type { ReqRespInterface } from '../interface.js';
9
10
  import type { IPeerCollection } from './peer_collection.js';
10
- import type { BatchRequestTxValidatorConfig, IBatchRequestTxValidator } from './tx_validator.js';
11
+ import type { BatchRequestTxValidatorConfig } from './tx_validator.js';
11
12
 
12
13
  export interface IPeerPenalizer {
13
14
  penalizePeer(peerId: PeerId, penalty: PeerErrorSeverity): void;
@@ -23,6 +24,8 @@ export interface ITxMetadataCollection {
23
24
  alreadyFetched(txHash: TxHash): boolean;
24
25
  // Returns true if tx was marked as fetched, false if it was already marked as fetched
25
26
  markPeerHas(peerId: PeerId, txHashes: TxHash[]): void;
27
+ /** Remove all tx metadata associations for a peer (e.g. on demotion from smart to dumb). */
28
+ clearPeerData(peerId: PeerId): void;
26
29
  }
27
30
 
28
31
  /**
@@ -30,13 +33,19 @@ export interface ITxMetadataCollection {
30
33
  */
31
34
  export interface BatchTxRequesterLibP2PService {
32
35
  /** ReqResp interface for sending requests to peers */
33
- reqResp: Pick<ReqRespInterface, 'sendBatchRequest' | 'sendRequestToPeer'>;
36
+ reqResp: Pick<ReqRespInterface, 'sendRequestToPeer'>;
34
37
  /** Connection sampler for getting peer lists */
35
38
  connectionSampler: Pick<ConnectionSampler, 'getPeerListSortedByConnectionCountAsc'>;
36
39
  /** Configuration needed for transaction validation */
37
40
  txValidatorConfig: BatchRequestTxValidatorConfig;
38
41
  /** Peer scoring for penalizing peers */
39
42
  peerScoring: IPeerPenalizer;
43
+ /** Validate the requested block transactions request-response consistency */
44
+ validateRequestedBlockTxsConsistency: (
45
+ request: BlockTxsRequest,
46
+ response: BlockTxsResponse,
47
+ peerId: PeerId,
48
+ ) => Promise<boolean>;
40
49
  }
41
50
 
42
51
  export interface BatchTxRequesterOptions {
@@ -47,7 +56,6 @@ export interface BatchTxRequesterOptions {
47
56
  //Injectable for testing purposes
48
57
  semaphore?: ISemaphore;
49
58
  peerCollection?: IPeerCollection;
50
- abortSignal?: AbortSignal;
51
59
  /** Optional tx validator for testing - if not provided, one is created from p2pService.txValidatorConfig */
52
- txValidator?: IBatchRequestTxValidator;
60
+ txValidator?: TxValidator;
53
61
  }
@@ -2,7 +2,7 @@ import { type Tx, TxHash } from '@aztec/stdlib/tx';
2
2
 
3
3
  import type { PeerId } from '@libp2p/interface';
4
4
 
5
- import type { IMissingTxsTracker } from '../../tx_collection/missing_txs_tracker.js';
5
+ import type { IRequestTracker } from '../../tx_collection/request_tracker.js';
6
6
  import { DEFAULT_BATCH_TX_REQUESTER_TX_BATCH_SIZE } from './config.js';
7
7
  import type { ITxMetadataCollection } from './interface.js';
8
8
 
@@ -41,10 +41,10 @@ export class MissingTxMetadataCollection implements ITxMetadataCollection {
41
41
  private txMetadata = new Map<string, MissingTxMetadata>();
42
42
 
43
43
  constructor(
44
- private missingTxsTracker: IMissingTxsTracker,
44
+ private requestTracker: IRequestTracker,
45
45
  private readonly txBatchSize: number = DEFAULT_BATCH_TX_REQUESTER_TX_BATCH_SIZE,
46
46
  ) {
47
- missingTxsTracker.missingTxHashes.forEach(hash => this.txMetadata.set(hash, new MissingTxMetadata(hash)));
47
+ requestTracker.missingTxHashes.forEach(hash => this.txMetadata.set(hash, new MissingTxMetadata(hash)));
48
48
  }
49
49
 
50
50
  public getPrioritizingNotInFlightAndLowerRequestCount(txs: string[]): MissingTxMetadata[] {
@@ -65,7 +65,7 @@ export class MissingTxMetadataCollection implements ITxMetadataCollection {
65
65
  }
66
66
 
67
67
  public getMissingTxHashes(): Set<string> {
68
- return this.missingTxsTracker.missingTxHashes;
68
+ return this.requestTracker.missingTxHashes;
69
69
  }
70
70
 
71
71
  public getTxsPeerHas(peer: PeerId): Set<string> {
@@ -128,7 +128,7 @@ export class MissingTxMetadataCollection implements ITxMetadataCollection {
128
128
  }
129
129
 
130
130
  public alreadyFetched(txHash: TxHash): boolean {
131
- return !this.missingTxsTracker.isMissing(txHash.toString());
131
+ return !this.requestTracker.isMissing(txHash.toString());
132
132
  }
133
133
 
134
134
  public markFetched(peerId: PeerId, tx: Tx): boolean {
@@ -144,7 +144,7 @@ export class MissingTxMetadataCollection implements ITxMetadataCollection {
144
144
  }
145
145
 
146
146
  txMeta.peers.add(peerId.toString());
147
- return this.missingTxsTracker.markFetched(tx);
147
+ return this.requestTracker.markFetched(tx);
148
148
  }
149
149
 
150
150
  public markPeerHas(peerId: PeerId, txHash: TxHash[]) {
@@ -158,4 +158,11 @@ export class MissingTxMetadataCollection implements ITxMetadataCollection {
158
158
  }
159
159
  });
160
160
  }
161
+
162
+ public clearPeerData(peerId: PeerId) {
163
+ const peerIdStr = peerId.toString();
164
+ for (const txMeta of this.txMetadata.values()) {
165
+ txMeta.peers.delete(peerIdStr);
166
+ }
167
+ }
161
168
  }