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