@aztec/p2p 0.0.1-commit.4d3c002 → 0.0.1-commit.4d9804df

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 (340) hide show
  1. package/README.md +7 -6
  2. package/dest/bootstrap/bootstrap.d.ts +1 -1
  3. package/dest/bootstrap/bootstrap.d.ts.map +1 -1
  4. package/dest/bootstrap/bootstrap.js +22 -6
  5. package/dest/client/factory.d.ts +4 -3
  6. package/dest/client/factory.d.ts.map +1 -1
  7. package/dest/client/factory.js +33 -24
  8. package/dest/client/interface.d.ts +40 -10
  9. package/dest/client/interface.d.ts.map +1 -1
  10. package/dest/client/p2p_client.d.ts +32 -18
  11. package/dest/client/p2p_client.d.ts.map +1 -1
  12. package/dest/client/p2p_client.js +97 -51
  13. package/dest/config.d.ts +143 -107
  14. package/dest/config.d.ts.map +1 -1
  15. package/dest/config.js +72 -26
  16. package/dest/errors/reqresp.error.d.ts +9 -16
  17. package/dest/errors/reqresp.error.d.ts.map +1 -1
  18. package/dest/errors/reqresp.error.js +10 -17
  19. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +98 -56
  20. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  21. package/dest/mem_pools/attestation_pool/attestation_pool.js +270 -198
  22. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +1 -1
  23. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
  24. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +218 -59
  25. package/dest/mem_pools/attestation_pool/mocks.d.ts +1 -1
  26. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  27. package/dest/mem_pools/attestation_pool/mocks.js +6 -4
  28. package/dest/mem_pools/instrumentation.d.ts +9 -4
  29. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  30. package/dest/mem_pools/instrumentation.js +28 -9
  31. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts +1 -5
  32. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts.map +1 -1
  33. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.js +1 -7
  34. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +3 -3
  35. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -1
  36. package/dest/mem_pools/tx_pool_v2/deleted_pool.js +6 -6
  37. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +1 -1
  38. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +2 -1
  39. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -1
  40. package/dest/mem_pools/tx_pool_v2/eviction/index.js +1 -0
  41. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts +16 -0
  42. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts.map +1 -0
  43. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.js +62 -0
  44. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +2 -2
  45. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +33 -5
  46. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
  47. package/dest/mem_pools/tx_pool_v2/interfaces.js +2 -1
  48. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +5 -2
  49. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
  50. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +8 -5
  51. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +15 -1
  52. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -1
  53. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +31 -0
  54. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +9 -3
  55. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -1
  56. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +19 -8
  57. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +17 -4
  58. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -1
  59. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +208 -118
  60. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +10 -3
  61. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  62. package/dest/msg_validators/attestation_validator/attestation_validator.js +38 -16
  63. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +7 -3
  64. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
  65. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +4 -5
  66. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +8 -3
  67. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
  68. package/dest/msg_validators/proposal_validator/block_proposal_validator.js +2 -2
  69. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +8 -3
  70. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
  71. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +8 -2
  72. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +25 -3
  73. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
  74. package/dest/msg_validators/proposal_validator/proposal_validator.js +85 -15
  75. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +1 -1
  76. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  77. package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +8 -15
  78. package/dest/msg_validators/tx_validator/allowed_public_setup.js +3 -3
  79. package/dest/msg_validators/tx_validator/archive_cache.js +1 -1
  80. package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts +15 -0
  81. package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts.map +1 -0
  82. package/dest/msg_validators/tx_validator/cached_tx_validator.js +19 -0
  83. package/dest/msg_validators/tx_validator/data_validator.d.ts +2 -1
  84. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  85. package/dest/msg_validators/tx_validator/data_validator.js +1 -0
  86. package/dest/msg_validators/tx_validator/factory.d.ts +14 -15
  87. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  88. package/dest/msg_validators/tx_validator/factory.js +29 -16
  89. package/dest/msg_validators/tx_validator/gas_validator.d.ts +47 -10
  90. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  91. package/dest/msg_validators/tx_validator/gas_validator.js +65 -48
  92. package/dest/msg_validators/tx_validator/index.d.ts +3 -1
  93. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  94. package/dest/msg_validators/tx_validator/index.js +2 -0
  95. package/dest/msg_validators/tx_validator/phases_validator.js +2 -2
  96. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +2 -1
  97. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
  98. package/dest/msg_validators/tx_validator/tx_proof_validator.js +2 -0
  99. package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts +48 -0
  100. package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts.map +1 -0
  101. package/dest/msg_validators/tx_validator/tx_validation_cache.js +68 -0
  102. package/dest/services/data_store.d.ts +1 -1
  103. package/dest/services/data_store.d.ts.map +1 -1
  104. package/dest/services/data_store.js +5 -5
  105. package/dest/services/discv5/discV5_service.d.ts +13 -2
  106. package/dest/services/discv5/discV5_service.d.ts.map +1 -1
  107. package/dest/services/discv5/discV5_service.js +117 -24
  108. package/dest/services/discv5/persisted_enr_store.d.ts +38 -0
  109. package/dest/services/discv5/persisted_enr_store.d.ts.map +1 -0
  110. package/dest/services/discv5/persisted_enr_store.js +145 -0
  111. package/dest/services/dummy_service.d.ts +15 -17
  112. package/dest/services/dummy_service.d.ts.map +1 -1
  113. package/dest/services/dummy_service.js +13 -18
  114. package/dest/services/encoding.d.ts +19 -6
  115. package/dest/services/encoding.d.ts.map +1 -1
  116. package/dest/services/encoding.js +25 -15
  117. package/dest/services/gossipsub/topic_score_params.d.ts +6 -12
  118. package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -1
  119. package/dest/services/gossipsub/topic_score_params.js +4 -14
  120. package/dest/services/libp2p/instrumentation.d.ts +3 -1
  121. package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
  122. package/dest/services/libp2p/instrumentation.js +14 -0
  123. package/dest/services/libp2p/libp2p_service.d.ts +31 -38
  124. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  125. package/dest/services/libp2p/libp2p_service.js +268 -248
  126. package/dest/services/peer-manager/peer_manager.d.ts +15 -2
  127. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  128. package/dest/services/peer-manager/peer_manager.js +59 -17
  129. package/dest/services/peer-manager/peer_scoring.d.ts +30 -1
  130. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  131. package/dest/services/peer-manager/peer_scoring.js +74 -3
  132. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +1 -8
  133. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -1
  134. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +35 -44
  135. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +8 -5
  136. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
  137. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +5 -14
  138. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -1
  139. package/dest/services/reqresp/batch-tx-requester/tx_validator.js +6 -20
  140. package/dest/services/reqresp/config.d.ts +15 -3
  141. package/dest/services/reqresp/config.d.ts.map +1 -1
  142. package/dest/services/reqresp/config.js +11 -0
  143. package/dest/services/reqresp/interface.d.ts +16 -18
  144. package/dest/services/reqresp/interface.d.ts.map +1 -1
  145. package/dest/services/reqresp/interface.js +10 -20
  146. package/dest/services/reqresp/metrics.d.ts +1 -1
  147. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  148. package/dest/services/reqresp/metrics.js +0 -1
  149. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +4 -3
  150. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -1
  151. package/dest/services/reqresp/protocols/block_txs/bitvector.js +3 -2
  152. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +1 -1
  153. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
  154. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +31 -28
  155. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +12 -7
  156. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
  157. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +42 -24
  158. package/dest/services/reqresp/protocols/index.d.ts +1 -2
  159. package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
  160. package/dest/services/reqresp/protocols/index.js +0 -1
  161. package/dest/services/reqresp/protocols/tx.d.ts +1 -1
  162. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  163. package/dest/services/reqresp/protocols/tx.js +1 -3
  164. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
  165. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
  166. package/dest/services/reqresp/rate-limiter/rate_limits.js +3 -13
  167. package/dest/services/reqresp/reqresp.d.ts +7 -29
  168. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  169. package/dest/services/reqresp/reqresp.js +59 -209
  170. package/dest/services/service.d.ts +21 -13
  171. package/dest/services/service.d.ts.map +1 -1
  172. package/dest/services/tx_collection/config.d.ts +2 -23
  173. package/dest/services/tx_collection/config.d.ts.map +1 -1
  174. package/dest/services/tx_collection/config.js +2 -55
  175. package/dest/services/tx_collection/file_store_tx_collection.d.ts +12 -28
  176. package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -1
  177. package/dest/services/tx_collection/file_store_tx_collection.js +43 -83
  178. package/dest/services/tx_collection/index.d.ts +2 -3
  179. package/dest/services/tx_collection/index.d.ts.map +1 -1
  180. package/dest/services/tx_collection/index.js +0 -1
  181. package/dest/services/tx_collection/instrumentation.d.ts +1 -1
  182. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
  183. package/dest/services/tx_collection/instrumentation.js +0 -2
  184. package/dest/services/tx_collection/tx_collection.d.ts +35 -51
  185. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  186. package/dest/services/tx_collection/tx_collection.js +275 -119
  187. package/dest/services/tx_collection/tx_collection_sink.d.ts +1 -1
  188. package/dest/services/tx_collection/tx_collection_sink.js +2 -2
  189. package/dest/services/tx_collection/tx_source.d.ts +1 -1
  190. package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
  191. package/dest/services/tx_collection/tx_source.js +4 -1
  192. package/dest/services/tx_file_store/tx_file_store.d.ts +1 -3
  193. package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -1
  194. package/dest/services/tx_file_store/tx_file_store.js +4 -14
  195. package/dest/services/tx_provider.d.ts +3 -1
  196. package/dest/services/tx_provider.d.ts.map +1 -1
  197. package/dest/services/tx_provider.js +3 -0
  198. package/dest/test-helpers/make-test-p2p-clients.d.ts +1 -1
  199. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  200. package/dest/test-helpers/make-test-p2p-clients.js +5 -2
  201. package/dest/test-helpers/mock-pubsub.d.ts +16 -9
  202. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  203. package/dest/test-helpers/mock-pubsub.js +36 -43
  204. package/dest/test-helpers/reqresp-nodes.d.ts +4 -5
  205. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  206. package/dest/test-helpers/reqresp-nodes.js +11 -17
  207. package/dest/test-helpers/test_tx_provider.d.ts +3 -1
  208. package/dest/test-helpers/test_tx_provider.d.ts.map +1 -1
  209. package/dest/test-helpers/test_tx_provider.js +3 -0
  210. package/dest/test-helpers/testbench-utils.d.ts +15 -14
  211. package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
  212. package/dest/test-helpers/testbench-utils.js +28 -13
  213. package/dest/testbench/p2p_client_testbench_worker.d.ts +3 -5
  214. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  215. package/dest/testbench/p2p_client_testbench_worker.js +60 -27
  216. package/dest/testbench/worker_client_manager.d.ts +10 -6
  217. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  218. package/dest/testbench/worker_client_manager.js +51 -8
  219. package/dest/util.d.ts +7 -6
  220. package/dest/util.d.ts.map +1 -1
  221. package/dest/util.js +39 -10
  222. package/dest/versioning.d.ts +3 -6
  223. package/dest/versioning.d.ts.map +1 -1
  224. package/dest/versioning.js +3 -24
  225. package/package.json +16 -16
  226. package/src/bootstrap/bootstrap.ts +17 -3
  227. package/src/client/factory.ts +49 -25
  228. package/src/client/interface.ts +35 -16
  229. package/src/client/p2p_client.ts +116 -85
  230. package/src/client/test/{tx_proposal_collector/README.md → p2p_client.batch_tx_requester.bench.README.md} +23 -53
  231. package/src/config.ts +146 -34
  232. package/src/errors/reqresp.error.ts +13 -19
  233. package/src/mem_pools/attestation_pool/attestation_pool.ts +325 -242
  234. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +238 -63
  235. package/src/mem_pools/attestation_pool/mocks.ts +13 -8
  236. package/src/mem_pools/instrumentation.ts +18 -12
  237. package/src/mem_pools/tx_pool_v2/archive/tx_archive.ts +1 -9
  238. package/src/mem_pools/tx_pool_v2/deleted_pool.ts +7 -7
  239. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +1 -1
  240. package/src/mem_pools/tx_pool_v2/eviction/index.ts +1 -0
  241. package/src/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.ts +65 -0
  242. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +3 -3
  243. package/src/mem_pools/tx_pool_v2/interfaces.ts +31 -4
  244. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +13 -7
  245. package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +35 -0
  246. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +22 -8
  247. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +233 -123
  248. package/src/msg_validators/attestation_validator/attestation_validator.ts +46 -15
  249. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +15 -7
  250. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +15 -3
  251. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +26 -3
  252. package/src/msg_validators/proposal_validator/proposal_validator.ts +94 -12
  253. package/src/msg_validators/tx_validator/README.md +13 -3
  254. package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +3 -12
  255. package/src/msg_validators/tx_validator/allowed_public_setup.ts +3 -3
  256. package/src/msg_validators/tx_validator/archive_cache.ts +1 -1
  257. package/src/msg_validators/tx_validator/cached_tx_validator.ts +31 -0
  258. package/src/msg_validators/tx_validator/data_validator.ts +2 -0
  259. package/src/msg_validators/tx_validator/factory.ts +37 -20
  260. package/src/msg_validators/tx_validator/gas_validator.ts +99 -54
  261. package/src/msg_validators/tx_validator/index.ts +2 -0
  262. package/src/msg_validators/tx_validator/phases_validator.ts +2 -2
  263. package/src/msg_validators/tx_validator/tx_proof_validator.ts +2 -0
  264. package/src/msg_validators/tx_validator/tx_validation_cache.ts +101 -0
  265. package/src/services/data_store.ts +5 -13
  266. package/src/services/discv5/discV5_service.ts +124 -15
  267. package/src/services/discv5/persisted_enr_store.ts +158 -0
  268. package/src/services/dummy_service.ts +19 -43
  269. package/src/services/encoding.ts +28 -20
  270. package/src/services/gossipsub/README.md +33 -11
  271. package/src/services/gossipsub/topic_score_params.ts +9 -18
  272. package/src/services/libp2p/instrumentation.ts +14 -0
  273. package/src/services/libp2p/libp2p_service.ts +311 -271
  274. package/src/services/peer-manager/peer_manager.ts +63 -16
  275. package/src/services/peer-manager/peer_scoring.ts +81 -3
  276. package/src/services/reqresp/README.md +2 -37
  277. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +39 -52
  278. package/src/services/reqresp/batch-tx-requester/interface.ts +11 -4
  279. package/src/services/reqresp/batch-tx-requester/tx_validator.ts +12 -25
  280. package/src/services/reqresp/config.ts +19 -2
  281. package/src/services/reqresp/interface.ts +21 -47
  282. package/src/services/reqresp/metrics.ts +0 -1
  283. package/src/services/reqresp/protocols/block_txs/bitvector.ts +3 -2
  284. package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +34 -30
  285. package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +47 -20
  286. package/src/services/reqresp/protocols/index.ts +0 -1
  287. package/src/services/reqresp/protocols/tx.ts +1 -3
  288. package/src/services/reqresp/rate-limiter/rate_limits.ts +3 -13
  289. package/src/services/reqresp/reqresp.ts +69 -252
  290. package/src/services/service.ts +25 -30
  291. package/src/services/tx_collection/config.ts +3 -80
  292. package/src/services/tx_collection/file_store_tx_collection.ts +54 -103
  293. package/src/services/tx_collection/index.ts +1 -6
  294. package/src/services/tx_collection/instrumentation.ts +1 -7
  295. package/src/services/tx_collection/tx_collection.ts +330 -173
  296. package/src/services/tx_collection/tx_collection_sink.ts +2 -2
  297. package/src/services/tx_collection/tx_source.ts +2 -1
  298. package/src/services/tx_file_store/tx_file_store.ts +5 -17
  299. package/src/services/tx_provider.ts +5 -0
  300. package/src/test-helpers/make-test-p2p-clients.ts +3 -0
  301. package/src/test-helpers/mock-pubsub.ts +39 -60
  302. package/src/test-helpers/reqresp-nodes.ts +8 -22
  303. package/src/test-helpers/test_tx_provider.ts +5 -0
  304. package/src/test-helpers/testbench-utils.ts +35 -26
  305. package/src/testbench/p2p_client_testbench_worker.ts +68 -44
  306. package/src/testbench/worker_client_manager.ts +59 -19
  307. package/src/util.ts +34 -12
  308. package/src/versioning.ts +3 -33
  309. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts +0 -2
  310. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts.map +0 -1
  311. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +0 -315
  312. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts +0 -73
  313. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts.map +0 -1
  314. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.js +0 -8
  315. package/dest/msg_validators/clock_tolerance.d.ts +0 -21
  316. package/dest/msg_validators/clock_tolerance.d.ts.map +0 -1
  317. package/dest/msg_validators/clock_tolerance.js +0 -38
  318. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +0 -64
  319. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +0 -1
  320. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +0 -151
  321. package/dest/services/reqresp/protocols/block.d.ts +0 -9
  322. package/dest/services/reqresp/protocols/block.d.ts.map +0 -1
  323. package/dest/services/reqresp/protocols/block.js +0 -32
  324. package/dest/services/tx_collection/fast_tx_collection.d.ts +0 -51
  325. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +0 -1
  326. package/dest/services/tx_collection/fast_tx_collection.js +0 -311
  327. package/dest/services/tx_collection/proposal_tx_collector.d.ts +0 -48
  328. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +0 -1
  329. package/dest/services/tx_collection/proposal_tx_collector.js +0 -50
  330. package/dest/services/tx_collection/slow_tx_collection.d.ts +0 -57
  331. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +0 -1
  332. package/dest/services/tx_collection/slow_tx_collection.js +0 -211
  333. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +0 -355
  334. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.ts +0 -43
  335. package/src/msg_validators/clock_tolerance.ts +0 -52
  336. package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +0 -161
  337. package/src/services/reqresp/protocols/block.ts +0 -37
  338. package/src/services/tx_collection/fast_tx_collection.ts +0 -361
  339. package/src/services/tx_collection/proposal_tx_collector.ts +0 -108
  340. package/src/services/tx_collection/slow_tx_collection.ts +0 -266
@@ -1,24 +1,30 @@
1
- import { GENESIS_BLOCK_HEADER_HASH } from '@aztec/constants';
2
1
  import type { EpochCacheInterface } from '@aztec/epoch-cache';
3
- import { BlockNumber, CheckpointNumber, SlotNumber } from '@aztec/foundation/branded-types';
2
+ import {
3
+ BlockNumber,
4
+ CheckpointNumber,
5
+ type CheckpointProposalHash,
6
+ SlotNumber,
7
+ } from '@aztec/foundation/branded-types';
4
8
  import { createLogger } from '@aztec/foundation/log';
5
- import { RunningPromise } from '@aztec/foundation/promise';
6
9
  import { DateProvider } from '@aztec/foundation/timer';
7
10
  import type { AztecAsyncKVStore, AztecAsyncSingleton } from '@aztec/kv-store';
8
11
  import { L2TipsKVStore } from '@aztec/kv-store/stores';
9
12
  import {
13
+ type BlockData,
14
+ type BlockHash,
10
15
  type CheckpointId,
11
16
  type EthAddress,
17
+ EventDrivenL2BlockStream,
12
18
  type L2Block,
13
19
  type L2BlockId,
14
20
  type L2BlockSource,
15
- L2BlockStream,
16
21
  type L2BlockStreamEvent,
17
- type L2Tips,
18
22
  type L2TipsStore,
23
+ type LocalL2Tips,
19
24
  } from '@aztec/stdlib/block';
20
25
  import type { ContractDataSource } from '@aztec/stdlib/contract';
21
- import { type PeerInfo, tryStop } from '@aztec/stdlib/interfaces/server';
26
+ import { getTimestampForSlot } from '@aztec/stdlib/epoch-helpers';
27
+ import { type GetTxByHashOptions, type PeerInfo, tryStop } from '@aztec/stdlib/interfaces/server';
22
28
  import { type BlockProposal, CheckpointAttestation, type CheckpointProposal, type TopicType } from '@aztec/stdlib/p2p';
23
29
  import type { BlockHeader, Tx, TxHash } from '@aztec/stdlib/tx';
24
30
  import { Attributes, type TelemetryClient, WithTracer, getTelemetryClient, trackSpan } from '@aztec/telemetry-client';
@@ -28,18 +34,15 @@ import type { ENR } from '@nethermindeth/enr';
28
34
 
29
35
  import { type P2PConfig, getP2PDefaultConfig } from '../config.js';
30
36
  import { TxPoolError } from '../errors/tx-pool.error.js';
31
- import type { AttestationPoolApi } from '../mem_pools/attestation_pool/attestation_pool.js';
37
+ import type { AttestationPoolApi, ProposalsForSlot } from '../mem_pools/attestation_pool/attestation_pool.js';
32
38
  import type { MemPools } from '../mem_pools/interface.js';
33
39
  import type { TxPoolV2 } from '../mem_pools/tx_pool_v2/interfaces.js';
34
40
  import type { AuthRequest, StatusMessage } from '../services/index.js';
35
- import {
36
- ReqRespSubProtocol,
37
- type ReqRespSubProtocolHandler,
38
- type ReqRespSubProtocolValidators,
39
- } from '../services/reqresp/interface.js';
41
+ import { ReqRespSubProtocol, type ReqRespSubProtocolHandler } from '../services/reqresp/interface.js';
40
42
  import type {
41
43
  DuplicateAttestationInfo,
42
44
  DuplicateProposalInfo,
45
+ OversizedProposalInfo,
43
46
  P2PBlockReceivedCallback,
44
47
  P2PCheckpointReceivedCallback,
45
48
  P2PService,
@@ -71,7 +74,7 @@ export class P2PClient extends WithTracer implements P2P {
71
74
 
72
75
  private config: P2PConfig;
73
76
 
74
- private blockStream: L2BlockStream | undefined;
77
+ private blockStream: EventDrivenL2BlockStream | undefined;
75
78
 
76
79
  private txProvider: TxProvider;
77
80
 
@@ -80,9 +83,6 @@ export class P2PClient extends WithTracer implements P2P {
80
83
  /** Tracks the last slot for which we called prepareForSlot */
81
84
  private lastSlotProcessed: SlotNumber = SlotNumber.ZERO;
82
85
 
83
- /** Polls for slot changes and calls prepareForSlot on the tx pool */
84
- private slotMonitor: RunningPromise | undefined;
85
-
86
86
  constructor(
87
87
  private store: AztecAsyncKVStore,
88
88
  private l2BlockSource: L2BlockSource & ContractDataSource,
@@ -95,6 +95,7 @@ export class P2PClient extends WithTracer implements P2P {
95
95
  private _dateProvider: DateProvider = new DateProvider(),
96
96
  private telemetry: TelemetryClient = getTelemetryClient(),
97
97
  private log = createLogger('p2p'),
98
+ initialBlockHash: BlockHash,
98
99
  ) {
99
100
  super(telemetry, 'P2PClient');
100
101
 
@@ -110,7 +111,7 @@ export class P2PClient extends WithTracer implements P2P {
110
111
  this.telemetry,
111
112
  );
112
113
 
113
- this.l2Tips = new L2TipsKVStore(store, 'p2p_client');
114
+ this.l2Tips = new L2TipsKVStore(store, 'p2p_client', initialBlockHash);
114
115
  this.synchedLatestSlot = store.openSingleton('p2p_pool_last_l2_slot');
115
116
  }
116
117
 
@@ -148,7 +149,7 @@ export class P2PClient extends WithTracer implements P2P {
148
149
  this.p2pService.updateConfig(config);
149
150
  }
150
151
 
151
- public getL2Tips(): Promise<L2Tips> {
152
+ public getL2Tips(): Promise<LocalL2Tips> {
152
153
  return this.l2Tips.getL2Tips();
153
154
  }
154
155
 
@@ -164,7 +165,7 @@ export class P2PClient extends WithTracer implements P2P {
164
165
  const from = BlockNumber(oldFinalizedBlockNum + 1);
165
166
  const limit = event.block.number - from + 1;
166
167
  if (limit > 0) {
167
- const oldBlocks = await this.l2BlockSource.getBlocks(from, limit);
168
+ const oldBlocks = await this.l2BlockSource.getBlocksData({ from, limit });
168
169
  await this.handleFinalizedL2Blocks(oldBlocks);
169
170
  }
170
171
  break;
@@ -174,10 +175,12 @@ export class P2PClient extends WithTracer implements P2P {
174
175
  break;
175
176
  case 'chain-pruned':
176
177
  this.txCollection.stopCollectingForBlocksAfter(event.block.number);
177
- await this.handlePruneL2Blocks(event.block, event.checkpoint);
178
+ await this.handlePruneL2Blocks(event.block, event.checkpointed.checkpoint);
178
179
  break;
179
180
  case 'chain-checkpointed':
180
181
  break;
182
+ case 'chain-proposed':
183
+ break;
181
184
  default: {
182
185
  const _: never = event;
183
186
  break;
@@ -257,33 +260,24 @@ export class P2PClient extends WithTracer implements P2P {
257
260
  });
258
261
  }
259
262
 
260
- this.blockStream!.start();
261
- await this.txCollection.start();
263
+ // Should never happen: all branches above call initBlockStream()
264
+ if (!this.blockStream) {
265
+ throw new Error('Block stream not initialized');
266
+ }
267
+ this.blockStream.start();
262
268
  this.txFileStore?.start();
263
269
 
264
- // Start slot monitor to call prepareForSlot when the slot changes
265
- this.slotMonitor = new RunningPromise(
266
- () => this.maybeCallPrepareForSlot(),
267
- this.log,
268
- this.config.slotCheckIntervalMS,
269
- );
270
- this.slotMonitor.start();
271
-
272
270
  return this.syncPromise;
273
271
  }
274
272
 
275
- addReqRespSubProtocol(
276
- subProtocol: ReqRespSubProtocol,
277
- handler: ReqRespSubProtocolHandler,
278
- validator: ReqRespSubProtocolValidators[ReqRespSubProtocol],
279
- ): Promise<void> {
280
- return this.p2pService.addReqRespSubProtocol(subProtocol, handler, validator);
273
+ addReqRespSubProtocol(subProtocol: ReqRespSubProtocol, handler: ReqRespSubProtocolHandler): Promise<void> {
274
+ return this.p2pService.addReqRespSubProtocol(subProtocol, handler);
281
275
  }
282
276
 
283
277
  private initBlockStream(startingBlock?: BlockNumber) {
284
278
  if (!this.blockStream) {
285
279
  const { blockRequestBatchSize: batchSize, blockCheckIntervalMS: pollIntervalMS } = this.config;
286
- this.blockStream = new L2BlockStream(
280
+ this.blockStream = new EventDrivenL2BlockStream(
287
281
  this.l2BlockSource,
288
282
  this,
289
283
  this,
@@ -299,8 +293,6 @@ export class P2PClient extends WithTracer implements P2P {
299
293
  */
300
294
  public async stop() {
301
295
  this.log.debug('Stopping p2p client...');
302
- await this.slotMonitor?.stop();
303
- this.log.debug('Stopped slot monitor');
304
296
  await tryStop(this.txCollection);
305
297
  this.log.debug('Stopped tx collection service');
306
298
  await this.txFileStore?.stop();
@@ -319,7 +311,11 @@ export class P2PClient extends WithTracer implements P2P {
319
311
  /** Triggers a sync to the archiver. Used for testing. */
320
312
  public async sync() {
321
313
  this.initBlockStream();
322
- await this.blockStream!.sync();
314
+ // Should never happen: initBlockStream() creates blockStream if absent
315
+ if (!this.blockStream) {
316
+ throw new Error('Block stream not initialized');
317
+ }
318
+ await this.blockStream.sync();
323
319
  }
324
320
 
325
321
  @trackSpan('p2pClient.broadcastProposal', async proposal => ({
@@ -357,8 +353,19 @@ export class P2PClient extends WithTracer implements P2P {
357
353
  // Store our own last-block proposal so we can respond to req/resp requests for it.
358
354
  await this.attestationPool.tryAddBlockProposal(blockProposal);
359
355
  }
360
- // Gossipsub doesn't deliver own messages, so fire the all-nodes handler locally
361
- await this.p2pService.notifyOwnCheckpointProposal(proposal.toCore());
356
+ const checkpointCore = proposal.toCore();
357
+ const { count } = await this.attestationPool.tryAddCheckpointProposal(checkpointCore);
358
+ if (count > 1) {
359
+ if (this.config.broadcastEquivocatedProposals) {
360
+ this.log.warn(`Broadcasting equivocated checkpoint proposal for slot ${proposal.slotNumber}`, {
361
+ slot: proposal.slotNumber,
362
+ archive: proposal.archive.toString(),
363
+ count,
364
+ });
365
+ } else {
366
+ throw new Error(`Attempted to broadcast a duplicate checkpoint proposal for slot ${proposal.slotNumber}`);
367
+ }
368
+ }
362
369
  return this.p2pService.propagate(proposal);
363
370
  }
364
371
 
@@ -369,10 +376,10 @@ export class P2PClient extends WithTracer implements P2P {
369
376
 
370
377
  public async getCheckpointAttestationsForSlot(
371
378
  slot: SlotNumber,
372
- proposalId?: string,
379
+ proposalPayloadHash?: CheckpointProposalHash,
373
380
  ): Promise<CheckpointAttestation[]> {
374
- return await (proposalId
375
- ? this.attestationPool.getCheckpointAttestationsForSlotAndProposal(slot, proposalId)
381
+ return await (proposalPayloadHash
382
+ ? this.attestationPool.getCheckpointAttestationsForSlotAndProposal(slot, proposalPayloadHash)
376
383
  : this.attestationPool.getCheckpointAttestationsForSlot(slot));
377
384
  }
378
385
 
@@ -380,10 +387,18 @@ export class P2PClient extends WithTracer implements P2P {
380
387
  return this.attestationPool.addOwnCheckpointAttestations(attestations);
381
388
  }
382
389
 
390
+ public getProposalsForSlot(slot: SlotNumber): Promise<ProposalsForSlot> {
391
+ return this.attestationPool.getProposalsForSlot(slot);
392
+ }
393
+
383
394
  public hasBlockProposalsForSlot(slot: SlotNumber): Promise<boolean> {
384
395
  return this.attestationPool.hasBlockProposalsForSlot(slot);
385
396
  }
386
397
 
398
+ public hasCheckpointProposalForSlot(slot: SlotNumber): Promise<boolean> {
399
+ return this.attestationPool.hasCheckpointProposalForSlot(slot);
400
+ }
401
+
387
402
  // REVIEW: https://github.com/AztecProtocol/aztec-packages/issues/7963
388
403
  // ^ This pattern is not my favorite (md)
389
404
  public registerBlockProposalHandler(handler: P2PBlockReceivedCallback): void {
@@ -402,11 +417,19 @@ export class P2PClient extends WithTracer implements P2P {
402
417
  this.p2pService.registerDuplicateProposalCallback(callback);
403
418
  }
404
419
 
420
+ public registerOversizedProposalCallback(callback: (info: OversizedProposalInfo) => void): void {
421
+ this.p2pService.registerOversizedProposalCallback(callback);
422
+ }
423
+
405
424
  public registerDuplicateAttestationCallback(callback: (info: DuplicateAttestationInfo) => void): void {
406
425
  this.p2pService.registerDuplicateAttestationCallback(callback);
407
426
  }
408
427
 
409
- public async getPendingTxs(limit?: number, after?: TxHash): Promise<Tx[]> {
428
+ public registerCheckpointAttestationCallback(callback: (attestation: CheckpointAttestation) => void): void {
429
+ this.p2pService.registerCheckpointAttestationCallback(callback);
430
+ }
431
+
432
+ public async getPendingTxs(limit?: number, after?: TxHash, options?: GetTxByHashOptions): Promise<Tx[]> {
410
433
  if (limit !== undefined && limit <= 0) {
411
434
  throw new TypeError('limit must be greater than 0');
412
435
  }
@@ -425,7 +448,9 @@ export class P2PClient extends WithTracer implements P2P {
425
448
  const endIndex = limit !== undefined ? startIndex + limit : undefined;
426
449
  txHashes = txHashes.slice(startIndex, endIndex);
427
450
 
428
- const maybeTxs = await Promise.all(txHashes.map(txHash => this.txPool.getTxByHash(txHash)));
451
+ // This is a public-facing API (exposed via both the node and the p2p RPC), so proofs are opt-in.
452
+ const includeProof = !!options?.includeProof;
453
+ const maybeTxs = await Promise.all(txHashes.map(txHash => this.txPool.getTxByHash(txHash, { includeProof })));
429
454
  return maybeTxs.filter((tx): tx is Tx => !!tx);
430
455
  }
431
456
 
@@ -433,18 +458,22 @@ export class P2PClient extends WithTracer implements P2P {
433
458
  return this.txPool.getPendingTxCount();
434
459
  }
435
460
 
436
- public async *iteratePendingTxs(): AsyncIterableIterator<Tx> {
461
+ public hasEligiblePendingTxs(minCount: number): Promise<boolean> {
462
+ return this.txPool.hasEligiblePendingTxs(minCount);
463
+ }
464
+
465
+ public async *iteratePendingTxs(opts?: { includeProof?: boolean }): AsyncIterableIterator<Tx> {
437
466
  for (const txHash of await this.txPool.getPendingTxHashes()) {
438
- const tx = await this.txPool.getTxByHash(txHash);
467
+ const tx = await this.txPool.getTxByHash(txHash, opts);
439
468
  if (tx) {
440
469
  yield tx;
441
470
  }
442
471
  }
443
472
  }
444
473
 
445
- public async *iterateEligiblePendingTxs(): AsyncIterableIterator<Tx> {
474
+ public async *iterateEligiblePendingTxs(opts?: { includeProof?: boolean }): AsyncIterableIterator<Tx> {
446
475
  for (const txHash of await this.txPool.getEligiblePendingTxHashes()) {
447
- const tx = await this.txPool.getTxByHash(txHash);
476
+ const tx = await this.txPool.getTxByHash(txHash, opts);
448
477
  if (tx) {
449
478
  yield tx;
450
479
  }
@@ -454,19 +483,21 @@ export class P2PClient extends WithTracer implements P2P {
454
483
  /**
455
484
  * Returns a transaction in the transaction pool by its hash.
456
485
  * @param txHash - Hash of the transaction to look for in the pool.
486
+ * @param opts - Set `includeProof: false` to skip loading the tx proof from the DB.
457
487
  * @returns A single tx or undefined.
458
488
  */
459
- getTxByHashFromPool(txHash: TxHash): Promise<Tx | undefined> {
460
- return this.txPool.getTxByHash(txHash);
489
+ getTxByHashFromPool(txHash: TxHash, opts?: { includeProof?: boolean }): Promise<Tx | undefined> {
490
+ return this.txPool.getTxByHash(txHash, opts);
461
491
  }
462
492
 
463
493
  /**
464
494
  * Returns transactions in the transaction pool by hash.
465
495
  * @param txHashes - Hashes of the transactions to look for.
496
+ * @param opts - Set `includeProof: false` to skip loading tx proofs from the DB.
466
497
  * @returns The txs found, in the same order as the requested hashes. If a tx is not found, it will be undefined.
467
498
  */
468
- getTxsByHashFromPool(txHashes: TxHash[]): Promise<(Tx | undefined)[]> {
469
- return this.txPool.getTxsByHash(txHashes);
499
+ getTxsByHashFromPool(txHashes: TxHash[], opts?: { includeProof?: boolean }): Promise<(Tx | undefined)[]> {
500
+ return this.txPool.getTxsByHash(txHashes, opts);
470
501
  }
471
502
 
472
503
  hasTxsInPool(txHashes: TxHash[]): Promise<boolean[]> {
@@ -576,13 +607,10 @@ export class P2PClient extends WithTracer implements P2P {
576
607
  */
577
608
  public async getStatus(): Promise<P2PSyncState> {
578
609
  const blockNumber = await this.getSyncedLatestBlockNum();
579
- const blockHash =
580
- blockNumber === 0
581
- ? GENESIS_BLOCK_HEADER_HASH.toString()
582
- : await this.l2BlockSource
583
- .getBlockHeader(blockNumber)
584
- .then(header => header?.hash())
585
- .then(hash => hash?.toString());
610
+ const blockHash = await this.l2BlockSource
611
+ .getBlockData({ number: blockNumber })
612
+ .then(data => data?.header.hash())
613
+ .then(hash => hash?.toString());
586
614
 
587
615
  return {
588
616
  state: this.currentState,
@@ -611,15 +639,20 @@ export class P2PClient extends WithTracer implements P2P {
611
639
  return;
612
640
  }
613
641
 
614
- await this.handleMinedBlocks(blocks);
615
- await this.maybeCallPrepareForSlot();
616
- await this.startCollectingMissingTxs(blocks);
617
642
  const lastBlock = blocks.at(-1)!;
618
- await this.synchedLatestSlot.set(BigInt(lastBlock.header.getSlot()));
643
+ const lastSlot = lastBlock.header.getSlot();
644
+
645
+ // Mark txs mined before releasing protections: a block landing at this slot supersedes any
646
+ // protection for txs it includes, so mined-marking must run first to keep just-landed txs from
647
+ // being unprotected into pending where they could be evicted before they are recorded as mined.
648
+ await this.handleMinedBlocks(blocks);
649
+ await this.maybeCallPrepareForSlot(lastSlot);
650
+ await this.collectingMissingTxs(blocks);
651
+ await this.synchedLatestSlot.set(BigInt(lastSlot));
619
652
  }
620
653
 
621
- /** Request txs for unproven blocks so the prover node has more chances to get them. */
622
- private async startCollectingMissingTxs(blocks: L2Block[]): Promise<void> {
654
+ /** Request txs for unproven blocks so the prover node can prove. */
655
+ private async collectingMissingTxs(blocks: L2Block[]): Promise<void> {
623
656
  try {
624
657
  // TODO(#15435): If the archiver has lagged behind L1, the reported proven block number may
625
658
  // be much lower than the actual one, and it does not update until the pending chain is
@@ -627,7 +660,7 @@ export class P2PClient extends WithTracer implements P2P {
627
660
  // are already proven, but the archiver has not yet updated its state. Until this is properly
628
661
  // fixed, it is mitigated by the expiration date of collection requests, which depends on
629
662
  // the slot number of the block.
630
- const provenBlockNumber = await this.l2BlockSource.getProvenBlockNumber();
663
+ const provenBlockNumber = (await this.l2BlockSource.getBlockNumber({ tag: 'proven' })) ?? BlockNumber.ZERO;
631
664
  const unprovenBlocks = blocks.filter(block => block.number > provenBlockNumber);
632
665
  for (const block of unprovenBlocks) {
633
666
  const txHashes = block.body.txEffects.map(txEffect => txEffect.txHash);
@@ -639,7 +672,17 @@ export class P2PClient extends WithTracer implements P2P {
639
672
  `Starting collection of ${missingTxHashes.length} missing txs for unproven mined block ${block.number}`,
640
673
  { missingTxHashes, blockNumber: block.number, blockHash: await block.hash().then(h => h.toString()) },
641
674
  );
642
- this.txCollection.startCollecting(block, missingTxHashes);
675
+ // Both `slashDataWithholdingToleranceSlots` and `p2pMissingTxCollectionDeadlineSlots`
676
+ // count *full slots after the block slot* — value N means collection runs until
677
+ // `slotStart(block.slot + N + 1)`. Take the larger of the two so collection never
678
+ // gives up before the data-withholding slash verdict is rendered.
679
+ const blockSlot = block.header.getSlot();
680
+ const toleranceSlots = this.config.slashDataWithholdingToleranceSlots;
681
+ const configuredSlots = this.config.p2pMissingTxCollectionDeadlineSlots ?? 0;
682
+ const deadlineSlot = SlotNumber(blockSlot + Math.max(toleranceSlots, configuredSlots) + 1);
683
+ const deadlineSeconds = getTimestampForSlot(deadlineSlot, this.epochCache.getL1Constants());
684
+ const deadline = new Date(Number(deadlineSeconds) * 1000);
685
+ await this.txCollection.collectFastForBlock(block, missingTxHashes, { deadline });
643
686
  }
644
687
  }
645
688
  } catch (err) {
@@ -652,7 +695,7 @@ export class P2PClient extends WithTracer implements P2P {
652
695
  * @param blocks - A list of finalized L2 blocks.
653
696
  * @returns Empty promise.
654
697
  */
655
- private async handleFinalizedL2Blocks(blocks: L2Block[]): Promise<void> {
698
+ private async handleFinalizedL2Blocks(blocks: BlockData[]): Promise<void> {
656
699
  if (!blocks.length) {
657
700
  return;
658
701
  }
@@ -700,20 +743,8 @@ export class P2PClient extends WithTracer implements P2P {
700
743
  return isEpochPrune;
701
744
  }
702
745
 
703
- /** Checks if the slot has changed and calls prepareForSlot if so. */
704
- private async maybeCallPrepareForSlot(): Promise<void> {
705
- // If we have a proposed checkpoint available, we want to prepare the target slot - otherwise we prepare the current slot
706
- const l2Tips = await this.l2Tips.getL2Tips();
707
- const hasProposedCheckpoint = l2Tips.proposedCheckpoint.checkpoint.number > l2Tips.checkpointed.checkpoint.number;
708
-
709
- let slot;
710
- if (this.epochCache.isProposerPipeliningEnabled() && hasProposedCheckpoint) {
711
- const { targetSlot } = this.epochCache.getTargetAndNextSlot();
712
- slot = targetSlot;
713
- } else {
714
- const { currentSlot } = this.epochCache.getCurrentAndNextSlot();
715
- slot = currentSlot;
716
- }
746
+ /** Calls prepareForSlot for the given slot if it advances past the last slot we prepared for. */
747
+ private async maybeCallPrepareForSlot(slot: SlotNumber): Promise<void> {
717
748
  if (slot <= this.lastSlotProcessed) {
718
749
  return;
719
750
  }
@@ -1,6 +1,6 @@
1
- # ProposalTxCollector Benchmarks
1
+ # BatchTxRequester Benchmarks
2
2
 
3
- This benchmark suite measures **how quickly a proposer node can fetch missing transactions from P2P peers** when building a block proposal. It compares two alternative transaction-collection implementations under several controlled "who-has-which-txs" distributions.
3
+ This benchmark suite measures **how quickly a proposer node can fetch missing transactions from P2P peers** when building a block proposal under several controlled "who-has-which-txs" distributions.
4
4
 
5
5
  ## Purpose
6
6
 
@@ -10,12 +10,6 @@ This benchmark answers:
10
10
 
11
11
  - How long does it take to fetch **N missing txs** (N ∈ **{10, 50, 100, 500}**)?
12
12
  - How do different **peer availability patterns** affect performance?
13
- - Which collector strategy performs better under each pattern?
14
-
15
- The suite compares two collectors:
16
-
17
- - **`BatchTxRequesterCollector`** (collector type: `batch-requester`)
18
- - **`SendBatchRequestCollector`** (collector type: `send-batch-request`)
19
13
 
20
14
  ## Architecture
21
15
 
@@ -24,7 +18,7 @@ The benchmark runs a small simulated network on localhost:
24
18
  ```
25
19
  ┌─────────────────────────────────────────────────────────────────────┐
26
20
  │ Test Process (Driver) │
27
- │ p2p_client.proposal_tx_collector.bench.test.ts │
21
+ │ p2p_client.batch_tx_requester.bench.test.ts │
28
22
  │ ┌─────────────────────────────────────────────────────────────┐ │
29
23
  │ │ WorkerClientManager │ │
30
24
  │ │ (src/testbench/worker_client_manager.ts) │ │
@@ -34,7 +28,7 @@ The benchmark runs a small simulated network on localhost:
34
28
  │ ▼ ▼ ▼ │
35
29
  │ ┌───────────┐ ┌───────────┐ ┌───────────┐ │
36
30
  │ │ Worker 0 │◄──────►│ Worker 1 │◄──────►│ Worker N-1│ │
37
- │ │ (Collector│ P2P │(Responder)│ P2P │(Responder)│ │
31
+ │ │(Aggregator│ P2P │(Responder)│ P2P │(Responder)│ │
38
32
  │ │ Node) │ │ │ │ │ │
39
33
  │ │ TxPool:[] │ │ TxPool: │ │ TxPool: │ │
40
34
  │ │ │ │ [txs...] │ │ [txs...] │ │
@@ -54,12 +48,12 @@ Using separate OS processes makes the setup closer to real networking behavior (
54
48
 
55
49
  The network is intentionally asymmetric:
56
50
 
57
- - **Worker 0 is the collector/proposer node**
51
+ - **Worker 0 is the aggregator/proposer node**
58
52
  - Starts with an **empty tx pool** (`[]`)
59
- - Is the only worker instructed to run the collector for each `BENCH_REQRESP` command
53
+ - Is the only worker instructed to run `BatchTxRequester` for each `BENCH_REQRESP` command
60
54
  - **Workers 1..N-1 are responder peers**
61
55
  - Locally generate and filter txs according to the distribution pattern
62
- - Respond to req/resp queries made by Worker 0's collector
56
+ - Respond to req/resp queries made by Worker 0's `BatchTxRequester`
63
57
 
64
58
  This models a proposer that has only `txHashes` in a proposal and must fetch the full tx bodies from the network.
65
59
 
@@ -72,7 +66,7 @@ Each benchmark case generates `missingTxCount` mock txs and assigns them to peer
72
66
  **Every responder peer has every transaction.**
73
67
 
74
68
  - Simulates the best-case: high replication / high gossip success
75
- - Expectation: collector should quickly succeed; differences mostly reflect collector overhead and batching strategy
69
+ - Expectation: the requester should quickly succeed; differences mostly reflect requester overhead and batching strategy
76
70
 
77
71
  ### `sparse`
78
72
 
@@ -81,7 +75,7 @@ Each benchmark case generates `missingTxCount` mock txs and assigns them to peer
81
75
  Each responder is bucketed and holds txs whose index falls into its bucket or the "next" bucket (striped by tx index).
82
76
 
83
77
  - Simulates partial propagation, churn, or uneven mempool convergence
84
- - Expectation: collector must query multiple peers and cope with "misses"
78
+ - Expectation: the requester must query multiple peers and cope with "misses"
85
79
 
86
80
  ### `pinned-only`
87
81
 
@@ -92,33 +86,13 @@ Each responder is bucketed and holds txs whose index falls into its bucket or th
92
86
 
93
87
  > **Guardrail:** the pinned peer index must be within `(0, numberOfPeers)` (Worker 0 cannot be pinned).
94
88
 
95
- ## Collectors Under Test
96
-
97
- ### `BatchTxRequesterCollector` (`batch-requester`)
98
-
99
- ```typescript
100
- new BatchTxRequesterCollector(p2pService, logger, new DateProvider())
101
- ```
102
-
103
- Uses the P2P service plus internal logic to fetch missing txs, coordinating requests in a batched or staged way.
104
-
105
- ### `SendBatchRequestCollector` (`send-batch-request`)
106
-
107
- ```typescript
108
- const maxPeers = 10;
109
- const maxRetryAttempts = Math.max(peerIds.length, 3);
110
- new SendBatchRequestCollector(p2pService, maxPeers, maxRetryAttempts)
111
- ```
112
-
113
- Explicitly caps the number of peers it will involve (`maxPeers`) and uses a retry budget derived from peer count.
114
-
115
89
  ## Test Parameters
116
90
 
117
91
  | Parameter | Value | Description |
118
92
  |-----------|-------|-------------|
119
93
  | `PEERS_PER_RUN` | 30 | Number of worker processes spawned |
120
94
  | `MISSING_TX_COUNTS` | 10, 50, 100, 500 | Number of missing transactions to fetch |
121
- | `TIMEOUT_MS` | 30,000 ms | Collector timeout per case |
95
+ | `TIMEOUT_MS` | 30,000 ms | Per-case timeout for the requester |
122
96
  | `TEST_TIMEOUT_MS` | 600,000 ms | Overall Jest timeout (10 minutes) |
123
97
 
124
98
  ## Running
@@ -127,13 +101,13 @@ From the p2p package:
127
101
 
128
102
  ```bash
129
103
  cd yarn-project/p2p
130
- yarn test src/client/test/tx_proposal_collector/p2p_client.proposal_tx_collector.bench.test.ts
104
+ yarn test src/client/test/p2p_client.batch_tx_requester.bench.test.ts
131
105
  ```
132
106
 
133
107
  Or from repo root:
134
108
 
135
109
  ```bash
136
- yarn test p2p_client.proposal_tx_collector.bench.test.ts
110
+ yarn test p2p_client.batch_tx_requester.bench.test.ts
137
111
  ```
138
112
 
139
113
  The benchmark is intentionally long due to spawning many processes and running multiple cases.
@@ -145,14 +119,12 @@ The benchmark is intentionally long due to spawning many processes and running m
145
119
  If no env vars are set, the suite prints a table:
146
120
 
147
121
  ```
148
- | Collector | Distribution | Missing | Duration (ms) | Fetched | Success |
149
- |---------------------|--------------|---------|---------------|---------|---------|
150
- | batch-requester | pinned-only | 10 | 123 | 10 | Yes |
151
- | send-batch-request | pinned-only | 10 | 145 | 10 | Yes |
122
+ | Distribution | Missing | Duration (ms) | Fetched | Success |
123
+ |--------------|---------|---------------|---------|---------|
124
+ | pinned-only | 10 | 123 | 10 | Yes |
125
+ | pinned-only | 50 | 145 | 50 | Yes |
152
126
  ```
153
127
 
154
- Plus a comparison summary stating which collector was faster per `(distribution, missing)` pair.
155
-
156
128
  ### JSON metrics (for CI/dashboards)
157
129
 
158
130
  ```bash
@@ -160,8 +132,8 @@ BENCH_OUTPUT=/path/results.json yarn test ...
160
132
  ```
161
133
 
162
134
  Writes JSON metrics like:
163
- - `ProposalTxCollector/<collector>/<distribution>/missing_<N>/duration` (ms)
164
- - `ProposalTxCollector/<collector>/<distribution>/missing_<N>/fetched` (txs)
135
+ - `BatchTxRequester/<distribution>/missing_<N>/duration` (ms)
136
+ - `BatchTxRequester/<distribution>/missing_<N>/fetched` (txs)
165
137
 
166
138
  ### Markdown file output
167
139
 
@@ -175,14 +147,14 @@ Writes the pretty table + summary to disk.
175
147
 
176
148
  For each case the benchmark records:
177
149
 
178
- - `durationMs`: wall-clock time spent inside the collector call
179
- - `fetchedCount`: how many txs were returned by the collector
150
+ - `durationMs`: wall-clock time spent inside the requester call
151
+ - `fetchedCount`: how many txs were returned by the requester
180
152
  - `success`: `fetchedCount === missingTxCount`
181
153
 
182
154
  **Guidelines:**
183
155
 
184
156
  - **Always check `Success` first.** A faster run that fetched fewer txs is not a win.
185
- - Compare collectors **within the same distribution + missing count** only.
157
+ - Compare runs **within the same distribution + missing count** only.
186
158
  - Expect `pinned-only` to highlight pinned-peer behavior (fast if pinned peer is used effectively; slow if the algorithm wastes time sampling other peers).
187
159
  - Expect `sparse` to be the most "network-like" stress case, since many peers won't have each requested tx.
188
160
 
@@ -193,7 +165,7 @@ Inside each worker, the benchmark intentionally reduces variability:
193
165
  - **Unlimited rate limits** are installed so the req/resp rate limiter doesn't dominate results
194
166
  - **Deterministic tx generation** ensures all workers see the same tx set without large IPC payloads
195
167
 
196
- This makes the benchmark better for *comparing collectors* (A vs B), but it is **not** a perfect model of production networking conditions.
168
+ This makes the benchmark better for tracking regressions, but it is **not** a perfect model of production networking conditions.
197
169
 
198
170
  ## Limitations
199
171
 
@@ -207,9 +179,7 @@ This benchmark does **not** measure:
207
179
 
208
180
  | File | Purpose |
209
181
  |------|---------|
210
- | `p2p_client.proposal_tx_collector.bench.test.ts` | Test suite (cases, distributions, output formatting) |
211
- | `proposal_tx_collector_worker.ts` | Collector-specific worker implementation |
212
- | `proposal_tx_collector_worker_protocol.ts` | IPC message types and serialization |
182
+ | `p2p_client.batch_tx_requester.bench.test.ts` | Test suite (cases, distributions, output formatting) |
213
183
  | `src/testbench/worker_client_manager.ts` | Worker process manager (forking, IPC, orchestration) |
214
184
  | `src/testbench/p2p_client_testbench_worker.ts` | General testbench worker implementation |
215
185
  | `src/test-helpers/testbench-utils.ts` | Shared mocks and utilities (InMemoryTxPool, InMemoryAttestationPool, etc.) |