@aztec/p2p 0.0.1-commit.42ee6df9b → 0.0.1-commit.431c48d

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 (360) 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 +32 -23
  8. package/dest/client/interface.d.ts +44 -11
  9. package/dest/client/interface.d.ts.map +1 -1
  10. package/dest/client/p2p_client.d.ts +34 -19
  11. package/dest/client/p2p_client.d.ts.map +1 -1
  12. package/dest/client/p2p_client.js +119 -59
  13. package/dest/config.d.ts +150 -107
  14. package/dest/config.d.ts.map +1 -1
  15. package/dest/config.js +77 -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 +10 -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 +29 -20
  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.d.ts +1 -1
  38. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -1
  39. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +3 -3
  40. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +1 -1
  41. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -1
  42. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +3 -1
  43. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +2 -1
  44. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -1
  45. package/dest/mem_pools/tx_pool_v2/eviction/index.js +1 -0
  46. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts +16 -0
  47. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts.map +1 -0
  48. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.js +64 -0
  49. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts +1 -1
  50. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -1
  51. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +3 -4
  52. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts +1 -1
  53. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -1
  54. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +6 -7
  55. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +1 -1
  56. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -1
  57. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +6 -5
  58. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts +11 -1
  59. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts.map +1 -1
  60. package/dest/mem_pools/tx_pool_v2/instrumentation.js +24 -0
  61. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +33 -5
  62. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
  63. package/dest/mem_pools/tx_pool_v2/interfaces.js +2 -1
  64. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +5 -2
  65. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
  66. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +8 -5
  67. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +15 -1
  68. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -1
  69. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +31 -0
  70. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +16 -3
  71. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -1
  72. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +83 -32
  73. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +50 -6
  74. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -1
  75. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +243 -127
  76. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +10 -3
  77. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  78. package/dest/msg_validators/attestation_validator/attestation_validator.js +38 -16
  79. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +7 -3
  80. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
  81. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +4 -5
  82. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +8 -3
  83. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
  84. package/dest/msg_validators/proposal_validator/block_proposal_validator.js +2 -2
  85. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +8 -3
  86. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
  87. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +8 -2
  88. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +25 -3
  89. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
  90. package/dest/msg_validators/proposal_validator/proposal_validator.js +85 -15
  91. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +1 -1
  92. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  93. package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +8 -15
  94. package/dest/msg_validators/tx_validator/allowed_public_setup.js +3 -3
  95. package/dest/msg_validators/tx_validator/archive_cache.js +1 -1
  96. package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts +15 -0
  97. package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts.map +1 -0
  98. package/dest/msg_validators/tx_validator/cached_tx_validator.js +19 -0
  99. package/dest/msg_validators/tx_validator/data_validator.d.ts +2 -1
  100. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  101. package/dest/msg_validators/tx_validator/data_validator.js +1 -0
  102. package/dest/msg_validators/tx_validator/factory.d.ts +14 -15
  103. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  104. package/dest/msg_validators/tx_validator/factory.js +29 -16
  105. package/dest/msg_validators/tx_validator/gas_validator.d.ts +47 -10
  106. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  107. package/dest/msg_validators/tx_validator/gas_validator.js +65 -48
  108. package/dest/msg_validators/tx_validator/index.d.ts +3 -1
  109. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  110. package/dest/msg_validators/tx_validator/index.js +2 -0
  111. package/dest/msg_validators/tx_validator/phases_validator.js +2 -2
  112. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +2 -1
  113. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
  114. package/dest/msg_validators/tx_validator/tx_proof_validator.js +2 -0
  115. package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts +48 -0
  116. package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts.map +1 -0
  117. package/dest/msg_validators/tx_validator/tx_validation_cache.js +68 -0
  118. package/dest/services/data_store.d.ts +1 -1
  119. package/dest/services/data_store.d.ts.map +1 -1
  120. package/dest/services/data_store.js +5 -5
  121. package/dest/services/discv5/discV5_service.d.ts +13 -2
  122. package/dest/services/discv5/discV5_service.d.ts.map +1 -1
  123. package/dest/services/discv5/discV5_service.js +119 -23
  124. package/dest/services/discv5/persisted_enr_store.d.ts +38 -0
  125. package/dest/services/discv5/persisted_enr_store.d.ts.map +1 -0
  126. package/dest/services/discv5/persisted_enr_store.js +145 -0
  127. package/dest/services/dummy_service.d.ts +18 -18
  128. package/dest/services/dummy_service.d.ts.map +1 -1
  129. package/dest/services/dummy_service.js +19 -18
  130. package/dest/services/encoding.d.ts +19 -6
  131. package/dest/services/encoding.d.ts.map +1 -1
  132. package/dest/services/encoding.js +25 -15
  133. package/dest/services/gossipsub/topic_score_params.d.ts +6 -12
  134. package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -1
  135. package/dest/services/gossipsub/topic_score_params.js +4 -14
  136. package/dest/services/libp2p/instrumentation.d.ts +6 -1
  137. package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
  138. package/dest/services/libp2p/instrumentation.js +21 -0
  139. package/dest/services/libp2p/libp2p_service.d.ts +40 -43
  140. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  141. package/dest/services/libp2p/libp2p_service.js +370 -276
  142. package/dest/services/peer-manager/peer_manager.d.ts +26 -2
  143. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  144. package/dest/services/peer-manager/peer_manager.js +103 -17
  145. package/dest/services/peer-manager/peer_scoring.d.ts +30 -1
  146. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  147. package/dest/services/peer-manager/peer_scoring.js +74 -3
  148. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +1 -8
  149. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -1
  150. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +35 -44
  151. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +8 -5
  152. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
  153. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +5 -14
  154. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -1
  155. package/dest/services/reqresp/batch-tx-requester/tx_validator.js +6 -20
  156. package/dest/services/reqresp/config.d.ts +15 -3
  157. package/dest/services/reqresp/config.d.ts.map +1 -1
  158. package/dest/services/reqresp/config.js +11 -0
  159. package/dest/services/reqresp/interface.d.ts +16 -18
  160. package/dest/services/reqresp/interface.d.ts.map +1 -1
  161. package/dest/services/reqresp/interface.js +10 -20
  162. package/dest/services/reqresp/metrics.d.ts +1 -1
  163. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  164. package/dest/services/reqresp/metrics.js +0 -1
  165. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +4 -3
  166. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -1
  167. package/dest/services/reqresp/protocols/block_txs/bitvector.js +3 -2
  168. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +1 -1
  169. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
  170. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +31 -28
  171. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +12 -7
  172. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
  173. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +42 -24
  174. package/dest/services/reqresp/protocols/index.d.ts +1 -2
  175. package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
  176. package/dest/services/reqresp/protocols/index.js +0 -1
  177. package/dest/services/reqresp/protocols/tx.d.ts +1 -1
  178. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  179. package/dest/services/reqresp/protocols/tx.js +1 -3
  180. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
  181. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
  182. package/dest/services/reqresp/rate-limiter/rate_limits.js +3 -13
  183. package/dest/services/reqresp/reqresp.d.ts +7 -29
  184. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  185. package/dest/services/reqresp/reqresp.js +59 -209
  186. package/dest/services/service.d.ts +41 -19
  187. package/dest/services/service.d.ts.map +1 -1
  188. package/dest/services/tx_collection/config.d.ts +2 -23
  189. package/dest/services/tx_collection/config.d.ts.map +1 -1
  190. package/dest/services/tx_collection/config.js +2 -55
  191. package/dest/services/tx_collection/file_store_tx_collection.d.ts +12 -28
  192. package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -1
  193. package/dest/services/tx_collection/file_store_tx_collection.js +43 -83
  194. package/dest/services/tx_collection/index.d.ts +2 -3
  195. package/dest/services/tx_collection/index.d.ts.map +1 -1
  196. package/dest/services/tx_collection/index.js +0 -1
  197. package/dest/services/tx_collection/instrumentation.d.ts +1 -1
  198. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
  199. package/dest/services/tx_collection/instrumentation.js +0 -2
  200. package/dest/services/tx_collection/tx_collection.d.ts +35 -51
  201. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  202. package/dest/services/tx_collection/tx_collection.js +275 -119
  203. package/dest/services/tx_collection/tx_collection_sink.d.ts +1 -1
  204. package/dest/services/tx_collection/tx_collection_sink.js +2 -2
  205. package/dest/services/tx_collection/tx_source.d.ts +1 -1
  206. package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
  207. package/dest/services/tx_collection/tx_source.js +4 -1
  208. package/dest/services/tx_file_store/tx_file_store.d.ts +1 -3
  209. package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -1
  210. package/dest/services/tx_file_store/tx_file_store.js +4 -14
  211. package/dest/services/tx_provider.d.ts +3 -1
  212. package/dest/services/tx_provider.d.ts.map +1 -1
  213. package/dest/services/tx_provider.js +3 -0
  214. package/dest/test-helpers/make-test-p2p-clients.d.ts +1 -1
  215. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  216. package/dest/test-helpers/make-test-p2p-clients.js +5 -2
  217. package/dest/test-helpers/mock-pubsub.d.ts +33 -9
  218. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  219. package/dest/test-helpers/mock-pubsub.js +57 -44
  220. package/dest/test-helpers/reqresp-nodes.d.ts +4 -5
  221. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  222. package/dest/test-helpers/reqresp-nodes.js +16 -18
  223. package/dest/test-helpers/test_tx_provider.d.ts +3 -1
  224. package/dest/test-helpers/test_tx_provider.d.ts.map +1 -1
  225. package/dest/test-helpers/test_tx_provider.js +3 -0
  226. package/dest/test-helpers/testbench-utils.d.ts +15 -14
  227. package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
  228. package/dest/test-helpers/testbench-utils.js +28 -13
  229. package/dest/testbench/p2p_client_testbench_worker.d.ts +3 -5
  230. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  231. package/dest/testbench/p2p_client_testbench_worker.js +60 -27
  232. package/dest/testbench/worker_client_manager.d.ts +10 -6
  233. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  234. package/dest/testbench/worker_client_manager.js +51 -8
  235. package/dest/util.d.ts +11 -6
  236. package/dest/util.d.ts.map +1 -1
  237. package/dest/util.js +35 -14
  238. package/dest/versioning.d.ts +3 -6
  239. package/dest/versioning.d.ts.map +1 -1
  240. package/dest/versioning.js +3 -24
  241. package/package.json +17 -17
  242. package/src/bootstrap/bootstrap.ts +17 -3
  243. package/src/client/factory.ts +48 -24
  244. package/src/client/interface.ts +39 -17
  245. package/src/client/p2p_client.ts +135 -92
  246. package/src/client/test/{tx_proposal_collector/README.md → p2p_client.batch_tx_requester.bench.README.md} +23 -53
  247. package/src/config.ts +159 -34
  248. package/src/errors/reqresp.error.ts +13 -19
  249. package/src/mem_pools/attestation_pool/attestation_pool.ts +325 -242
  250. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +238 -63
  251. package/src/mem_pools/attestation_pool/mocks.ts +13 -8
  252. package/src/mem_pools/instrumentation.ts +18 -12
  253. package/src/mem_pools/tx_pool_v2/archive/tx_archive.ts +30 -20
  254. package/src/mem_pools/tx_pool_v2/deleted_pool.ts +7 -7
  255. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +2 -4
  256. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +3 -2
  257. package/src/mem_pools/tx_pool_v2/eviction/index.ts +1 -0
  258. package/src/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.ts +67 -0
  259. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +1 -3
  260. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +5 -7
  261. package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +5 -6
  262. package/src/mem_pools/tx_pool_v2/instrumentation.ts +27 -0
  263. package/src/mem_pools/tx_pool_v2/interfaces.ts +31 -4
  264. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +13 -7
  265. package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +35 -0
  266. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +94 -31
  267. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +270 -133
  268. package/src/msg_validators/attestation_validator/attestation_validator.ts +46 -15
  269. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +15 -7
  270. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +15 -3
  271. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +26 -3
  272. package/src/msg_validators/proposal_validator/proposal_validator.ts +94 -12
  273. package/src/msg_validators/tx_validator/README.md +13 -3
  274. package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +3 -12
  275. package/src/msg_validators/tx_validator/allowed_public_setup.ts +3 -3
  276. package/src/msg_validators/tx_validator/archive_cache.ts +1 -1
  277. package/src/msg_validators/tx_validator/cached_tx_validator.ts +31 -0
  278. package/src/msg_validators/tx_validator/data_validator.ts +2 -0
  279. package/src/msg_validators/tx_validator/factory.ts +37 -20
  280. package/src/msg_validators/tx_validator/gas_validator.ts +99 -54
  281. package/src/msg_validators/tx_validator/index.ts +2 -0
  282. package/src/msg_validators/tx_validator/phases_validator.ts +2 -2
  283. package/src/msg_validators/tx_validator/tx_proof_validator.ts +2 -0
  284. package/src/msg_validators/tx_validator/tx_validation_cache.ts +101 -0
  285. package/src/services/data_store.ts +5 -13
  286. package/src/services/discv5/discV5_service.ts +126 -14
  287. package/src/services/discv5/persisted_enr_store.ts +158 -0
  288. package/src/services/dummy_service.ts +25 -44
  289. package/src/services/encoding.ts +28 -20
  290. package/src/services/gossipsub/README.md +33 -11
  291. package/src/services/gossipsub/topic_score_params.ts +9 -18
  292. package/src/services/libp2p/instrumentation.ts +22 -0
  293. package/src/services/libp2p/libp2p_service.ts +433 -302
  294. package/src/services/peer-manager/peer_manager.ts +112 -16
  295. package/src/services/peer-manager/peer_scoring.ts +81 -3
  296. package/src/services/reqresp/README.md +2 -37
  297. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +39 -52
  298. package/src/services/reqresp/batch-tx-requester/interface.ts +11 -4
  299. package/src/services/reqresp/batch-tx-requester/tx_validator.ts +12 -25
  300. package/src/services/reqresp/config.ts +19 -2
  301. package/src/services/reqresp/interface.ts +21 -47
  302. package/src/services/reqresp/metrics.ts +0 -1
  303. package/src/services/reqresp/protocols/block_txs/bitvector.ts +3 -2
  304. package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +34 -30
  305. package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +47 -20
  306. package/src/services/reqresp/protocols/index.ts +0 -1
  307. package/src/services/reqresp/protocols/tx.ts +1 -3
  308. package/src/services/reqresp/rate-limiter/rate_limits.ts +3 -13
  309. package/src/services/reqresp/reqresp.ts +69 -252
  310. package/src/services/service.ts +48 -37
  311. package/src/services/tx_collection/config.ts +3 -80
  312. package/src/services/tx_collection/file_store_tx_collection.ts +54 -103
  313. package/src/services/tx_collection/index.ts +1 -6
  314. package/src/services/tx_collection/instrumentation.ts +1 -7
  315. package/src/services/tx_collection/tx_collection.ts +330 -173
  316. package/src/services/tx_collection/tx_collection_sink.ts +2 -2
  317. package/src/services/tx_collection/tx_source.ts +2 -1
  318. package/src/services/tx_file_store/tx_file_store.ts +5 -17
  319. package/src/services/tx_provider.ts +5 -0
  320. package/src/test-helpers/make-test-p2p-clients.ts +3 -0
  321. package/src/test-helpers/mock-pubsub.ts +61 -60
  322. package/src/test-helpers/reqresp-nodes.ts +12 -22
  323. package/src/test-helpers/test_tx_provider.ts +5 -0
  324. package/src/test-helpers/testbench-utils.ts +35 -26
  325. package/src/testbench/p2p_client_testbench_worker.ts +68 -44
  326. package/src/testbench/worker_client_manager.ts +59 -19
  327. package/src/util.ts +32 -17
  328. package/src/versioning.ts +3 -33
  329. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts +0 -2
  330. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts.map +0 -1
  331. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +0 -315
  332. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts +0 -73
  333. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts.map +0 -1
  334. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.js +0 -8
  335. package/dest/msg_validators/clock_tolerance.d.ts +0 -21
  336. package/dest/msg_validators/clock_tolerance.d.ts.map +0 -1
  337. package/dest/msg_validators/clock_tolerance.js +0 -38
  338. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +0 -64
  339. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +0 -1
  340. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +0 -151
  341. package/dest/services/reqresp/protocols/block.d.ts +0 -9
  342. package/dest/services/reqresp/protocols/block.d.ts.map +0 -1
  343. package/dest/services/reqresp/protocols/block.js +0 -32
  344. package/dest/services/tx_collection/fast_tx_collection.d.ts +0 -51
  345. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +0 -1
  346. package/dest/services/tx_collection/fast_tx_collection.js +0 -311
  347. package/dest/services/tx_collection/proposal_tx_collector.d.ts +0 -48
  348. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +0 -1
  349. package/dest/services/tx_collection/proposal_tx_collector.js +0 -50
  350. package/dest/services/tx_collection/slow_tx_collection.d.ts +0 -57
  351. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +0 -1
  352. package/dest/services/tx_collection/slow_tx_collection.js +0 -211
  353. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +0 -355
  354. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.ts +0 -43
  355. package/src/msg_validators/clock_tolerance.ts +0 -52
  356. package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +0 -161
  357. package/src/services/reqresp/protocols/block.ts +0 -37
  358. package/src/services/tx_collection/fast_tx_collection.ts +0 -361
  359. package/src/services/tx_collection/proposal_tx_collector.ts +0 -108
  360. package/src/services/tx_collection/slow_tx_collection.ts +0 -266
@@ -1,24 +1,31 @@
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';
9
+ import { type PromiseWithResolvers, promiseWithResolvers } from '@aztec/foundation/promise';
6
10
  import { DateProvider } from '@aztec/foundation/timer';
7
11
  import type { AztecAsyncKVStore, AztecAsyncSingleton } from '@aztec/kv-store';
8
12
  import { L2TipsKVStore } from '@aztec/kv-store/stores';
9
13
  import {
14
+ type BlockData,
15
+ type BlockHash,
10
16
  type CheckpointId,
11
17
  type EthAddress,
18
+ EventDrivenL2BlockStream,
12
19
  type L2Block,
13
20
  type L2BlockId,
14
21
  type L2BlockSource,
15
- L2BlockStream,
16
22
  type L2BlockStreamEvent,
17
- type L2Tips,
18
23
  type L2TipsStore,
24
+ type LocalL2Tips,
19
25
  } from '@aztec/stdlib/block';
20
26
  import type { ContractDataSource } from '@aztec/stdlib/contract';
21
- import { type PeerInfo, tryStop } from '@aztec/stdlib/interfaces/server';
27
+ import { getTimestampForSlot } from '@aztec/stdlib/epoch-helpers';
28
+ import { type GetTxByHashOptions, type P2PConnectivity, type PeerInfo, tryStop } from '@aztec/stdlib/interfaces/server';
22
29
  import { type BlockProposal, CheckpointAttestation, type CheckpointProposal, type TopicType } from '@aztec/stdlib/p2p';
23
30
  import type { BlockHeader, Tx, TxHash } from '@aztec/stdlib/tx';
24
31
  import { Attributes, type TelemetryClient, WithTracer, getTelemetryClient, trackSpan } from '@aztec/telemetry-client';
@@ -28,18 +35,15 @@ import type { ENR } from '@nethermindeth/enr';
28
35
 
29
36
  import { type P2PConfig, getP2PDefaultConfig } from '../config.js';
30
37
  import { TxPoolError } from '../errors/tx-pool.error.js';
31
- import type { AttestationPoolApi } from '../mem_pools/attestation_pool/attestation_pool.js';
38
+ import type { AttestationPoolApi, ProposalsForSlot } from '../mem_pools/attestation_pool/attestation_pool.js';
32
39
  import type { MemPools } from '../mem_pools/interface.js';
33
40
  import type { TxPoolV2 } from '../mem_pools/tx_pool_v2/interfaces.js';
34
41
  import type { AuthRequest, StatusMessage } from '../services/index.js';
35
- import {
36
- ReqRespSubProtocol,
37
- type ReqRespSubProtocolHandler,
38
- type ReqRespSubProtocolValidators,
39
- } from '../services/reqresp/interface.js';
42
+ import { ReqRespSubProtocol, type ReqRespSubProtocolHandler } from '../services/reqresp/interface.js';
40
43
  import type {
41
44
  DuplicateAttestationInfo,
42
45
  DuplicateProposalInfo,
46
+ OversizedProposalInfo,
43
47
  P2PBlockReceivedCallback,
44
48
  P2PCheckpointReceivedCallback,
45
49
  P2PService,
@@ -58,7 +62,7 @@ export class P2PClient extends WithTracer implements P2P {
58
62
 
59
63
  private currentState = P2PClientState.IDLE;
60
64
  private syncPromise = Promise.resolve();
61
- private syncResolve?: () => void = undefined;
65
+ private syncResolvers?: PromiseWithResolvers<void> = undefined;
62
66
  private latestBlockNumberAtStart = -1;
63
67
  private provenBlockNumberAtStart = -1;
64
68
  private finalizedBlockNumberAtStart = -1;
@@ -71,7 +75,7 @@ export class P2PClient extends WithTracer implements P2P {
71
75
 
72
76
  private config: P2PConfig;
73
77
 
74
- private blockStream: L2BlockStream | undefined;
78
+ private blockStream: EventDrivenL2BlockStream | undefined;
75
79
 
76
80
  private txProvider: TxProvider;
77
81
 
@@ -80,9 +84,6 @@ export class P2PClient extends WithTracer implements P2P {
80
84
  /** Tracks the last slot for which we called prepareForSlot */
81
85
  private lastSlotProcessed: SlotNumber = SlotNumber.ZERO;
82
86
 
83
- /** Polls for slot changes and calls prepareForSlot on the tx pool */
84
- private slotMonitor: RunningPromise | undefined;
85
-
86
87
  constructor(
87
88
  private store: AztecAsyncKVStore,
88
89
  private l2BlockSource: L2BlockSource & ContractDataSource,
@@ -95,6 +96,7 @@ export class P2PClient extends WithTracer implements P2P {
95
96
  private _dateProvider: DateProvider = new DateProvider(),
96
97
  private telemetry: TelemetryClient = getTelemetryClient(),
97
98
  private log = createLogger('p2p'),
99
+ initialBlockHash: BlockHash,
98
100
  ) {
99
101
  super(telemetry, 'P2PClient');
100
102
 
@@ -110,7 +112,7 @@ export class P2PClient extends WithTracer implements P2P {
110
112
  this.telemetry,
111
113
  );
112
114
 
113
- this.l2Tips = new L2TipsKVStore(store, 'p2p_client');
115
+ this.l2Tips = new L2TipsKVStore(store, 'p2p_client', initialBlockHash);
114
116
  this.synchedLatestSlot = store.openSingleton('p2p_pool_last_l2_slot');
115
117
  }
116
118
 
@@ -135,6 +137,10 @@ export class P2PClient extends WithTracer implements P2P {
135
137
  return Promise.resolve(this.p2pService.getPeers(includePending));
136
138
  }
137
139
 
140
+ public getP2PConnectivity(): Promise<P2PConnectivity> {
141
+ return Promise.resolve(this.p2pService.getP2PConnectivity());
142
+ }
143
+
138
144
  public getGossipMeshPeerCount(topicType: TopicType): Promise<number> {
139
145
  return Promise.resolve(this.p2pService.getGossipMeshPeerCount(topicType));
140
146
  }
@@ -148,7 +154,7 @@ export class P2PClient extends WithTracer implements P2P {
148
154
  this.p2pService.updateConfig(config);
149
155
  }
150
156
 
151
- public getL2Tips(): Promise<L2Tips> {
157
+ public getL2Tips(): Promise<LocalL2Tips> {
152
158
  return this.l2Tips.getL2Tips();
153
159
  }
154
160
 
@@ -164,7 +170,7 @@ export class P2PClient extends WithTracer implements P2P {
164
170
  const from = BlockNumber(oldFinalizedBlockNum + 1);
165
171
  const limit = event.block.number - from + 1;
166
172
  if (limit > 0) {
167
- const oldBlocks = await this.l2BlockSource.getBlocks(from, limit);
173
+ const oldBlocks = await this.l2BlockSource.getBlocksData({ from, limit });
168
174
  await this.handleFinalizedL2Blocks(oldBlocks);
169
175
  }
170
176
  break;
@@ -174,10 +180,12 @@ export class P2PClient extends WithTracer implements P2P {
174
180
  break;
175
181
  case 'chain-pruned':
176
182
  this.txCollection.stopCollectingForBlocksAfter(event.block.number);
177
- await this.handlePruneL2Blocks(event.block, event.checkpoint);
183
+ await this.handlePruneL2Blocks(event.block, event.checkpointed.checkpoint);
178
184
  break;
179
185
  case 'chain-checkpointed':
180
186
  break;
187
+ case 'chain-proposed':
188
+ break;
181
189
  default: {
182
190
  const _: never = event;
183
191
  break;
@@ -236,9 +244,8 @@ export class P2PClient extends WithTracer implements P2P {
236
244
  // this gets resolved on `startServiceIfSynched`
237
245
  this.initBlockStream();
238
246
  this.setCurrentState(P2PClientState.SYNCHING);
239
- this.syncPromise = new Promise(resolve => {
240
- this.syncResolve = resolve;
241
- });
247
+ this.syncResolvers = promiseWithResolvers<void>();
248
+ this.syncPromise = this.syncResolvers.promise;
242
249
  this.log.info(`Initiating p2p sync from ${syncedLatestBlock}`, {
243
250
  syncedLatestBlock,
244
251
  syncedProvenBlock,
@@ -257,33 +264,24 @@ export class P2PClient extends WithTracer implements P2P {
257
264
  });
258
265
  }
259
266
 
260
- this.blockStream!.start();
261
- await this.txCollection.start();
267
+ // Should never happen: all branches above call initBlockStream()
268
+ if (!this.blockStream) {
269
+ throw new Error('Block stream not initialized');
270
+ }
271
+ this.blockStream.start();
262
272
  this.txFileStore?.start();
263
273
 
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
274
  return this.syncPromise;
273
275
  }
274
276
 
275
- addReqRespSubProtocol(
276
- subProtocol: ReqRespSubProtocol,
277
- handler: ReqRespSubProtocolHandler,
278
- validator: ReqRespSubProtocolValidators[ReqRespSubProtocol],
279
- ): Promise<void> {
280
- return this.p2pService.addReqRespSubProtocol(subProtocol, handler, validator);
277
+ addReqRespSubProtocol(subProtocol: ReqRespSubProtocol, handler: ReqRespSubProtocolHandler): Promise<void> {
278
+ return this.p2pService.addReqRespSubProtocol(subProtocol, handler);
281
279
  }
282
280
 
283
281
  private initBlockStream(startingBlock?: BlockNumber) {
284
282
  if (!this.blockStream) {
285
283
  const { blockRequestBatchSize: batchSize, blockCheckIntervalMS: pollIntervalMS } = this.config;
286
- this.blockStream = new L2BlockStream(
284
+ this.blockStream = new EventDrivenL2BlockStream(
287
285
  this.l2BlockSource,
288
286
  this,
289
287
  this,
@@ -299,8 +297,6 @@ export class P2PClient extends WithTracer implements P2P {
299
297
  */
300
298
  public async stop() {
301
299
  this.log.debug('Stopping p2p client...');
302
- await this.slotMonitor?.stop();
303
- this.log.debug('Stopped slot monitor');
304
300
  await tryStop(this.txCollection);
305
301
  this.log.debug('Stopped tx collection service');
306
302
  await this.txFileStore?.stop();
@@ -319,7 +315,11 @@ export class P2PClient extends WithTracer implements P2P {
319
315
  /** Triggers a sync to the archiver. Used for testing. */
320
316
  public async sync() {
321
317
  this.initBlockStream();
322
- await this.blockStream!.sync();
318
+ // Should never happen: initBlockStream() creates blockStream if absent
319
+ if (!this.blockStream) {
320
+ throw new Error('Block stream not initialized');
321
+ }
322
+ await this.blockStream.sync();
323
323
  }
324
324
 
325
325
  @trackSpan('p2pClient.broadcastProposal', async proposal => ({
@@ -357,8 +357,19 @@ export class P2PClient extends WithTracer implements P2P {
357
357
  // Store our own last-block proposal so we can respond to req/resp requests for it.
358
358
  await this.attestationPool.tryAddBlockProposal(blockProposal);
359
359
  }
360
- // Gossipsub doesn't deliver own messages, so fire the all-nodes handler locally
361
- await this.p2pService.notifyOwnCheckpointProposal(proposal.toCore());
360
+ const checkpointCore = proposal.toCore();
361
+ const { count } = await this.attestationPool.tryAddCheckpointProposal(checkpointCore);
362
+ if (count > 1) {
363
+ if (this.config.broadcastEquivocatedProposals) {
364
+ this.log.warn(`Broadcasting equivocated checkpoint proposal for slot ${proposal.slotNumber}`, {
365
+ slot: proposal.slotNumber,
366
+ archive: proposal.archive.toString(),
367
+ count,
368
+ });
369
+ } else {
370
+ throw new Error(`Attempted to broadcast a duplicate checkpoint proposal for slot ${proposal.slotNumber}`);
371
+ }
372
+ }
362
373
  return this.p2pService.propagate(proposal);
363
374
  }
364
375
 
@@ -369,10 +380,10 @@ export class P2PClient extends WithTracer implements P2P {
369
380
 
370
381
  public async getCheckpointAttestationsForSlot(
371
382
  slot: SlotNumber,
372
- proposalId?: string,
383
+ proposalPayloadHash?: CheckpointProposalHash,
373
384
  ): Promise<CheckpointAttestation[]> {
374
- return await (proposalId
375
- ? this.attestationPool.getCheckpointAttestationsForSlotAndProposal(slot, proposalId)
385
+ return await (proposalPayloadHash
386
+ ? this.attestationPool.getCheckpointAttestationsForSlotAndProposal(slot, proposalPayloadHash)
376
387
  : this.attestationPool.getCheckpointAttestationsForSlot(slot));
377
388
  }
378
389
 
@@ -380,10 +391,18 @@ export class P2PClient extends WithTracer implements P2P {
380
391
  return this.attestationPool.addOwnCheckpointAttestations(attestations);
381
392
  }
382
393
 
394
+ public getProposalsForSlot(slot: SlotNumber): Promise<ProposalsForSlot> {
395
+ return this.attestationPool.getProposalsForSlot(slot);
396
+ }
397
+
383
398
  public hasBlockProposalsForSlot(slot: SlotNumber): Promise<boolean> {
384
399
  return this.attestationPool.hasBlockProposalsForSlot(slot);
385
400
  }
386
401
 
402
+ public hasCheckpointProposalForSlot(slot: SlotNumber): Promise<boolean> {
403
+ return this.attestationPool.hasCheckpointProposalForSlot(slot);
404
+ }
405
+
387
406
  // REVIEW: https://github.com/AztecProtocol/aztec-packages/issues/7963
388
407
  // ^ This pattern is not my favorite (md)
389
408
  public registerBlockProposalHandler(handler: P2PBlockReceivedCallback): void {
@@ -402,11 +421,19 @@ export class P2PClient extends WithTracer implements P2P {
402
421
  this.p2pService.registerDuplicateProposalCallback(callback);
403
422
  }
404
423
 
424
+ public registerOversizedProposalCallback(callback: (info: OversizedProposalInfo) => void): void {
425
+ this.p2pService.registerOversizedProposalCallback(callback);
426
+ }
427
+
405
428
  public registerDuplicateAttestationCallback(callback: (info: DuplicateAttestationInfo) => void): void {
406
429
  this.p2pService.registerDuplicateAttestationCallback(callback);
407
430
  }
408
431
 
409
- public async getPendingTxs(limit?: number, after?: TxHash): Promise<Tx[]> {
432
+ public registerCheckpointAttestationCallback(callback: (attestation: CheckpointAttestation) => void): void {
433
+ this.p2pService.registerCheckpointAttestationCallback(callback);
434
+ }
435
+
436
+ public async getPendingTxs(limit?: number, after?: TxHash, options?: GetTxByHashOptions): Promise<Tx[]> {
410
437
  if (limit !== undefined && limit <= 0) {
411
438
  throw new TypeError('limit must be greater than 0');
412
439
  }
@@ -425,7 +452,9 @@ export class P2PClient extends WithTracer implements P2P {
425
452
  const endIndex = limit !== undefined ? startIndex + limit : undefined;
426
453
  txHashes = txHashes.slice(startIndex, endIndex);
427
454
 
428
- const maybeTxs = await Promise.all(txHashes.map(txHash => this.txPool.getTxByHash(txHash)));
455
+ // This is a public-facing API (exposed via both the node and the p2p RPC), so proofs are opt-in.
456
+ const includeProof = !!options?.includeProof;
457
+ const maybeTxs = await Promise.all(txHashes.map(txHash => this.txPool.getTxByHash(txHash, { includeProof })));
429
458
  return maybeTxs.filter((tx): tx is Tx => !!tx);
430
459
  }
431
460
 
@@ -433,18 +462,22 @@ export class P2PClient extends WithTracer implements P2P {
433
462
  return this.txPool.getPendingTxCount();
434
463
  }
435
464
 
436
- public async *iteratePendingTxs(): AsyncIterableIterator<Tx> {
465
+ public hasEligiblePendingTxs(minCount: number): Promise<boolean> {
466
+ return this.txPool.hasEligiblePendingTxs(minCount);
467
+ }
468
+
469
+ public async *iteratePendingTxs(opts?: { includeProof?: boolean }): AsyncIterableIterator<Tx> {
437
470
  for (const txHash of await this.txPool.getPendingTxHashes()) {
438
- const tx = await this.txPool.getTxByHash(txHash);
471
+ const tx = await this.txPool.getTxByHash(txHash, opts);
439
472
  if (tx) {
440
473
  yield tx;
441
474
  }
442
475
  }
443
476
  }
444
477
 
445
- public async *iterateEligiblePendingTxs(): AsyncIterableIterator<Tx> {
478
+ public async *iterateEligiblePendingTxs(opts?: { includeProof?: boolean }): AsyncIterableIterator<Tx> {
446
479
  for (const txHash of await this.txPool.getEligiblePendingTxHashes()) {
447
- const tx = await this.txPool.getTxByHash(txHash);
480
+ const tx = await this.txPool.getTxByHash(txHash, opts);
448
481
  if (tx) {
449
482
  yield tx;
450
483
  }
@@ -454,19 +487,21 @@ export class P2PClient extends WithTracer implements P2P {
454
487
  /**
455
488
  * Returns a transaction in the transaction pool by its hash.
456
489
  * @param txHash - Hash of the transaction to look for in the pool.
490
+ * @param opts - Set `includeProof: false` to skip loading the tx proof from the DB.
457
491
  * @returns A single tx or undefined.
458
492
  */
459
- getTxByHashFromPool(txHash: TxHash): Promise<Tx | undefined> {
460
- return this.txPool.getTxByHash(txHash);
493
+ getTxByHashFromPool(txHash: TxHash, opts?: { includeProof?: boolean }): Promise<Tx | undefined> {
494
+ return this.txPool.getTxByHash(txHash, opts);
461
495
  }
462
496
 
463
497
  /**
464
498
  * Returns transactions in the transaction pool by hash.
465
499
  * @param txHashes - Hashes of the transactions to look for.
500
+ * @param opts - Set `includeProof: false` to skip loading tx proofs from the DB.
466
501
  * @returns The txs found, in the same order as the requested hashes. If a tx is not found, it will be undefined.
467
502
  */
468
- getTxsByHashFromPool(txHashes: TxHash[]): Promise<(Tx | undefined)[]> {
469
- return this.txPool.getTxsByHash(txHashes);
503
+ getTxsByHashFromPool(txHashes: TxHash[], opts?: { includeProof?: boolean }): Promise<(Tx | undefined)[]> {
504
+ return this.txPool.getTxsByHash(txHashes, opts);
470
505
  }
471
506
 
472
507
  hasTxsInPool(txHashes: TxHash[]): Promise<boolean[]> {
@@ -576,13 +611,10 @@ export class P2PClient extends WithTracer implements P2P {
576
611
  */
577
612
  public async getStatus(): Promise<P2PSyncState> {
578
613
  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());
614
+ const blockHash = await this.l2BlockSource
615
+ .getBlockData({ number: blockNumber })
616
+ .then(data => data?.header.hash())
617
+ .then(hash => hash?.toString());
586
618
 
587
619
  return {
588
620
  state: this.currentState,
@@ -611,15 +643,20 @@ export class P2PClient extends WithTracer implements P2P {
611
643
  return;
612
644
  }
613
645
 
614
- await this.handleMinedBlocks(blocks);
615
- await this.maybeCallPrepareForSlot();
616
- await this.startCollectingMissingTxs(blocks);
617
646
  const lastBlock = blocks.at(-1)!;
618
- await this.synchedLatestSlot.set(BigInt(lastBlock.header.getSlot()));
647
+ const lastSlot = lastBlock.header.getSlot();
648
+
649
+ // Mark txs mined before releasing protections: a block landing at this slot supersedes any
650
+ // protection for txs it includes, so mined-marking must run first to keep just-landed txs from
651
+ // being unprotected into pending where they could be evicted before they are recorded as mined.
652
+ await this.handleMinedBlocks(blocks);
653
+ await this.maybeCallPrepareForSlot(lastSlot);
654
+ await this.collectingMissingTxs(blocks);
655
+ await this.synchedLatestSlot.set(BigInt(lastSlot));
619
656
  }
620
657
 
621
- /** Request txs for unproven blocks so the prover node has more chances to get them. */
622
- private async startCollectingMissingTxs(blocks: L2Block[]): Promise<void> {
658
+ /** Request txs for unproven blocks so the prover node can prove. */
659
+ private async collectingMissingTxs(blocks: L2Block[]): Promise<void> {
623
660
  try {
624
661
  // TODO(#15435): If the archiver has lagged behind L1, the reported proven block number may
625
662
  // be much lower than the actual one, and it does not update until the pending chain is
@@ -627,7 +664,7 @@ export class P2PClient extends WithTracer implements P2P {
627
664
  // are already proven, but the archiver has not yet updated its state. Until this is properly
628
665
  // fixed, it is mitigated by the expiration date of collection requests, which depends on
629
666
  // the slot number of the block.
630
- const provenBlockNumber = await this.l2BlockSource.getProvenBlockNumber();
667
+ const provenBlockNumber = (await this.l2BlockSource.getBlockNumber({ tag: 'proven' })) ?? BlockNumber.ZERO;
631
668
  const unprovenBlocks = blocks.filter(block => block.number > provenBlockNumber);
632
669
  for (const block of unprovenBlocks) {
633
670
  const txHashes = block.body.txEffects.map(txEffect => txEffect.txHash);
@@ -639,7 +676,17 @@ export class P2PClient extends WithTracer implements P2P {
639
676
  `Starting collection of ${missingTxHashes.length} missing txs for unproven mined block ${block.number}`,
640
677
  { missingTxHashes, blockNumber: block.number, blockHash: await block.hash().then(h => h.toString()) },
641
678
  );
642
- this.txCollection.startCollecting(block, missingTxHashes);
679
+ // Both `slashDataWithholdingToleranceSlots` and `p2pMissingTxCollectionDeadlineSlots`
680
+ // count *full slots after the block slot* — value N means collection runs until
681
+ // `slotStart(block.slot + N + 1)`. Take the larger of the two so collection never
682
+ // gives up before the data-withholding slash verdict is rendered.
683
+ const blockSlot = block.header.getSlot();
684
+ const toleranceSlots = this.config.slashDataWithholdingToleranceSlots;
685
+ const configuredSlots = this.config.p2pMissingTxCollectionDeadlineSlots ?? 0;
686
+ const deadlineSlot = SlotNumber(blockSlot + Math.max(toleranceSlots, configuredSlots) + 1);
687
+ const deadlineSeconds = getTimestampForSlot(deadlineSlot, this.epochCache.getL1Constants());
688
+ const deadline = new Date(Number(deadlineSeconds) * 1000);
689
+ await this.txCollection.collectFastForBlock(block, missingTxHashes, { deadline });
643
690
  }
644
691
  }
645
692
  } catch (err) {
@@ -652,7 +699,7 @@ export class P2PClient extends WithTracer implements P2P {
652
699
  * @param blocks - A list of finalized L2 blocks.
653
700
  * @returns Empty promise.
654
701
  */
655
- private async handleFinalizedL2Blocks(blocks: L2Block[]): Promise<void> {
702
+ private async handleFinalizedL2Blocks(blocks: BlockData[]): Promise<void> {
656
703
  if (!blocks.length) {
657
704
  return;
658
705
  }
@@ -700,20 +747,8 @@ export class P2PClient extends WithTracer implements P2P {
700
747
  return isEpochPrune;
701
748
  }
702
749
 
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
- }
750
+ /** Calls prepareForSlot for the given slot if it advances past the last slot we prepared for. */
751
+ private async maybeCallPrepareForSlot(slot: SlotNumber): Promise<void> {
717
752
  if (slot <= this.lastSlotProcessed) {
718
753
  return;
719
754
  }
@@ -741,9 +776,17 @@ export class P2PClient extends WithTracer implements P2P {
741
776
  syncedFinalizedBlock,
742
777
  });
743
778
  this.setCurrentState(P2PClientState.RUNNING);
744
- if (this.syncResolve !== undefined) {
745
- this.syncResolve();
746
- await this.p2pService.start();
779
+ if (this.syncResolvers !== undefined) {
780
+ // A throw here would be swallowed by the block stream event handler, so we reject the promise returned by
781
+ // start instead, which makes node startup fail rather than run on with a dead p2p stack.
782
+ try {
783
+ await this.p2pService.start();
784
+ } catch (err) {
785
+ this.log.fatal(`Failed to start p2p service`, { err, syncedLatestBlock });
786
+ this.syncResolvers.reject(err);
787
+ return;
788
+ }
789
+ this.syncResolvers.resolve();
747
790
  }
748
791
  }
749
792
  }
@@ -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.) |