@aztec/p2p 0.0.1-commit.993d52e → 0.0.1-commit.9badcec54

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 (331) hide show
  1. package/README.md +129 -3
  2. package/dest/client/factory.d.ts +2 -2
  3. package/dest/client/factory.d.ts.map +1 -1
  4. package/dest/client/factory.js +24 -10
  5. package/dest/client/interface.d.ts +9 -2
  6. package/dest/client/interface.d.ts.map +1 -1
  7. package/dest/client/p2p_client.d.ts +3 -2
  8. package/dest/client/p2p_client.d.ts.map +1 -1
  9. package/dest/client/p2p_client.js +46 -38
  10. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +17 -6
  11. package/dest/config.d.ts +124 -106
  12. package/dest/config.d.ts.map +1 -1
  13. package/dest/config.js +87 -38
  14. package/dest/errors/p2p-service.error.d.ts +9 -0
  15. package/dest/errors/p2p-service.error.d.ts.map +1 -0
  16. package/dest/errors/p2p-service.error.js +10 -0
  17. package/dest/index.d.ts +1 -2
  18. package/dest/index.d.ts.map +1 -1
  19. package/dest/index.js +0 -1
  20. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +7 -5
  21. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  22. package/dest/mem_pools/attestation_pool/attestation_pool.js +16 -9
  23. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +6 -6
  24. package/dest/mem_pools/index.d.ts +1 -2
  25. package/dest/mem_pools/index.d.ts.map +1 -1
  26. package/dest/mem_pools/instrumentation.d.ts +4 -2
  27. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  28. package/dest/mem_pools/instrumentation.js +16 -14
  29. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +1 -1
  30. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -1
  31. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +2 -1
  32. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +2 -2
  33. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +9 -5
  34. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
  35. package/dest/mem_pools/tx_pool_v2/interfaces.js +1 -0
  36. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +13 -7
  37. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
  38. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +13 -3
  39. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +1 -1
  40. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -1
  41. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +26 -43
  42. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +4 -2
  43. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -1
  44. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +6 -0
  45. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +2 -1
  46. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -1
  47. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +29 -5
  48. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +5 -2
  49. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  50. package/dest/msg_validators/attestation_validator/attestation_validator.js +20 -11
  51. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +4 -2
  52. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
  53. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +2 -2
  54. package/dest/msg_validators/clock_tolerance.d.ts +12 -1
  55. package/dest/msg_validators/clock_tolerance.d.ts.map +1 -1
  56. package/dest/msg_validators/clock_tolerance.js +54 -3
  57. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +6 -4
  58. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
  59. package/dest/msg_validators/proposal_validator/block_proposal_validator.js +10 -2
  60. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +6 -4
  61. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
  62. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +16 -2
  63. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +14 -9
  64. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
  65. package/dest/msg_validators/proposal_validator/proposal_validator.js +65 -55
  66. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +2 -1
  67. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -1
  68. package/dest/msg_validators/tx_validator/allowed_public_setup.js +24 -20
  69. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts +17 -0
  70. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts.map +1 -0
  71. package/dest/msg_validators/tx_validator/allowed_setup_helpers.js +24 -0
  72. package/dest/msg_validators/tx_validator/archive_cache.js +1 -1
  73. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts +9 -0
  74. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts.map +1 -0
  75. package/dest/msg_validators/tx_validator/contract_instance_validator.js +48 -0
  76. package/dest/msg_validators/tx_validator/data_validator.d.ts +1 -1
  77. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  78. package/dest/msg_validators/tx_validator/data_validator.js +35 -2
  79. package/dest/msg_validators/tx_validator/factory.d.ts +23 -4
  80. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  81. package/dest/msg_validators/tx_validator/factory.js +36 -10
  82. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +1 -1
  83. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -1
  84. package/dest/msg_validators/tx_validator/fee_payer_balance.js +6 -2
  85. package/dest/msg_validators/tx_validator/gas_validator.d.ts +13 -4
  86. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  87. package/dest/msg_validators/tx_validator/gas_validator.js +49 -17
  88. package/dest/msg_validators/tx_validator/index.d.ts +2 -1
  89. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  90. package/dest/msg_validators/tx_validator/index.js +1 -0
  91. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +1 -1
  92. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  93. package/dest/msg_validators/tx_validator/metadata_validator.js +4 -4
  94. package/dest/msg_validators/tx_validator/phases_validator.d.ts +22 -2
  95. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
  96. package/dest/msg_validators/tx_validator/phases_validator.js +72 -24
  97. package/dest/services/data_store.d.ts +1 -1
  98. package/dest/services/data_store.d.ts.map +1 -1
  99. package/dest/services/data_store.js +5 -5
  100. package/dest/services/dummy_service.d.ts +6 -3
  101. package/dest/services/dummy_service.d.ts.map +1 -1
  102. package/dest/services/dummy_service.js +6 -1
  103. package/dest/services/encoding.d.ts +5 -1
  104. package/dest/services/encoding.d.ts.map +1 -1
  105. package/dest/services/encoding.js +7 -1
  106. package/dest/services/gossipsub/topic_score_params.d.ts +13 -2
  107. package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -1
  108. package/dest/services/gossipsub/topic_score_params.js +21 -4
  109. package/dest/services/libp2p/instrumentation.d.ts +3 -1
  110. package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
  111. package/dest/services/libp2p/instrumentation.js +14 -0
  112. package/dest/services/libp2p/libp2p_service.d.ts +15 -25
  113. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  114. package/dest/services/libp2p/libp2p_service.js +176 -127
  115. package/dest/services/peer-manager/metrics.d.ts +3 -1
  116. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  117. package/dest/services/peer-manager/metrics.js +6 -0
  118. package/dest/services/peer-manager/peer_manager.d.ts +6 -2
  119. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  120. package/dest/services/peer-manager/peer_manager.js +39 -11
  121. package/dest/services/peer-manager/peer_scoring.d.ts +7 -2
  122. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  123. package/dest/services/peer-manager/peer_scoring.js +32 -10
  124. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +11 -8
  125. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -1
  126. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +82 -101
  127. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +3 -2
  128. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
  129. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +5 -4
  130. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -1
  131. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +13 -7
  132. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +19 -11
  133. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -1
  134. package/dest/services/reqresp/batch-tx-requester/peer_collection.js +52 -15
  135. package/dest/services/reqresp/config.d.ts +3 -3
  136. package/dest/services/reqresp/config.d.ts.map +1 -1
  137. package/dest/services/reqresp/interface.d.ts +14 -9
  138. package/dest/services/reqresp/interface.d.ts.map +1 -1
  139. package/dest/services/reqresp/interface.js +10 -11
  140. package/dest/services/reqresp/metrics.d.ts +1 -1
  141. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  142. package/dest/services/reqresp/metrics.js +0 -1
  143. package/dest/services/reqresp/protocols/index.d.ts +1 -2
  144. package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
  145. package/dest/services/reqresp/protocols/index.js +0 -1
  146. package/dest/services/reqresp/protocols/tx.d.ts +1 -1
  147. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  148. package/dest/services/reqresp/protocols/tx.js +1 -3
  149. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +5 -4
  150. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
  151. package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -8
  152. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
  153. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
  154. package/dest/services/reqresp/rate-limiter/rate_limits.js +0 -10
  155. package/dest/services/reqresp/reqresp.d.ts +4 -2
  156. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  157. package/dest/services/reqresp/reqresp.js +30 -12
  158. package/dest/services/service.d.ts +5 -2
  159. package/dest/services/service.d.ts.map +1 -1
  160. package/dest/services/tx_collection/fast_tx_collection.d.ts +1 -4
  161. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
  162. package/dest/services/tx_collection/fast_tx_collection.js +57 -73
  163. package/dest/services/tx_collection/file_store_tx_source.d.ts +5 -4
  164. package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -1
  165. package/dest/services/tx_collection/file_store_tx_source.js +39 -29
  166. package/dest/services/tx_collection/proposal_tx_collector.d.ts +6 -7
  167. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -1
  168. package/dest/services/tx_collection/proposal_tx_collector.js +4 -4
  169. package/dest/services/tx_collection/request_tracker.d.ts +53 -0
  170. package/dest/services/tx_collection/request_tracker.d.ts.map +1 -0
  171. package/dest/services/tx_collection/request_tracker.js +84 -0
  172. package/dest/services/tx_collection/slow_tx_collection.js +1 -1
  173. package/dest/services/tx_collection/tx_collection.d.ts +3 -6
  174. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  175. package/dest/services/tx_collection/tx_source.d.ts +6 -5
  176. package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
  177. package/dest/services/tx_collection/tx_source.js +9 -7
  178. package/dest/test-helpers/make-test-p2p-clients.d.ts +1 -1
  179. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  180. package/dest/test-helpers/mock-pubsub.d.ts +11 -3
  181. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  182. package/dest/test-helpers/mock-pubsub.js +35 -10
  183. package/dest/test-helpers/reqresp-nodes.d.ts +1 -1
  184. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  185. package/dest/test-helpers/reqresp-nodes.js +1 -2
  186. package/dest/test-helpers/testbench-utils.d.ts +1 -1
  187. package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
  188. package/dest/test-helpers/testbench-utils.js +23 -3
  189. package/dest/testbench/p2p_client_testbench_worker.js +68 -16
  190. package/dest/testbench/worker_client_manager.d.ts +10 -1
  191. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  192. package/dest/testbench/worker_client_manager.js +55 -3
  193. package/dest/util.d.ts +1 -1
  194. package/package.json +14 -14
  195. package/src/client/factory.ts +43 -14
  196. package/src/client/interface.ts +9 -1
  197. package/src/client/p2p_client.ts +50 -39
  198. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +19 -9
  199. package/src/config.ts +129 -45
  200. package/src/errors/p2p-service.error.ts +11 -0
  201. package/src/index.ts +0 -1
  202. package/src/mem_pools/attestation_pool/attestation_pool.ts +17 -12
  203. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +6 -6
  204. package/src/mem_pools/index.ts +0 -3
  205. package/src/mem_pools/instrumentation.ts +17 -13
  206. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +2 -1
  207. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +3 -3
  208. package/src/mem_pools/tx_pool_v2/interfaces.ts +9 -4
  209. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +23 -7
  210. package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +29 -43
  211. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +16 -1
  212. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +31 -5
  213. package/src/msg_validators/attestation_validator/README.md +49 -0
  214. package/src/msg_validators/attestation_validator/attestation_validator.ts +21 -9
  215. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +4 -1
  216. package/src/msg_validators/clock_tolerance.ts +72 -3
  217. package/src/msg_validators/proposal_validator/README.md +123 -0
  218. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +17 -4
  219. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +23 -7
  220. package/src/msg_validators/proposal_validator/proposal_validator.ts +74 -58
  221. package/src/msg_validators/tx_validator/README.md +5 -1
  222. package/src/msg_validators/tx_validator/allowed_public_setup.ts +22 -27
  223. package/src/msg_validators/tx_validator/allowed_setup_helpers.ts +31 -0
  224. package/src/msg_validators/tx_validator/archive_cache.ts +1 -1
  225. package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
  226. package/src/msg_validators/tx_validator/data_validator.ts +42 -1
  227. package/src/msg_validators/tx_validator/factory.ts +43 -3
  228. package/src/msg_validators/tx_validator/fee_payer_balance.ts +6 -2
  229. package/src/msg_validators/tx_validator/gas_validator.ts +65 -16
  230. package/src/msg_validators/tx_validator/index.ts +1 -0
  231. package/src/msg_validators/tx_validator/metadata_validator.ts +12 -4
  232. package/src/msg_validators/tx_validator/phases_validator.ts +82 -27
  233. package/src/services/data_store.ts +5 -13
  234. package/src/services/dummy_service.ts +8 -2
  235. package/src/services/encoding.ts +9 -1
  236. package/src/services/gossipsub/topic_score_params.ts +36 -4
  237. package/src/services/libp2p/instrumentation.ts +14 -0
  238. package/src/services/libp2p/libp2p_service.ts +175 -143
  239. package/src/services/peer-manager/metrics.ts +7 -0
  240. package/src/services/peer-manager/peer_manager.ts +45 -11
  241. package/src/services/peer-manager/peer_scoring.ts +27 -5
  242. package/src/services/reqresp/README.md +229 -0
  243. package/src/services/reqresp/batch-tx-requester/README.md +46 -7
  244. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +78 -111
  245. package/src/services/reqresp/batch-tx-requester/interface.ts +2 -1
  246. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +13 -6
  247. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +68 -24
  248. package/src/services/reqresp/config.ts +2 -2
  249. package/src/services/reqresp/interface.ts +21 -11
  250. package/src/services/reqresp/metrics.ts +0 -1
  251. package/src/services/reqresp/protocols/index.ts +0 -1
  252. package/src/services/reqresp/protocols/tx.ts +1 -3
  253. package/src/services/reqresp/rate-limiter/rate_limiter.ts +13 -9
  254. package/src/services/reqresp/rate-limiter/rate_limits.ts +0 -10
  255. package/src/services/reqresp/reqresp.ts +40 -13
  256. package/src/services/service.ts +6 -1
  257. package/src/services/tx_collection/fast_tx_collection.ts +57 -83
  258. package/src/services/tx_collection/file_store_tx_source.ts +43 -31
  259. package/src/services/tx_collection/proposal_tx_collector.ts +8 -13
  260. package/src/services/tx_collection/request_tracker.ts +127 -0
  261. package/src/services/tx_collection/slow_tx_collection.ts +1 -1
  262. package/src/services/tx_collection/tx_collection.ts +3 -5
  263. package/src/services/tx_collection/tx_source.ts +8 -7
  264. package/src/test-helpers/make-test-p2p-clients.ts +1 -1
  265. package/src/test-helpers/mock-pubsub.ts +31 -5
  266. package/src/test-helpers/reqresp-nodes.ts +3 -3
  267. package/src/test-helpers/testbench-utils.ts +30 -3
  268. package/src/testbench/p2p_client_testbench_worker.ts +72 -15
  269. package/src/testbench/worker_client_manager.ts +68 -6
  270. package/src/util.ts +1 -1
  271. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +0 -125
  272. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +0 -1
  273. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +0 -596
  274. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +0 -32
  275. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +0 -1
  276. package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +0 -112
  277. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +0 -157
  278. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +0 -1
  279. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +0 -52
  280. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +0 -16
  281. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +0 -1
  282. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +0 -122
  283. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +0 -17
  284. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +0 -1
  285. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +0 -84
  286. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +0 -19
  287. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +0 -1
  288. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +0 -78
  289. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +0 -26
  290. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +0 -1
  291. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +0 -84
  292. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +0 -25
  293. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +0 -1
  294. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +0 -57
  295. package/dest/mem_pools/tx_pool/index.d.ts +0 -3
  296. package/dest/mem_pools/tx_pool/index.d.ts.map +0 -1
  297. package/dest/mem_pools/tx_pool/index.js +0 -2
  298. package/dest/mem_pools/tx_pool/priority.d.ts +0 -12
  299. package/dest/mem_pools/tx_pool/priority.d.ts.map +0 -1
  300. package/dest/mem_pools/tx_pool/priority.js +0 -15
  301. package/dest/mem_pools/tx_pool/tx_pool.d.ts +0 -127
  302. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +0 -1
  303. package/dest/mem_pools/tx_pool/tx_pool.js +0 -3
  304. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +0 -7
  305. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +0 -1
  306. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +0 -400
  307. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +0 -24
  308. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +0 -1
  309. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +0 -378
  310. package/dest/services/reqresp/protocols/block.d.ts +0 -9
  311. package/dest/services/reqresp/protocols/block.d.ts.map +0 -1
  312. package/dest/services/reqresp/protocols/block.js +0 -32
  313. package/dest/services/tx_collection/missing_txs_tracker.d.ts +0 -32
  314. package/dest/services/tx_collection/missing_txs_tracker.d.ts.map +0 -1
  315. package/dest/services/tx_collection/missing_txs_tracker.js +0 -27
  316. package/src/mem_pools/tx_pool/README.md +0 -270
  317. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -746
  318. package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +0 -132
  319. package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +0 -208
  320. package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +0 -162
  321. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +0 -104
  322. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +0 -93
  323. package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +0 -106
  324. package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +0 -75
  325. package/src/mem_pools/tx_pool/index.ts +0 -2
  326. package/src/mem_pools/tx_pool/priority.ts +0 -20
  327. package/src/mem_pools/tx_pool/tx_pool.ts +0 -141
  328. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +0 -319
  329. package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +0 -373
  330. package/src/services/reqresp/protocols/block.ts +0 -37
  331. package/src/services/tx_collection/missing_txs_tracker.ts +0 -52
@@ -1,7 +1,8 @@
1
+ import { partitionAsync } from '@aztec/foundation/collection';
1
2
  import { type Logger, createLogger } from '@aztec/foundation/log';
2
3
  import { Timer } from '@aztec/foundation/timer';
3
4
  import { type ReadOnlyFileStore, createReadOnlyFileStore } from '@aztec/stdlib/file-store';
4
- import { Tx, type TxHash } from '@aztec/stdlib/tx';
5
+ import { Tx, type TxHash, type TxValidator } from '@aztec/stdlib/tx';
5
6
  import {
6
7
  type Histogram,
7
8
  Metrics,
@@ -23,6 +24,7 @@ export class FileStoreTxSource implements TxSource {
23
24
  private readonly fileStore: ReadOnlyFileStore,
24
25
  private readonly baseUrl: string,
25
26
  private readonly basePath: string,
27
+ private readonly txValidator: TxValidator,
26
28
  private readonly log: Logger,
27
29
  telemetry: TelemetryClient,
28
30
  ) {
@@ -44,6 +46,7 @@ export class FileStoreTxSource implements TxSource {
44
46
  public static async create(
45
47
  url: string,
46
48
  basePath: string,
49
+ txValidator: TxValidator,
47
50
  log: Logger = createLogger('p2p:file_store_tx_source'),
48
51
  telemetry: TelemetryClient = getTelemetryClient(),
49
52
  ): Promise<FileStoreTxSource | undefined> {
@@ -53,7 +56,7 @@ export class FileStoreTxSource implements TxSource {
53
56
  log.warn(`Failed to create file store for URL: ${url}`);
54
57
  return undefined;
55
58
  }
56
- return new FileStoreTxSource(fileStore, url, basePath, log, telemetry);
59
+ return new FileStoreTxSource(fileStore, url, basePath, txValidator, log, telemetry);
57
60
  } catch (err) {
58
61
  log.warn(`Error creating file store for URL: ${url}`, { error: err });
59
62
  return undefined;
@@ -65,35 +68,41 @@ export class FileStoreTxSource implements TxSource {
65
68
  }
66
69
 
67
70
  public async getTxsByHash(txHashes: TxHash[]): Promise<TxSourceCollectionResult> {
68
- const invalidTxHashes: string[] = [];
71
+ const results = await Promise.all(
72
+ txHashes.map(async txHash => {
73
+ const path = `${this.basePath}/txs/${txHash.toString()}.bin`;
74
+ const timer = new Timer();
75
+ try {
76
+ const buffer = await this.fileStore.read(path);
77
+ const tx = Tx.fromBuffer(buffer);
78
+ return { tx, downloadDuration: timer.ms(), downloadSize: buffer.length };
79
+ } catch {
80
+ this.downloadsFailed.add(1);
81
+ return undefined;
82
+ }
83
+ }),
84
+ );
85
+
86
+ const txs = results.filter(tx => tx !== undefined);
87
+ const [validTxs, invalidTxs] = await partitionAsync(
88
+ txs,
89
+ async ({ tx, downloadDuration, downloadSize }): Promise<boolean> => {
90
+ const valid = await this.txValidator.validateTx(tx);
91
+ if (valid.result === 'valid') {
92
+ this.downloadsSuccess.add(1);
93
+ this.downloadDuration.record(Math.ceil(downloadDuration));
94
+ this.downloadSize.record(downloadSize);
95
+ return true;
96
+ } else {
97
+ this.downloadsFailed.add(1);
98
+ return false;
99
+ }
100
+ },
101
+ );
102
+
69
103
  return {
70
- validTxs: (
71
- await Promise.all(
72
- txHashes.map(async txHash => {
73
- const path = `${this.basePath}/txs/${txHash.toString()}.bin`;
74
- const timer = new Timer();
75
- try {
76
- const buffer = await this.fileStore.read(path);
77
- const tx = Tx.fromBuffer(buffer);
78
- if ((await tx.validateTxHash()) && txHash.equals(tx.txHash)) {
79
- this.downloadsSuccess.add(1);
80
- this.downloadDuration.record(Math.ceil(timer.ms()));
81
- this.downloadSize.record(buffer.length);
82
- return tx;
83
- } else {
84
- invalidTxHashes.push(tx.txHash.toString());
85
- this.downloadsFailed.add(1);
86
- return undefined;
87
- }
88
- } catch {
89
- // Tx not found or error reading - return undefined
90
- this.downloadsFailed.add(1);
91
- return undefined;
92
- }
93
- }),
94
- )
95
- ).filter(tx => tx !== undefined),
96
- invalidTxHashes: invalidTxHashes,
104
+ validTxs: validTxs.map(({ tx }) => tx),
105
+ invalidTxHashes: invalidTxs.map(({ tx }) => tx.getTxHash().toString()),
97
106
  };
98
107
  }
99
108
  }
@@ -109,9 +118,12 @@ export class FileStoreTxSource implements TxSource {
109
118
  export async function createFileStoreTxSources(
110
119
  urls: string[],
111
120
  basePath: string,
121
+ txValidator: TxValidator,
112
122
  log: Logger = createLogger('p2p:file_store_tx_source'),
113
123
  telemetry: TelemetryClient = getTelemetryClient(),
114
124
  ): Promise<FileStoreTxSource[]> {
115
- const sources = await Promise.all(urls.map(url => FileStoreTxSource.create(url, basePath, log, telemetry)));
125
+ const sources = await Promise.all(
126
+ urls.map(url => FileStoreTxSource.create(url, basePath, txValidator, log, telemetry)),
127
+ );
116
128
  return sources.filter((s): s is FileStoreTxSource => s !== undefined);
117
129
  }
@@ -9,7 +9,7 @@ import type { BatchTxRequesterConfig } from '../reqresp/batch-tx-requester/confi
9
9
  import type { BatchTxRequesterLibP2PService } from '../reqresp/batch-tx-requester/interface.js';
10
10
  import type { IBatchRequestTxValidator } from '../reqresp/batch-tx-requester/tx_validator.js';
11
11
  import { type BlockTxsSource, ReqRespSubProtocol, chunkTxHashesRequest } from '../reqresp/index.js';
12
- import type { IMissingTxsTracker } from './missing_txs_tracker.js';
12
+ import type { IRequestTracker } from './request_tracker.js';
13
13
 
14
14
  /**
15
15
  * Strategy interface for collecting missing transactions for a block or proposal.
@@ -18,17 +18,15 @@ import type { IMissingTxsTracker } from './missing_txs_tracker.js';
18
18
  export interface MissingTxsCollector {
19
19
  /**
20
20
  * Collect missing transactions for a block or proposal.
21
- * @param missingTxsTracker - The missing transactions tracker
21
+ * @param requestTracker - The missing transactions tracker
22
22
  * @param blockTxsSource - The block or proposal containing the transactions
23
23
  * @param pinnedPeer - Optional peer expected to have the transactions
24
- * @param timeoutMs - Timeout in milliseconds
25
24
  * @returns The collected transactions
26
25
  */
27
26
  collectTxs(
28
- missingTxsTracker: IMissingTxsTracker,
27
+ requestTracker: IRequestTracker,
29
28
  blockTxsSource: BlockTxsSource,
30
29
  pinnedPeer: PeerId | undefined,
31
- timeoutMs: number,
32
30
  ): Promise<Tx[]>;
33
31
  }
34
32
 
@@ -46,10 +44,9 @@ export class BatchTxRequesterCollector implements MissingTxsCollector {
46
44
  ) {}
47
45
 
48
46
  async collectTxs(
49
- missingTxsTracker: IMissingTxsTracker,
47
+ requestTracker: IRequestTracker,
50
48
  blockTxsSource: BlockTxsSource,
51
49
  pinnedPeer: PeerId | undefined,
52
- timeoutMs: number,
53
50
  ): Promise<Tx[]> {
54
51
  const {
55
52
  batchTxRequesterSmartParallelWorkerCount: smartParallelWorkerCount,
@@ -59,10 +56,9 @@ export class BatchTxRequesterCollector implements MissingTxsCollector {
59
56
  } = this.batchTxRequesterConfig ?? {};
60
57
 
61
58
  const batchRequester = new BatchTxRequester(
62
- missingTxsTracker,
59
+ requestTracker,
63
60
  blockTxsSource,
64
61
  pinnedPeer,
65
- timeoutMs,
66
62
  this.p2pService,
67
63
  this.log,
68
64
  this.dateProvider,
@@ -94,16 +90,15 @@ export class SendBatchRequestCollector implements MissingTxsCollector {
94
90
  ) {}
95
91
 
96
92
  async collectTxs(
97
- missingTxsTracker: IMissingTxsTracker,
93
+ requestTracker: IRequestTracker,
98
94
  _blockTxsSource: BlockTxsSource,
99
95
  pinnedPeer: PeerId | undefined,
100
- timeoutMs: number,
101
96
  ): Promise<Tx[]> {
102
97
  const txs = await this.p2pService.reqResp.sendBatchRequest<ReqRespSubProtocol.TX>(
103
98
  ReqRespSubProtocol.TX,
104
- chunkTxHashesRequest(Array.from(missingTxsTracker.missingTxHashes).map(TxHash.fromString)),
99
+ chunkTxHashesRequest(Array.from(requestTracker.missingTxHashes).map(TxHash.fromString)),
105
100
  pinnedPeer,
106
- timeoutMs,
101
+ requestTracker.timeoutMs,
107
102
  this.maxPeers,
108
103
  this.maxRetryAttempts,
109
104
  );
@@ -0,0 +1,127 @@
1
+ import { type PromiseWithResolvers, promiseWithResolvers } from '@aztec/foundation/promise';
2
+ import type { DateProvider } from '@aztec/foundation/timer';
3
+ import { TxHash } from '@aztec/stdlib/tx';
4
+ import type { Tx } from '@aztec/stdlib/tx';
5
+
6
+ /**
7
+ * Tracks which transactions are still missing and need to be fetched.
8
+ * Manages the request deadline and serves as the sole source of cancellation signal.
9
+ * The request is cancelled when all txs are fetched or the deadline expires.
10
+ */
11
+ export interface IRequestTracker {
12
+ /** Returns the set of transaction hashes that are still missing. */
13
+ get missingTxHashes(): Set<string>;
14
+ /** Size of this.missingTxHashes */
15
+ get numberOfMissingTxs(): number;
16
+ /** Are all requested txs fetched */
17
+ allFetched(): boolean;
18
+ /** Checks that transaction is still missing */
19
+ isMissing(txHash: string): boolean;
20
+ /** Marks a transaction as fetched. Returns true if it was previously missing. */
21
+ markFetched(tx: Tx): boolean;
22
+ /** Get list of collected txs */
23
+ get collectedTxs(): Tx[];
24
+ /** The deadline for this request. */
25
+ get deadline(): Date;
26
+ /** Remaining time in milliseconds until deadline. Returns 0 if already past. */
27
+ get timeoutMs(): number;
28
+ /** Checks whether the request is cancelled (deadline expired or all fetched). May trigger cancellation if deadline has passed. */
29
+ checkCancelled(): boolean;
30
+ /** Resolves when deadline expires or all txs are fetched. */
31
+ get cancellationToken(): Promise<void>;
32
+ /** Externally cancel the request. */
33
+ cancel(): void;
34
+ }
35
+
36
+ export class RequestTracker implements IRequestTracker {
37
+ public readonly collectedTxs: Tx[] = [];
38
+ private done = false;
39
+ private readonly cancellationTokenPromise: PromiseWithResolvers<void>;
40
+ private readonly deadlineTimer: ReturnType<typeof setTimeout> | undefined;
41
+
42
+ private constructor(
43
+ public readonly missingTxHashes: Set<string>,
44
+ public readonly deadline: Date,
45
+ private readonly dateProvider?: DateProvider,
46
+ ) {
47
+ this.cancellationTokenPromise = promiseWithResolvers<void>();
48
+
49
+ if (missingTxHashes.size === 0) {
50
+ this.finish();
51
+ return;
52
+ }
53
+
54
+ const now = this.dateProvider?.now() ?? Date.now();
55
+ const remaining = deadline.getTime() - now;
56
+ if (remaining <= 0) {
57
+ this.finish();
58
+ } else {
59
+ this.deadlineTimer = setTimeout(() => this.finish(), remaining);
60
+ }
61
+ }
62
+
63
+ public static create(hashes: TxHash[] | string[], deadline: Date, dateProvider?: DateProvider) {
64
+ return new RequestTracker(new Set(hashes.map(hash => hash.toString())), deadline, dateProvider);
65
+ }
66
+
67
+ markFetched(tx: Tx): boolean {
68
+ if (this.missingTxHashes.delete(tx.txHash.toString())) {
69
+ this.collectedTxs.push(tx);
70
+ if (this.allFetched()) {
71
+ this.finish();
72
+ }
73
+ return true;
74
+ }
75
+ return false;
76
+ }
77
+
78
+ get numberOfMissingTxs(): number {
79
+ return this.missingTxHashes.size;
80
+ }
81
+
82
+ allFetched(): boolean {
83
+ return this.numberOfMissingTxs === 0;
84
+ }
85
+
86
+ isMissing(txHash: string): boolean {
87
+ return this.missingTxHashes.has(txHash.toString());
88
+ }
89
+
90
+ get timeoutMs(): number {
91
+ const now = this.dateProvider?.now() ?? Date.now();
92
+ return Math.max(0, this.deadline.getTime() - now);
93
+ }
94
+
95
+ checkCancelled(): boolean {
96
+ if (this.done) {
97
+ return true;
98
+ }
99
+ // Synchronous fallback: check deadline even if setTimeout hasn't fired yet.
100
+ // This prevents macrotask starvation in tight async loops from blocking cancellation.
101
+ const now = this.dateProvider?.now() ?? Date.now();
102
+ if (now >= this.deadline.getTime()) {
103
+ this.finish();
104
+ return true;
105
+ }
106
+ return false;
107
+ }
108
+
109
+ get cancellationToken(): Promise<void> {
110
+ return this.cancellationTokenPromise.promise;
111
+ }
112
+
113
+ cancel(): void {
114
+ this.finish();
115
+ }
116
+
117
+ private finish() {
118
+ if (this.done) {
119
+ return;
120
+ }
121
+ this.done = true;
122
+ if (this.deadlineTimer) {
123
+ clearTimeout(this.deadlineTimer);
124
+ }
125
+ this.cancellationTokenPromise.resolve();
126
+ }
127
+ }
@@ -196,7 +196,7 @@ export class SlowTxCollection {
196
196
  // from mined unproven blocks it has seen in the past.
197
197
  const fastRequests = this.fastCollection.getFastCollectionRequests();
198
198
  const fastCollectionTxs: Set<string> = new Set(
199
- fastRequests.values().flatMap(r => Array.from(r.missingTxTracker.missingTxHashes)),
199
+ fastRequests.values().flatMap(r => Array.from(r.requestTracker.missingTxHashes)),
200
200
  );
201
201
 
202
202
  // Return all missing txs that are not in fastCollectionTxs and are ready for reqresp if requested
@@ -1,7 +1,7 @@
1
1
  import { BlockNumber } from '@aztec/foundation/branded-types';
2
2
  import { compactArray } from '@aztec/foundation/collection';
3
3
  import { type Logger, createLogger } from '@aztec/foundation/log';
4
- import { type PromiseWithResolvers, RunningPromise } from '@aztec/foundation/promise';
4
+ import { RunningPromise } from '@aztec/foundation/promise';
5
5
  import { sleep } from '@aztec/foundation/sleep';
6
6
  import { DateProvider } from '@aztec/foundation/timer';
7
7
  import type { L2Block, L2BlockInfo } from '@aztec/stdlib/block';
@@ -19,7 +19,7 @@ import type { TxCollectionConfig } from './config.js';
19
19
  import { FastTxCollection } from './fast_tx_collection.js';
20
20
  import { FileStoreTxCollection } from './file_store_tx_collection.js';
21
21
  import type { FileStoreTxSource } from './file_store_tx_source.js';
22
- import type { IMissingTxsTracker } from './missing_txs_tracker.js';
22
+ import type { IRequestTracker } from './request_tracker.js';
23
23
  import { SlowTxCollection, getProofDeadlineForSlot } from './slow_tx_collection.js';
24
24
  import { type TxAddContext, TxCollectionSink } from './tx_collection_sink.js';
25
25
  import type { TxSource } from './tx_source.js';
@@ -33,10 +33,8 @@ export type FastCollectionRequestInput =
33
33
  | { type: 'proposal'; blockProposal: BlockProposal; blockNumber: BlockNumber };
34
34
 
35
35
  export type FastCollectionRequest = FastCollectionRequestInput & {
36
- missingTxTracker: IMissingTxsTracker;
37
- deadline: Date;
36
+ requestTracker: IRequestTracker;
38
37
  blockInfo: L2BlockInfo;
39
- promise: PromiseWithResolvers<void>;
40
38
  };
41
39
 
42
40
  /**
@@ -2,7 +2,7 @@ import { getVKTreeRoot } from '@aztec/noir-protocol-circuits-types/vk-tree';
2
2
  import { protocolContractsHash } from '@aztec/protocol-contracts';
3
3
  import type { ChainConfig } from '@aztec/stdlib/config';
4
4
  import { type AztecNode, createAztecNodeClient } from '@aztec/stdlib/interfaces/client';
5
- import type { Tx, TxHash } from '@aztec/stdlib/tx';
5
+ import type { Tx, TxHash, TxValidator } from '@aztec/stdlib/tx';
6
6
  import { type ComponentsVersions, getComponentsVersionsFromConfig } from '@aztec/stdlib/versioning';
7
7
  import { makeTracedFetch } from '@aztec/telemetry-client';
8
8
 
@@ -16,12 +16,13 @@ export interface TxSource {
16
16
  export class NodeRpcTxSource implements TxSource {
17
17
  constructor(
18
18
  private readonly client: Pick<AztecNode, 'getTxsByHash'>,
19
+ private readonly txValidator: TxValidator,
19
20
  private readonly info: string,
20
21
  ) {}
21
22
 
22
- public static fromUrl(nodeUrl: string, versions: ComponentsVersions): NodeRpcTxSource {
23
+ public static fromUrl(nodeUrl: string, txValidator: TxValidator, versions: ComponentsVersions): NodeRpcTxSource {
23
24
  const client = createAztecNodeClient(nodeUrl, versions, makeTracedFetch([1, 2, 3], false));
24
- return new NodeRpcTxSource(client, nodeUrl);
25
+ return new NodeRpcTxSource(client, txValidator, nodeUrl);
25
26
  }
26
27
 
27
28
  public getInfo() {
@@ -38,8 +39,8 @@ export class NodeRpcTxSource implements TxSource {
38
39
  const invalidTxHashes: string[] = [];
39
40
  await Promise.all(
40
41
  txs.map(async tx => {
41
- const isValid = await tx.validateTxHash();
42
- if (isValid) {
42
+ const validation = await this.txValidator.validateTx(tx);
43
+ if (validation.result === 'valid') {
43
44
  validTxs.push(tx);
44
45
  } else {
45
46
  invalidTxHashes.push(tx.getTxHash().toString());
@@ -50,7 +51,7 @@ export class NodeRpcTxSource implements TxSource {
50
51
  }
51
52
  }
52
53
 
53
- export function createNodeRpcTxSources(urls: string[], chainConfig: ChainConfig) {
54
+ export function createNodeRpcTxSources(urls: string[], txValidator: TxValidator, chainConfig: ChainConfig) {
54
55
  const versions = getComponentsVersionsFromConfig(chainConfig, protocolContractsHash, getVKTreeRoot());
55
- return urls.map(url => NodeRpcTxSource.fromUrl(url, versions));
56
+ return urls.map(url => NodeRpcTxSource.fromUrl(url, txValidator, versions));
56
57
  }
@@ -4,9 +4,9 @@ import { SecretValue } from '@aztec/foundation/config';
4
4
  import { type Logger, createLogger } from '@aztec/foundation/log';
5
5
  import { retryUntil } from '@aztec/foundation/retry';
6
6
  import { sleep } from '@aztec/foundation/sleep';
7
- import type { DataStoreConfig } from '@aztec/kv-store/config';
8
7
  import { openTmpStore } from '@aztec/kv-store/lmdb-v2';
9
8
  import type { WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
9
+ import type { DataStoreConfig } from '@aztec/stdlib/kv-store';
10
10
 
11
11
  import { createP2PClient } from '../client/index.js';
12
12
  import type { P2PClient } from '../client/p2p_client.js';
@@ -1,5 +1,6 @@
1
1
  import type { EpochCacheInterface } from '@aztec/epoch-cache';
2
2
  import { type Logger, createLogger } from '@aztec/foundation/log';
3
+ import { sleep } from '@aztec/foundation/sleep';
3
4
  import type { AztecAsyncKVStore } from '@aztec/kv-store';
4
5
  import type { L2BlockSource } from '@aztec/stdlib/block';
5
6
  import type { ContractDataSource } from '@aztec/stdlib/contract';
@@ -100,6 +101,7 @@ class MockReqResp implements ReqRespInterface {
100
101
  }
101
102
 
102
103
  updateConfig(_config: Partial<P2PReqRespConfig>): void {}
104
+ setShouldRejectPeer(): void {}
103
105
 
104
106
  start(
105
107
  subProtocolHandlers: Partial<ReqRespSubProtocolHandlers>,
@@ -138,6 +140,11 @@ class MockReqResp implements ReqRespInterface {
138
140
  const responses: InstanceType<SubProtocolMap[SubProtocol]['response']>[] = [];
139
141
  const peers = this.network.getReqRespPeers().filter(p => !p.peerId.equals(this.peerId));
140
142
  const targetPeers = pinnedPeer ? peers.filter(p => p.peerId.equals(pinnedPeer)) : peers;
143
+ const delayMs = this.network.getPropagationDelayMs();
144
+
145
+ if (delayMs > 0) {
146
+ await sleep(delayMs);
147
+ }
141
148
 
142
149
  for (const request of requests) {
143
150
  const requestBuffer = request.toBuffer();
@@ -174,7 +181,12 @@ class MockReqResp implements ReqRespInterface {
174
181
  return { status: ReqRespStatus.SUCCESS, data: Buffer.from([]) };
175
182
  }
176
183
  try {
184
+ const delayMs = this.network.getPropagationDelayMs();
185
+ if (delayMs > 0) {
186
+ await sleep(delayMs);
187
+ }
177
188
  const data = await handler(this.peerId, payload);
189
+
178
190
  return { status: ReqRespStatus.SUCCESS, data };
179
191
  } catch {
180
192
  return { status: ReqRespStatus.FAILURE };
@@ -242,10 +254,10 @@ class MockGossipSubService extends TypedEventEmitter<GossipsubEvents> implements
242
254
  score: (_peerId: PeerIdStr) => 0,
243
255
  };
244
256
 
245
- publish(topic: TopicStr, data: Uint8Array, _opts?: PublishOpts): Promise<PublishResult> {
257
+ async publish(topic: TopicStr, data: Uint8Array, _opts?: PublishOpts): Promise<PublishResult> {
246
258
  this.logger.debug(`Publishing message on topic ${topic}`, { topic, sender: this.peerId.toString() });
247
- this.network.publishToPeers(topic, data, this.peerId);
248
- return Promise.resolve({ recipients: this.network.getPeers().filter(peer => !this.peerId.equals(peer)) });
259
+ await this.network.publishToPeers(topic, data, this.peerId);
260
+ return { recipients: this.network.getPeers().filter(peer => !this.peerId.equals(peer)) };
249
261
  }
250
262
 
251
263
  receive(msg: GossipsubMessage) {
@@ -281,7 +293,8 @@ class MockGossipSubService extends TypedEventEmitter<GossipsubEvents> implements
281
293
 
282
294
  /**
283
295
  * Mock gossip sub network used for testing.
284
- * All instances of MockGossipSubService connected to the same network will instantly receive the same messages.
296
+ * All instances of MockGossipSubService connected to the same network receive the same messages,
297
+ * optionally delayed by a configurable propagation time.
285
298
  */
286
299
  export class MockGossipSubNetwork {
287
300
  private peers: MockGossipSubService[] = [];
@@ -290,6 +303,15 @@ export class MockGossipSubNetwork {
290
303
 
291
304
  private logger = createLogger('p2p:test:mock-gossipsub-network');
292
305
 
306
+ constructor(
307
+ /** Artificial propagation delay in milliseconds applied to each message delivery. */
308
+ private propagationDelayMs: number = 0,
309
+ ) {}
310
+
311
+ public getPropagationDelayMs(): number {
312
+ return this.propagationDelayMs;
313
+ }
314
+
293
315
  public getPeers(): PeerId[] {
294
316
  return this.peers.map(peer => peer.peerId);
295
317
  }
@@ -306,7 +328,7 @@ export class MockGossipSubNetwork {
306
328
  return this.reqRespPeers;
307
329
  }
308
330
 
309
- public publishToPeers(topic: TopicStr, data: Uint8Array, sender: PeerId): void {
331
+ public async publishToPeers(topic: TopicStr, data: Uint8Array, sender: PeerId): Promise<void> {
310
332
  const msgId = (this.nextMsgId++).toString();
311
333
  this.logger.debug(`Network is distributing message on topic ${topic}`, {
312
334
  topic,
@@ -315,6 +337,10 @@ export class MockGossipSubNetwork {
315
337
  msgId,
316
338
  });
317
339
 
340
+ if (this.propagationDelayMs > 0) {
341
+ await sleep(this.propagationDelayMs);
342
+ }
343
+
318
344
  const gossipSubMsg: GossipsubMessage = { msgId, msg: { type: 'unsigned', topic, data }, propagationSource: sender };
319
345
  for (const peer of this.peers) {
320
346
  if (peer.subscribedTopics.has(topic)) {
@@ -2,7 +2,6 @@ import type { EpochCache } from '@aztec/epoch-cache';
2
2
  import { timesParallel } from '@aztec/foundation/collection';
3
3
  import { SecretValue } from '@aztec/foundation/config';
4
4
  import { createLogger } from '@aztec/foundation/log';
5
- import type { DataStoreConfig } from '@aztec/kv-store/config';
6
5
  import { openTmpStore } from '@aztec/kv-store/lmdb-v2';
7
6
  import type { L2BlockSource } from '@aztec/stdlib/block';
8
7
  import { type ChainConfig, emptyChainConfig } from '@aztec/stdlib/config';
@@ -12,6 +11,7 @@ import type {
12
11
  IVCProofVerificationResult,
13
12
  WorldStateSynchronizer,
14
13
  } from '@aztec/stdlib/interfaces/server';
14
+ import type { DataStoreConfig } from '@aztec/stdlib/kv-store';
15
15
  import type { Tx } from '@aztec/stdlib/tx';
16
16
  import { compressComponentVersions } from '@aztec/stdlib/versioning';
17
17
  import { type TelemetryClient, getTelemetryClient } from '@aztec/telemetry-client';
@@ -153,6 +153,8 @@ export async function createTestLibP2PService(
153
153
  epochCache,
154
154
  );
155
155
 
156
+ reqresp.setShouldRejectPeer(peerId => peerManager.shouldDisableP2PGossip(peerId));
157
+
156
158
  p2pNode.services.pubsub.score.params.appSpecificWeight = APP_SPECIFIC_WEIGHT;
157
159
  p2pNode.services.pubsub.score.params.appSpecificScore = (peerId: string) =>
158
160
  peerManager.shouldDisableP2PGossip(peerId) ? -Infinity : peerManager.getPeerScore(peerId);
@@ -187,7 +189,6 @@ export const MOCK_SUB_PROTOCOL_HANDLERS: ReqRespSubProtocolHandlers = {
187
189
  [ReqRespSubProtocol.STATUS]: (_msg: any) => Promise.resolve(Buffer.from('status')),
188
190
  [ReqRespSubProtocol.TX]: (_msg: any) => Promise.resolve(Buffer.from('tx')),
189
191
  [ReqRespSubProtocol.GOODBYE]: (_msg: any) => Promise.resolve(Buffer.from('goodbye')),
190
- [ReqRespSubProtocol.BLOCK]: (_msg: any) => Promise.resolve(Buffer.from('block')),
191
192
  [ReqRespSubProtocol.AUTH]: (_msg: any) => Promise.resolve(Buffer.from('auth')),
192
193
  [ReqRespSubProtocol.BLOCK_TXS]: (_msg: any) => Promise.resolve(Buffer.from('block_txs')),
193
194
  };
@@ -199,7 +200,6 @@ export const MOCK_SUB_PROTOCOL_VALIDATORS: ReqRespSubProtocolValidators = {
199
200
  [ReqRespSubProtocol.STATUS]: noopValidator,
200
201
  [ReqRespSubProtocol.TX]: noopValidator,
201
202
  [ReqRespSubProtocol.GOODBYE]: noopValidator,
202
- [ReqRespSubProtocol.BLOCK]: noopValidator,
203
203
  [ReqRespSubProtocol.AUTH]: noopValidator,
204
204
  [ReqRespSubProtocol.BLOCK_TXS]: noopValidator,
205
205
  };
@@ -273,17 +273,42 @@ export class InMemoryAttestationPool {
273
273
  * Creates a mock EpochCache for testing.
274
274
  */
275
275
  export function createMockEpochCache(): EpochCacheInterface {
276
- return {
276
+ const cache: EpochCacheInterface = {
277
277
  getCommittee: () => Promise.resolve({ committee: [], seed: 1n, epoch: EpochNumber.ZERO, isEscapeHatchOpen: false }),
278
278
  getProposerIndexEncoding: () => '0x' as `0x${string}`,
279
- getEpochAndSlotNow: () => ({ epoch: EpochNumber.ZERO, slot: SlotNumber.ZERO, ts: 0n, nowMs: 0n }),
279
+ getSlotNow: () => SlotNumber.ZERO,
280
+ getTargetSlot: () => SlotNumber.ZERO,
281
+ getEpochNow: () => EpochNumber.ZERO,
282
+ getTargetEpoch: () => EpochNumber.ZERO,
283
+ getEpochAndSlotNow: () => ({
284
+ epoch: EpochNumber.ZERO,
285
+ slot: SlotNumber.ZERO,
286
+ ts: 0n,
287
+ nowMs: 0n,
288
+ }),
289
+ isProposerPipeliningEnabled: () => false,
290
+ pipeliningOffset: () => 0,
280
291
  computeProposerIndex: () => 0n,
281
292
  getCurrentAndNextSlot: () => ({ currentSlot: SlotNumber.ZERO, nextSlot: SlotNumber.ZERO }),
293
+ getTargetAndNextSlot: () => ({ targetSlot: SlotNumber.ZERO, nextSlot: SlotNumber.ZERO }),
282
294
  getProposerAttesterAddressInSlot: () => Promise.resolve(undefined),
283
- getEpochAndSlotInNextL1Slot: () => ({ epoch: EpochNumber.ZERO, slot: SlotNumber.ZERO, ts: 0n, now: 0n }),
295
+ getEpochAndSlotInNextL1Slot: () => ({
296
+ epoch: EpochNumber.ZERO,
297
+ slot: SlotNumber.ZERO,
298
+ ts: 0n,
299
+ nowSeconds: 0n,
300
+ }),
301
+ getTargetEpochAndSlotInNextL1Slot: () => ({
302
+ epoch: EpochNumber.ZERO,
303
+ slot: SlotNumber.ZERO,
304
+ ts: 0n,
305
+ nowSeconds: 0n,
306
+ }),
284
307
  isInCommittee: () => Promise.resolve(false),
285
308
  getRegisteredValidators: () => Promise.resolve([]),
286
309
  filterInCommittee: () => Promise.resolve([]),
310
+ isEscapeHatchOpen: () => Promise.resolve(false),
311
+ isEscapeHatchOpenAtSlot: () => Promise.resolve(false),
287
312
  getL1Constants: () => ({
288
313
  l1StartBlock: 0n,
289
314
  l1GenesisTime: 0n,
@@ -292,8 +317,10 @@ export function createMockEpochCache(): EpochCacheInterface {
292
317
  ethereumSlotDuration: 1,
293
318
  proofSubmissionEpochs: 1,
294
319
  targetCommitteeSize: 48,
320
+ rollupManaLimit: Number.MAX_SAFE_INTEGER,
295
321
  }),
296
322
  };
323
+ return cache;
297
324
  }
298
325
 
299
326
  /**