@aztec/p2p 0.0.1-commit.f504929 → 0.0.1-commit.f5a9928

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 (483) hide show
  1. package/README.md +130 -3
  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 +39 -16
  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 +142 -81
  13. package/dest/config.d.ts +163 -98
  14. package/dest/config.d.ts.map +1 -1
  15. package/dest/config.js +130 -20
  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 +272 -199
  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 +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 +5 -4
  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/interfaces.d.ts +7 -1
  58. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -1
  59. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts +1 -1
  60. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -1
  61. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +3 -4
  62. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts +1 -1
  63. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -1
  64. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +6 -7
  65. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +1 -1
  66. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -1
  67. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +6 -5
  68. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +1 -1
  69. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -1
  70. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +8 -6
  71. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +2 -2
  72. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -1
  73. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +2 -2
  74. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts +11 -1
  75. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts.map +1 -1
  76. package/dest/mem_pools/tx_pool_v2/instrumentation.js +24 -0
  77. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +41 -9
  78. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
  79. package/dest/mem_pools/tx_pool_v2/interfaces.js +3 -1
  80. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +29 -11
  81. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
  82. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +46 -16
  83. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +15 -1
  84. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -1
  85. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +55 -41
  86. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +19 -4
  87. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -1
  88. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +86 -32
  89. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +50 -6
  90. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -1
  91. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +262 -131
  92. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +10 -3
  93. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  94. package/dest/msg_validators/attestation_validator/attestation_validator.js +38 -15
  95. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +7 -3
  96. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
  97. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +4 -5
  98. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +11 -5
  99. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
  100. package/dest/msg_validators/proposal_validator/block_proposal_validator.js +11 -3
  101. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +11 -5
  102. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
  103. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +23 -3
  104. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +35 -10
  105. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
  106. package/dest/msg_validators/proposal_validator/proposal_validator.js +128 -56
  107. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +1 -1
  108. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  109. package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +8 -15
  110. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +1 -1
  111. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -1
  112. package/dest/msg_validators/tx_validator/allowed_public_setup.js +21 -32
  113. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts +17 -0
  114. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts.map +1 -0
  115. package/dest/msg_validators/tx_validator/allowed_setup_helpers.js +24 -0
  116. package/dest/msg_validators/tx_validator/archive_cache.js +1 -1
  117. package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts +15 -0
  118. package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts.map +1 -0
  119. package/dest/msg_validators/tx_validator/cached_tx_validator.js +19 -0
  120. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts +9 -0
  121. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts.map +1 -0
  122. package/dest/msg_validators/tx_validator/contract_instance_validator.js +48 -0
  123. package/dest/msg_validators/tx_validator/data_validator.d.ts +2 -1
  124. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  125. package/dest/msg_validators/tx_validator/data_validator.js +36 -2
  126. package/dest/msg_validators/tx_validator/factory.d.ts +25 -7
  127. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  128. package/dest/msg_validators/tx_validator/factory.js +55 -16
  129. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +1 -1
  130. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -1
  131. package/dest/msg_validators/tx_validator/fee_payer_balance.js +6 -2
  132. package/dest/msg_validators/tx_validator/gas_validator.d.ts +53 -7
  133. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  134. package/dest/msg_validators/tx_validator/gas_validator.js +88 -41
  135. package/dest/msg_validators/tx_validator/index.d.ts +4 -1
  136. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  137. package/dest/msg_validators/tx_validator/index.js +3 -0
  138. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +1 -1
  139. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  140. package/dest/msg_validators/tx_validator/metadata_validator.js +4 -4
  141. package/dest/msg_validators/tx_validator/phases_validator.d.ts +21 -1
  142. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
  143. package/dest/msg_validators/tx_validator/phases_validator.js +49 -2
  144. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +2 -1
  145. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
  146. package/dest/msg_validators/tx_validator/tx_proof_validator.js +2 -0
  147. package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts +48 -0
  148. package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts.map +1 -0
  149. package/dest/msg_validators/tx_validator/tx_validation_cache.js +68 -0
  150. package/dest/services/data_store.d.ts +1 -1
  151. package/dest/services/data_store.d.ts.map +1 -1
  152. package/dest/services/data_store.js +5 -5
  153. package/dest/services/discv5/discV5_service.d.ts +13 -2
  154. package/dest/services/discv5/discV5_service.d.ts.map +1 -1
  155. package/dest/services/discv5/discV5_service.js +119 -23
  156. package/dest/services/discv5/persisted_enr_store.d.ts +38 -0
  157. package/dest/services/discv5/persisted_enr_store.d.ts.map +1 -0
  158. package/dest/services/discv5/persisted_enr_store.js +145 -0
  159. package/dest/services/dummy_service.d.ts +18 -16
  160. package/dest/services/dummy_service.d.ts.map +1 -1
  161. package/dest/services/dummy_service.js +21 -16
  162. package/dest/services/encoding.d.ts +23 -6
  163. package/dest/services/encoding.d.ts.map +1 -1
  164. package/dest/services/encoding.js +32 -16
  165. package/dest/services/gossipsub/topic_score_params.d.ts +6 -12
  166. package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -1
  167. package/dest/services/gossipsub/topic_score_params.js +4 -14
  168. package/dest/services/libp2p/instrumentation.d.ts +6 -1
  169. package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
  170. package/dest/services/libp2p/instrumentation.js +21 -0
  171. package/dest/services/libp2p/libp2p_service.d.ts +51 -51
  172. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  173. package/dest/services/libp2p/libp2p_service.js +499 -333
  174. package/dest/services/peer-manager/peer_manager.d.ts +31 -3
  175. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  176. package/dest/services/peer-manager/peer_manager.js +125 -25
  177. package/dest/services/peer-manager/peer_scoring.d.ts +34 -2
  178. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  179. package/dest/services/peer-manager/peer_scoring.js +102 -13
  180. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +4 -8
  181. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -1
  182. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +81 -86
  183. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +10 -6
  184. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
  185. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +5 -4
  186. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -1
  187. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +13 -7
  188. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +3 -1
  189. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -1
  190. package/dest/services/reqresp/batch-tx-requester/peer_collection.js +3 -0
  191. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +5 -14
  192. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -1
  193. package/dest/services/reqresp/batch-tx-requester/tx_validator.js +6 -20
  194. package/dest/services/reqresp/config.d.ts +15 -3
  195. package/dest/services/reqresp/config.d.ts.map +1 -1
  196. package/dest/services/reqresp/config.js +11 -0
  197. package/dest/services/reqresp/interface.d.ts +16 -18
  198. package/dest/services/reqresp/interface.d.ts.map +1 -1
  199. package/dest/services/reqresp/interface.js +10 -20
  200. package/dest/services/reqresp/metrics.d.ts +1 -1
  201. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  202. package/dest/services/reqresp/metrics.js +0 -1
  203. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +4 -3
  204. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -1
  205. package/dest/services/reqresp/protocols/block_txs/bitvector.js +3 -2
  206. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +1 -1
  207. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
  208. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +31 -28
  209. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +12 -7
  210. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
  211. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +42 -24
  212. package/dest/services/reqresp/protocols/index.d.ts +1 -2
  213. package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
  214. package/dest/services/reqresp/protocols/index.js +0 -1
  215. package/dest/services/reqresp/protocols/tx.d.ts +1 -1
  216. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  217. package/dest/services/reqresp/protocols/tx.js +1 -3
  218. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +5 -4
  219. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
  220. package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -8
  221. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
  222. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
  223. package/dest/services/reqresp/rate-limiter/rate_limits.js +3 -13
  224. package/dest/services/reqresp/reqresp.d.ts +7 -29
  225. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  226. package/dest/services/reqresp/reqresp.js +73 -215
  227. package/dest/services/service.d.ts +43 -18
  228. package/dest/services/service.d.ts.map +1 -1
  229. package/dest/services/tx_collection/config.d.ts +2 -23
  230. package/dest/services/tx_collection/config.d.ts.map +1 -1
  231. package/dest/services/tx_collection/config.js +2 -55
  232. package/dest/services/tx_collection/file_store_tx_collection.d.ts +12 -28
  233. package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -1
  234. package/dest/services/tx_collection/file_store_tx_collection.js +43 -83
  235. package/dest/services/tx_collection/file_store_tx_source.d.ts +5 -4
  236. package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -1
  237. package/dest/services/tx_collection/file_store_tx_source.js +39 -29
  238. package/dest/services/tx_collection/index.d.ts +2 -3
  239. package/dest/services/tx_collection/index.d.ts.map +1 -1
  240. package/dest/services/tx_collection/index.js +0 -1
  241. package/dest/services/tx_collection/instrumentation.d.ts +1 -1
  242. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
  243. package/dest/services/tx_collection/instrumentation.js +0 -2
  244. package/dest/services/tx_collection/request_tracker.d.ts +53 -0
  245. package/dest/services/tx_collection/request_tracker.d.ts.map +1 -0
  246. package/dest/services/tx_collection/request_tracker.js +84 -0
  247. package/dest/services/tx_collection/tx_collection.d.ts +36 -55
  248. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  249. package/dest/services/tx_collection/tx_collection.js +275 -119
  250. package/dest/services/tx_collection/tx_collection_sink.d.ts +1 -1
  251. package/dest/services/tx_collection/tx_collection_sink.js +2 -2
  252. package/dest/services/tx_collection/tx_source.d.ts +6 -5
  253. package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
  254. package/dest/services/tx_collection/tx_source.js +13 -8
  255. package/dest/services/tx_file_store/tx_file_store.d.ts +1 -3
  256. package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -1
  257. package/dest/services/tx_file_store/tx_file_store.js +4 -14
  258. package/dest/services/tx_provider.d.ts +3 -1
  259. package/dest/services/tx_provider.d.ts.map +1 -1
  260. package/dest/services/tx_provider.js +3 -0
  261. package/dest/test-helpers/make-test-p2p-clients.d.ts +1 -1
  262. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  263. package/dest/test-helpers/make-test-p2p-clients.js +5 -2
  264. package/dest/test-helpers/mock-pubsub.d.ts +33 -9
  265. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  266. package/dest/test-helpers/mock-pubsub.js +57 -44
  267. package/dest/test-helpers/reqresp-nodes.d.ts +4 -5
  268. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  269. package/dest/test-helpers/reqresp-nodes.js +16 -18
  270. package/dest/test-helpers/test_tx_provider.d.ts +3 -1
  271. package/dest/test-helpers/test_tx_provider.d.ts.map +1 -1
  272. package/dest/test-helpers/test_tx_provider.js +3 -0
  273. package/dest/test-helpers/testbench-utils.d.ts +15 -14
  274. package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
  275. package/dest/test-helpers/testbench-utils.js +49 -15
  276. package/dest/testbench/p2p_client_testbench_worker.d.ts +3 -5
  277. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  278. package/dest/testbench/p2p_client_testbench_worker.js +104 -41
  279. package/dest/testbench/worker_client_manager.d.ts +12 -6
  280. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  281. package/dest/testbench/worker_client_manager.js +57 -11
  282. package/dest/util.d.ts +12 -7
  283. package/dest/util.d.ts.map +1 -1
  284. package/dest/util.js +35 -14
  285. package/dest/versioning.d.ts +3 -6
  286. package/dest/versioning.d.ts.map +1 -1
  287. package/dest/versioning.js +3 -24
  288. package/package.json +17 -17
  289. package/src/bootstrap/bootstrap.ts +17 -3
  290. package/src/client/factory.ts +62 -9
  291. package/src/client/interface.ts +48 -18
  292. package/src/client/p2p_client.ts +159 -113
  293. package/src/client/test/{tx_proposal_collector/README.md → p2p_client.batch_tx_requester.bench.README.md} +23 -53
  294. package/src/config.ts +233 -20
  295. package/src/errors/p2p-service.error.ts +11 -0
  296. package/src/errors/reqresp.error.ts +13 -19
  297. package/src/index.ts +0 -1
  298. package/src/mem_pools/attestation_pool/attestation_pool.ts +327 -242
  299. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +244 -69
  300. package/src/mem_pools/attestation_pool/mocks.ts +13 -8
  301. package/src/mem_pools/index.ts +0 -3
  302. package/src/mem_pools/instrumentation.ts +18 -12
  303. package/src/mem_pools/tx_pool_v2/README.md +9 -1
  304. package/src/mem_pools/tx_pool_v2/archive/tx_archive.ts +30 -20
  305. package/src/mem_pools/tx_pool_v2/deleted_pool.ts +7 -7
  306. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +4 -5
  307. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +3 -2
  308. package/src/mem_pools/tx_pool_v2/eviction/index.ts +1 -0
  309. package/src/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.ts +67 -0
  310. package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +11 -1
  311. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +1 -3
  312. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +5 -7
  313. package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +5 -6
  314. package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +15 -6
  315. package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +2 -1
  316. package/src/mem_pools/tx_pool_v2/instrumentation.ts +27 -0
  317. package/src/mem_pools/tx_pool_v2/interfaces.ts +40 -8
  318. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +72 -20
  319. package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +62 -41
  320. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +107 -32
  321. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +291 -137
  322. package/src/msg_validators/attestation_validator/README.md +49 -0
  323. package/src/msg_validators/attestation_validator/attestation_validator.ts +46 -14
  324. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +15 -7
  325. package/src/msg_validators/proposal_validator/README.md +123 -0
  326. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +26 -4
  327. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +43 -7
  328. package/src/msg_validators/proposal_validator/proposal_validator.ts +150 -58
  329. package/src/msg_validators/tx_validator/README.md +17 -3
  330. package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +3 -12
  331. package/src/msg_validators/tx_validator/allowed_public_setup.ts +16 -35
  332. package/src/msg_validators/tx_validator/allowed_setup_helpers.ts +31 -0
  333. package/src/msg_validators/tx_validator/archive_cache.ts +1 -1
  334. package/src/msg_validators/tx_validator/cached_tx_validator.ts +31 -0
  335. package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
  336. package/src/msg_validators/tx_validator/data_validator.ts +44 -1
  337. package/src/msg_validators/tx_validator/factory.ts +66 -9
  338. package/src/msg_validators/tx_validator/fee_payer_balance.ts +6 -2
  339. package/src/msg_validators/tx_validator/gas_validator.ts +117 -39
  340. package/src/msg_validators/tx_validator/index.ts +3 -0
  341. package/src/msg_validators/tx_validator/metadata_validator.ts +12 -4
  342. package/src/msg_validators/tx_validator/phases_validator.ts +60 -1
  343. package/src/msg_validators/tx_validator/tx_proof_validator.ts +2 -0
  344. package/src/msg_validators/tx_validator/tx_validation_cache.ts +101 -0
  345. package/src/services/data_store.ts +5 -13
  346. package/src/services/discv5/discV5_service.ts +126 -14
  347. package/src/services/discv5/persisted_enr_store.ts +158 -0
  348. package/src/services/dummy_service.ts +26 -40
  349. package/src/services/encoding.ts +35 -19
  350. package/src/services/gossipsub/README.md +33 -11
  351. package/src/services/gossipsub/topic_score_params.ts +9 -18
  352. package/src/services/libp2p/instrumentation.ts +22 -0
  353. package/src/services/libp2p/libp2p_service.ts +560 -369
  354. package/src/services/peer-manager/peer_manager.ts +138 -24
  355. package/src/services/peer-manager/peer_scoring.ts +102 -8
  356. package/src/services/reqresp/README.md +194 -0
  357. package/src/services/reqresp/batch-tx-requester/README.md +46 -7
  358. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +77 -95
  359. package/src/services/reqresp/batch-tx-requester/interface.ts +13 -5
  360. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +13 -6
  361. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +5 -0
  362. package/src/services/reqresp/batch-tx-requester/tx_validator.ts +12 -25
  363. package/src/services/reqresp/config.ts +19 -2
  364. package/src/services/reqresp/interface.ts +21 -47
  365. package/src/services/reqresp/metrics.ts +0 -1
  366. package/src/services/reqresp/protocols/block_txs/bitvector.ts +3 -2
  367. package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +34 -30
  368. package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +47 -20
  369. package/src/services/reqresp/protocols/index.ts +0 -1
  370. package/src/services/reqresp/protocols/tx.ts +1 -3
  371. package/src/services/reqresp/rate-limiter/rate_limiter.ts +13 -9
  372. package/src/services/reqresp/rate-limiter/rate_limits.ts +3 -13
  373. package/src/services/reqresp/reqresp.ts +84 -259
  374. package/src/services/service.ts +51 -35
  375. package/src/services/tx_collection/config.ts +3 -80
  376. package/src/services/tx_collection/file_store_tx_collection.ts +54 -103
  377. package/src/services/tx_collection/file_store_tx_source.ts +43 -31
  378. package/src/services/tx_collection/index.ts +1 -6
  379. package/src/services/tx_collection/instrumentation.ts +1 -7
  380. package/src/services/tx_collection/request_tracker.ts +127 -0
  381. package/src/services/tx_collection/tx_collection.ts +331 -176
  382. package/src/services/tx_collection/tx_collection_sink.ts +2 -2
  383. package/src/services/tx_collection/tx_source.ts +10 -8
  384. package/src/services/tx_file_store/tx_file_store.ts +5 -17
  385. package/src/services/tx_provider.ts +5 -0
  386. package/src/test-helpers/make-test-p2p-clients.ts +4 -1
  387. package/src/test-helpers/mock-pubsub.ts +61 -60
  388. package/src/test-helpers/reqresp-nodes.ts +13 -23
  389. package/src/test-helpers/test_tx_provider.ts +5 -0
  390. package/src/test-helpers/testbench-utils.ts +63 -28
  391. package/src/testbench/p2p_client_testbench_worker.ts +111 -57
  392. package/src/testbench/worker_client_manager.ts +72 -25
  393. package/src/util.ts +33 -18
  394. package/src/versioning.ts +3 -33
  395. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts +0 -2
  396. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts.map +0 -1
  397. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +0 -304
  398. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts +0 -73
  399. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts.map +0 -1
  400. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.js +0 -8
  401. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +0 -125
  402. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +0 -1
  403. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +0 -596
  404. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +0 -32
  405. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +0 -1
  406. package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +0 -112
  407. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +0 -157
  408. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +0 -1
  409. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +0 -52
  410. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +0 -16
  411. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +0 -1
  412. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +0 -122
  413. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +0 -17
  414. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +0 -1
  415. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +0 -84
  416. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +0 -19
  417. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +0 -1
  418. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +0 -78
  419. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +0 -26
  420. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +0 -1
  421. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +0 -84
  422. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +0 -25
  423. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +0 -1
  424. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +0 -57
  425. package/dest/mem_pools/tx_pool/index.d.ts +0 -3
  426. package/dest/mem_pools/tx_pool/index.d.ts.map +0 -1
  427. package/dest/mem_pools/tx_pool/index.js +0 -2
  428. package/dest/mem_pools/tx_pool/priority.d.ts +0 -12
  429. package/dest/mem_pools/tx_pool/priority.d.ts.map +0 -1
  430. package/dest/mem_pools/tx_pool/priority.js +0 -15
  431. package/dest/mem_pools/tx_pool/tx_pool.d.ts +0 -127
  432. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +0 -1
  433. package/dest/mem_pools/tx_pool/tx_pool.js +0 -3
  434. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +0 -7
  435. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +0 -1
  436. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +0 -400
  437. package/dest/msg_validators/clock_tolerance.d.ts +0 -21
  438. package/dest/msg_validators/clock_tolerance.d.ts.map +0 -1
  439. package/dest/msg_validators/clock_tolerance.js +0 -37
  440. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +0 -24
  441. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +0 -1
  442. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +0 -378
  443. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +0 -64
  444. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +0 -1
  445. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +0 -151
  446. package/dest/services/reqresp/protocols/block.d.ts +0 -9
  447. package/dest/services/reqresp/protocols/block.d.ts.map +0 -1
  448. package/dest/services/reqresp/protocols/block.js +0 -32
  449. package/dest/services/tx_collection/fast_tx_collection.d.ts +0 -54
  450. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +0 -1
  451. package/dest/services/tx_collection/fast_tx_collection.js +0 -327
  452. package/dest/services/tx_collection/missing_txs_tracker.d.ts +0 -32
  453. package/dest/services/tx_collection/missing_txs_tracker.d.ts.map +0 -1
  454. package/dest/services/tx_collection/missing_txs_tracker.js +0 -27
  455. package/dest/services/tx_collection/proposal_tx_collector.d.ts +0 -49
  456. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +0 -1
  457. package/dest/services/tx_collection/proposal_tx_collector.js +0 -50
  458. package/dest/services/tx_collection/slow_tx_collection.d.ts +0 -57
  459. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +0 -1
  460. package/dest/services/tx_collection/slow_tx_collection.js +0 -211
  461. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +0 -345
  462. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.ts +0 -43
  463. package/src/mem_pools/tx_pool/README.md +0 -270
  464. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -746
  465. package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +0 -132
  466. package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +0 -208
  467. package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +0 -162
  468. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +0 -104
  469. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +0 -93
  470. package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +0 -106
  471. package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +0 -75
  472. package/src/mem_pools/tx_pool/index.ts +0 -2
  473. package/src/mem_pools/tx_pool/priority.ts +0 -20
  474. package/src/mem_pools/tx_pool/tx_pool.ts +0 -141
  475. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +0 -319
  476. package/src/msg_validators/clock_tolerance.ts +0 -51
  477. package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +0 -373
  478. package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +0 -161
  479. package/src/services/reqresp/protocols/block.ts +0 -37
  480. package/src/services/tx_collection/fast_tx_collection.ts +0 -387
  481. package/src/services/tx_collection/missing_txs_tracker.ts +0 -52
  482. package/src/services/tx_collection/proposal_tx_collector.ts +0 -113
  483. package/src/services/tx_collection/slow_tx_collection.ts +0 -266
@@ -1,25 +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
27
  import { getTimestampForSlot } from '@aztec/stdlib/epoch-helpers';
22
- import { type PeerInfo, tryStop } from '@aztec/stdlib/interfaces/server';
28
+ import { type GetTxByHashOptions, type P2PConnectivity, type PeerInfo, tryStop } from '@aztec/stdlib/interfaces/server';
23
29
  import { type BlockProposal, CheckpointAttestation, type CheckpointProposal, type TopicType } from '@aztec/stdlib/p2p';
24
30
  import type { BlockHeader, Tx, TxHash } from '@aztec/stdlib/tx';
25
31
  import { Attributes, type TelemetryClient, WithTracer, getTelemetryClient, trackSpan } from '@aztec/telemetry-client';
@@ -29,18 +35,15 @@ import type { ENR } from '@nethermindeth/enr';
29
35
 
30
36
  import { type P2PConfig, getP2PDefaultConfig } from '../config.js';
31
37
  import { TxPoolError } from '../errors/tx-pool.error.js';
32
- import type { AttestationPoolApi } from '../mem_pools/attestation_pool/attestation_pool.js';
38
+ import type { AttestationPoolApi, ProposalsForSlot } from '../mem_pools/attestation_pool/attestation_pool.js';
33
39
  import type { MemPools } from '../mem_pools/interface.js';
34
40
  import type { TxPoolV2 } from '../mem_pools/tx_pool_v2/interfaces.js';
35
41
  import type { AuthRequest, StatusMessage } from '../services/index.js';
36
- import {
37
- ReqRespSubProtocol,
38
- type ReqRespSubProtocolHandler,
39
- type ReqRespSubProtocolValidators,
40
- } from '../services/reqresp/interface.js';
42
+ import { ReqRespSubProtocol, type ReqRespSubProtocolHandler } from '../services/reqresp/interface.js';
41
43
  import type {
42
44
  DuplicateAttestationInfo,
43
45
  DuplicateProposalInfo,
46
+ OversizedProposalInfo,
44
47
  P2PBlockReceivedCallback,
45
48
  P2PCheckpointReceivedCallback,
46
49
  P2PService,
@@ -59,7 +62,7 @@ export class P2PClient extends WithTracer implements P2P {
59
62
 
60
63
  private currentState = P2PClientState.IDLE;
61
64
  private syncPromise = Promise.resolve();
62
- private syncResolve?: () => void = undefined;
65
+ private syncResolvers?: PromiseWithResolvers<void> = undefined;
63
66
  private latestBlockNumberAtStart = -1;
64
67
  private provenBlockNumberAtStart = -1;
65
68
  private finalizedBlockNumberAtStart = -1;
@@ -72,7 +75,7 @@ export class P2PClient extends WithTracer implements P2P {
72
75
 
73
76
  private config: P2PConfig;
74
77
 
75
- private blockStream: L2BlockStream | undefined;
78
+ private blockStream: EventDrivenL2BlockStream | undefined;
76
79
 
77
80
  private txProvider: TxProvider;
78
81
 
@@ -81,9 +84,6 @@ export class P2PClient extends WithTracer implements P2P {
81
84
  /** Tracks the last slot for which we called prepareForSlot */
82
85
  private lastSlotProcessed: SlotNumber = SlotNumber.ZERO;
83
86
 
84
- /** Polls for slot changes and calls prepareForSlot on the tx pool */
85
- private slotMonitor: RunningPromise | undefined;
86
-
87
87
  constructor(
88
88
  private store: AztecAsyncKVStore,
89
89
  private l2BlockSource: L2BlockSource & ContractDataSource,
@@ -96,6 +96,7 @@ export class P2PClient extends WithTracer implements P2P {
96
96
  private _dateProvider: DateProvider = new DateProvider(),
97
97
  private telemetry: TelemetryClient = getTelemetryClient(),
98
98
  private log = createLogger('p2p'),
99
+ initialBlockHash: BlockHash,
99
100
  ) {
100
101
  super(telemetry, 'P2PClient');
101
102
 
@@ -111,28 +112,7 @@ export class P2PClient extends WithTracer implements P2P {
111
112
  this.telemetry,
112
113
  );
113
114
 
114
- // Default to collecting all txs when we see a valid proposal
115
- // This can be overridden by the validator client to validate, and it will call getTxsForBlockProposal on its own
116
- // Note: Validators do NOT attest to individual blocks - attestations are only for checkpoint proposals.
117
- // TODO(palla/txs): We should not trigger a request for txs on a proposal before fully validating it. We need to bring
118
- // validator-client code into here so we can validate a proposal is reasonable.
119
- this.registerBlockProposalHandler(async (block, sender) => {
120
- this.log.debug(`Received block proposal from ${sender.toString()}`);
121
- // TODO(palla/txs): Need to subtract validatorReexecuteDeadlineMs from this deadline (see ValidatorClient.getReexecutionDeadline)
122
- const constants = this.txCollection.getConstants();
123
- const nextSlotTimestampSeconds = Number(getTimestampForSlot(SlotNumber(block.slotNumber + 1), constants));
124
- const deadline = new Date(nextSlotTimestampSeconds * 1000);
125
- const parentBlock = await this.l2BlockSource.getBlockHeaderByArchive(block.blockHeader.lastArchive.root);
126
- if (!parentBlock) {
127
- this.log.debug(`Cannot collect txs for proposal as parent block not found`);
128
- return false;
129
- }
130
- const blockNumber = BlockNumber(parentBlock.getBlockNumber() + 1);
131
- await this.txProvider.getTxsForBlockProposal(block, blockNumber, { pinnedPeer: sender, deadline });
132
- return true;
133
- });
134
-
135
- this.l2Tips = new L2TipsKVStore(store, 'p2p_client');
115
+ this.l2Tips = new L2TipsKVStore(store, 'p2p_client', initialBlockHash);
136
116
  this.synchedLatestSlot = store.openSingleton('p2p_pool_last_l2_slot');
137
117
  }
138
118
 
@@ -157,6 +137,10 @@ export class P2PClient extends WithTracer implements P2P {
157
137
  return Promise.resolve(this.p2pService.getPeers(includePending));
158
138
  }
159
139
 
140
+ public getP2PConnectivity(): Promise<P2PConnectivity> {
141
+ return Promise.resolve(this.p2pService.getP2PConnectivity());
142
+ }
143
+
160
144
  public getGossipMeshPeerCount(topicType: TopicType): Promise<number> {
161
145
  return Promise.resolve(this.p2pService.getGossipMeshPeerCount(topicType));
162
146
  }
@@ -170,7 +154,7 @@ export class P2PClient extends WithTracer implements P2P {
170
154
  this.p2pService.updateConfig(config);
171
155
  }
172
156
 
173
- public getL2Tips(): Promise<L2Tips> {
157
+ public getL2Tips(): Promise<LocalL2Tips> {
174
158
  return this.l2Tips.getL2Tips();
175
159
  }
176
160
 
@@ -186,7 +170,7 @@ export class P2PClient extends WithTracer implements P2P {
186
170
  const from = BlockNumber(oldFinalizedBlockNum + 1);
187
171
  const limit = event.block.number - from + 1;
188
172
  if (limit > 0) {
189
- const oldBlocks = await this.l2BlockSource.getBlocks(from, limit);
173
+ const oldBlocks = await this.l2BlockSource.getBlocksData({ from, limit });
190
174
  await this.handleFinalizedL2Blocks(oldBlocks);
191
175
  }
192
176
  break;
@@ -196,10 +180,12 @@ export class P2PClient extends WithTracer implements P2P {
196
180
  break;
197
181
  case 'chain-pruned':
198
182
  this.txCollection.stopCollectingForBlocksAfter(event.block.number);
199
- await this.handlePruneL2Blocks(event.block, event.checkpoint);
183
+ await this.handlePruneL2Blocks(event.block, event.checkpointed.checkpoint);
200
184
  break;
201
185
  case 'chain-checkpointed':
202
186
  break;
187
+ case 'chain-proposed':
188
+ break;
203
189
  default: {
204
190
  const _: never = event;
205
191
  break;
@@ -258,9 +244,8 @@ export class P2PClient extends WithTracer implements P2P {
258
244
  // this gets resolved on `startServiceIfSynched`
259
245
  this.initBlockStream();
260
246
  this.setCurrentState(P2PClientState.SYNCHING);
261
- this.syncPromise = new Promise(resolve => {
262
- this.syncResolve = resolve;
263
- });
247
+ this.syncResolvers = promiseWithResolvers<void>();
248
+ this.syncPromise = this.syncResolvers.promise;
264
249
  this.log.info(`Initiating p2p sync from ${syncedLatestBlock}`, {
265
250
  syncedLatestBlock,
266
251
  syncedProvenBlock,
@@ -279,33 +264,24 @@ export class P2PClient extends WithTracer implements P2P {
279
264
  });
280
265
  }
281
266
 
282
- this.blockStream!.start();
283
- 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();
284
272
  this.txFileStore?.start();
285
273
 
286
- // Start slot monitor to call prepareForSlot when the slot changes
287
- this.slotMonitor = new RunningPromise(
288
- () => this.maybeCallPrepareForSlot(),
289
- this.log,
290
- this.config.slotCheckIntervalMS,
291
- );
292
- this.slotMonitor.start();
293
-
294
274
  return this.syncPromise;
295
275
  }
296
276
 
297
- addReqRespSubProtocol(
298
- subProtocol: ReqRespSubProtocol,
299
- handler: ReqRespSubProtocolHandler,
300
- validator: ReqRespSubProtocolValidators[ReqRespSubProtocol],
301
- ): Promise<void> {
302
- return this.p2pService.addReqRespSubProtocol(subProtocol, handler, validator);
277
+ addReqRespSubProtocol(subProtocol: ReqRespSubProtocol, handler: ReqRespSubProtocolHandler): Promise<void> {
278
+ return this.p2pService.addReqRespSubProtocol(subProtocol, handler);
303
279
  }
304
280
 
305
281
  private initBlockStream(startingBlock?: BlockNumber) {
306
282
  if (!this.blockStream) {
307
283
  const { blockRequestBatchSize: batchSize, blockCheckIntervalMS: pollIntervalMS } = this.config;
308
- this.blockStream = new L2BlockStream(
284
+ this.blockStream = new EventDrivenL2BlockStream(
309
285
  this.l2BlockSource,
310
286
  this,
311
287
  this,
@@ -321,8 +297,6 @@ export class P2PClient extends WithTracer implements P2P {
321
297
  */
322
298
  public async stop() {
323
299
  this.log.debug('Stopping p2p client...');
324
- await this.slotMonitor?.stop();
325
- this.log.debug('Stopped slot monitor');
326
300
  await tryStop(this.txCollection);
327
301
  this.log.debug('Stopped tx collection service');
328
302
  await this.txFileStore?.stop();
@@ -341,7 +315,11 @@ export class P2PClient extends WithTracer implements P2P {
341
315
  /** Triggers a sync to the archiver. Used for testing. */
342
316
  public async sync() {
343
317
  this.initBlockStream();
344
- 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();
345
323
  }
346
324
 
347
325
  @trackSpan('p2pClient.broadcastProposal', async proposal => ({
@@ -379,6 +357,19 @@ export class P2PClient extends WithTracer implements P2P {
379
357
  // Store our own last-block proposal so we can respond to req/resp requests for it.
380
358
  await this.attestationPool.tryAddBlockProposal(blockProposal);
381
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
+ }
382
373
  return this.p2pService.propagate(proposal);
383
374
  }
384
375
 
@@ -389,10 +380,10 @@ export class P2PClient extends WithTracer implements P2P {
389
380
 
390
381
  public async getCheckpointAttestationsForSlot(
391
382
  slot: SlotNumber,
392
- proposalId?: string,
383
+ proposalPayloadHash?: CheckpointProposalHash,
393
384
  ): Promise<CheckpointAttestation[]> {
394
- return await (proposalId
395
- ? this.attestationPool.getCheckpointAttestationsForSlotAndProposal(slot, proposalId)
385
+ return await (proposalPayloadHash
386
+ ? this.attestationPool.getCheckpointAttestationsForSlotAndProposal(slot, proposalPayloadHash)
396
387
  : this.attestationPool.getCheckpointAttestationsForSlot(slot));
397
388
  }
398
389
 
@@ -400,29 +391,49 @@ export class P2PClient extends WithTracer implements P2P {
400
391
  return this.attestationPool.addOwnCheckpointAttestations(attestations);
401
392
  }
402
393
 
394
+ public getProposalsForSlot(slot: SlotNumber): Promise<ProposalsForSlot> {
395
+ return this.attestationPool.getProposalsForSlot(slot);
396
+ }
397
+
403
398
  public hasBlockProposalsForSlot(slot: SlotNumber): Promise<boolean> {
404
399
  return this.attestationPool.hasBlockProposalsForSlot(slot);
405
400
  }
406
401
 
402
+ public hasCheckpointProposalForSlot(slot: SlotNumber): Promise<boolean> {
403
+ return this.attestationPool.hasCheckpointProposalForSlot(slot);
404
+ }
405
+
407
406
  // REVIEW: https://github.com/AztecProtocol/aztec-packages/issues/7963
408
407
  // ^ This pattern is not my favorite (md)
409
408
  public registerBlockProposalHandler(handler: P2PBlockReceivedCallback): void {
410
409
  this.p2pService.registerBlockReceivedCallback(handler);
411
410
  }
412
411
 
413
- public registerCheckpointProposalHandler(handler: P2PCheckpointReceivedCallback): void {
414
- 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);
415
418
  }
416
419
 
417
420
  public registerDuplicateProposalCallback(callback: (info: DuplicateProposalInfo) => void): void {
418
421
  this.p2pService.registerDuplicateProposalCallback(callback);
419
422
  }
420
423
 
424
+ public registerOversizedProposalCallback(callback: (info: OversizedProposalInfo) => void): void {
425
+ this.p2pService.registerOversizedProposalCallback(callback);
426
+ }
427
+
421
428
  public registerDuplicateAttestationCallback(callback: (info: DuplicateAttestationInfo) => void): void {
422
429
  this.p2pService.registerDuplicateAttestationCallback(callback);
423
430
  }
424
431
 
425
- 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[]> {
426
437
  if (limit !== undefined && limit <= 0) {
427
438
  throw new TypeError('limit must be greater than 0');
428
439
  }
@@ -441,7 +452,9 @@ export class P2PClient extends WithTracer implements P2P {
441
452
  const endIndex = limit !== undefined ? startIndex + limit : undefined;
442
453
  txHashes = txHashes.slice(startIndex, endIndex);
443
454
 
444
- 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 })));
445
458
  return maybeTxs.filter((tx): tx is Tx => !!tx);
446
459
  }
447
460
 
@@ -449,18 +462,22 @@ export class P2PClient extends WithTracer implements P2P {
449
462
  return this.txPool.getPendingTxCount();
450
463
  }
451
464
 
452
- 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> {
453
470
  for (const txHash of await this.txPool.getPendingTxHashes()) {
454
- const tx = await this.txPool.getTxByHash(txHash);
471
+ const tx = await this.txPool.getTxByHash(txHash, opts);
455
472
  if (tx) {
456
473
  yield tx;
457
474
  }
458
475
  }
459
476
  }
460
477
 
461
- public async *iterateEligiblePendingTxs(): AsyncIterableIterator<Tx> {
478
+ public async *iterateEligiblePendingTxs(opts?: { includeProof?: boolean }): AsyncIterableIterator<Tx> {
462
479
  for (const txHash of await this.txPool.getEligiblePendingTxHashes()) {
463
- const tx = await this.txPool.getTxByHash(txHash);
480
+ const tx = await this.txPool.getTxByHash(txHash, opts);
464
481
  if (tx) {
465
482
  yield tx;
466
483
  }
@@ -470,19 +487,21 @@ export class P2PClient extends WithTracer implements P2P {
470
487
  /**
471
488
  * Returns a transaction in the transaction pool by its hash.
472
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.
473
491
  * @returns A single tx or undefined.
474
492
  */
475
- getTxByHashFromPool(txHash: TxHash): Promise<Tx | undefined> {
476
- return this.txPool.getTxByHash(txHash);
493
+ getTxByHashFromPool(txHash: TxHash, opts?: { includeProof?: boolean }): Promise<Tx | undefined> {
494
+ return this.txPool.getTxByHash(txHash, opts);
477
495
  }
478
496
 
479
497
  /**
480
498
  * Returns transactions in the transaction pool by hash.
481
499
  * @param txHashes - Hashes of the transactions to look for.
500
+ * @param opts - Set `includeProof: false` to skip loading tx proofs from the DB.
482
501
  * @returns The txs found, in the same order as the requested hashes. If a tx is not found, it will be undefined.
483
502
  */
484
- getTxsByHashFromPool(txHashes: TxHash[]): Promise<(Tx | undefined)[]> {
485
- return this.txPool.getTxsByHash(txHashes);
503
+ getTxsByHashFromPool(txHashes: TxHash[], opts?: { includeProof?: boolean }): Promise<(Tx | undefined)[]> {
504
+ return this.txPool.getTxsByHash(txHashes, opts);
486
505
  }
487
506
 
488
507
  hasTxsInPool(txHashes: TxHash[]): Promise<boolean[]> {
@@ -592,13 +611,10 @@ export class P2PClient extends WithTracer implements P2P {
592
611
  */
593
612
  public async getStatus(): Promise<P2PSyncState> {
594
613
  const blockNumber = await this.getSyncedLatestBlockNum();
595
- const blockHash =
596
- blockNumber === 0
597
- ? GENESIS_BLOCK_HEADER_HASH.toString()
598
- : await this.l2BlockSource
599
- .getBlockHeader(blockNumber)
600
- .then(header => header?.hash())
601
- .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());
602
618
 
603
619
  return {
604
620
  state: this.currentState,
@@ -627,15 +643,20 @@ export class P2PClient extends WithTracer implements P2P {
627
643
  return;
628
644
  }
629
645
 
630
- await this.handleMinedBlocks(blocks);
631
- await this.maybeCallPrepareForSlot();
632
- await this.startCollectingMissingTxs(blocks);
633
646
  const lastBlock = blocks.at(-1)!;
634
- 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));
635
656
  }
636
657
 
637
- /** Request txs for unproven blocks so the prover node has more chances to get them. */
638
- 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> {
639
660
  try {
640
661
  // TODO(#15435): If the archiver has lagged behind L1, the reported proven block number may
641
662
  // be much lower than the actual one, and it does not update until the pending chain is
@@ -643,7 +664,7 @@ export class P2PClient extends WithTracer implements P2P {
643
664
  // are already proven, but the archiver has not yet updated its state. Until this is properly
644
665
  // fixed, it is mitigated by the expiration date of collection requests, which depends on
645
666
  // the slot number of the block.
646
- const provenBlockNumber = await this.l2BlockSource.getProvenBlockNumber();
667
+ const provenBlockNumber = (await this.l2BlockSource.getBlockNumber({ tag: 'proven' })) ?? BlockNumber.ZERO;
647
668
  const unprovenBlocks = blocks.filter(block => block.number > provenBlockNumber);
648
669
  for (const block of unprovenBlocks) {
649
670
  const txHashes = block.body.txEffects.map(txEffect => txEffect.txHash);
@@ -655,7 +676,17 @@ export class P2PClient extends WithTracer implements P2P {
655
676
  `Starting collection of ${missingTxHashes.length} missing txs for unproven mined block ${block.number}`,
656
677
  { missingTxHashes, blockNumber: block.number, blockHash: await block.hash().then(h => h.toString()) },
657
678
  );
658
- 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 });
659
690
  }
660
691
  }
661
692
  } catch (err) {
@@ -668,7 +699,7 @@ export class P2PClient extends WithTracer implements P2P {
668
699
  * @param blocks - A list of finalized L2 blocks.
669
700
  * @returns Empty promise.
670
701
  */
671
- private async handleFinalizedL2Blocks(blocks: L2Block[]): Promise<void> {
702
+ private async handleFinalizedL2Blocks(blocks: BlockData[]): Promise<void> {
672
703
  if (!blocks.length) {
673
704
  return;
674
705
  }
@@ -691,31 +722,38 @@ export class P2PClient extends WithTracer implements P2P {
691
722
  }
692
723
 
693
724
  /**
694
- * Returns true if the prune crossed a checkpoint boundary.
695
- * If the old and new checkpoint numbers are the same, the prune is within a single checkpoint.
696
- * If they differ, the prune spans across checkpoints (epoch prune).
725
+ * Returns true if the prune is an epoch prune (new checkpoint number is less than old).
726
+ * If the checkpoint number stays the same or increases, the prune is within a checkpoint.
697
727
  */
698
728
  private async isEpochPrune(newCheckpoint: CheckpointId): Promise<boolean> {
699
729
  const tips = await this.l2Tips.getL2Tips();
700
730
  const oldCheckpointNumber = tips.checkpointed.checkpoint.number;
701
- if (oldCheckpointNumber <= CheckpointNumber.ZERO) {
731
+ if (oldCheckpointNumber <= CheckpointNumber.INITIAL) {
702
732
  return false;
703
733
  }
704
- const isEpochPrune = oldCheckpointNumber !== newCheckpoint.number;
705
- this.log.info(
706
- `Detected epoch prune: ${isEpochPrune}. Old checkpoint: ${oldCheckpointNumber}, new checkpoint: ${newCheckpoint.number}`,
707
- );
734
+ const newCheckpointNumber = newCheckpoint.number;
735
+ // We check that the new checkpoint number is less than the old checkpoint number in order to consider it an epoch prune.
736
+ // To be more certain that it is an epoch prune, we will check that at least 2 checkpoints were removed.
737
+ // This means we should avoid thinking checkpoints removed by L1 re-orgs are epoch prunes
738
+ const thresholdForEpochPrune = CheckpointNumber(oldCheckpointNumber - 2);
739
+ const isEpochPrune = newCheckpointNumber <= thresholdForEpochPrune;
740
+ if (isEpochPrune) {
741
+ this.log.info(`Detected epoch prune to ${newCheckpointNumber}`, {
742
+ oldCheckpointNumber,
743
+ newCheckpointNumber,
744
+ thresholdForEpochPrune,
745
+ });
746
+ }
708
747
  return isEpochPrune;
709
748
  }
710
749
 
711
- /** Checks if the slot has changed and calls prepareForSlot if so. */
712
- private async maybeCallPrepareForSlot(): Promise<void> {
713
- const { currentSlot } = this.epochCache.getCurrentAndNextSlot();
714
- if (currentSlot <= 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) {
715
753
  return;
716
754
  }
717
- this.lastSlotProcessed = currentSlot;
718
- await this.txPool.prepareForSlot(currentSlot);
755
+ this.lastSlotProcessed = slot;
756
+ await this.txPool.prepareForSlot(slot);
719
757
  }
720
758
 
721
759
  private async startServiceIfSynched() {
@@ -738,9 +776,17 @@ export class P2PClient extends WithTracer implements P2P {
738
776
  syncedFinalizedBlock,
739
777
  });
740
778
  this.setCurrentState(P2PClientState.RUNNING);
741
- if (this.syncResolve !== undefined) {
742
- this.syncResolve();
743
- 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();
744
790
  }
745
791
  }
746
792
  }