@aztec/p2p 0.0.1-commit.b655e406 → 0.0.1-commit.b8a057fa

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 (606) hide show
  1. package/README.md +130 -3
  2. package/dest/bootstrap/bootstrap.d.ts +4 -3
  3. package/dest/bootstrap/bootstrap.d.ts.map +1 -1
  4. package/dest/bootstrap/bootstrap.js +26 -10
  5. package/dest/client/factory.d.ts +13 -12
  6. package/dest/client/factory.d.ts.map +1 -1
  7. package/dest/client/factory.js +70 -21
  8. package/dest/client/index.d.ts +1 -1
  9. package/dest/client/interface.d.ts +104 -39
  10. package/dest/client/interface.d.ts.map +1 -1
  11. package/dest/client/p2p_client.d.ts +76 -92
  12. package/dest/client/p2p_client.d.ts.map +1 -1
  13. package/dest/client/p2p_client.js +685 -344
  14. package/dest/config.d.ts +175 -87
  15. package/dest/config.d.ts.map +1 -1
  16. package/dest/config.js +180 -59
  17. package/dest/enr/generate-enr.d.ts +1 -1
  18. package/dest/enr/index.d.ts +1 -1
  19. package/dest/errors/attestation-pool.error.d.ts +7 -0
  20. package/dest/errors/attestation-pool.error.d.ts.map +1 -0
  21. package/dest/errors/attestation-pool.error.js +12 -0
  22. package/dest/errors/p2p-service.error.d.ts +9 -0
  23. package/dest/errors/p2p-service.error.d.ts.map +1 -0
  24. package/dest/errors/p2p-service.error.js +10 -0
  25. package/dest/errors/reqresp.error.d.ts +9 -16
  26. package/dest/errors/reqresp.error.d.ts.map +1 -1
  27. package/dest/errors/reqresp.error.js +10 -17
  28. package/dest/errors/tx-pool.error.d.ts +8 -0
  29. package/dest/errors/tx-pool.error.d.ts.map +1 -0
  30. package/dest/errors/tx-pool.error.js +9 -0
  31. package/dest/index.d.ts +2 -2
  32. package/dest/index.d.ts.map +1 -1
  33. package/dest/index.js +1 -1
  34. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +156 -57
  35. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  36. package/dest/mem_pools/attestation_pool/attestation_pool.js +518 -3
  37. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +2 -2
  38. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
  39. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +694 -294
  40. package/dest/mem_pools/attestation_pool/index.d.ts +2 -3
  41. package/dest/mem_pools/attestation_pool/index.d.ts.map +1 -1
  42. package/dest/mem_pools/attestation_pool/index.js +1 -2
  43. package/dest/mem_pools/attestation_pool/mocks.d.ts +234 -10
  44. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  45. package/dest/mem_pools/attestation_pool/mocks.js +19 -13
  46. package/dest/mem_pools/index.d.ts +3 -3
  47. package/dest/mem_pools/index.d.ts.map +1 -1
  48. package/dest/mem_pools/index.js +1 -1
  49. package/dest/mem_pools/instrumentation.d.ts +16 -1
  50. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  51. package/dest/mem_pools/instrumentation.js +58 -10
  52. package/dest/mem_pools/interface.d.ts +6 -7
  53. package/dest/mem_pools/interface.d.ts.map +1 -1
  54. package/dest/mem_pools/tx_pool_v2/archive/index.d.ts +2 -0
  55. package/dest/mem_pools/tx_pool_v2/archive/index.d.ts.map +1 -0
  56. package/dest/mem_pools/tx_pool_v2/archive/index.js +1 -0
  57. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts +39 -0
  58. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts.map +1 -0
  59. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.js +97 -0
  60. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +104 -0
  61. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -0
  62. package/dest/mem_pools/tx_pool_v2/deleted_pool.js +251 -0
  63. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts +47 -0
  64. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts.map +1 -0
  65. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.js +128 -0
  66. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +17 -0
  67. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -0
  68. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +94 -0
  69. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +19 -0
  70. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -0
  71. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +97 -0
  72. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +11 -0
  73. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -0
  74. package/dest/mem_pools/tx_pool_v2/eviction/index.js +12 -0
  75. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts +16 -0
  76. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts.map +1 -0
  77. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.js +62 -0
  78. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +180 -0
  79. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -0
  80. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.js +25 -0
  81. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts +15 -0
  82. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -0
  83. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +65 -0
  84. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts +17 -0
  85. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -0
  86. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +93 -0
  87. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +16 -0
  88. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -0
  89. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +78 -0
  90. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +20 -0
  91. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -0
  92. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +75 -0
  93. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +15 -0
  94. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -0
  95. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +19 -0
  96. package/dest/mem_pools/tx_pool_v2/index.d.ts +6 -0
  97. package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -0
  98. package/dest/mem_pools/tx_pool_v2/index.js +5 -0
  99. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts +15 -0
  100. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts.map +1 -0
  101. package/dest/mem_pools/tx_pool_v2/instrumentation.js +43 -0
  102. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +243 -0
  103. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -0
  104. package/dest/mem_pools/tx_pool_v2/interfaces.js +11 -0
  105. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +137 -0
  106. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -0
  107. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +223 -0
  108. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts +26 -0
  109. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts.map +1 -0
  110. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.js +70 -0
  111. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +122 -0
  112. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -0
  113. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +368 -0
  114. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +68 -0
  115. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -0
  116. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +178 -0
  117. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +91 -0
  118. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -0
  119. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +1013 -0
  120. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +15 -7
  121. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  122. package/dest/msg_validators/attestation_validator/attestation_validator.js +82 -26
  123. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +24 -0
  124. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -0
  125. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +75 -0
  126. package/dest/msg_validators/attestation_validator/index.d.ts +2 -1
  127. package/dest/msg_validators/attestation_validator/index.d.ts.map +1 -1
  128. package/dest/msg_validators/attestation_validator/index.js +1 -0
  129. package/dest/msg_validators/index.d.ts +2 -2
  130. package/dest/msg_validators/index.d.ts.map +1 -1
  131. package/dest/msg_validators/index.js +1 -1
  132. package/dest/msg_validators/msg_seen_validator/msg_seen_validator.d.ts +1 -1
  133. package/dest/msg_validators/msg_seen_validator/msg_seen_validator.d.ts.map +1 -1
  134. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +16 -0
  135. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -0
  136. package/dest/msg_validators/proposal_validator/block_proposal_validator.js +14 -0
  137. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +16 -0
  138. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -0
  139. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +26 -0
  140. package/dest/msg_validators/proposal_validator/index.d.ts +4 -0
  141. package/dest/msg_validators/proposal_validator/index.d.ts.map +1 -0
  142. package/dest/msg_validators/proposal_validator/index.js +3 -0
  143. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +40 -0
  144. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -0
  145. package/dest/msg_validators/proposal_validator/proposal_validator.js +186 -0
  146. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +4 -4
  147. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  148. package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +11 -18
  149. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +2 -1
  150. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -1
  151. package/dest/msg_validators/tx_validator/allowed_public_setup.js +25 -21
  152. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts +17 -0
  153. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts.map +1 -0
  154. package/dest/msg_validators/tx_validator/allowed_setup_helpers.js +24 -0
  155. package/dest/msg_validators/tx_validator/archive_cache.d.ts +3 -3
  156. package/dest/msg_validators/tx_validator/archive_cache.d.ts.map +1 -1
  157. package/dest/msg_validators/tx_validator/block_header_validator.d.ts +20 -6
  158. package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
  159. package/dest/msg_validators/tx_validator/block_header_validator.js +4 -3
  160. package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts +15 -0
  161. package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts.map +1 -0
  162. package/dest/msg_validators/tx_validator/cached_tx_validator.js +19 -0
  163. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts +9 -0
  164. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts.map +1 -0
  165. package/dest/msg_validators/tx_validator/contract_instance_validator.js +48 -0
  166. package/dest/msg_validators/tx_validator/data_validator.d.ts +4 -1
  167. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  168. package/dest/msg_validators/tx_validator/data_validator.js +40 -3
  169. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +15 -4
  170. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
  171. package/dest/msg_validators/tx_validator/double_spend_validator.js +7 -6
  172. package/dest/msg_validators/tx_validator/factory.d.ts +138 -6
  173. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  174. package/dest/msg_validators/tx_validator/factory.js +268 -58
  175. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +10 -0
  176. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -0
  177. package/dest/msg_validators/tx_validator/fee_payer_balance.js +24 -0
  178. package/dest/msg_validators/tx_validator/gas_validator.d.ts +105 -3
  179. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  180. package/dest/msg_validators/tx_validator/gas_validator.js +146 -67
  181. package/dest/msg_validators/tx_validator/index.d.ts +6 -1
  182. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  183. package/dest/msg_validators/tx_validator/index.js +5 -0
  184. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +4 -3
  185. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  186. package/dest/msg_validators/tx_validator/metadata_validator.js +6 -6
  187. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts +14 -0
  188. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts.map +1 -0
  189. package/dest/msg_validators/tx_validator/nullifier_cache.js +24 -0
  190. package/dest/msg_validators/tx_validator/phases_validator.d.ts +24 -3
  191. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
  192. package/dest/msg_validators/tx_validator/phases_validator.js +78 -28
  193. package/dest/msg_validators/tx_validator/size_validator.d.ts +8 -0
  194. package/dest/msg_validators/tx_validator/size_validator.d.ts.map +1 -0
  195. package/dest/msg_validators/tx_validator/size_validator.js +23 -0
  196. package/dest/msg_validators/tx_validator/test_utils.d.ts +2 -2
  197. package/dest/msg_validators/tx_validator/test_utils.d.ts.map +1 -1
  198. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +23 -5
  199. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
  200. package/dest/msg_validators/tx_validator/timestamp_validator.js +8 -8
  201. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts +3 -2
  202. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts.map +1 -1
  203. package/dest/msg_validators/tx_validator/tx_permitted_validator.js +2 -2
  204. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +4 -2
  205. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
  206. package/dest/msg_validators/tx_validator/tx_proof_validator.js +4 -2
  207. package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts +48 -0
  208. package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts.map +1 -0
  209. package/dest/msg_validators/tx_validator/tx_validation_cache.js +68 -0
  210. package/dest/services/data_store.d.ts +1 -1
  211. package/dest/services/data_store.d.ts.map +1 -1
  212. package/dest/services/data_store.js +14 -10
  213. package/dest/services/discv5/discV5_service.d.ts +13 -2
  214. package/dest/services/discv5/discV5_service.d.ts.map +1 -1
  215. package/dest/services/discv5/discV5_service.js +120 -24
  216. package/dest/services/discv5/persisted_enr_store.d.ts +38 -0
  217. package/dest/services/discv5/persisted_enr_store.d.ts.map +1 -0
  218. package/dest/services/discv5/persisted_enr_store.js +145 -0
  219. package/dest/services/dummy_service.d.ts +40 -16
  220. package/dest/services/dummy_service.d.ts.map +1 -1
  221. package/dest/services/dummy_service.js +61 -14
  222. package/dest/services/encoding.d.ts +24 -7
  223. package/dest/services/encoding.d.ts.map +1 -1
  224. package/dest/services/encoding.js +48 -30
  225. package/dest/services/gossipsub/index.d.ts +3 -0
  226. package/dest/services/gossipsub/index.d.ts.map +1 -0
  227. package/dest/services/gossipsub/index.js +2 -0
  228. package/dest/services/gossipsub/scoring.d.ts +21 -3
  229. package/dest/services/gossipsub/scoring.d.ts.map +1 -1
  230. package/dest/services/gossipsub/scoring.js +24 -7
  231. package/dest/services/gossipsub/topic_score_params.d.ts +167 -0
  232. package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -0
  233. package/dest/services/gossipsub/topic_score_params.js +336 -0
  234. package/dest/services/index.d.ts +2 -1
  235. package/dest/services/index.d.ts.map +1 -1
  236. package/dest/services/index.js +1 -0
  237. package/dest/services/libp2p/instrumentation.d.ts +5 -1
  238. package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
  239. package/dest/services/libp2p/instrumentation.js +49 -70
  240. package/dest/services/libp2p/libp2p_service.d.ts +127 -110
  241. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  242. package/dest/services/libp2p/libp2p_service.js +1385 -447
  243. package/dest/services/peer-manager/interface.d.ts +1 -1
  244. package/dest/services/peer-manager/metrics.d.ts +11 -2
  245. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  246. package/dest/services/peer-manager/metrics.js +45 -16
  247. package/dest/services/peer-manager/peer_manager.d.ts +21 -35
  248. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  249. package/dest/services/peer-manager/peer_manager.js +89 -38
  250. package/dest/services/peer-manager/peer_scoring.d.ts +39 -2
  251. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  252. package/dest/services/peer-manager/peer_scoring.js +168 -15
  253. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +44 -0
  254. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -0
  255. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +534 -0
  256. package/dest/services/reqresp/batch-tx-requester/config.d.ts +17 -0
  257. package/dest/services/reqresp/batch-tx-requester/config.d.ts.map +1 -0
  258. package/dest/services/reqresp/batch-tx-requester/config.js +27 -0
  259. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +50 -0
  260. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -0
  261. package/dest/services/reqresp/batch-tx-requester/interface.js +1 -0
  262. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +35 -0
  263. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -0
  264. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +136 -0
  265. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +62 -0
  266. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -0
  267. package/dest/services/reqresp/batch-tx-requester/peer_collection.js +176 -0
  268. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +11 -0
  269. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -0
  270. package/dest/services/reqresp/batch-tx-requester/tx_validator.js +7 -0
  271. package/dest/services/reqresp/config.d.ts +15 -3
  272. package/dest/services/reqresp/config.d.ts.map +1 -1
  273. package/dest/services/reqresp/config.js +11 -0
  274. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +2 -4
  275. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -1
  276. package/dest/services/reqresp/connection-sampler/connection_sampler.js +12 -0
  277. package/dest/services/reqresp/constants.d.ts +12 -0
  278. package/dest/services/reqresp/constants.d.ts.map +1 -0
  279. package/dest/services/reqresp/constants.js +7 -0
  280. package/dest/services/reqresp/index.d.ts +1 -1
  281. package/dest/services/reqresp/interface.d.ts +27 -18
  282. package/dest/services/reqresp/interface.d.ts.map +1 -1
  283. package/dest/services/reqresp/interface.js +23 -19
  284. package/dest/services/reqresp/metrics.d.ts +6 -5
  285. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  286. package/dest/services/reqresp/metrics.js +16 -21
  287. package/dest/services/reqresp/protocols/auth.d.ts +2 -2
  288. package/dest/services/reqresp/protocols/auth.d.ts.map +1 -1
  289. package/dest/services/reqresp/protocols/auth.js +2 -2
  290. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +8 -3
  291. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -1
  292. package/dest/services/reqresp/protocols/block_txs/bitvector.js +15 -2
  293. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +7 -5
  294. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
  295. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +35 -14
  296. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +37 -11
  297. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
  298. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +85 -21
  299. package/dest/services/reqresp/protocols/block_txs/index.d.ts +1 -1
  300. package/dest/services/reqresp/protocols/goodbye.d.ts +1 -1
  301. package/dest/services/reqresp/protocols/goodbye.d.ts.map +1 -1
  302. package/dest/services/reqresp/protocols/index.d.ts +1 -2
  303. package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
  304. package/dest/services/reqresp/protocols/index.js +0 -1
  305. package/dest/services/reqresp/protocols/ping.d.ts +1 -1
  306. package/dest/services/reqresp/protocols/status.d.ts +6 -5
  307. package/dest/services/reqresp/protocols/status.d.ts.map +1 -1
  308. package/dest/services/reqresp/protocols/status.js +7 -3
  309. package/dest/services/reqresp/protocols/tx.d.ts +8 -3
  310. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  311. package/dest/services/reqresp/protocols/tx.js +21 -3
  312. package/dest/services/reqresp/rate-limiter/index.d.ts +1 -1
  313. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +6 -5
  314. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
  315. package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -8
  316. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
  317. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
  318. package/dest/services/reqresp/rate-limiter/rate_limits.js +3 -13
  319. package/dest/services/reqresp/reqresp.d.ts +12 -69
  320. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  321. package/dest/services/reqresp/reqresp.js +480 -200
  322. package/dest/services/reqresp/status.d.ts +2 -2
  323. package/dest/services/reqresp/status.d.ts.map +1 -1
  324. package/dest/services/service.d.ts +78 -13
  325. package/dest/services/service.d.ts.map +1 -1
  326. package/dest/services/tx_collection/config.d.ts +11 -11
  327. package/dest/services/tx_collection/config.d.ts.map +1 -1
  328. package/dest/services/tx_collection/config.js +28 -27
  329. package/dest/services/tx_collection/file_store_tx_collection.d.ts +37 -0
  330. package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -0
  331. package/dest/services/tx_collection/file_store_tx_collection.js +127 -0
  332. package/dest/services/tx_collection/file_store_tx_source.d.ts +38 -0
  333. package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -0
  334. package/dest/services/tx_collection/file_store_tx_source.js +100 -0
  335. package/dest/services/tx_collection/index.d.ts +3 -2
  336. package/dest/services/tx_collection/index.d.ts.map +1 -1
  337. package/dest/services/tx_collection/index.js +1 -0
  338. package/dest/services/tx_collection/instrumentation.d.ts +1 -1
  339. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
  340. package/dest/services/tx_collection/instrumentation.js +9 -13
  341. package/dest/services/tx_collection/request_tracker.d.ts +53 -0
  342. package/dest/services/tx_collection/request_tracker.d.ts.map +1 -0
  343. package/dest/services/tx_collection/request_tracker.js +84 -0
  344. package/dest/services/tx_collection/tx_collection.d.ts +51 -57
  345. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  346. package/dest/services/tx_collection/tx_collection.js +298 -70
  347. package/dest/services/tx_collection/tx_collection_sink.d.ts +20 -10
  348. package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -1
  349. package/dest/services/tx_collection/tx_collection_sink.js +28 -31
  350. package/dest/services/tx_collection/tx_source.d.ts +13 -7
  351. package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
  352. package/dest/services/tx_collection/tx_source.js +29 -7
  353. package/dest/services/tx_file_store/config.d.ts +16 -0
  354. package/dest/services/tx_file_store/config.d.ts.map +1 -0
  355. package/dest/services/tx_file_store/config.js +22 -0
  356. package/dest/services/tx_file_store/index.d.ts +4 -0
  357. package/dest/services/tx_file_store/index.d.ts.map +1 -0
  358. package/dest/services/tx_file_store/index.js +3 -0
  359. package/dest/services/tx_file_store/instrumentation.d.ts +15 -0
  360. package/dest/services/tx_file_store/instrumentation.d.ts.map +1 -0
  361. package/dest/services/tx_file_store/instrumentation.js +29 -0
  362. package/dest/services/tx_file_store/tx_file_store.d.ts +46 -0
  363. package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -0
  364. package/dest/services/tx_file_store/tx_file_store.js +142 -0
  365. package/dest/services/tx_provider.d.ts +9 -5
  366. package/dest/services/tx_provider.d.ts.map +1 -1
  367. package/dest/services/tx_provider.js +23 -10
  368. package/dest/services/tx_provider_instrumentation.d.ts +5 -2
  369. package/dest/services/tx_provider_instrumentation.d.ts.map +1 -1
  370. package/dest/services/tx_provider_instrumentation.js +14 -14
  371. package/dest/test-helpers/generate-peer-id-private-keys.d.ts +1 -1
  372. package/dest/test-helpers/get-ports.d.ts +1 -1
  373. package/dest/test-helpers/get-ports.d.ts.map +1 -1
  374. package/dest/test-helpers/index.d.ts +3 -1
  375. package/dest/test-helpers/index.d.ts.map +1 -1
  376. package/dest/test-helpers/index.js +2 -0
  377. package/dest/test-helpers/make-enrs.d.ts +1 -1
  378. package/dest/test-helpers/make-test-p2p-clients.d.ts +7 -8
  379. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  380. package/dest/test-helpers/make-test-p2p-clients.js +5 -3
  381. package/dest/test-helpers/mock-pubsub.d.ts +48 -8
  382. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  383. package/dest/test-helpers/mock-pubsub.js +115 -14
  384. package/dest/test-helpers/mock-tx-helpers.d.ts +2 -2
  385. package/dest/test-helpers/mock-tx-helpers.d.ts.map +1 -1
  386. package/dest/test-helpers/mock-tx-helpers.js +1 -1
  387. package/dest/test-helpers/reqresp-nodes.d.ts +5 -7
  388. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  389. package/dest/test-helpers/reqresp-nodes.js +19 -20
  390. package/dest/test-helpers/test_tx_provider.d.ts +42 -0
  391. package/dest/test-helpers/test_tx_provider.d.ts.map +1 -0
  392. package/dest/test-helpers/test_tx_provider.js +44 -0
  393. package/dest/test-helpers/testbench-utils.d.ts +164 -0
  394. package/dest/test-helpers/testbench-utils.d.ts.map +1 -0
  395. package/dest/test-helpers/testbench-utils.js +400 -0
  396. package/dest/testbench/p2p_client_testbench_worker.d.ts +26 -2
  397. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  398. package/dest/testbench/p2p_client_testbench_worker.js +289 -128
  399. package/dest/testbench/parse_log_file.d.ts +1 -1
  400. package/dest/testbench/testbench.d.ts +1 -1
  401. package/dest/testbench/worker_client_manager.d.ts +57 -6
  402. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  403. package/dest/testbench/worker_client_manager.js +277 -44
  404. package/dest/types/index.d.ts +1 -1
  405. package/dest/util.d.ts +14 -8
  406. package/dest/util.d.ts.map +1 -1
  407. package/dest/util.js +41 -11
  408. package/dest/versioning.d.ts +3 -6
  409. package/dest/versioning.d.ts.map +1 -1
  410. package/dest/versioning.js +3 -24
  411. package/package.json +21 -20
  412. package/src/bootstrap/bootstrap.ts +24 -7
  413. package/src/client/factory.ts +141 -46
  414. package/src/client/interface.ts +114 -47
  415. package/src/client/p2p_client.ts +356 -424
  416. package/src/client/test/p2p_client.batch_tx_requester.bench.README.md +197 -0
  417. package/src/config.ts +316 -67
  418. package/src/errors/attestation-pool.error.ts +13 -0
  419. package/src/errors/p2p-service.error.ts +11 -0
  420. package/src/errors/reqresp.error.ts +13 -19
  421. package/src/errors/tx-pool.error.ts +12 -0
  422. package/src/index.ts +1 -1
  423. package/src/mem_pools/attestation_pool/attestation_pool.ts +598 -56
  424. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +796 -316
  425. package/src/mem_pools/attestation_pool/index.ts +9 -2
  426. package/src/mem_pools/attestation_pool/mocks.ts +29 -17
  427. package/src/mem_pools/index.ts +2 -2
  428. package/src/mem_pools/instrumentation.ts +58 -10
  429. package/src/mem_pools/interface.ts +5 -7
  430. package/src/mem_pools/tx_pool_v2/README.md +283 -0
  431. package/src/mem_pools/tx_pool_v2/archive/index.ts +1 -0
  432. package/src/mem_pools/tx_pool_v2/archive/tx_archive.ts +112 -0
  433. package/src/mem_pools/tx_pool_v2/deleted_pool.ts +321 -0
  434. package/src/mem_pools/tx_pool_v2/eviction/eviction_manager.ts +160 -0
  435. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +122 -0
  436. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +125 -0
  437. package/src/mem_pools/tx_pool_v2/eviction/index.ts +28 -0
  438. package/src/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.ts +65 -0
  439. package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +219 -0
  440. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +74 -0
  441. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +101 -0
  442. package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +91 -0
  443. package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +99 -0
  444. package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +32 -0
  445. package/src/mem_pools/tx_pool_v2/index.ts +12 -0
  446. package/src/mem_pools/tx_pool_v2/instrumentation.ts +69 -0
  447. package/src/mem_pools/tx_pool_v2/interfaces.ts +274 -0
  448. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +349 -0
  449. package/src/mem_pools/tx_pool_v2/tx_pool_bench_metrics.ts +77 -0
  450. package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +465 -0
  451. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +252 -0
  452. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +1215 -0
  453. package/src/msg_validators/attestation_validator/README.md +49 -0
  454. package/src/msg_validators/attestation_validator/attestation_validator.ts +78 -33
  455. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +102 -0
  456. package/src/msg_validators/attestation_validator/index.ts +1 -0
  457. package/src/msg_validators/index.ts +1 -1
  458. package/src/msg_validators/proposal_validator/README.md +123 -0
  459. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +32 -0
  460. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +49 -0
  461. package/src/msg_validators/proposal_validator/index.ts +3 -0
  462. package/src/msg_validators/proposal_validator/proposal_validator.ts +198 -0
  463. package/src/msg_validators/tx_validator/README.md +129 -0
  464. package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +8 -17
  465. package/src/msg_validators/tx_validator/allowed_public_setup.ts +22 -27
  466. package/src/msg_validators/tx_validator/allowed_setup_helpers.ts +31 -0
  467. package/src/msg_validators/tx_validator/archive_cache.ts +2 -2
  468. package/src/msg_validators/tx_validator/block_header_validator.ts +21 -8
  469. package/src/msg_validators/tx_validator/cached_tx_validator.ts +31 -0
  470. package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
  471. package/src/msg_validators/tx_validator/data_validator.ts +62 -7
  472. package/src/msg_validators/tx_validator/double_spend_validator.ts +15 -9
  473. package/src/msg_validators/tx_validator/factory.ts +433 -58
  474. package/src/msg_validators/tx_validator/fee_payer_balance.ts +44 -0
  475. package/src/msg_validators/tx_validator/gas_validator.ts +206 -76
  476. package/src/msg_validators/tx_validator/index.ts +5 -0
  477. package/src/msg_validators/tx_validator/metadata_validator.ts +31 -12
  478. package/src/msg_validators/tx_validator/nullifier_cache.ts +30 -0
  479. package/src/msg_validators/tx_validator/phases_validator.ts +90 -31
  480. package/src/msg_validators/tx_validator/size_validator.ts +22 -0
  481. package/src/msg_validators/tx_validator/test_utils.ts +1 -1
  482. package/src/msg_validators/tx_validator/timestamp_validator.ts +30 -19
  483. package/src/msg_validators/tx_validator/tx_permitted_validator.ts +8 -3
  484. package/src/msg_validators/tx_validator/tx_proof_validator.ts +10 -3
  485. package/src/msg_validators/tx_validator/tx_validation_cache.ts +101 -0
  486. package/src/services/data_store.ts +14 -19
  487. package/src/services/discv5/discV5_service.ts +127 -15
  488. package/src/services/discv5/persisted_enr_store.ts +158 -0
  489. package/src/services/dummy_service.ts +82 -38
  490. package/src/services/encoding.ts +46 -29
  491. package/src/services/gossipsub/README.md +663 -0
  492. package/src/services/gossipsub/index.ts +2 -0
  493. package/src/services/gossipsub/scoring.ts +29 -5
  494. package/src/services/gossipsub/topic_score_params.ts +478 -0
  495. package/src/services/index.ts +1 -0
  496. package/src/services/libp2p/instrumentation.ts +54 -72
  497. package/src/services/libp2p/libp2p_service.ts +1152 -497
  498. package/src/services/peer-manager/metrics.ts +51 -16
  499. package/src/services/peer-manager/peer_manager.ts +98 -29
  500. package/src/services/peer-manager/peer_scoring.ts +170 -9
  501. package/src/services/reqresp/README.md +194 -0
  502. package/src/services/reqresp/batch-tx-requester/README.md +344 -0
  503. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +660 -0
  504. package/src/services/reqresp/batch-tx-requester/config.ts +40 -0
  505. package/src/services/reqresp/batch-tx-requester/interface.ts +61 -0
  506. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +168 -0
  507. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +249 -0
  508. package/src/services/reqresp/batch-tx-requester/tx_validator.ts +24 -0
  509. package/src/services/reqresp/config.ts +19 -2
  510. package/src/services/reqresp/connection-sampler/connection_sampler.ts +19 -1
  511. package/src/services/reqresp/constants.ts +14 -0
  512. package/src/services/reqresp/interface.ts +48 -46
  513. package/src/services/reqresp/metrics.ts +35 -27
  514. package/src/services/reqresp/protocols/auth.ts +2 -2
  515. package/src/services/reqresp/protocols/block_txs/bitvector.ts +19 -2
  516. package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +44 -17
  517. package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +109 -17
  518. package/src/services/reqresp/protocols/index.ts +0 -1
  519. package/src/services/reqresp/protocols/status.ts +16 -12
  520. package/src/services/reqresp/protocols/tx.ts +24 -5
  521. package/src/services/reqresp/rate-limiter/rate_limiter.ts +13 -9
  522. package/src/services/reqresp/rate-limiter/rate_limits.ts +3 -13
  523. package/src/services/reqresp/reqresp.ts +107 -223
  524. package/src/services/service.ts +102 -31
  525. package/src/services/tx_collection/config.ts +42 -37
  526. package/src/services/tx_collection/file_store_tx_collection.ts +153 -0
  527. package/src/services/tx_collection/file_store_tx_source.ts +129 -0
  528. package/src/services/tx_collection/index.ts +2 -1
  529. package/src/services/tx_collection/instrumentation.ts +5 -13
  530. package/src/services/tx_collection/request_tracker.ts +127 -0
  531. package/src/services/tx_collection/tx_collection.ts +368 -115
  532. package/src/services/tx_collection/tx_collection_sink.ts +32 -36
  533. package/src/services/tx_collection/tx_source.ts +29 -8
  534. package/src/services/tx_file_store/config.ts +37 -0
  535. package/src/services/tx_file_store/index.ts +3 -0
  536. package/src/services/tx_file_store/instrumentation.ts +36 -0
  537. package/src/services/tx_file_store/tx_file_store.ts +163 -0
  538. package/src/services/tx_provider.ts +34 -12
  539. package/src/services/tx_provider_instrumentation.ts +24 -14
  540. package/src/test-helpers/index.ts +2 -0
  541. package/src/test-helpers/make-test-p2p-clients.ts +7 -6
  542. package/src/test-helpers/mock-pubsub.ts +138 -15
  543. package/src/test-helpers/mock-tx-helpers.ts +1 -1
  544. package/src/test-helpers/reqresp-nodes.ts +18 -30
  545. package/src/test-helpers/test_tx_provider.ts +69 -0
  546. package/src/test-helpers/testbench-utils.ts +465 -0
  547. package/src/testbench/p2p_client_testbench_worker.ts +406 -127
  548. package/src/testbench/worker_client_manager.ts +355 -46
  549. package/src/util.ts +47 -16
  550. package/src/versioning.ts +3 -33
  551. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +0 -30
  552. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +0 -1
  553. package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +0 -190
  554. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +0 -25
  555. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +0 -1
  556. package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +0 -197
  557. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +0 -150
  558. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +0 -1
  559. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +0 -617
  560. package/dest/mem_pools/tx_pool/index.d.ts +0 -4
  561. package/dest/mem_pools/tx_pool/index.d.ts.map +0 -1
  562. package/dest/mem_pools/tx_pool/index.js +0 -3
  563. package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts +0 -80
  564. package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts.map +0 -1
  565. package/dest/mem_pools/tx_pool/memory_tx_pool.js +0 -238
  566. package/dest/mem_pools/tx_pool/priority.d.ts +0 -8
  567. package/dest/mem_pools/tx_pool/priority.d.ts.map +0 -1
  568. package/dest/mem_pools/tx_pool/priority.js +0 -10
  569. package/dest/mem_pools/tx_pool/tx_pool.d.ts +0 -122
  570. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +0 -1
  571. package/dest/mem_pools/tx_pool/tx_pool.js +0 -3
  572. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +0 -7
  573. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +0 -1
  574. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +0 -394
  575. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts +0 -12
  576. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts.map +0 -1
  577. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.js +0 -70
  578. package/dest/msg_validators/block_proposal_validator/index.d.ts +0 -2
  579. package/dest/msg_validators/block_proposal_validator/index.d.ts.map +0 -1
  580. package/dest/msg_validators/block_proposal_validator/index.js +0 -1
  581. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +0 -45
  582. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +0 -1
  583. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +0 -92
  584. package/dest/services/reqresp/protocols/block.d.ts +0 -9
  585. package/dest/services/reqresp/protocols/block.d.ts.map +0 -1
  586. package/dest/services/reqresp/protocols/block.js +0 -31
  587. package/dest/services/tx_collection/fast_tx_collection.d.ts +0 -56
  588. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +0 -1
  589. package/dest/services/tx_collection/fast_tx_collection.js +0 -300
  590. package/dest/services/tx_collection/slow_tx_collection.d.ts +0 -54
  591. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +0 -1
  592. package/dest/services/tx_collection/slow_tx_collection.js +0 -176
  593. package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +0 -256
  594. package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +0 -253
  595. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -750
  596. package/src/mem_pools/tx_pool/index.ts +0 -3
  597. package/src/mem_pools/tx_pool/memory_tx_pool.ts +0 -283
  598. package/src/mem_pools/tx_pool/priority.ts +0 -13
  599. package/src/mem_pools/tx_pool/tx_pool.ts +0 -135
  600. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +0 -313
  601. package/src/msg_validators/block_proposal_validator/block_proposal_validator.ts +0 -81
  602. package/src/msg_validators/block_proposal_validator/index.ts +0 -1
  603. package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +0 -100
  604. package/src/services/reqresp/protocols/block.ts +0 -36
  605. package/src/services/tx_collection/fast_tx_collection.ts +0 -340
  606. package/src/services/tx_collection/slow_tx_collection.ts +0 -232
@@ -1,57 +1,61 @@
1
- import { INITIAL_L2_BLOCK_NUM } from '@aztec/constants';
1
+ import type { EpochCacheInterface } from '@aztec/epoch-cache';
2
+ import {
3
+ BlockNumber,
4
+ CheckpointNumber,
5
+ type CheckpointProposalHash,
6
+ SlotNumber,
7
+ } from '@aztec/foundation/branded-types';
2
8
  import { createLogger } from '@aztec/foundation/log';
3
9
  import { DateProvider } from '@aztec/foundation/timer';
4
- import type { AztecAsyncKVStore, AztecAsyncMap, AztecAsyncSingleton } from '@aztec/kv-store';
5
- import type {
6
- EthAddress,
7
- L2Block,
8
- L2BlockId,
9
- L2BlockSource,
10
- L2BlockStream,
11
- L2BlockStreamEvent,
12
- L2Tips,
13
- PublishedL2Block,
10
+ import type { AztecAsyncKVStore, AztecAsyncSingleton } from '@aztec/kv-store';
11
+ import { L2TipsKVStore } from '@aztec/kv-store/stores';
12
+ import {
13
+ type BlockData,
14
+ type BlockHash,
15
+ type CheckpointId,
16
+ type EthAddress,
17
+ EventDrivenL2BlockStream,
18
+ type L2Block,
19
+ type L2BlockId,
20
+ type L2BlockSource,
21
+ type L2BlockStreamEvent,
22
+ type L2TipsStore,
23
+ type LocalL2Tips,
14
24
  } from '@aztec/stdlib/block';
15
25
  import type { ContractDataSource } from '@aztec/stdlib/contract';
16
26
  import { getTimestampForSlot } from '@aztec/stdlib/epoch-helpers';
17
- import { type PeerInfo, tryStop } from '@aztec/stdlib/interfaces/server';
18
- import { BlockAttestation, type BlockProposal, type P2PClientType } from '@aztec/stdlib/p2p';
19
- import type { Tx, TxHash } from '@aztec/stdlib/tx';
20
- import {
21
- Attributes,
22
- type TelemetryClient,
23
- TraceableL2BlockStream,
24
- WithTracer,
25
- getTelemetryClient,
26
- trackSpan,
27
- } from '@aztec/telemetry-client';
27
+ import { type GetTxByHashOptions, type PeerInfo, tryStop } from '@aztec/stdlib/interfaces/server';
28
+ import { type BlockProposal, CheckpointAttestation, type CheckpointProposal, type TopicType } from '@aztec/stdlib/p2p';
29
+ import type { BlockHeader, Tx, TxHash } from '@aztec/stdlib/tx';
30
+ import { Attributes, type TelemetryClient, WithTracer, getTelemetryClient, trackSpan } from '@aztec/telemetry-client';
28
31
 
29
32
  import type { PeerId } from '@libp2p/interface';
30
33
  import type { ENR } from '@nethermindeth/enr';
31
34
 
32
35
  import { type P2PConfig, getP2PDefaultConfig } from '../config.js';
33
- import type { AttestationPool } from '../mem_pools/attestation_pool/attestation_pool.js';
36
+ import { TxPoolError } from '../errors/tx-pool.error.js';
37
+ import type { AttestationPoolApi, ProposalsForSlot } from '../mem_pools/attestation_pool/attestation_pool.js';
34
38
  import type { MemPools } from '../mem_pools/interface.js';
35
- import type { TxPool } from '../mem_pools/tx_pool/index.js';
39
+ import type { TxPoolV2 } from '../mem_pools/tx_pool_v2/interfaces.js';
36
40
  import type { AuthRequest, StatusMessage } from '../services/index.js';
37
- import {
38
- ReqRespSubProtocol,
39
- type ReqRespSubProtocolHandler,
40
- type ReqRespSubProtocolValidators,
41
- } from '../services/reqresp/interface.js';
42
- import { chunkTxHashesRequest } from '../services/reqresp/protocols/tx.js';
43
- import type { P2PBlockReceivedCallback, P2PService } from '../services/service.js';
41
+ import { ReqRespSubProtocol, type ReqRespSubProtocolHandler } from '../services/reqresp/interface.js';
42
+ import type {
43
+ DuplicateAttestationInfo,
44
+ DuplicateProposalInfo,
45
+ OversizedProposalInfo,
46
+ P2PBlockReceivedCallback,
47
+ P2PCheckpointReceivedCallback,
48
+ P2PService,
49
+ } from '../services/service.js';
44
50
  import { TxCollection } from '../services/tx_collection/tx_collection.js';
51
+ import type { TxFileStore } from '../services/tx_file_store/tx_file_store.js';
45
52
  import { TxProvider } from '../services/tx_provider.js';
46
53
  import { type P2P, P2PClientState, type P2PSyncState } from './interface.js';
47
54
 
48
55
  /**
49
56
  * The P2P client implementation.
50
57
  */
51
- export class P2PClient<T extends P2PClientType = P2PClientType.Full>
52
- extends WithTracer
53
- implements P2P, P2P<P2PClientType.Prover>
54
- {
58
+ export class P2PClient extends WithTracer implements P2P {
55
59
  /** The JS promise that will be running to keep the client's data in sync. Can be interrupted if the client is stopped. */
56
60
  private runningPromise!: Promise<void>;
57
61
 
@@ -62,48 +66,42 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
62
66
  private provenBlockNumberAtStart = -1;
63
67
  private finalizedBlockNumberAtStart = -1;
64
68
 
65
- private synchedBlockHashes: AztecAsyncMap<number, string>;
66
- private synchedLatestBlockNumber: AztecAsyncSingleton<number>;
67
- private synchedProvenBlockNumber: AztecAsyncSingleton<number>;
68
- private synchedFinalizedBlockNumber: AztecAsyncSingleton<number>;
69
+ private l2Tips: L2TipsStore;
69
70
  private synchedLatestSlot: AztecAsyncSingleton<bigint>;
70
71
 
71
- private txPool: TxPool;
72
- private attestationPool: T extends P2PClientType.Full ? AttestationPool : undefined;
72
+ private txPool: TxPoolV2;
73
+ private attestationPool: AttestationPoolApi;
73
74
 
74
75
  private config: P2PConfig;
75
76
 
76
- private blockStream: L2BlockStream | undefined;
77
+ private blockStream: EventDrivenL2BlockStream | undefined;
77
78
 
78
79
  private txProvider: TxProvider;
79
80
 
80
81
  private validatorAddresses: EthAddress[] = [];
81
82
 
82
- /**
83
- * In-memory P2P client constructor.
84
- * @param store - The client's instance of the KV store.
85
- * @param l2BlockSource - P2P client's source for fetching existing blocks.
86
- * @param txPool - The client's instance of a transaction pool. Defaults to in-memory implementation.
87
- * @param p2pService - The concrete instance of p2p networking to use.
88
- * @param log - A logger.
89
- */
83
+ /** Tracks the last slot for which we called prepareForSlot */
84
+ private lastSlotProcessed: SlotNumber = SlotNumber.ZERO;
85
+
90
86
  constructor(
91
- _clientType: T,
92
87
  private store: AztecAsyncKVStore,
93
88
  private l2BlockSource: L2BlockSource & ContractDataSource,
94
- mempools: MemPools<T>,
89
+ mempools: MemPools,
95
90
  private p2pService: P2PService,
96
91
  private txCollection: TxCollection,
92
+ private txFileStore: TxFileStore | undefined,
93
+ private epochCache: EpochCacheInterface,
97
94
  config: Partial<P2PConfig> = {},
98
95
  private _dateProvider: DateProvider = new DateProvider(),
99
96
  private telemetry: TelemetryClient = getTelemetryClient(),
100
97
  private log = createLogger('p2p'),
98
+ initialBlockHash: BlockHash,
101
99
  ) {
102
100
  super(telemetry, 'P2PClient');
103
101
 
104
102
  this.config = { ...getP2PDefaultConfig(), ...config };
105
103
  this.txPool = mempools.txPool;
106
- this.attestationPool = mempools.attestationPool!;
104
+ this.attestationPool = mempools.attestationPool;
107
105
 
108
106
  this.txProvider = new TxProvider(
109
107
  this.txCollection,
@@ -113,31 +111,7 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
113
111
  this.telemetry,
114
112
  );
115
113
 
116
- // Default to collecting all txs when we see a valid proposal
117
- // This can be overridden by the validator client to attest, and it will call getTxsForBlockProposal on its own
118
- // TODO(palla/txs): We should not trigger a request for txs on a proposal before fully validating it. We need to bring
119
- // validator-client code into here so we can validate a proposal is reasonable.
120
- this.registerBlockProposalHandler(async (block, sender) => {
121
- this.log.debug(`Received block proposal from ${sender.toString()}`);
122
- // TODO(palla/txs): Need to subtract validatorReexecuteDeadlineMs from this deadline (see ValidatorClient.getReexecutionDeadline)
123
- const constants = this.txCollection.getConstants();
124
- const nextSlotTimestampSeconds = Number(getTimestampForSlot(block.slotNumber.toBigInt() + 1n, constants));
125
- const deadline = new Date(nextSlotTimestampSeconds * 1000);
126
- const parentBlock = await this.l2BlockSource.getBlockHeaderByArchive(block.payload.header.lastArchiveRoot);
127
- if (!parentBlock) {
128
- this.log.debug(`Cannot collect txs for proposal as parent block not found`);
129
- return;
130
- }
131
- const blockNumber = parentBlock.getBlockNumber() + 1;
132
- await this.txProvider.getTxsForBlockProposal(block, blockNumber, { pinnedPeer: sender, deadline });
133
- return undefined;
134
- });
135
-
136
- // REFACTOR: Try replacing these with an L2TipsStore
137
- this.synchedBlockHashes = store.openMap('p2p_pool_block_hashes');
138
- this.synchedLatestBlockNumber = store.openSingleton('p2p_pool_last_l2_block');
139
- this.synchedProvenBlockNumber = store.openSingleton('p2p_pool_last_proven_l2_block');
140
- this.synchedFinalizedBlockNumber = store.openSingleton('p2p_pool_last_finalized_l2_block');
114
+ this.l2Tips = new L2TipsKVStore(store, 'p2p_client', initialBlockHash);
141
115
  this.synchedLatestSlot = store.openSingleton('p2p_pool_last_l2_slot');
142
116
  }
143
117
 
@@ -162,96 +136,63 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
162
136
  return Promise.resolve(this.p2pService.getPeers(includePending));
163
137
  }
164
138
 
165
- public getL2BlockHash(number: number): Promise<string | undefined> {
166
- return this.synchedBlockHashes.getAsync(number);
139
+ public getGossipMeshPeerCount(topicType: TopicType): Promise<number> {
140
+ return Promise.resolve(this.p2pService.getGossipMeshPeerCount(topicType));
167
141
  }
168
142
 
169
- public updateP2PConfig(config: Partial<P2PConfig>): Promise<void> {
170
- this.txPool.updateConfig(config);
171
- this.p2pService.updateConfig(config);
172
- return Promise.resolve();
143
+ public getL2BlockHash(number: BlockNumber): Promise<string | undefined> {
144
+ return this.l2Tips.getL2BlockHash(number);
173
145
  }
174
146
 
175
- public async getL2Tips(): Promise<L2Tips> {
176
- const latestBlockNumber = await this.getSyncedLatestBlockNum();
177
- let latestBlockHash: string | undefined;
178
-
179
- const provenBlockNumber = await this.getSyncedProvenBlockNum();
180
- let provenBlockHash: string | undefined;
181
-
182
- const finalizedBlockNumber = await this.getSyncedFinalizedBlockNum();
183
- let finalizedBlockHash: string | undefined;
184
-
185
- if (latestBlockNumber > 0) {
186
- latestBlockHash = await this.synchedBlockHashes.getAsync(latestBlockNumber);
187
- if (typeof latestBlockHash === 'undefined') {
188
- throw new Error(`Block hash for latest block ${latestBlockNumber} not found in p2p client`);
189
- }
190
- }
191
-
192
- if (provenBlockNumber > 0) {
193
- provenBlockHash = await this.synchedBlockHashes.getAsync(provenBlockNumber);
194
- if (typeof provenBlockHash === 'undefined') {
195
- throw new Error(`Block hash for proven block ${provenBlockNumber} not found in p2p client`);
196
- }
197
- }
198
-
199
- if (finalizedBlockNumber > 0) {
200
- finalizedBlockHash = await this.synchedBlockHashes.getAsync(finalizedBlockNumber);
201
- if (typeof finalizedBlockHash === 'undefined') {
202
- throw new Error(`Block hash for finalized block ${finalizedBlockNumber} not found in p2p client`);
203
- }
204
- }
147
+ public async updateP2PConfig(config: Partial<P2PConfig>): Promise<void> {
148
+ await this.txPool.updateConfig(config);
149
+ this.p2pService.updateConfig(config);
150
+ }
205
151
 
206
- return {
207
- latest: { hash: latestBlockHash!, number: latestBlockNumber },
208
- proven: { hash: provenBlockHash!, number: provenBlockNumber },
209
- finalized: { hash: finalizedBlockHash!, number: finalizedBlockNumber },
210
- };
152
+ public getL2Tips(): Promise<LocalL2Tips> {
153
+ return this.l2Tips.getL2Tips();
211
154
  }
212
155
 
213
156
  public async handleBlockStreamEvent(event: L2BlockStreamEvent): Promise<void> {
214
157
  this.log.debug(`Handling block stream event ${event.type}`);
158
+
215
159
  switch (event.type) {
216
160
  case 'blocks-added':
217
161
  await this.handleLatestL2Blocks(event.blocks);
218
162
  break;
219
163
  case 'chain-finalized': {
220
- // TODO (alexg): I think we can prune the block hashes map here
221
- await this.setBlockHash(event.block);
222
- const from = (await this.getSyncedFinalizedBlockNum()) + 1;
164
+ const oldFinalizedBlockNum = await this.getSyncedFinalizedBlockNum();
165
+ const from = BlockNumber(oldFinalizedBlockNum + 1);
223
166
  const limit = event.block.number - from + 1;
224
167
  if (limit > 0) {
225
- await this.handleFinalizedL2Blocks(await this.l2BlockSource.getBlocks(from, limit));
168
+ const oldBlocks = await this.l2BlockSource.getBlocksData({ from, limit });
169
+ await this.handleFinalizedL2Blocks(oldBlocks);
226
170
  }
227
171
  break;
228
172
  }
229
- case 'chain-proven': {
230
- await this.setBlockHash(event.block);
173
+ case 'chain-proven':
231
174
  this.txCollection.stopCollectingForBlocksUpTo(event.block.number);
232
- await this.synchedProvenBlockNumber.set(event.block.number);
233
175
  break;
234
- }
235
176
  case 'chain-pruned':
236
- await this.setBlockHash(event.block);
237
177
  this.txCollection.stopCollectingForBlocksAfter(event.block.number);
238
- await this.handlePruneL2Blocks(event.block.number);
178
+ await this.handlePruneL2Blocks(event.block, event.checkpointed.checkpoint);
179
+ break;
180
+ case 'chain-checkpointed':
181
+ break;
182
+ case 'chain-proposed':
239
183
  break;
240
184
  default: {
241
185
  const _: never = event;
242
186
  break;
243
187
  }
244
188
  }
245
- }
246
189
 
247
- private async setBlockHash(block: L2BlockId): Promise<void> {
248
- if (block.hash !== undefined) {
249
- await this.synchedBlockHashes.set(block.number, block.hash.toString());
250
- }
190
+ // Pass the event through to our l2 tips store
191
+ await this.l2Tips.handleBlockStreamEvent(event);
192
+ await this.startServiceIfSynched();
251
193
  }
252
194
 
253
195
  #assertIsReady() {
254
- // this.log.info('Checking if p2p client is ready, current state: ', this.currentState);
255
196
  if (!this.isReady()) {
256
197
  throw new Error('P2P client not ready');
257
198
  }
@@ -269,22 +210,22 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
269
210
  return this.syncPromise;
270
211
  }
271
212
 
213
+ // Start the tx pool first, as it needs to hydrate state from persistence
214
+ await this.txPool.start();
215
+
272
216
  // get the current latest block numbers
273
217
  const latestBlockNumbers = await this.l2BlockSource.getL2Tips();
274
- this.latestBlockNumberAtStart = latestBlockNumbers.latest.number;
275
- this.provenBlockNumberAtStart = latestBlockNumbers.proven.number;
276
- this.finalizedBlockNumberAtStart = latestBlockNumbers.finalized.number;
218
+ this.latestBlockNumberAtStart = latestBlockNumbers.proposed.number;
219
+ this.provenBlockNumberAtStart = latestBlockNumbers.proven.block.number;
220
+ this.finalizedBlockNumberAtStart = latestBlockNumbers.finalized.block.number;
277
221
 
278
222
  const syncedLatestBlock = (await this.getSyncedLatestBlockNum()) + 1;
279
223
  const syncedProvenBlock = (await this.getSyncedProvenBlockNum()) + 1;
280
224
  const syncedFinalizedBlock = (await this.getSyncedFinalizedBlockNum()) + 1;
281
225
 
282
- if (
283
- (await this.txPool.isEmpty()) &&
284
- (this.attestationPool === undefined || (await this.attestationPool?.isEmpty()))
285
- ) {
226
+ if ((await this.txPool.isEmpty()) && (await this.attestationPool.isEmpty())) {
286
227
  // if mempools are empty, we don't care about syncing prior blocks
287
- this.initBlockStream(this.latestBlockNumberAtStart);
228
+ this.initBlockStream(BlockNumber(this.latestBlockNumberAtStart));
288
229
  this.setCurrentState(P2PClientState.RUNNING);
289
230
  this.syncPromise = Promise.resolve();
290
231
  await this.p2pService.start();
@@ -319,28 +260,27 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
319
260
  });
320
261
  }
321
262
 
322
- this.blockStream!.start();
323
- await this.txCollection.start();
263
+ // Should never happen: all branches above call initBlockStream()
264
+ if (!this.blockStream) {
265
+ throw new Error('Block stream not initialized');
266
+ }
267
+ this.blockStream.start();
268
+ this.txFileStore?.start();
269
+
324
270
  return this.syncPromise;
325
271
  }
326
272
 
327
- addReqRespSubProtocol(
328
- subProtocol: ReqRespSubProtocol,
329
- handler: ReqRespSubProtocolHandler,
330
- validator: ReqRespSubProtocolValidators[ReqRespSubProtocol],
331
- ): Promise<void> {
332
- return this.p2pService.addReqRespSubProtocol(subProtocol, handler, validator);
273
+ addReqRespSubProtocol(subProtocol: ReqRespSubProtocol, handler: ReqRespSubProtocolHandler): Promise<void> {
274
+ return this.p2pService.addReqRespSubProtocol(subProtocol, handler);
333
275
  }
334
276
 
335
- private initBlockStream(startingBlock?: number) {
277
+ private initBlockStream(startingBlock?: BlockNumber) {
336
278
  if (!this.blockStream) {
337
279
  const { blockRequestBatchSize: batchSize, blockCheckIntervalMS: pollIntervalMS } = this.config;
338
- this.blockStream = new TraceableL2BlockStream(
280
+ this.blockStream = new EventDrivenL2BlockStream(
339
281
  this.l2BlockSource,
340
282
  this,
341
283
  this,
342
- this.telemetry.getTracer('P2PL2BlockStream'),
343
- 'P2PL2BlockStream',
344
284
  createLogger(`${this.log.module}:l2-block-stream`),
345
285
  { batchSize, pollIntervalMS, startingBlock },
346
286
  );
@@ -355,10 +295,14 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
355
295
  this.log.debug('Stopping p2p client...');
356
296
  await tryStop(this.txCollection);
357
297
  this.log.debug('Stopped tx collection service');
298
+ await this.txFileStore?.stop();
299
+ this.log.debug('Stopped tx file store');
358
300
  await this.p2pService.stop();
359
301
  this.log.debug('Stopped p2p service');
360
302
  await this.blockStream?.stop();
361
303
  this.log.debug('Stopped block downloader');
304
+ await this.txPool.stop();
305
+ this.log.debug('Stopped tx pool');
362
306
  await this.runningPromise;
363
307
  this.setCurrentState(P2PClientState.STOPPED);
364
308
  this.log.info('P2P client stopped');
@@ -367,33 +311,92 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
367
311
  /** Triggers a sync to the archiver. Used for testing. */
368
312
  public async sync() {
369
313
  this.initBlockStream();
370
- await this.blockStream!.sync();
314
+ // Should never happen: initBlockStream() creates blockStream if absent
315
+ if (!this.blockStream) {
316
+ throw new Error('Block stream not initialized');
317
+ }
318
+ await this.blockStream.sync();
371
319
  }
372
320
 
373
321
  @trackSpan('p2pClient.broadcastProposal', async proposal => ({
374
- [Attributes.SLOT_NUMBER]: proposal.slotNumber.toNumber(),
322
+ [Attributes.SLOT_NUMBER]: proposal.slotNumber,
375
323
  [Attributes.BLOCK_ARCHIVE]: proposal.archive.toString(),
376
- [Attributes.P2P_ID]: (await proposal.p2pMessageIdentifier()).toString(),
324
+ [Attributes.P2P_ID]: (await proposal.p2pMessageLoggingIdentifier()).toString(),
377
325
  }))
378
- public broadcastProposal(proposal: BlockProposal): Promise<void> {
379
- this.log.verbose(`Broadcasting proposal for slot ${proposal.slotNumber.toNumber()} to peers`);
326
+ public async broadcastProposal(proposal: BlockProposal): Promise<void> {
327
+ this.log.verbose(`Broadcasting proposal for slot ${proposal.slotNumber} to peers`);
328
+ // Store our own proposal so we can respond to req/resp requests for it
329
+ const { count } = await this.attestationPool.tryAddBlockProposal(proposal);
330
+ if (count > 1) {
331
+ if (this.config.broadcastEquivocatedProposals) {
332
+ this.log.warn(`Broadcasting equivocated block proposal for slot ${proposal.slotNumber}`, {
333
+ slot: proposal.slotNumber,
334
+ archive: proposal.archive.toString(),
335
+ count,
336
+ });
337
+ } else {
338
+ throw new Error(`Attempted to broadcast a duplicate block proposal for slot ${proposal.slotNumber}`);
339
+ }
340
+ }
380
341
  return this.p2pService.propagate(proposal);
381
342
  }
382
343
 
383
- public async getAttestationsForSlot(slot: bigint, proposalId?: string): Promise<BlockAttestation[]> {
384
- return (
385
- (await (proposalId
386
- ? this.attestationPool?.getAttestationsForSlotAndProposal(slot, proposalId)
387
- : this.attestationPool?.getAttestationsForSlot(slot))) ?? []
388
- );
344
+ @trackSpan('p2pClient.broadcastCheckpointProposal', async proposal => ({
345
+ [Attributes.SLOT_NUMBER]: proposal.slotNumber,
346
+ [Attributes.BLOCK_ARCHIVE]: proposal.archive.toString(),
347
+ [Attributes.P2P_ID]: (await proposal.p2pMessageLoggingIdentifier()).toString(),
348
+ }))
349
+ public async broadcastCheckpointProposal(proposal: CheckpointProposal): Promise<void> {
350
+ this.log.verbose(`Broadcasting checkpoint proposal for slot ${proposal.slotNumber} to peers`);
351
+ const blockProposal = proposal.getBlockProposal();
352
+ if (blockProposal) {
353
+ // Store our own last-block proposal so we can respond to req/resp requests for it.
354
+ await this.attestationPool.tryAddBlockProposal(blockProposal);
355
+ }
356
+ const checkpointCore = proposal.toCore();
357
+ const { count } = await this.attestationPool.tryAddCheckpointProposal(checkpointCore);
358
+ if (count > 1) {
359
+ if (this.config.broadcastEquivocatedProposals) {
360
+ this.log.warn(`Broadcasting equivocated checkpoint proposal for slot ${proposal.slotNumber}`, {
361
+ slot: proposal.slotNumber,
362
+ archive: proposal.archive.toString(),
363
+ count,
364
+ });
365
+ } else {
366
+ throw new Error(`Attempted to broadcast a duplicate checkpoint proposal for slot ${proposal.slotNumber}`);
367
+ }
368
+ }
369
+ return this.p2pService.propagate(proposal);
370
+ }
371
+
372
+ public async broadcastCheckpointAttestations(attestations: CheckpointAttestation[]): Promise<void> {
373
+ this.log.verbose(`Broadcasting ${attestations.length} checkpoint attestations to peers`);
374
+ await Promise.all(attestations.map(att => this.p2pService.propagate(att)));
375
+ }
376
+
377
+ public async getCheckpointAttestationsForSlot(
378
+ slot: SlotNumber,
379
+ proposalPayloadHash?: CheckpointProposalHash,
380
+ ): Promise<CheckpointAttestation[]> {
381
+ return await (proposalPayloadHash
382
+ ? this.attestationPool.getCheckpointAttestationsForSlotAndProposal(slot, proposalPayloadHash)
383
+ : this.attestationPool.getCheckpointAttestationsForSlot(slot));
384
+ }
385
+
386
+ public addOwnCheckpointAttestations(attestations: CheckpointAttestation[]): Promise<void> {
387
+ return this.attestationPool.addOwnCheckpointAttestations(attestations);
388
+ }
389
+
390
+ public getProposalsForSlot(slot: SlotNumber): Promise<ProposalsForSlot> {
391
+ return this.attestationPool.getProposalsForSlot(slot);
389
392
  }
390
393
 
391
- public addAttestations(attestations: BlockAttestation[]): Promise<void> {
392
- return this.attestationPool?.addAttestations(attestations) ?? Promise.resolve();
394
+ public hasBlockProposalsForSlot(slot: SlotNumber): Promise<boolean> {
395
+ return this.attestationPool.hasBlockProposalsForSlot(slot);
393
396
  }
394
397
 
395
- public deleteAttestation(attestation: BlockAttestation): Promise<void> {
396
- return this.attestationPool?.deleteAttestations([attestation]) ?? Promise.resolve();
398
+ public hasCheckpointProposalForSlot(slot: SlotNumber): Promise<boolean> {
399
+ return this.attestationPool.hasCheckpointProposalForSlot(slot);
397
400
  }
398
401
 
399
402
  // REVIEW: https://github.com/AztecProtocol/aztec-packages/issues/7963
@@ -402,176 +405,105 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
402
405
  this.p2pService.registerBlockReceivedCallback(handler);
403
406
  }
404
407
 
405
- /**
406
- * Uses the batched Request Response protocol to request a set of transactions from the network.
407
- */
408
- public async requestTxsByHash(txHashes: TxHash[], pinnedPeerId: PeerId | undefined): Promise<Tx[]> {
409
- const timeoutMs = 8000; // Longer timeout for now
410
- const maxRetryAttempts = 10; // Keep retrying within the timeout
411
- const requests = chunkTxHashesRequest(txHashes);
412
- const maxPeers = Math.min(Math.ceil(requests.length / 3), 10);
413
-
414
- const txBatches = await this.p2pService.sendBatchRequest(
415
- ReqRespSubProtocol.TX,
416
- requests,
417
- pinnedPeerId,
418
- timeoutMs,
419
- maxPeers,
420
- maxRetryAttempts,
421
- );
422
-
423
- const txs = txBatches.flat();
424
- if (txs.length > 0) {
425
- await this.txPool.addTxs(txs);
426
- }
408
+ public registerValidatorCheckpointProposalHandler(handler: P2PCheckpointReceivedCallback): void {
409
+ this.p2pService.registerValidatorCheckpointReceivedCallback(handler);
410
+ }
427
411
 
428
- const txHashesStr = txHashes.map(tx => tx.toString()).join(', ');
429
- this.log.debug(`Requested txs ${txHashesStr} (${txs.length} / ${txHashes.length}) from peers`);
412
+ public registerAllNodesCheckpointProposalHandler(handler: P2PCheckpointReceivedCallback): void {
413
+ this.p2pService.registerAllNodesCheckpointReceivedCallback(handler);
414
+ }
430
415
 
431
- // We return all transactions, even the not found ones to the caller, such they can handle missing items themselves.
432
- return txs;
416
+ public registerDuplicateProposalCallback(callback: (info: DuplicateProposalInfo) => void): void {
417
+ this.p2pService.registerDuplicateProposalCallback(callback);
433
418
  }
434
419
 
435
- public getPendingTxs(limit?: number, after?: TxHash): Promise<Tx[]> {
436
- return this.getTxs('pending', limit, after);
420
+ public registerOversizedProposalCallback(callback: (info: OversizedProposalInfo) => void): void {
421
+ this.p2pService.registerOversizedProposalCallback(callback);
437
422
  }
438
423
 
439
- public getPendingTxCount(): Promise<number> {
440
- return this.txPool.getPendingTxCount();
424
+ public registerDuplicateAttestationCallback(callback: (info: DuplicateAttestationInfo) => void): void {
425
+ this.p2pService.registerDuplicateAttestationCallback(callback);
441
426
  }
442
427
 
443
- public async *iteratePendingTxs(): AsyncIterableIterator<Tx> {
444
- for (const txHash of await this.txPool.getPendingTxHashes()) {
445
- const tx = await this.txPool.getTxByHash(txHash);
446
- if (tx) {
447
- yield tx;
448
- }
449
- }
428
+ public registerCheckpointAttestationCallback(callback: (attestation: CheckpointAttestation) => void): void {
429
+ this.p2pService.registerCheckpointAttestationCallback(callback);
450
430
  }
451
431
 
452
- /**
453
- * Returns all transactions in the transaction pool.
454
- * @param filter - The type of txs to return
455
- * @param limit - How many txs to return
456
- * @param after - If paginating, the last known tx hash. Will return txs after this hash
457
- * @returns An array of Txs.
458
- */
459
- public async getTxs(filter: 'all' | 'pending' | 'mined', limit?: number, after?: TxHash): Promise<Tx[]> {
432
+ public async getPendingTxs(limit?: number, after?: TxHash, options?: GetTxByHashOptions): Promise<Tx[]> {
460
433
  if (limit !== undefined && limit <= 0) {
461
434
  throw new TypeError('limit must be greater than 0');
462
435
  }
463
436
 
464
- let txs: Tx[] | undefined = undefined;
465
- let txHashes: TxHash[];
466
-
467
- if (filter === 'all') {
468
- txs = await this.txPool.getAllTxs();
469
- txHashes = await Promise.all(txs.map(tx => tx.getTxHash()));
470
- } else if (filter === 'mined') {
471
- const minedTxHashes = await this.txPool.getMinedTxHashes();
472
- txHashes = minedTxHashes.map(([txHash]) => txHash);
473
- } else if (filter === 'pending') {
474
- txHashes = await this.txPool.getPendingTxHashes();
475
- } else {
476
- const _: never = filter;
477
- throw new Error(`Unknown filter ${filter}`);
478
- }
437
+ let txHashes = await this.txPool.getPendingTxHashes();
479
438
 
480
439
  let startIndex = 0;
481
- let endIndex: number | undefined = undefined;
482
-
483
440
  if (after) {
484
441
  startIndex = txHashes.findIndex(txHash => after.equals(txHash));
485
-
486
- // if we can't find the last tx in our set then return an empty array as pagination is no longer valid.
487
442
  if (startIndex === -1) {
488
443
  return [];
489
444
  }
490
-
491
- // increment by one because we don't want to return the same tx again
492
445
  startIndex++;
493
446
  }
494
447
 
495
- if (limit !== undefined) {
496
- endIndex = startIndex + limit;
497
- }
498
-
448
+ const endIndex = limit !== undefined ? startIndex + limit : undefined;
499
449
  txHashes = txHashes.slice(startIndex, endIndex);
500
- if (txs) {
501
- txs = txs.slice(startIndex, endIndex);
502
- } else {
503
- const maybeTxs = await Promise.all(txHashes.map(txHash => this.txPool.getTxByHash(txHash)));
504
- txs = maybeTxs.filter((tx): tx is Tx => !!tx);
450
+
451
+ // This is a public-facing API (exposed via both the node and the p2p RPC), so proofs are opt-in.
452
+ const includeProof = !!options?.includeProof;
453
+ const maybeTxs = await Promise.all(txHashes.map(txHash => this.txPool.getTxByHash(txHash, { includeProof })));
454
+ return maybeTxs.filter((tx): tx is Tx => !!tx);
455
+ }
456
+
457
+ public getPendingTxCount(): Promise<number> {
458
+ return this.txPool.getPendingTxCount();
459
+ }
460
+
461
+ public hasEligiblePendingTxs(minCount: number): Promise<boolean> {
462
+ return this.txPool.hasEligiblePendingTxs(minCount);
463
+ }
464
+
465
+ public async *iteratePendingTxs(opts?: { includeProof?: boolean }): AsyncIterableIterator<Tx> {
466
+ for (const txHash of await this.txPool.getPendingTxHashes()) {
467
+ const tx = await this.txPool.getTxByHash(txHash, opts);
468
+ if (tx) {
469
+ yield tx;
470
+ }
505
471
  }
472
+ }
506
473
 
507
- return txs;
474
+ public async *iterateEligiblePendingTxs(opts?: { includeProof?: boolean }): AsyncIterableIterator<Tx> {
475
+ for (const txHash of await this.txPool.getEligiblePendingTxHashes()) {
476
+ const tx = await this.txPool.getTxByHash(txHash, opts);
477
+ if (tx) {
478
+ yield tx;
479
+ }
480
+ }
508
481
  }
509
482
 
510
483
  /**
511
484
  * Returns a transaction in the transaction pool by its hash.
512
485
  * @param txHash - Hash of the transaction to look for in the pool.
486
+ * @param opts - Set `includeProof: false` to skip loading the tx proof from the DB.
513
487
  * @returns A single tx or undefined.
514
488
  */
515
- getTxByHashFromPool(txHash: TxHash): Promise<Tx | undefined> {
516
- return this.txPool.getTxByHash(txHash);
489
+ getTxByHashFromPool(txHash: TxHash, opts?: { includeProof?: boolean }): Promise<Tx | undefined> {
490
+ return this.txPool.getTxByHash(txHash, opts);
517
491
  }
518
492
 
519
493
  /**
520
494
  * Returns transactions in the transaction pool by hash.
521
495
  * @param txHashes - Hashes of the transactions to look for.
496
+ * @param opts - Set `includeProof: false` to skip loading tx proofs from the DB.
522
497
  * @returns The txs found, in the same order as the requested hashes. If a tx is not found, it will be undefined.
523
498
  */
524
- getTxsByHashFromPool(txHashes: TxHash[]): Promise<(Tx | undefined)[]> {
525
- return this.txPool.getTxsByHash(txHashes);
499
+ getTxsByHashFromPool(txHashes: TxHash[], opts?: { includeProof?: boolean }): Promise<(Tx | undefined)[]> {
500
+ return this.txPool.getTxsByHash(txHashes, opts);
526
501
  }
527
502
 
528
503
  hasTxsInPool(txHashes: TxHash[]): Promise<boolean[]> {
529
504
  return this.txPool.hasTxs(txHashes);
530
505
  }
531
506
 
532
- /**
533
- * Returns transactions in the transaction pool by hash.
534
- * If a transaction is not in the pool, it will be requested from the network.
535
- * @param txHashes - Hashes of the transactions to look for.
536
- * @returns The txs found, or undefined if not found in the order requested.
537
- */
538
- async getTxsByHash(txHashes: TxHash[], pinnedPeerId: PeerId | undefined): Promise<(Tx | undefined)[]> {
539
- const txs = await Promise.all(txHashes.map(txHash => this.txPool.getTxByHash(txHash)));
540
- const missingTxHashes = txs
541
- .map((tx, index) => [tx, index] as const)
542
- .filter(([tx, _index]) => !tx)
543
- .map(([_tx, index]) => txHashes[index]);
544
-
545
- if (missingTxHashes.length === 0) {
546
- return txs as Tx[];
547
- }
548
-
549
- const missingTxs = await this.requestTxsByHash(missingTxHashes, pinnedPeerId);
550
- // TODO: optimize
551
- // Merge the found txs in order
552
- const mergingTxs = txHashes.map(txHash => {
553
- // Is it in the txs list from the mempool?
554
- for (const tx of txs) {
555
- if (tx !== undefined && tx.getTxHash().equals(txHash)) {
556
- return tx;
557
- }
558
- }
559
-
560
- // Is it in the fetched missing txs?
561
- // Note: this is an O(n^2) operation, but we expect the number of missing txs to be small.
562
- for (const tx of missingTxs) {
563
- if (tx.getTxHash().equals(txHash)) {
564
- return tx;
565
- }
566
- }
567
-
568
- // Otherwise return undefined
569
- return undefined;
570
- });
571
-
572
- return mergingTxs;
573
- }
574
-
575
507
  /**
576
508
  * Returns an archived transaction in the transaction pool by its hash.
577
509
  * @param txHash - Hash of the archived transaction to look for.
@@ -582,25 +514,28 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
582
514
  }
583
515
 
584
516
  /**
585
- * Verifies the 'tx' and, if valid, adds it to local tx pool and forwards it to other peers.
586
- * @param tx - The tx to verify.
517
+ * Accepts a transaction, adds it to local tx pool and forwards it to other peers.
518
+ * @param tx - The tx to send.
587
519
  * @returns Empty promise.
588
520
  **/
589
521
  public async sendTx(tx: Tx): Promise<void> {
590
- const addedCount = await this.addTxsToPool([tx]);
591
- const txAddedSuccessfully = addedCount === 1;
592
- if (txAddedSuccessfully) {
522
+ this.#assertIsReady();
523
+ const result = await this.txPool.addPendingTxs([tx], { feeComparisonOnly: true });
524
+ if (result.accepted.length === 1) {
593
525
  await this.p2pService.propagate(tx);
526
+ return;
594
527
  }
595
- }
596
528
 
597
- /**
598
- * Adds transactions to the pool. Does not send to peers or validate the txs.
599
- * @param txs - The transactions.
600
- **/
601
- public async addTxsToPool(txs: Tx[]): Promise<number> {
602
- this.#assertIsReady();
603
- return await this.txPool.addTxs(txs);
529
+ const txHashStr = tx.getTxHash().toString();
530
+ const reason = result.errors?.get(txHashStr);
531
+ if (reason) {
532
+ this.log.warn(`Tx ${txHashStr} not added to pool: ${reason.message}`);
533
+ throw new TxPoolError(reason);
534
+ }
535
+
536
+ this.log.warn(
537
+ `Tx ${txHashStr} not propagated: accepted=${result.accepted.length} ignored=${result.ignored.length} rejected=${result.rejected.length}`,
538
+ );
604
539
  }
605
540
 
606
541
  /**
@@ -608,8 +543,9 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
608
543
  * @param txHash - Hash of the tx to query.
609
544
  * @returns Pending or mined depending on its status, or undefined if not found.
610
545
  */
611
- public getTxStatus(txHash: TxHash): Promise<'pending' | 'mined' | 'deleted' | undefined> {
612
- return this.txPool.getTxStatus(txHash);
546
+ public async getTxStatus(txHash: TxHash): Promise<'pending' | 'mined' | 'deleted' | undefined> {
547
+ const status = await this.txPool.getTxStatus(txHash);
548
+ return status === 'protected' ? 'pending' : status;
613
549
  }
614
550
 
615
551
  public getEnr(): ENR | undefined {
@@ -621,14 +557,12 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
621
557
  }
622
558
 
623
559
  /**
624
- * Deletes the 'txs' from the pool.
625
- * NOT used if we use sendTx as reconcileTxPool will handle this.
626
- * @param txHashes - Hashes of the transactions to delete.
627
- * @returns Empty promise.
560
+ * Handles failed transaction execution by removing txs from the pool.
561
+ * @param txHashes - Hashes of the transactions that failed execution.
628
562
  **/
629
- public async deleteTxs(txHashes: TxHash[]): Promise<void> {
563
+ public async handleFailedExecution(txHashes: TxHash[]): Promise<void> {
630
564
  this.#assertIsReady();
631
- await this.txPool.deleteTxs(txHashes);
565
+ await this.txPool.handleFailedExecution(txHashes);
632
566
  }
633
567
 
634
568
  /**
@@ -643,20 +577,23 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
643
577
  * Public function to check the latest block number that the P2P client is synced to.
644
578
  * @returns Block number of latest L2 Block we've synced with.
645
579
  */
646
- public async getSyncedLatestBlockNum(): Promise<number> {
647
- return (await this.synchedLatestBlockNumber.getAsync()) ?? INITIAL_L2_BLOCK_NUM - 1;
580
+ public async getSyncedLatestBlockNum(): Promise<BlockNumber> {
581
+ const tips = await this.l2Tips.getL2Tips();
582
+ return tips.proposed.number;
648
583
  }
649
584
 
650
585
  /**
651
586
  * Public function to check the latest proven block number that the P2P client is synced to.
652
587
  * @returns Block number of latest proven L2 Block we've synced with.
653
588
  */
654
- public async getSyncedProvenBlockNum(): Promise<number> {
655
- return (await this.synchedProvenBlockNumber.getAsync()) ?? INITIAL_L2_BLOCK_NUM - 1;
589
+ public async getSyncedProvenBlockNum(): Promise<BlockNumber> {
590
+ const tips = await this.l2Tips.getL2Tips();
591
+ return tips.proven.block.number;
656
592
  }
657
593
 
658
- public async getSyncedFinalizedBlockNum(): Promise<number> {
659
- return (await this.synchedFinalizedBlockNumber.getAsync()) ?? INITIAL_L2_BLOCK_NUM - 1;
594
+ public async getSyncedFinalizedBlockNum(): Promise<BlockNumber> {
595
+ const tips = await this.l2Tips.getL2Tips();
596
+ return tips.finalized.block.number;
660
597
  }
661
598
 
662
599
  /** Returns latest L2 slot for which we have seen an L2 block. */
@@ -670,29 +607,25 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
670
607
  */
671
608
  public async getStatus(): Promise<P2PSyncState> {
672
609
  const blockNumber = await this.getSyncedLatestBlockNum();
673
- const blockHash =
674
- blockNumber === 0
675
- ? ''
676
- : await this.l2BlockSource
677
- .getBlockHeader(blockNumber)
678
- .then(header => header?.hash())
679
- .then(hash => hash?.toString());
610
+ const blockHash = await this.l2BlockSource
611
+ .getBlockData({ number: blockNumber })
612
+ .then(data => data?.header.hash())
613
+ .then(hash => hash?.toString());
680
614
 
681
615
  return {
682
616
  state: this.currentState,
683
- syncedToL2Block: { number: blockNumber, hash: blockHash },
684
- } as P2PSyncState;
617
+ syncedToL2Block: { number: blockNumber, hash: blockHash! },
618
+ };
685
619
  }
686
620
 
687
621
  /**
688
- * Mark all txs from these blocks as mined.
622
+ * Handles mined blocks by marking the txs in them as mined.
689
623
  * @param blocks - A list of existing blocks with txs that the P2P client needs to ensure the tx pool is reconciled with.
690
624
  * @returns Empty promise.
691
625
  */
692
- private async markTxsAsMinedFromBlocks(blocks: L2Block[]): Promise<void> {
626
+ private async handleMinedBlocks(blocks: L2Block[]): Promise<void> {
693
627
  for (const block of blocks) {
694
- const txHashes = block.body.txEffects.map(txEffect => txEffect.txHash);
695
- await this.txPool.markAsMined(txHashes, block.getBlockHeader());
628
+ await this.txPool.handleMinedBlock(block);
696
629
  }
697
630
  }
698
631
 
@@ -701,33 +634,25 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
701
634
  * @param blocks - A list of existing blocks with txs that the P2P client needs to ensure the tx pool is reconciled with.
702
635
  * @returns Empty promise.
703
636
  */
704
- private async handleLatestL2Blocks(blocks: PublishedL2Block[]): Promise<void> {
637
+ private async handleLatestL2Blocks(blocks: L2Block[]): Promise<void> {
705
638
  if (!blocks.length) {
706
- return Promise.resolve();
639
+ return;
707
640
  }
708
641
 
709
- await this.markTxsAsMinedFromBlocks(blocks.map(b => b.block));
710
- await this.startCollectingMissingTxs(blocks.map(b => b.block));
711
-
712
- const lastBlock = blocks.at(-1)!.block;
713
-
714
- await Promise.all(
715
- blocks.map(async block =>
716
- this.setBlockHash({
717
- number: block.block.number,
718
- hash: await block.block.hash().then(h => h.toString()),
719
- }),
720
- ),
721
- );
642
+ const lastBlock = blocks.at(-1)!;
643
+ const lastSlot = lastBlock.header.getSlot();
722
644
 
723
- await this.synchedLatestBlockNumber.set(lastBlock.number);
724
- await this.synchedLatestSlot.set(lastBlock.header.getSlot());
725
- this.log.verbose(`Synched to latest block ${lastBlock.number}`);
726
- await this.startServiceIfSynched();
645
+ // Mark txs mined before releasing protections: a block landing at this slot supersedes any
646
+ // protection for txs it includes, so mined-marking must run first to keep just-landed txs from
647
+ // being unprotected into pending where they could be evicted before they are recorded as mined.
648
+ await this.handleMinedBlocks(blocks);
649
+ await this.maybeCallPrepareForSlot(lastSlot);
650
+ await this.collectingMissingTxs(blocks);
651
+ await this.synchedLatestSlot.set(BigInt(lastSlot));
727
652
  }
728
653
 
729
- /** Request txs for unproven blocks so the prover node has more chances to get them. */
730
- private async startCollectingMissingTxs(blocks: L2Block[]): Promise<void> {
654
+ /** Request txs for unproven blocks so the prover node can prove. */
655
+ private async collectingMissingTxs(blocks: L2Block[]): Promise<void> {
731
656
  try {
732
657
  // TODO(#15435): If the archiver has lagged behind L1, the reported proven block number may
733
658
  // be much lower than the actual one, and it does not update until the pending chain is
@@ -735,7 +660,7 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
735
660
  // are already proven, but the archiver has not yet updated its state. Until this is properly
736
661
  // fixed, it is mitigated by the expiration date of collection requests, which depends on
737
662
  // the slot number of the block.
738
- const provenBlockNumber = await this.l2BlockSource.getProvenBlockNumber();
663
+ const provenBlockNumber = (await this.l2BlockSource.getBlockNumber({ tag: 'proven' })) ?? BlockNumber.ZERO;
739
664
  const unprovenBlocks = blocks.filter(block => block.number > provenBlockNumber);
740
665
  for (const block of unprovenBlocks) {
741
666
  const txHashes = block.body.txEffects.map(txEffect => txEffect.txHash);
@@ -747,7 +672,17 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
747
672
  `Starting collection of ${missingTxHashes.length} missing txs for unproven mined block ${block.number}`,
748
673
  { missingTxHashes, blockNumber: block.number, blockHash: await block.hash().then(h => h.toString()) },
749
674
  );
750
- this.txCollection.startCollecting(block, missingTxHashes);
675
+ // Both `slashDataWithholdingToleranceSlots` and `p2pMissingTxCollectionDeadlineSlots`
676
+ // count *full slots after the block slot* — value N means collection runs until
677
+ // `slotStart(block.slot + N + 1)`. Take the larger of the two so collection never
678
+ // gives up before the data-withholding slash verdict is rendered.
679
+ const blockSlot = block.header.getSlot();
680
+ const toleranceSlots = this.config.slashDataWithholdingToleranceSlots;
681
+ const configuredSlots = this.config.p2pMissingTxCollectionDeadlineSlots ?? 0;
682
+ const deadlineSlot = SlotNumber(blockSlot + Math.max(toleranceSlots, configuredSlots) + 1);
683
+ const deadlineSeconds = getTimestampForSlot(deadlineSlot, this.epochCache.getL1Constants());
684
+ const deadline = new Date(Number(deadlineSeconds) * 1000);
685
+ await this.txCollection.collectFastForBlock(block, missingTxHashes, { deadline });
751
686
  }
752
687
  }
753
688
  } catch (err) {
@@ -760,86 +695,71 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
760
695
  * @param blocks - A list of finalized L2 blocks.
761
696
  * @returns Empty promise.
762
697
  */
763
- private async handleFinalizedL2Blocks(blocks: L2Block[]): Promise<void> {
698
+ private async handleFinalizedL2Blocks(blocks: BlockData[]): Promise<void> {
764
699
  if (!blocks.length) {
765
- return Promise.resolve();
700
+ return;
766
701
  }
767
- this.log.debug(`Handling finalized blocks ${blocks.length} up to ${blocks.at(-1)?.number}`);
768
-
769
- const lastBlockNum = blocks[blocks.length - 1].number;
770
- const lastBlockSlot = blocks[blocks.length - 1].header.getSlot();
771
-
772
- const txHashes = blocks.flatMap(block => block.body.txEffects.map(txEffect => txEffect.txHash));
773
- this.log.debug(`Deleting ${txHashes.length} txs from pool from finalized blocks up to ${lastBlockNum}`);
774
- await this.txPool.deleteTxs(txHashes, { permanently: true });
775
- await this.txPool.cleanupDeletedMinedTxs(lastBlockNum);
776
702
 
777
- await this.attestationPool?.deleteAttestationsOlderThan(lastBlockSlot);
778
-
779
- await this.synchedFinalizedBlockNumber.set(lastBlockNum);
780
- this.log.debug(`Synched to finalized block ${lastBlockNum} at slot ${lastBlockSlot}`);
781
-
782
- await this.startServiceIfSynched();
703
+ // Finalization is monotonic, so we only need to call with the last block
704
+ const lastBlock = blocks.at(-1)!;
705
+ await this.txPool.handleFinalizedBlock(lastBlock.header);
706
+ await this.attestationPool.deleteOlderThan(lastBlock.header.getSlot());
783
707
  }
784
708
 
785
709
  /**
786
710
  * Updates the tx pool after a chain prune.
787
- * @param latestBlock - The block number the chain was pruned to.
711
+ * Detects epoch prunes (checkpoint number changed) and deletes all txs in that case.
712
+ * @param latestBlock - The block ID the chain was pruned to.
713
+ * @param newCheckpoint - The checkpoint ID after the prune.
788
714
  */
789
- private async handlePruneL2Blocks(latestBlock: number): Promise<void> {
790
- const txsToDelete = new Map<string, TxHash>();
791
- const minedTxs = await this.txPool.getMinedTxHashes();
792
-
793
- // Find transactions that reference pruned blocks in their historical header
794
- for (const tx of await this.txPool.getAllTxs()) {
795
- // every tx that's been generated against a block that has now been pruned is no longer valid
796
- if (tx.data.constants.anchorBlockHeader.globalVariables.blockNumber > latestBlock) {
797
- const txHash = tx.getTxHash();
798
- txsToDelete.set(txHash.toString(), txHash);
799
- }
800
- }
715
+ private async handlePruneL2Blocks(latestBlock: L2BlockId, newCheckpoint: CheckpointId): Promise<void> {
716
+ const deleteAllTxs = this.config.txPoolDeleteTxsAfterReorg && (await this.isEpochPrune(newCheckpoint));
717
+ await this.txPool.handlePrunedBlocks(latestBlock, { deleteAllTxs });
718
+ }
801
719
 
802
- this.log.info(`Detected chain prune. Removing ${txsToDelete.size} txs built against pruned blocks.`, {
803
- newLatestBlock: latestBlock,
804
- previousLatestBlock: await this.getSyncedLatestBlockNum(),
805
- txsToDelete: Array.from(txsToDelete.keys()),
806
- });
807
-
808
- // delete invalid txs (both pending and mined)
809
- await this.txPool.deleteTxs(Array.from(txsToDelete.values()));
810
-
811
- // everything left in the mined set was built against a block on the proven chain so its still valid
812
- // move back to pending the txs that were reorged out of the chain, unless txPoolDeleteTxsAfterReorg is set,
813
- // in which case we clean them up to avoid potential reorg loops
814
- // NOTE: we can't move _all_ txs back to pending because the tx pool could keep hold of mined txs for longer
815
- // (see this.keepProvenTxsFor)
816
- const minedTxsFromReorg: TxHash[] = [];
817
- for (const [txHash, blockNumber] of minedTxs) {
818
- // We keep the txsToDelete out of this list as they have already been deleted above
819
- if (blockNumber > latestBlock && !txsToDelete.has(txHash.toString())) {
820
- minedTxsFromReorg.push(txHash);
821
- }
720
+ /**
721
+ * Returns true if the prune is an epoch prune (new checkpoint number is less than old).
722
+ * If the checkpoint number stays the same or increases, the prune is within a checkpoint.
723
+ */
724
+ private async isEpochPrune(newCheckpoint: CheckpointId): Promise<boolean> {
725
+ const tips = await this.l2Tips.getL2Tips();
726
+ const oldCheckpointNumber = tips.checkpointed.checkpoint.number;
727
+ if (oldCheckpointNumber <= CheckpointNumber.INITIAL) {
728
+ return false;
822
729
  }
823
-
824
- if (this.config.txPoolDeleteTxsAfterReorg) {
825
- this.log.info(`Deleting ${minedTxsFromReorg.length} mined txs from reorg`);
826
- await this.txPool.deleteTxs(minedTxsFromReorg);
827
- } else {
828
- this.log.info(`Moving ${minedTxsFromReorg.length} mined txs from reorg back to pending`);
829
- await this.txPool.markMinedAsPending(minedTxsFromReorg);
730
+ const newCheckpointNumber = newCheckpoint.number;
731
+ // We check that the new checkpoint number is less than the old checkpoint number in order to consider it an epoch prune.
732
+ // To be more certain that it is an epoch prune, we will check that at least 2 checkpoints were removed.
733
+ // This means we should avoid thinking checkpoints removed by L1 re-orgs are epoch prunes
734
+ const thresholdForEpochPrune = CheckpointNumber(oldCheckpointNumber - 2);
735
+ const isEpochPrune = newCheckpointNumber <= thresholdForEpochPrune;
736
+ if (isEpochPrune) {
737
+ this.log.info(`Detected epoch prune to ${newCheckpointNumber}`, {
738
+ oldCheckpointNumber,
739
+ newCheckpointNumber,
740
+ thresholdForEpochPrune,
741
+ });
830
742
  }
743
+ return isEpochPrune;
744
+ }
831
745
 
832
- await this.synchedLatestBlockNumber.set(latestBlock);
833
- // no need to update block hashes, as they will be updated as new blocks are added
746
+ /** Calls prepareForSlot for the given slot if it advances past the last slot we prepared for. */
747
+ private async maybeCallPrepareForSlot(slot: SlotNumber): Promise<void> {
748
+ if (slot <= this.lastSlotProcessed) {
749
+ return;
750
+ }
751
+ this.lastSlotProcessed = slot;
752
+ await this.txPool.prepareForSlot(slot);
834
753
  }
835
754
 
836
755
  private async startServiceIfSynched() {
837
756
  if (this.currentState !== P2PClientState.SYNCHING) {
838
757
  return;
839
758
  }
840
- const syncedFinalizedBlock = await this.getSyncedFinalizedBlockNum();
841
- const syncedProvenBlock = await this.getSyncedProvenBlockNum();
842
- const syncedLatestBlock = await this.getSyncedLatestBlockNum();
759
+ const tips = await this.l2Tips.getL2Tips();
760
+ const syncedFinalizedBlock = tips.finalized.block.number;
761
+ const syncedProvenBlock = tips.proven.block.number;
762
+ const syncedLatestBlock = tips.proposed.number;
843
763
 
844
764
  if (
845
765
  syncedLatestBlock >= this.latestBlockNumberAtStart &&
@@ -869,16 +789,28 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
869
789
  this.log.debug(`Moved from state ${P2PClientState[oldState]} to ${P2PClientState[this.currentState]}`);
870
790
  }
871
791
 
872
- public validate(txs: Tx[]): Promise<void> {
873
- return this.p2pService.validate(txs);
792
+ public validateTxsReceivedInBlockProposal(txs: Tx[]): Promise<void> {
793
+ return this.p2pService.validateTxsReceivedInBlockProposal(txs);
794
+ }
795
+
796
+ /**
797
+ * Protects existing transactions by hash for a given slot.
798
+ * Returns hashes of transactions that weren't found in the pool.
799
+ * @param txHashes - Hashes of the transactions to protect.
800
+ * @param blockHeader - The block header providing slot context.
801
+ * @returns Hashes of transactions not found in the pool.
802
+ */
803
+ public protectTxs(txHashes: TxHash[], blockHeader: BlockHeader): Promise<TxHash[]> {
804
+ return this.txPool.protectTxs(txHashes, blockHeader);
874
805
  }
875
806
 
876
807
  /**
877
- * Marks transactions as non-evictable in the pool.
878
- * @param txHashes - Hashes of the transactions to mark as non-evictable.
808
+ * Prepares the pool for a new slot.
809
+ * Unprotects transactions from earlier slots and validates them.
810
+ * @param slotNumber - The slot number to prepare for
879
811
  */
880
- public markTxsAsNonEvictable(txHashes: TxHash[]): Promise<void> {
881
- return this.txPool.markTxsAsNonEvictable(txHashes);
812
+ public async prepareForSlot(slotNumber: SlotNumber): Promise<void> {
813
+ await this.txPool.prepareForSlot(slotNumber);
882
814
  }
883
815
 
884
816
  public handleAuthRequestFromPeer(authRequest: AuthRequest, peerId: PeerId): Promise<StatusMessage> {