@aztec/p2p 0.0.1-commit.a89ec08 → 0.0.1-commit.aa0c64f

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 (427) 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 +5 -4
  6. package/dest/client/factory.d.ts.map +1 -1
  7. package/dest/client/factory.js +33 -23
  8. package/dest/client/interface.d.ts +48 -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 +105 -44
  13. package/dest/config.d.ts +147 -111
  14. package/dest/config.d.ts.map +1 -1
  15. package/dest/config.js +78 -32
  16. package/dest/errors/p2p-service.error.d.ts +9 -0
  17. package/dest/errors/p2p-service.error.d.ts.map +1 -0
  18. package/dest/errors/p2p-service.error.js +10 -0
  19. package/dest/errors/reqresp.error.d.ts +9 -16
  20. package/dest/errors/reqresp.error.d.ts.map +1 -1
  21. package/dest/errors/reqresp.error.js +10 -17
  22. package/dest/index.d.ts +1 -2
  23. package/dest/index.d.ts.map +1 -1
  24. package/dest/index.js +0 -1
  25. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +101 -59
  26. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  27. package/dest/mem_pools/attestation_pool/attestation_pool.js +274 -197
  28. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +1 -1
  29. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
  30. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +224 -65
  31. package/dest/mem_pools/attestation_pool/mocks.d.ts +1 -1
  32. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  33. package/dest/mem_pools/attestation_pool/mocks.js +6 -4
  34. package/dest/mem_pools/index.d.ts +1 -2
  35. package/dest/mem_pools/index.d.ts.map +1 -1
  36. package/dest/mem_pools/instrumentation.d.ts +12 -5
  37. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  38. package/dest/mem_pools/instrumentation.js +38 -17
  39. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts +1 -5
  40. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts.map +1 -1
  41. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.js +1 -7
  42. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +3 -3
  43. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -1
  44. package/dest/mem_pools/tx_pool_v2/deleted_pool.js +6 -6
  45. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +1 -1
  46. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +2 -1
  47. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -1
  48. package/dest/mem_pools/tx_pool_v2/eviction/index.js +1 -0
  49. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts +16 -0
  50. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts.map +1 -0
  51. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.js +62 -0
  52. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +2 -2
  53. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +39 -9
  54. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
  55. package/dest/mem_pools/tx_pool_v2/interfaces.js +3 -1
  56. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +9 -7
  57. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
  58. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +13 -6
  59. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +15 -1
  60. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -1
  61. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +55 -41
  62. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +9 -3
  63. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -1
  64. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +20 -6
  65. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +17 -3
  66. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -1
  67. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +225 -118
  68. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +10 -3
  69. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  70. package/dest/msg_validators/attestation_validator/attestation_validator.js +38 -15
  71. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +7 -3
  72. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
  73. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +4 -5
  74. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +8 -3
  75. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
  76. package/dest/msg_validators/proposal_validator/block_proposal_validator.js +2 -2
  77. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +8 -3
  78. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
  79. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +8 -2
  80. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +25 -3
  81. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
  82. package/dest/msg_validators/proposal_validator/proposal_validator.js +85 -15
  83. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +1 -1
  84. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  85. package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +8 -15
  86. package/dest/msg_validators/tx_validator/allowed_public_setup.js +3 -3
  87. package/dest/msg_validators/tx_validator/archive_cache.js +1 -1
  88. package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts +15 -0
  89. package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts.map +1 -0
  90. package/dest/msg_validators/tx_validator/cached_tx_validator.js +19 -0
  91. package/dest/msg_validators/tx_validator/data_validator.d.ts +2 -1
  92. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  93. package/dest/msg_validators/tx_validator/data_validator.js +1 -0
  94. package/dest/msg_validators/tx_validator/factory.d.ts +14 -15
  95. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  96. package/dest/msg_validators/tx_validator/factory.js +29 -16
  97. package/dest/msg_validators/tx_validator/gas_validator.d.ts +47 -10
  98. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  99. package/dest/msg_validators/tx_validator/gas_validator.js +65 -48
  100. package/dest/msg_validators/tx_validator/index.d.ts +3 -1
  101. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  102. package/dest/msg_validators/tx_validator/index.js +2 -0
  103. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +1 -1
  104. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  105. package/dest/msg_validators/tx_validator/metadata_validator.js +4 -4
  106. package/dest/msg_validators/tx_validator/phases_validator.js +2 -2
  107. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +2 -1
  108. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
  109. package/dest/msg_validators/tx_validator/tx_proof_validator.js +2 -0
  110. package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts +48 -0
  111. package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts.map +1 -0
  112. package/dest/msg_validators/tx_validator/tx_validation_cache.js +68 -0
  113. package/dest/services/data_store.d.ts +1 -1
  114. package/dest/services/data_store.d.ts.map +1 -1
  115. package/dest/services/data_store.js +5 -5
  116. package/dest/services/discv5/discV5_service.d.ts +13 -2
  117. package/dest/services/discv5/discV5_service.d.ts.map +1 -1
  118. package/dest/services/discv5/discV5_service.js +119 -23
  119. package/dest/services/discv5/persisted_enr_store.d.ts +38 -0
  120. package/dest/services/discv5/persisted_enr_store.d.ts.map +1 -0
  121. package/dest/services/discv5/persisted_enr_store.js +145 -0
  122. package/dest/services/dummy_service.d.ts +15 -15
  123. package/dest/services/dummy_service.d.ts.map +1 -1
  124. package/dest/services/dummy_service.js +15 -16
  125. package/dest/services/encoding.d.ts +19 -6
  126. package/dest/services/encoding.d.ts.map +1 -1
  127. package/dest/services/encoding.js +25 -15
  128. package/dest/services/gossipsub/topic_score_params.d.ts +6 -12
  129. package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -1
  130. package/dest/services/gossipsub/topic_score_params.js +4 -14
  131. package/dest/services/libp2p/instrumentation.d.ts +3 -1
  132. package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
  133. package/dest/services/libp2p/instrumentation.js +14 -0
  134. package/dest/services/libp2p/libp2p_service.d.ts +45 -47
  135. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  136. package/dest/services/libp2p/libp2p_service.js +409 -303
  137. package/dest/services/peer-manager/metrics.d.ts +3 -1
  138. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  139. package/dest/services/peer-manager/metrics.js +6 -0
  140. package/dest/services/peer-manager/peer_manager.d.ts +20 -3
  141. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  142. package/dest/services/peer-manager/peer_manager.js +83 -26
  143. package/dest/services/peer-manager/peer_scoring.d.ts +34 -2
  144. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  145. package/dest/services/peer-manager/peer_scoring.js +102 -13
  146. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +4 -8
  147. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -1
  148. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +94 -122
  149. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +10 -6
  150. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
  151. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +5 -4
  152. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -1
  153. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +13 -7
  154. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +19 -11
  155. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -1
  156. package/dest/services/reqresp/batch-tx-requester/peer_collection.js +52 -15
  157. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +5 -14
  158. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -1
  159. package/dest/services/reqresp/batch-tx-requester/tx_validator.js +6 -20
  160. package/dest/services/reqresp/config.d.ts +15 -3
  161. package/dest/services/reqresp/config.d.ts.map +1 -1
  162. package/dest/services/reqresp/config.js +11 -0
  163. package/dest/services/reqresp/interface.d.ts +16 -18
  164. package/dest/services/reqresp/interface.d.ts.map +1 -1
  165. package/dest/services/reqresp/interface.js +10 -20
  166. package/dest/services/reqresp/metrics.d.ts +1 -1
  167. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  168. package/dest/services/reqresp/metrics.js +0 -1
  169. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +4 -3
  170. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -1
  171. package/dest/services/reqresp/protocols/block_txs/bitvector.js +3 -2
  172. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +1 -1
  173. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
  174. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +31 -28
  175. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +12 -7
  176. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
  177. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +42 -24
  178. package/dest/services/reqresp/protocols/index.d.ts +1 -2
  179. package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
  180. package/dest/services/reqresp/protocols/index.js +0 -1
  181. package/dest/services/reqresp/protocols/tx.d.ts +1 -1
  182. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  183. package/dest/services/reqresp/protocols/tx.js +1 -3
  184. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
  185. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
  186. package/dest/services/reqresp/rate-limiter/rate_limits.js +3 -13
  187. package/dest/services/reqresp/reqresp.d.ts +7 -29
  188. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  189. package/dest/services/reqresp/reqresp.js +60 -209
  190. package/dest/services/service.d.ts +25 -12
  191. package/dest/services/service.d.ts.map +1 -1
  192. package/dest/services/tx_collection/config.d.ts +2 -23
  193. package/dest/services/tx_collection/config.d.ts.map +1 -1
  194. package/dest/services/tx_collection/config.js +2 -55
  195. package/dest/services/tx_collection/file_store_tx_collection.d.ts +12 -28
  196. package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -1
  197. package/dest/services/tx_collection/file_store_tx_collection.js +43 -83
  198. package/dest/services/tx_collection/index.d.ts +2 -3
  199. package/dest/services/tx_collection/index.d.ts.map +1 -1
  200. package/dest/services/tx_collection/index.js +0 -1
  201. package/dest/services/tx_collection/instrumentation.d.ts +1 -1
  202. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
  203. package/dest/services/tx_collection/instrumentation.js +0 -2
  204. package/dest/services/tx_collection/request_tracker.d.ts +53 -0
  205. package/dest/services/tx_collection/request_tracker.d.ts.map +1 -0
  206. package/dest/services/tx_collection/request_tracker.js +84 -0
  207. package/dest/services/tx_collection/tx_collection.d.ts +36 -55
  208. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  209. package/dest/services/tx_collection/tx_collection.js +275 -119
  210. package/dest/services/tx_collection/tx_collection_sink.d.ts +1 -1
  211. package/dest/services/tx_collection/tx_collection_sink.js +2 -2
  212. package/dest/services/tx_collection/tx_source.d.ts +1 -1
  213. package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
  214. package/dest/services/tx_collection/tx_source.js +4 -1
  215. package/dest/services/tx_file_store/tx_file_store.d.ts +1 -3
  216. package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -1
  217. package/dest/services/tx_file_store/tx_file_store.js +4 -14
  218. package/dest/services/tx_provider.d.ts +3 -1
  219. package/dest/services/tx_provider.d.ts.map +1 -1
  220. package/dest/services/tx_provider.js +3 -0
  221. package/dest/test-helpers/make-test-p2p-clients.d.ts +1 -1
  222. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  223. package/dest/test-helpers/make-test-p2p-clients.js +5 -2
  224. package/dest/test-helpers/mock-pubsub.d.ts +23 -9
  225. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  226. package/dest/test-helpers/mock-pubsub.js +44 -44
  227. package/dest/test-helpers/reqresp-nodes.d.ts +4 -5
  228. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  229. package/dest/test-helpers/reqresp-nodes.js +16 -18
  230. package/dest/test-helpers/test_tx_provider.d.ts +3 -1
  231. package/dest/test-helpers/test_tx_provider.d.ts.map +1 -1
  232. package/dest/test-helpers/test_tx_provider.js +3 -0
  233. package/dest/test-helpers/testbench-utils.d.ts +15 -14
  234. package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
  235. package/dest/test-helpers/testbench-utils.js +47 -14
  236. package/dest/testbench/p2p_client_testbench_worker.d.ts +3 -5
  237. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  238. package/dest/testbench/p2p_client_testbench_worker.js +102 -40
  239. package/dest/testbench/worker_client_manager.d.ts +10 -6
  240. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  241. package/dest/testbench/worker_client_manager.js +53 -10
  242. package/dest/util.d.ts +12 -7
  243. package/dest/util.d.ts.map +1 -1
  244. package/dest/util.js +35 -14
  245. package/dest/versioning.d.ts +3 -6
  246. package/dest/versioning.d.ts.map +1 -1
  247. package/dest/versioning.js +3 -24
  248. package/package.json +16 -16
  249. package/src/bootstrap/bootstrap.ts +17 -3
  250. package/src/client/factory.ts +50 -25
  251. package/src/client/interface.ts +44 -17
  252. package/src/client/p2p_client.ts +125 -77
  253. package/src/client/test/{tx_proposal_collector/README.md → p2p_client.batch_tx_requester.bench.README.md} +23 -53
  254. package/src/config.ts +156 -44
  255. package/src/errors/p2p-service.error.ts +11 -0
  256. package/src/errors/reqresp.error.ts +13 -19
  257. package/src/index.ts +0 -1
  258. package/src/mem_pools/attestation_pool/attestation_pool.ts +329 -243
  259. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +244 -69
  260. package/src/mem_pools/attestation_pool/mocks.ts +13 -8
  261. package/src/mem_pools/index.ts +0 -3
  262. package/src/mem_pools/instrumentation.ts +27 -17
  263. package/src/mem_pools/tx_pool_v2/archive/tx_archive.ts +1 -9
  264. package/src/mem_pools/tx_pool_v2/deleted_pool.ts +7 -7
  265. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +1 -1
  266. package/src/mem_pools/tx_pool_v2/eviction/index.ts +1 -0
  267. package/src/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.ts +65 -0
  268. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +3 -3
  269. package/src/mem_pools/tx_pool_v2/interfaces.ts +38 -8
  270. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +24 -12
  271. package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +62 -41
  272. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +23 -6
  273. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +250 -122
  274. package/src/msg_validators/attestation_validator/README.md +1 -1
  275. package/src/msg_validators/attestation_validator/attestation_validator.ts +46 -14
  276. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +15 -7
  277. package/src/msg_validators/proposal_validator/README.md +4 -4
  278. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +15 -3
  279. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +26 -3
  280. package/src/msg_validators/proposal_validator/proposal_validator.ts +95 -12
  281. package/src/msg_validators/tx_validator/README.md +13 -3
  282. package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +3 -12
  283. package/src/msg_validators/tx_validator/allowed_public_setup.ts +3 -3
  284. package/src/msg_validators/tx_validator/archive_cache.ts +1 -1
  285. package/src/msg_validators/tx_validator/cached_tx_validator.ts +31 -0
  286. package/src/msg_validators/tx_validator/data_validator.ts +2 -0
  287. package/src/msg_validators/tx_validator/factory.ts +37 -20
  288. package/src/msg_validators/tx_validator/gas_validator.ts +99 -54
  289. package/src/msg_validators/tx_validator/index.ts +2 -0
  290. package/src/msg_validators/tx_validator/metadata_validator.ts +12 -4
  291. package/src/msg_validators/tx_validator/phases_validator.ts +2 -2
  292. package/src/msg_validators/tx_validator/tx_proof_validator.ts +2 -0
  293. package/src/msg_validators/tx_validator/tx_validation_cache.ts +101 -0
  294. package/src/services/data_store.ts +5 -13
  295. package/src/services/discv5/discV5_service.ts +126 -14
  296. package/src/services/discv5/persisted_enr_store.ts +158 -0
  297. package/src/services/dummy_service.ts +20 -39
  298. package/src/services/encoding.ts +28 -20
  299. package/src/services/gossipsub/README.md +33 -11
  300. package/src/services/gossipsub/topic_score_params.ts +9 -18
  301. package/src/services/libp2p/instrumentation.ts +14 -0
  302. package/src/services/libp2p/libp2p_service.ts +457 -341
  303. package/src/services/peer-manager/metrics.ts +7 -0
  304. package/src/services/peer-manager/peer_manager.ts +91 -25
  305. package/src/services/peer-manager/peer_scoring.ts +102 -8
  306. package/src/services/reqresp/README.md +2 -37
  307. package/src/services/reqresp/batch-tx-requester/README.md +46 -7
  308. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +91 -137
  309. package/src/services/reqresp/batch-tx-requester/interface.ts +13 -5
  310. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +13 -6
  311. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +68 -24
  312. package/src/services/reqresp/batch-tx-requester/tx_validator.ts +12 -25
  313. package/src/services/reqresp/config.ts +19 -2
  314. package/src/services/reqresp/interface.ts +21 -47
  315. package/src/services/reqresp/metrics.ts +0 -1
  316. package/src/services/reqresp/protocols/block_txs/bitvector.ts +3 -2
  317. package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +34 -30
  318. package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +47 -20
  319. package/src/services/reqresp/protocols/index.ts +0 -1
  320. package/src/services/reqresp/protocols/tx.ts +1 -3
  321. package/src/services/reqresp/rate-limiter/rate_limits.ts +3 -13
  322. package/src/services/reqresp/reqresp.ts +71 -252
  323. package/src/services/service.ts +31 -28
  324. package/src/services/tx_collection/config.ts +3 -80
  325. package/src/services/tx_collection/file_store_tx_collection.ts +54 -103
  326. package/src/services/tx_collection/index.ts +1 -6
  327. package/src/services/tx_collection/instrumentation.ts +1 -7
  328. package/src/services/tx_collection/request_tracker.ts +127 -0
  329. package/src/services/tx_collection/tx_collection.ts +331 -176
  330. package/src/services/tx_collection/tx_collection_sink.ts +2 -2
  331. package/src/services/tx_collection/tx_source.ts +2 -1
  332. package/src/services/tx_file_store/tx_file_store.ts +5 -17
  333. package/src/services/tx_provider.ts +5 -0
  334. package/src/test-helpers/make-test-p2p-clients.ts +4 -1
  335. package/src/test-helpers/mock-pubsub.ts +46 -60
  336. package/src/test-helpers/reqresp-nodes.ts +13 -23
  337. package/src/test-helpers/test_tx_provider.ts +5 -0
  338. package/src/test-helpers/testbench-utils.ts +62 -28
  339. package/src/testbench/p2p_client_testbench_worker.ts +110 -57
  340. package/src/testbench/worker_client_manager.ts +61 -21
  341. package/src/util.ts +33 -18
  342. package/src/versioning.ts +3 -33
  343. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts +0 -2
  344. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts.map +0 -1
  345. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +0 -304
  346. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts +0 -73
  347. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts.map +0 -1
  348. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.js +0 -8
  349. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +0 -125
  350. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +0 -1
  351. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +0 -596
  352. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +0 -32
  353. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +0 -1
  354. package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +0 -112
  355. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +0 -157
  356. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +0 -1
  357. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +0 -52
  358. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +0 -16
  359. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +0 -1
  360. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +0 -123
  361. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +0 -17
  362. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +0 -1
  363. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +0 -84
  364. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +0 -19
  365. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +0 -1
  366. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +0 -78
  367. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +0 -26
  368. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +0 -1
  369. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +0 -84
  370. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +0 -25
  371. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +0 -1
  372. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +0 -57
  373. package/dest/mem_pools/tx_pool/index.d.ts +0 -3
  374. package/dest/mem_pools/tx_pool/index.d.ts.map +0 -1
  375. package/dest/mem_pools/tx_pool/index.js +0 -2
  376. package/dest/mem_pools/tx_pool/priority.d.ts +0 -12
  377. package/dest/mem_pools/tx_pool/priority.d.ts.map +0 -1
  378. package/dest/mem_pools/tx_pool/priority.js +0 -15
  379. package/dest/mem_pools/tx_pool/tx_pool.d.ts +0 -127
  380. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +0 -1
  381. package/dest/mem_pools/tx_pool/tx_pool.js +0 -3
  382. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +0 -7
  383. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +0 -1
  384. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +0 -402
  385. package/dest/msg_validators/clock_tolerance.d.ts +0 -21
  386. package/dest/msg_validators/clock_tolerance.d.ts.map +0 -1
  387. package/dest/msg_validators/clock_tolerance.js +0 -37
  388. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +0 -64
  389. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +0 -1
  390. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +0 -151
  391. package/dest/services/reqresp/protocols/block.d.ts +0 -9
  392. package/dest/services/reqresp/protocols/block.d.ts.map +0 -1
  393. package/dest/services/reqresp/protocols/block.js +0 -32
  394. package/dest/services/tx_collection/fast_tx_collection.d.ts +0 -54
  395. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +0 -1
  396. package/dest/services/tx_collection/fast_tx_collection.js +0 -327
  397. package/dest/services/tx_collection/missing_txs_tracker.d.ts +0 -32
  398. package/dest/services/tx_collection/missing_txs_tracker.d.ts.map +0 -1
  399. package/dest/services/tx_collection/missing_txs_tracker.js +0 -27
  400. package/dest/services/tx_collection/proposal_tx_collector.d.ts +0 -49
  401. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +0 -1
  402. package/dest/services/tx_collection/proposal_tx_collector.js +0 -50
  403. package/dest/services/tx_collection/slow_tx_collection.d.ts +0 -57
  404. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +0 -1
  405. package/dest/services/tx_collection/slow_tx_collection.js +0 -211
  406. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +0 -345
  407. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.ts +0 -43
  408. package/src/mem_pools/tx_pool/README.md +0 -270
  409. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -746
  410. package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +0 -132
  411. package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +0 -208
  412. package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +0 -163
  413. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +0 -104
  414. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +0 -93
  415. package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +0 -106
  416. package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +0 -75
  417. package/src/mem_pools/tx_pool/index.ts +0 -2
  418. package/src/mem_pools/tx_pool/priority.ts +0 -20
  419. package/src/mem_pools/tx_pool/tx_pool.ts +0 -141
  420. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +0 -321
  421. package/src/msg_validators/clock_tolerance.ts +0 -51
  422. package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +0 -161
  423. package/src/services/reqresp/protocols/block.ts +0 -37
  424. package/src/services/tx_collection/fast_tx_collection.ts +0 -387
  425. package/src/services/tx_collection/missing_txs_tracker.ts +0 -52
  426. package/src/services/tx_collection/proposal_tx_collector.ts +0 -113
  427. package/src/services/tx_collection/slow_tx_collection.ts +0 -266
@@ -9,15 +9,13 @@ import type { ENR } from '@nethermindeth/enr';
9
9
 
10
10
  import type { P2PConfig } from '../config.js';
11
11
  import type { AuthRequest, StatusMessage } from '../services/index.js';
12
- import type {
13
- ReqRespSubProtocol,
14
- ReqRespSubProtocolHandler,
15
- ReqRespSubProtocolValidators,
16
- } from '../services/reqresp/interface.js';
12
+ import type { ReqRespSubProtocol, ReqRespSubProtocolHandler } from '../services/reqresp/interface.js';
17
13
  import type {
18
14
  DuplicateAttestationInfo,
19
15
  DuplicateProposalInfo,
16
+ OversizedProposalInfo,
20
17
  P2PBlockReceivedCallback,
18
+ P2PCheckpointAttestationCallback,
21
19
  P2PCheckpointReceivedCallback,
22
20
  } from '../services/service.js';
23
21
 
@@ -82,7 +80,15 @@ export type P2P = P2PClient & {
82
80
  *
83
81
  * @param handler - A function taking a received checkpoint proposal and producing attestations
84
82
  */
85
- registerCheckpointProposalHandler(callback: P2PCheckpointReceivedCallback): void;
83
+ registerValidatorCheckpointProposalHandler(callback: P2PCheckpointReceivedCallback): void;
84
+
85
+ /**
86
+ * Registers a callback that runs for ALL nodes (not just validators) when a checkpoint proposal is received.
87
+ * Used to set the proposed checkpoint number on the archiver so the sequencer can build on top of it.
88
+ *
89
+ * @param handler - A function taking a received checkpoint proposal
90
+ */
91
+ registerAllNodesCheckpointProposalHandler(callback: P2PCheckpointReceivedCallback): void;
86
92
 
87
93
  /**
88
94
  * Registers a callback invoked when a duplicate proposal is detected (equivocation).
@@ -92,6 +98,14 @@ export type P2P = P2PClient & {
92
98
  */
93
99
  registerDuplicateProposalCallback(callback: (info: DuplicateProposalInfo) => void): void;
94
100
 
101
+ /**
102
+ * Registers a callback invoked when an oversized block proposal (index at or beyond the consensus
103
+ * per-checkpoint block limit) is stored and re-broadcast as slashing evidence.
104
+ *
105
+ * @param callback - Function called with info about the oversized proposal
106
+ */
107
+ registerOversizedProposalCallback(callback: (info: OversizedProposalInfo) => void): void;
108
+
95
109
  /**
96
110
  * Registers a callback invoked when a duplicate attestation is detected (equivocation).
97
111
  * A validator signing attestations for different proposals at the same slot.
@@ -101,6 +115,9 @@ export type P2P = P2PClient & {
101
115
  */
102
116
  registerDuplicateAttestationCallback(callback: (info: DuplicateAttestationInfo) => void): void;
103
117
 
118
+ /** Registers a callback invoked when a valid checkpoint attestation is accepted into the pool. */
119
+ registerCheckpointAttestationCallback(callback: P2PCheckpointAttestationCallback): void;
120
+
104
121
  /**
105
122
  * Verifies the 'tx' and, if valid, adds it to local tx pool and forwards it to other peers.
106
123
  * @param tx - The transaction.
@@ -116,16 +133,18 @@ export type P2P = P2PClient & {
116
133
  /**
117
134
  * Returns a transaction in the transaction pool by its hash.
118
135
  * @param txHash - Hash of tx to return.
136
+ * @param opts - Set `includeProof: false` to skip loading the tx proof from the DB.
119
137
  * @returns A single tx or undefined.
120
138
  */
121
- getTxByHashFromPool(txHash: TxHash): Promise<Tx | undefined>;
139
+ getTxByHashFromPool(txHash: TxHash, opts?: { includeProof?: boolean }): Promise<Tx | undefined>;
122
140
 
123
141
  /**
124
142
  * Returns transactions in the transaction pool by hash.
125
143
  * @param txHashes - Hashes of txs to return.
144
+ * @param opts - Set `includeProof: false` to skip loading tx proofs from the DB.
126
145
  * @returns An array of txs or undefined.
127
146
  */
128
- getTxsByHashFromPool(txHashes: TxHash[]): Promise<(Tx | undefined)[]>;
147
+ getTxsByHashFromPool(txHashes: TxHash[], opts?: { includeProof?: boolean }): Promise<(Tx | undefined)[]>;
129
148
 
130
149
  /**
131
150
  * Checks if transactions exist in the pool
@@ -148,15 +167,27 @@ export type P2P = P2PClient & {
148
167
  */
149
168
  getTxStatus(txHash: TxHash): Promise<'pending' | 'mined' | 'deleted' | undefined>;
150
169
 
151
- /** Returns an iterator over pending txs on the mempool. */
152
- iteratePendingTxs(): AsyncIterableIterator<Tx>;
170
+ /**
171
+ * Returns an iterator over pending txs on the mempool.
172
+ * Set `includeProof: false` to skip loading tx proofs from the DB.
173
+ */
174
+ iteratePendingTxs(opts?: { includeProof?: boolean }): AsyncIterableIterator<Tx>;
153
175
 
154
- /** Returns an iterator over pending txs that have been in the pool long enough to be eligible for block building. */
155
- iterateEligiblePendingTxs(): AsyncIterableIterator<Tx>;
176
+ /**
177
+ * Returns an iterator over pending txs that have been in the pool long enough to be eligible for block building.
178
+ * Set `includeProof: false` to skip loading tx proofs from the DB.
179
+ */
180
+ iterateEligiblePendingTxs(opts?: { includeProof?: boolean }): AsyncIterableIterator<Tx>;
156
181
 
157
182
  /** Returns the number of pending txs in the mempool. */
158
183
  getPendingTxCount(): Promise<number>;
159
184
 
185
+ /**
186
+ * Returns whether at least `minCount` pending txs have been in the pool long enough to be eligible for block
187
+ * building. Early-exits once the threshold is met instead of counting every eligible tx.
188
+ */
189
+ hasEligiblePendingTxs(minCount: number): Promise<boolean>;
190
+
160
191
  /**
161
192
  * Protects existing transactions by hash for a given slot.
162
193
  * Returns hashes of transactions that weren't found in the pool.
@@ -216,11 +247,7 @@ export type P2P = P2PClient & {
216
247
  /** Clears the db. */
217
248
  clear(): Promise<void>;
218
249
 
219
- addReqRespSubProtocol(
220
- subProtocol: ReqRespSubProtocol,
221
- handler: ReqRespSubProtocolHandler,
222
- validator?: ReqRespSubProtocolValidators[ReqRespSubProtocol],
223
- ): Promise<void>;
250
+ addReqRespSubProtocol(subProtocol: ReqRespSubProtocol, handler: ReqRespSubProtocolHandler): Promise<void>;
224
251
 
225
252
  handleAuthRequestFromPeer(authRequest: AuthRequest, peerId: PeerId): Promise<StatusMessage>;
226
253
 
@@ -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,6 +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
  }
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
+ }
360
369
  return this.p2pService.propagate(proposal);
361
370
  }
362
371
 
@@ -367,10 +376,10 @@ export class P2PClient extends WithTracer implements P2P {
367
376
 
368
377
  public async getCheckpointAttestationsForSlot(
369
378
  slot: SlotNumber,
370
- proposalId?: string,
379
+ proposalPayloadHash?: CheckpointProposalHash,
371
380
  ): Promise<CheckpointAttestation[]> {
372
- return await (proposalId
373
- ? this.attestationPool.getCheckpointAttestationsForSlotAndProposal(slot, proposalId)
381
+ return await (proposalPayloadHash
382
+ ? this.attestationPool.getCheckpointAttestationsForSlotAndProposal(slot, proposalPayloadHash)
374
383
  : this.attestationPool.getCheckpointAttestationsForSlot(slot));
375
384
  }
376
385
 
@@ -378,29 +387,49 @@ export class P2PClient extends WithTracer implements P2P {
378
387
  return this.attestationPool.addOwnCheckpointAttestations(attestations);
379
388
  }
380
389
 
390
+ public getProposalsForSlot(slot: SlotNumber): Promise<ProposalsForSlot> {
391
+ return this.attestationPool.getProposalsForSlot(slot);
392
+ }
393
+
381
394
  public hasBlockProposalsForSlot(slot: SlotNumber): Promise<boolean> {
382
395
  return this.attestationPool.hasBlockProposalsForSlot(slot);
383
396
  }
384
397
 
398
+ public hasCheckpointProposalForSlot(slot: SlotNumber): Promise<boolean> {
399
+ return this.attestationPool.hasCheckpointProposalForSlot(slot);
400
+ }
401
+
385
402
  // REVIEW: https://github.com/AztecProtocol/aztec-packages/issues/7963
386
403
  // ^ This pattern is not my favorite (md)
387
404
  public registerBlockProposalHandler(handler: P2PBlockReceivedCallback): void {
388
405
  this.p2pService.registerBlockReceivedCallback(handler);
389
406
  }
390
407
 
391
- public registerCheckpointProposalHandler(handler: P2PCheckpointReceivedCallback): void {
392
- this.p2pService.registerCheckpointReceivedCallback(handler);
408
+ public registerValidatorCheckpointProposalHandler(handler: P2PCheckpointReceivedCallback): void {
409
+ this.p2pService.registerValidatorCheckpointReceivedCallback(handler);
410
+ }
411
+
412
+ public registerAllNodesCheckpointProposalHandler(handler: P2PCheckpointReceivedCallback): void {
413
+ this.p2pService.registerAllNodesCheckpointReceivedCallback(handler);
393
414
  }
394
415
 
395
416
  public registerDuplicateProposalCallback(callback: (info: DuplicateProposalInfo) => void): void {
396
417
  this.p2pService.registerDuplicateProposalCallback(callback);
397
418
  }
398
419
 
420
+ public registerOversizedProposalCallback(callback: (info: OversizedProposalInfo) => void): void {
421
+ this.p2pService.registerOversizedProposalCallback(callback);
422
+ }
423
+
399
424
  public registerDuplicateAttestationCallback(callback: (info: DuplicateAttestationInfo) => void): void {
400
425
  this.p2pService.registerDuplicateAttestationCallback(callback);
401
426
  }
402
427
 
403
- 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[]> {
404
433
  if (limit !== undefined && limit <= 0) {
405
434
  throw new TypeError('limit must be greater than 0');
406
435
  }
@@ -419,7 +448,9 @@ export class P2PClient extends WithTracer implements P2P {
419
448
  const endIndex = limit !== undefined ? startIndex + limit : undefined;
420
449
  txHashes = txHashes.slice(startIndex, endIndex);
421
450
 
422
- 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 })));
423
454
  return maybeTxs.filter((tx): tx is Tx => !!tx);
424
455
  }
425
456
 
@@ -427,18 +458,22 @@ export class P2PClient extends WithTracer implements P2P {
427
458
  return this.txPool.getPendingTxCount();
428
459
  }
429
460
 
430
- 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> {
431
466
  for (const txHash of await this.txPool.getPendingTxHashes()) {
432
- const tx = await this.txPool.getTxByHash(txHash);
467
+ const tx = await this.txPool.getTxByHash(txHash, opts);
433
468
  if (tx) {
434
469
  yield tx;
435
470
  }
436
471
  }
437
472
  }
438
473
 
439
- public async *iterateEligiblePendingTxs(): AsyncIterableIterator<Tx> {
474
+ public async *iterateEligiblePendingTxs(opts?: { includeProof?: boolean }): AsyncIterableIterator<Tx> {
440
475
  for (const txHash of await this.txPool.getEligiblePendingTxHashes()) {
441
- const tx = await this.txPool.getTxByHash(txHash);
476
+ const tx = await this.txPool.getTxByHash(txHash, opts);
442
477
  if (tx) {
443
478
  yield tx;
444
479
  }
@@ -448,19 +483,21 @@ export class P2PClient extends WithTracer implements P2P {
448
483
  /**
449
484
  * Returns a transaction in the transaction pool by its hash.
450
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.
451
487
  * @returns A single tx or undefined.
452
488
  */
453
- getTxByHashFromPool(txHash: TxHash): Promise<Tx | undefined> {
454
- return this.txPool.getTxByHash(txHash);
489
+ getTxByHashFromPool(txHash: TxHash, opts?: { includeProof?: boolean }): Promise<Tx | undefined> {
490
+ return this.txPool.getTxByHash(txHash, opts);
455
491
  }
456
492
 
457
493
  /**
458
494
  * Returns transactions in the transaction pool by hash.
459
495
  * @param txHashes - Hashes of the transactions to look for.
496
+ * @param opts - Set `includeProof: false` to skip loading tx proofs from the DB.
460
497
  * @returns The txs found, in the same order as the requested hashes. If a tx is not found, it will be undefined.
461
498
  */
462
- getTxsByHashFromPool(txHashes: TxHash[]): Promise<(Tx | undefined)[]> {
463
- return this.txPool.getTxsByHash(txHashes);
499
+ getTxsByHashFromPool(txHashes: TxHash[], opts?: { includeProof?: boolean }): Promise<(Tx | undefined)[]> {
500
+ return this.txPool.getTxsByHash(txHashes, opts);
464
501
  }
465
502
 
466
503
  hasTxsInPool(txHashes: TxHash[]): Promise<boolean[]> {
@@ -570,13 +607,10 @@ export class P2PClient extends WithTracer implements P2P {
570
607
  */
571
608
  public async getStatus(): Promise<P2PSyncState> {
572
609
  const blockNumber = await this.getSyncedLatestBlockNum();
573
- const blockHash =
574
- blockNumber === 0
575
- ? GENESIS_BLOCK_HEADER_HASH.toString()
576
- : await this.l2BlockSource
577
- .getBlockHeader(blockNumber)
578
- .then(header => header?.hash())
579
- .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());
580
614
 
581
615
  return {
582
616
  state: this.currentState,
@@ -605,15 +639,20 @@ export class P2PClient extends WithTracer implements P2P {
605
639
  return;
606
640
  }
607
641
 
608
- await this.handleMinedBlocks(blocks);
609
- await this.maybeCallPrepareForSlot();
610
- await this.startCollectingMissingTxs(blocks);
611
642
  const lastBlock = blocks.at(-1)!;
612
- 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));
613
652
  }
614
653
 
615
- /** Request txs for unproven blocks so the prover node has more chances to get them. */
616
- 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> {
617
656
  try {
618
657
  // TODO(#15435): If the archiver has lagged behind L1, the reported proven block number may
619
658
  // be much lower than the actual one, and it does not update until the pending chain is
@@ -621,7 +660,7 @@ export class P2PClient extends WithTracer implements P2P {
621
660
  // are already proven, but the archiver has not yet updated its state. Until this is properly
622
661
  // fixed, it is mitigated by the expiration date of collection requests, which depends on
623
662
  // the slot number of the block.
624
- const provenBlockNumber = await this.l2BlockSource.getProvenBlockNumber();
663
+ const provenBlockNumber = (await this.l2BlockSource.getBlockNumber({ tag: 'proven' })) ?? BlockNumber.ZERO;
625
664
  const unprovenBlocks = blocks.filter(block => block.number > provenBlockNumber);
626
665
  for (const block of unprovenBlocks) {
627
666
  const txHashes = block.body.txEffects.map(txEffect => txEffect.txHash);
@@ -633,7 +672,17 @@ export class P2PClient extends WithTracer implements P2P {
633
672
  `Starting collection of ${missingTxHashes.length} missing txs for unproven mined block ${block.number}`,
634
673
  { missingTxHashes, blockNumber: block.number, blockHash: await block.hash().then(h => h.toString()) },
635
674
  );
636
- 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 });
637
686
  }
638
687
  }
639
688
  } catch (err) {
@@ -646,7 +695,7 @@ export class P2PClient extends WithTracer implements P2P {
646
695
  * @param blocks - A list of finalized L2 blocks.
647
696
  * @returns Empty promise.
648
697
  */
649
- private async handleFinalizedL2Blocks(blocks: L2Block[]): Promise<void> {
698
+ private async handleFinalizedL2Blocks(blocks: BlockData[]): Promise<void> {
650
699
  if (!blocks.length) {
651
700
  return;
652
701
  }
@@ -694,14 +743,13 @@ export class P2PClient extends WithTracer implements P2P {
694
743
  return isEpochPrune;
695
744
  }
696
745
 
697
- /** Checks if the slot has changed and calls prepareForSlot if so. */
698
- private async maybeCallPrepareForSlot(): Promise<void> {
699
- const { currentSlot } = this.epochCache.getCurrentAndNextSlot();
700
- if (currentSlot <= this.lastSlotProcessed) {
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> {
748
+ if (slot <= this.lastSlotProcessed) {
701
749
  return;
702
750
  }
703
- this.lastSlotProcessed = currentSlot;
704
- await this.txPool.prepareForSlot(currentSlot);
751
+ this.lastSlotProcessed = slot;
752
+ await this.txPool.prepareForSlot(slot);
705
753
  }
706
754
 
707
755
  private async startServiceIfSynched() {