@aztec/p2p 0.0.0-test.1 → 0.0.1-commit.017a351

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