@aztec/p2p 0.0.0-test.0 → 0.0.1-commit.001888fc

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