@aztec/p2p 0.0.1-commit.1bea0213 → 0.0.1-commit.21ecf947b

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 (415) hide show
  1. package/dest/bootstrap/bootstrap.d.ts +4 -3
  2. package/dest/bootstrap/bootstrap.d.ts.map +1 -1
  3. package/dest/bootstrap/bootstrap.js +4 -4
  4. package/dest/client/factory.d.ts +5 -5
  5. package/dest/client/factory.d.ts.map +1 -1
  6. package/dest/client/factory.js +50 -13
  7. package/dest/client/interface.d.ts +37 -15
  8. package/dest/client/interface.d.ts.map +1 -1
  9. package/dest/client/p2p_client.d.ts +37 -36
  10. package/dest/client/p2p_client.d.ts.map +1 -1
  11. package/dest/client/p2p_client.js +125 -138
  12. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts +2 -0
  13. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts.map +1 -0
  14. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +305 -0
  15. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts +73 -0
  16. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts.map +1 -0
  17. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.js +8 -0
  18. package/dest/config.d.ts +33 -3
  19. package/dest/config.d.ts.map +1 -1
  20. package/dest/config.js +21 -2
  21. package/dest/index.d.ts +2 -1
  22. package/dest/index.d.ts.map +1 -1
  23. package/dest/index.js +1 -0
  24. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +104 -88
  25. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  26. package/dest/mem_pools/attestation_pool/attestation_pool.js +441 -3
  27. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +2 -2
  28. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
  29. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +353 -87
  30. package/dest/mem_pools/attestation_pool/index.d.ts +2 -3
  31. package/dest/mem_pools/attestation_pool/index.d.ts.map +1 -1
  32. package/dest/mem_pools/attestation_pool/index.js +1 -2
  33. package/dest/mem_pools/attestation_pool/mocks.d.ts +2 -2
  34. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  35. package/dest/mem_pools/attestation_pool/mocks.js +2 -2
  36. package/dest/mem_pools/index.d.ts +3 -2
  37. package/dest/mem_pools/index.d.ts.map +1 -1
  38. package/dest/mem_pools/index.js +1 -1
  39. package/dest/mem_pools/instrumentation.d.ts +1 -1
  40. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  41. package/dest/mem_pools/instrumentation.js +2 -2
  42. package/dest/mem_pools/interface.d.ts +5 -5
  43. package/dest/mem_pools/interface.d.ts.map +1 -1
  44. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +3 -3
  45. package/dest/mem_pools/tx_pool_v2/archive/index.d.ts +2 -0
  46. package/dest/mem_pools/tx_pool_v2/archive/index.d.ts.map +1 -0
  47. package/dest/mem_pools/tx_pool_v2/archive/index.js +1 -0
  48. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts +43 -0
  49. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts.map +1 -0
  50. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.js +103 -0
  51. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +102 -0
  52. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -0
  53. package/dest/mem_pools/tx_pool_v2/deleted_pool.js +242 -0
  54. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts +47 -0
  55. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts.map +1 -0
  56. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.js +119 -0
  57. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +17 -0
  58. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -0
  59. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +93 -0
  60. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +19 -0
  61. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -0
  62. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +89 -0
  63. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +10 -0
  64. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -0
  65. package/dest/mem_pools/tx_pool_v2/eviction/index.js +11 -0
  66. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +131 -0
  67. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -0
  68. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.js +17 -0
  69. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts +15 -0
  70. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -0
  71. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +65 -0
  72. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts +17 -0
  73. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -0
  74. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +93 -0
  75. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +16 -0
  76. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -0
  77. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +72 -0
  78. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +20 -0
  79. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -0
  80. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +63 -0
  81. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +15 -0
  82. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -0
  83. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +19 -0
  84. package/dest/mem_pools/tx_pool_v2/index.d.ts +6 -0
  85. package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -0
  86. package/dest/mem_pools/tx_pool_v2/index.js +5 -0
  87. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +201 -0
  88. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -0
  89. package/dest/mem_pools/tx_pool_v2/interfaces.js +7 -0
  90. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +95 -0
  91. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -0
  92. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +128 -0
  93. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts +26 -0
  94. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts.map +1 -0
  95. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.js +70 -0
  96. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +105 -0
  97. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -0
  98. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +345 -0
  99. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +57 -0
  100. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -0
  101. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +160 -0
  102. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +71 -0
  103. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -0
  104. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +780 -0
  105. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +3 -3
  106. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
  107. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +7 -2
  108. package/dest/msg_validators/proposal_validator/proposal_validator.js +5 -5
  109. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +3 -3
  110. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  111. package/dest/msg_validators/tx_validator/archive_cache.d.ts +3 -3
  112. package/dest/msg_validators/tx_validator/archive_cache.d.ts.map +1 -1
  113. package/dest/msg_validators/tx_validator/archive_cache.js +1 -1
  114. package/dest/msg_validators/tx_validator/block_header_validator.d.ts +20 -6
  115. package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
  116. package/dest/msg_validators/tx_validator/block_header_validator.js +5 -4
  117. package/dest/msg_validators/tx_validator/data_validator.d.ts +3 -1
  118. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  119. package/dest/msg_validators/tx_validator/data_validator.js +4 -1
  120. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +15 -4
  121. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
  122. package/dest/msg_validators/tx_validator/double_spend_validator.js +7 -6
  123. package/dest/msg_validators/tx_validator/factory.d.ts +8 -3
  124. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  125. package/dest/msg_validators/tx_validator/factory.js +21 -11
  126. package/dest/msg_validators/tx_validator/gas_validator.d.ts +3 -2
  127. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  128. package/dest/msg_validators/tx_validator/gas_validator.js +3 -2
  129. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +3 -2
  130. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  131. package/dest/msg_validators/tx_validator/metadata_validator.js +2 -2
  132. package/dest/msg_validators/tx_validator/phases_validator.d.ts +3 -2
  133. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
  134. package/dest/msg_validators/tx_validator/phases_validator.js +3 -3
  135. package/dest/msg_validators/tx_validator/size_validator.d.ts +3 -1
  136. package/dest/msg_validators/tx_validator/size_validator.d.ts.map +1 -1
  137. package/dest/msg_validators/tx_validator/size_validator.js +4 -1
  138. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +22 -5
  139. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
  140. package/dest/msg_validators/tx_validator/timestamp_validator.js +8 -8
  141. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts +3 -2
  142. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts.map +1 -1
  143. package/dest/msg_validators/tx_validator/tx_permitted_validator.js +2 -2
  144. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +3 -2
  145. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
  146. package/dest/msg_validators/tx_validator/tx_proof_validator.js +2 -2
  147. package/dest/services/data_store.d.ts +1 -1
  148. package/dest/services/data_store.d.ts.map +1 -1
  149. package/dest/services/data_store.js +10 -6
  150. package/dest/services/discv5/discV5_service.js +1 -1
  151. package/dest/services/dummy_service.d.ts +22 -2
  152. package/dest/services/dummy_service.d.ts.map +1 -1
  153. package/dest/services/dummy_service.js +45 -0
  154. package/dest/services/encoding.d.ts +2 -2
  155. package/dest/services/encoding.d.ts.map +1 -1
  156. package/dest/services/encoding.js +2 -2
  157. package/dest/services/gossipsub/index.d.ts +3 -0
  158. package/dest/services/gossipsub/index.d.ts.map +1 -0
  159. package/dest/services/gossipsub/index.js +2 -0
  160. package/dest/services/gossipsub/scoring.d.ts +21 -3
  161. package/dest/services/gossipsub/scoring.d.ts.map +1 -1
  162. package/dest/services/gossipsub/scoring.js +24 -7
  163. package/dest/services/gossipsub/topic_score_params.d.ts +161 -0
  164. package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -0
  165. package/dest/services/gossipsub/topic_score_params.js +324 -0
  166. package/dest/services/index.d.ts +2 -1
  167. package/dest/services/index.d.ts.map +1 -1
  168. package/dest/services/index.js +1 -0
  169. package/dest/services/libp2p/instrumentation.d.ts +1 -1
  170. package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
  171. package/dest/services/libp2p/instrumentation.js +14 -3
  172. package/dest/services/libp2p/libp2p_service.d.ts +90 -35
  173. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  174. package/dest/services/libp2p/libp2p_service.js +405 -301
  175. package/dest/services/peer-manager/metrics.d.ts +2 -2
  176. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  177. package/dest/services/peer-manager/metrics.js +20 -5
  178. package/dest/services/peer-manager/peer_scoring.d.ts +1 -1
  179. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  180. package/dest/services/peer-manager/peer_scoring.js +33 -4
  181. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +47 -0
  182. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -0
  183. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +566 -0
  184. package/dest/services/reqresp/batch-tx-requester/config.d.ts +17 -0
  185. package/dest/services/reqresp/batch-tx-requester/config.d.ts.map +1 -0
  186. package/dest/services/reqresp/batch-tx-requester/config.js +27 -0
  187. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +50 -0
  188. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -0
  189. package/dest/services/reqresp/batch-tx-requester/interface.js +1 -0
  190. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +37 -0
  191. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -0
  192. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +151 -0
  193. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +54 -0
  194. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -0
  195. package/dest/services/reqresp/batch-tx-requester/peer_collection.js +139 -0
  196. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +20 -0
  197. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -0
  198. package/dest/services/reqresp/batch-tx-requester/tx_validator.js +21 -0
  199. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +22 -3
  200. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +1 -1
  201. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +63 -4
  202. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +2 -1
  203. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -1
  204. package/dest/services/reqresp/connection-sampler/connection_sampler.js +12 -0
  205. package/dest/services/reqresp/interface.d.ts +12 -1
  206. package/dest/services/reqresp/interface.d.ts.map +1 -1
  207. package/dest/services/reqresp/interface.js +15 -1
  208. package/dest/services/reqresp/metrics.d.ts +6 -5
  209. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  210. package/dest/services/reqresp/metrics.js +17 -5
  211. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +5 -1
  212. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -1
  213. package/dest/services/reqresp/protocols/block_txs/bitvector.js +5 -0
  214. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +7 -5
  215. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
  216. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +27 -9
  217. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +29 -6
  218. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
  219. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +59 -13
  220. package/dest/services/reqresp/protocols/tx.d.ts +7 -1
  221. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  222. package/dest/services/reqresp/protocols/tx.js +20 -0
  223. package/dest/services/reqresp/reqresp.d.ts +6 -1
  224. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  225. package/dest/services/reqresp/reqresp.js +69 -26
  226. package/dest/services/service.d.ts +38 -1
  227. package/dest/services/service.d.ts.map +1 -1
  228. package/dest/services/tx_collection/config.d.ts +22 -1
  229. package/dest/services/tx_collection/config.d.ts.map +1 -1
  230. package/dest/services/tx_collection/config.js +55 -1
  231. package/dest/services/tx_collection/fast_tx_collection.d.ts +7 -4
  232. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
  233. package/dest/services/tx_collection/fast_tx_collection.js +34 -13
  234. package/dest/services/tx_collection/file_store_tx_collection.d.ts +53 -0
  235. package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -0
  236. package/dest/services/tx_collection/file_store_tx_collection.js +165 -0
  237. package/dest/services/tx_collection/file_store_tx_source.d.ts +28 -0
  238. package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -0
  239. package/dest/services/tx_collection/file_store_tx_source.js +59 -0
  240. package/dest/services/tx_collection/index.d.ts +3 -1
  241. package/dest/services/tx_collection/index.d.ts.map +1 -1
  242. package/dest/services/tx_collection/index.js +2 -0
  243. package/dest/services/tx_collection/instrumentation.d.ts +1 -1
  244. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
  245. package/dest/services/tx_collection/instrumentation.js +9 -2
  246. package/dest/services/tx_collection/proposal_tx_collector.d.ts +48 -0
  247. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -0
  248. package/dest/services/tx_collection/proposal_tx_collector.js +49 -0
  249. package/dest/services/tx_collection/slow_tx_collection.d.ts +6 -2
  250. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -1
  251. package/dest/services/tx_collection/slow_tx_collection.js +55 -23
  252. package/dest/services/tx_collection/tx_collection.d.ts +21 -9
  253. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  254. package/dest/services/tx_collection/tx_collection.js +79 -7
  255. package/dest/services/tx_collection/tx_collection_sink.d.ts +15 -6
  256. package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -1
  257. package/dest/services/tx_collection/tx_collection_sink.js +13 -7
  258. package/dest/services/tx_file_store/config.d.ts +16 -0
  259. package/dest/services/tx_file_store/config.d.ts.map +1 -0
  260. package/dest/services/tx_file_store/config.js +22 -0
  261. package/dest/services/tx_file_store/index.d.ts +4 -0
  262. package/dest/services/tx_file_store/index.d.ts.map +1 -0
  263. package/dest/services/tx_file_store/index.js +3 -0
  264. package/dest/services/tx_file_store/instrumentation.d.ts +15 -0
  265. package/dest/services/tx_file_store/instrumentation.d.ts.map +1 -0
  266. package/dest/services/tx_file_store/instrumentation.js +29 -0
  267. package/dest/services/tx_file_store/tx_file_store.d.ts +48 -0
  268. package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -0
  269. package/dest/services/tx_file_store/tx_file_store.js +152 -0
  270. package/dest/services/tx_provider.d.ts +3 -3
  271. package/dest/services/tx_provider.d.ts.map +1 -1
  272. package/dest/services/tx_provider.js +5 -4
  273. package/dest/services/tx_provider_instrumentation.d.ts +1 -1
  274. package/dest/services/tx_provider_instrumentation.d.ts.map +1 -1
  275. package/dest/services/tx_provider_instrumentation.js +5 -5
  276. package/dest/test-helpers/index.d.ts +3 -1
  277. package/dest/test-helpers/index.d.ts.map +1 -1
  278. package/dest/test-helpers/index.js +2 -0
  279. package/dest/test-helpers/make-test-p2p-clients.d.ts +3 -3
  280. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  281. package/dest/test-helpers/mock-pubsub.d.ts +27 -1
  282. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  283. package/dest/test-helpers/mock-pubsub.js +97 -2
  284. package/dest/test-helpers/reqresp-nodes.d.ts +1 -1
  285. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  286. package/dest/test-helpers/reqresp-nodes.js +2 -1
  287. package/dest/test-helpers/test_tx_provider.d.ts +40 -0
  288. package/dest/test-helpers/test_tx_provider.d.ts.map +1 -0
  289. package/dest/test-helpers/test_tx_provider.js +41 -0
  290. package/dest/test-helpers/testbench-utils.d.ts +160 -0
  291. package/dest/test-helpers/testbench-utils.d.ts.map +1 -0
  292. package/dest/test-helpers/testbench-utils.js +366 -0
  293. package/dest/testbench/p2p_client_testbench_worker.d.ts +28 -2
  294. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  295. package/dest/testbench/p2p_client_testbench_worker.js +213 -132
  296. package/dest/testbench/worker_client_manager.d.ts +51 -6
  297. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  298. package/dest/testbench/worker_client_manager.js +226 -44
  299. package/package.json +14 -14
  300. package/src/bootstrap/bootstrap.ts +7 -4
  301. package/src/client/factory.ts +90 -22
  302. package/src/client/interface.ts +45 -14
  303. package/src/client/p2p_client.ts +163 -161
  304. package/src/client/test/tx_proposal_collector/README.md +227 -0
  305. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +336 -0
  306. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.ts +43 -0
  307. package/src/config.ts +46 -2
  308. package/src/index.ts +1 -0
  309. package/src/mem_pools/attestation_pool/attestation_pool.ts +496 -91
  310. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +442 -102
  311. package/src/mem_pools/attestation_pool/index.ts +9 -2
  312. package/src/mem_pools/attestation_pool/mocks.ts +2 -1
  313. package/src/mem_pools/index.ts +4 -1
  314. package/src/mem_pools/instrumentation.ts +2 -1
  315. package/src/mem_pools/interface.ts +4 -4
  316. package/src/mem_pools/tx_pool/README.md +1 -1
  317. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +3 -3
  318. package/src/mem_pools/tx_pool_v2/README.md +275 -0
  319. package/src/mem_pools/tx_pool_v2/archive/index.ts +1 -0
  320. package/src/mem_pools/tx_pool_v2/archive/tx_archive.ts +120 -0
  321. package/src/mem_pools/tx_pool_v2/deleted_pool.ts +310 -0
  322. package/src/mem_pools/tx_pool_v2/eviction/eviction_manager.ts +147 -0
  323. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +121 -0
  324. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +111 -0
  325. package/src/mem_pools/tx_pool_v2/eviction/index.ts +23 -0
  326. package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +164 -0
  327. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +74 -0
  328. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +101 -0
  329. package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +88 -0
  330. package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +72 -0
  331. package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +31 -0
  332. package/src/mem_pools/tx_pool_v2/index.ts +12 -0
  333. package/src/mem_pools/tx_pool_v2/interfaces.ts +233 -0
  334. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +211 -0
  335. package/src/mem_pools/tx_pool_v2/tx_pool_bench_metrics.ts +77 -0
  336. package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +433 -0
  337. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +218 -0
  338. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +924 -0
  339. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +10 -4
  340. package/src/msg_validators/proposal_validator/proposal_validator.ts +5 -5
  341. package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +2 -2
  342. package/src/msg_validators/tx_validator/archive_cache.ts +3 -3
  343. package/src/msg_validators/tx_validator/block_header_validator.ts +22 -11
  344. package/src/msg_validators/tx_validator/data_validator.ts +6 -2
  345. package/src/msg_validators/tx_validator/double_spend_validator.ts +15 -9
  346. package/src/msg_validators/tx_validator/factory.ts +64 -23
  347. package/src/msg_validators/tx_validator/gas_validator.ts +9 -3
  348. package/src/msg_validators/tx_validator/metadata_validator.ts +6 -3
  349. package/src/msg_validators/tx_validator/phases_validator.ts +5 -3
  350. package/src/msg_validators/tx_validator/size_validator.ts +6 -2
  351. package/src/msg_validators/tx_validator/timestamp_validator.ts +29 -21
  352. package/src/msg_validators/tx_validator/tx_permitted_validator.ts +8 -3
  353. package/src/msg_validators/tx_validator/tx_proof_validator.ts +8 -3
  354. package/src/services/data_store.ts +10 -7
  355. package/src/services/discv5/discV5_service.ts +1 -1
  356. package/src/services/dummy_service.ts +57 -0
  357. package/src/services/encoding.ts +2 -2
  358. package/src/services/gossipsub/README.md +626 -0
  359. package/src/services/gossipsub/index.ts +2 -0
  360. package/src/services/gossipsub/scoring.ts +29 -5
  361. package/src/services/gossipsub/topic_score_params.ts +451 -0
  362. package/src/services/index.ts +1 -0
  363. package/src/services/libp2p/instrumentation.ts +15 -2
  364. package/src/services/libp2p/libp2p_service.ts +430 -321
  365. package/src/services/peer-manager/metrics.ts +21 -4
  366. package/src/services/peer-manager/peer_scoring.ts +29 -1
  367. package/src/services/reqresp/batch-tx-requester/README.md +305 -0
  368. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +706 -0
  369. package/src/services/reqresp/batch-tx-requester/config.ts +40 -0
  370. package/src/services/reqresp/batch-tx-requester/interface.ts +57 -0
  371. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +209 -0
  372. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +205 -0
  373. package/src/services/reqresp/batch-tx-requester/tx_validator.ts +37 -0
  374. package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +65 -4
  375. package/src/services/reqresp/connection-sampler/connection_sampler.ts +16 -0
  376. package/src/services/reqresp/interface.ts +29 -1
  377. package/src/services/reqresp/metrics.ts +34 -9
  378. package/src/services/reqresp/protocols/block_txs/bitvector.ts +7 -0
  379. package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +35 -12
  380. package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +74 -9
  381. package/src/services/reqresp/protocols/tx.ts +22 -0
  382. package/src/services/reqresp/reqresp.ts +79 -22
  383. package/src/services/service.ts +44 -0
  384. package/src/services/tx_collection/config.ts +83 -1
  385. package/src/services/tx_collection/fast_tx_collection.ts +44 -19
  386. package/src/services/tx_collection/file_store_tx_collection.ts +198 -0
  387. package/src/services/tx_collection/file_store_tx_source.ts +73 -0
  388. package/src/services/tx_collection/index.ts +6 -0
  389. package/src/services/tx_collection/instrumentation.ts +11 -2
  390. package/src/services/tx_collection/proposal_tx_collector.ts +112 -0
  391. package/src/services/tx_collection/slow_tx_collection.ts +64 -30
  392. package/src/services/tx_collection/tx_collection.ts +113 -17
  393. package/src/services/tx_collection/tx_collection_sink.ts +17 -7
  394. package/src/services/tx_file_store/config.ts +37 -0
  395. package/src/services/tx_file_store/index.ts +3 -0
  396. package/src/services/tx_file_store/instrumentation.ts +36 -0
  397. package/src/services/tx_file_store/tx_file_store.ts +175 -0
  398. package/src/services/tx_provider.ts +8 -7
  399. package/src/services/tx_provider_instrumentation.ts +11 -5
  400. package/src/test-helpers/index.ts +2 -0
  401. package/src/test-helpers/make-test-p2p-clients.ts +3 -3
  402. package/src/test-helpers/mock-pubsub.ts +133 -3
  403. package/src/test-helpers/reqresp-nodes.ts +2 -1
  404. package/src/test-helpers/test_tx_provider.ts +64 -0
  405. package/src/test-helpers/testbench-utils.ts +430 -0
  406. package/src/testbench/p2p_client_testbench_worker.ts +322 -123
  407. package/src/testbench/worker_client_manager.ts +304 -47
  408. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +0 -40
  409. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +0 -1
  410. package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +0 -218
  411. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +0 -31
  412. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +0 -1
  413. package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +0 -180
  414. package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +0 -320
  415. package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +0 -264
@@ -1,7 +1,8 @@
1
+ import type { SlotNumber } from '@aztec/foundation/branded-types';
1
2
  import type { EthAddress, L2BlockId } from '@aztec/stdlib/block';
2
3
  import type { P2PApiFull } from '@aztec/stdlib/interfaces/server';
3
4
  import type { BlockProposal, CheckpointAttestation, CheckpointProposal, P2PClientType } from '@aztec/stdlib/p2p';
4
- import type { Tx, TxHash } from '@aztec/stdlib/tx';
5
+ import type { BlockHeader, Tx, TxHash } from '@aztec/stdlib/tx';
5
6
 
6
7
  import type { PeerId } from '@libp2p/interface';
7
8
  import type { ENR } from '@nethermindeth/enr';
@@ -13,7 +14,12 @@ import type {
13
14
  ReqRespSubProtocolHandler,
14
15
  ReqRespSubProtocolValidators,
15
16
  } from '../services/reqresp/interface.js';
16
- import type { P2PBlockReceivedCallback, P2PCheckpointReceivedCallback } from '../services/service.js';
17
+ import type {
18
+ DuplicateAttestationInfo,
19
+ DuplicateProposalInfo,
20
+ P2PBlockReceivedCallback,
21
+ P2PCheckpointReceivedCallback,
22
+ } from '../services/service.js';
17
23
 
18
24
  /**
19
25
  * Enum defining the possible states of the p2p client.
@@ -79,12 +85,21 @@ export type P2P<T extends P2PClientType = P2PClientType.Full> = P2PApiFull<T> &
79
85
  registerCheckpointProposalHandler(callback: P2PCheckpointReceivedCallback): void;
80
86
 
81
87
  /**
82
- * Request a list of transactions from another peer by their tx hashes.
83
- * @param txHashes - Hashes of the txs to query.
84
- * @param pinnedPeerId - An optional peer id that will be used to request the tx from (in addition to other random peers).
85
- * @returns A list of transactions or undefined if the transactions are not found.
88
+ * Registers a callback invoked when a duplicate proposal is detected (equivocation).
89
+ * The callback is triggered on the first duplicate (when count goes from 1 to 2).
90
+ *
91
+ * @param callback - Function called with info about the duplicate proposal
92
+ */
93
+ registerDuplicateProposalCallback(callback: (info: DuplicateProposalInfo) => void): void;
94
+
95
+ /**
96
+ * Registers a callback invoked when a duplicate attestation is detected (equivocation).
97
+ * A validator signing attestations for different proposals at the same slot.
98
+ * The callback is triggered on the first duplicate (when count goes from 1 to 2).
99
+ *
100
+ * @param callback - Function called with info about the duplicate attestation
86
101
  */
87
- requestTxsByHash(txHashes: TxHash[], pinnedPeerId: PeerId): Promise<Tx[]>;
102
+ registerDuplicateAttestationCallback(callback: (info: DuplicateAttestationInfo) => void): void;
88
103
 
89
104
  /**
90
105
  * Verifies the 'tx' and, if valid, adds it to local tx pool and forwards it to other peers.
@@ -100,11 +115,10 @@ export type P2P<T extends P2PClientType = P2PClientType.Full> = P2PApiFull<T> &
100
115
  addTxsToPool(txs: Tx[]): Promise<number>;
101
116
 
102
117
  /**
103
- * Deletes 'txs' from the pool, given hashes.
104
- * NOT used if we use sendTx as reconcileTxPool will handle this.
105
- * @param txHashes - Hashes to check.
118
+ * Handles failed transaction execution by removing txs from the pool.
119
+ * @param txHashes - Hashes of the transactions that failed execution.
106
120
  **/
107
- deleteTxs(txHashes: TxHash[]): Promise<void>;
121
+ handleFailedExecution(txHashes: TxHash[]): Promise<void>;
108
122
 
109
123
  /**
110
124
  * Returns a transaction in the transaction pool by its hash.
@@ -152,14 +166,28 @@ export type P2P<T extends P2PClientType = P2PClientType.Full> = P2PApiFull<T> &
152
166
  /** Returns an iterator over pending txs on the mempool. */
153
167
  iteratePendingTxs(): AsyncIterableIterator<Tx>;
154
168
 
169
+ /** Returns an iterator over pending txs that have been in the pool long enough to be eligible for block building. */
170
+ iterateEligiblePendingTxs(): AsyncIterableIterator<Tx>;
171
+
155
172
  /** Returns the number of pending txs in the mempool. */
156
173
  getPendingTxCount(): Promise<number>;
157
174
 
158
175
  /**
159
- * Marks transactions as non-evictable in the pool.
160
- * @param txHashes - Hashes of the transactions to mark as non-evictable.
176
+ * Protects existing transactions by hash for a given slot.
177
+ * Returns hashes of transactions that weren't found in the pool.
178
+ * @param txHashes - Hashes of the transactions to protect.
179
+ * @param blockHeader - The block header providing slot context.
180
+ * @returns Hashes of transactions not found in the pool.
181
+ */
182
+ protectTxs(txHashes: TxHash[], blockHeader: BlockHeader): Promise<TxHash[]>;
183
+
184
+ /**
185
+ * Prepares the pool for a new slot.
186
+ * Unprotects transactions from earlier slots and validates them before
187
+ * returning to pending state.
188
+ * @param slotNumber - The slot number to prepare for
161
189
  */
162
- markTxsAsNonEvictable(txHashes: TxHash[]): Promise<void>;
190
+ prepareForSlot(slotNumber: SlotNumber): Promise<void>;
163
191
 
164
192
  /**
165
193
  * Starts the p2p client.
@@ -208,6 +236,9 @@ export type P2P<T extends P2PClientType = P2PClientType.Full> = P2PApiFull<T> &
208
236
 
209
237
  handleAuthRequestFromPeer(authRequest: AuthRequest, peerId: PeerId): Promise<StatusMessage>;
210
238
 
239
+ /** Checks if any block proposals exist for the given slot. */
240
+ hasBlockProposalsForSlot(slot: SlotNumber): Promise<boolean>;
241
+
211
242
  /** If node running this P2P stack is validator, passes in validator address to P2P layer */
212
243
  registerThisValidatorAddresses(address: EthAddress[]): void;
213
244
  };
@@ -1,12 +1,15 @@
1
1
  import { GENESIS_BLOCK_HEADER_HASH } from '@aztec/constants';
2
+ import type { EpochCacheInterface } from '@aztec/epoch-cache';
2
3
  import { BlockNumber, SlotNumber } from '@aztec/foundation/branded-types';
3
4
  import { createLogger } from '@aztec/foundation/log';
5
+ import { RunningPromise } from '@aztec/foundation/promise';
4
6
  import { DateProvider } from '@aztec/foundation/timer';
5
7
  import type { AztecAsyncKVStore, AztecAsyncSingleton } from '@aztec/kv-store';
6
8
  import { L2TipsKVStore } from '@aztec/kv-store/stores';
7
9
  import {
8
10
  type EthAddress,
9
11
  type L2Block,
12
+ type L2BlockId,
10
13
  type L2BlockSource,
11
14
  L2BlockStream,
12
15
  type L2BlockStreamEvent,
@@ -22,16 +25,16 @@ import {
22
25
  type CheckpointProposal,
23
26
  type P2PClientType,
24
27
  } from '@aztec/stdlib/p2p';
25
- import type { Tx, TxHash } from '@aztec/stdlib/tx';
28
+ import type { BlockHeader, Tx, TxHash } from '@aztec/stdlib/tx';
26
29
  import { Attributes, type TelemetryClient, WithTracer, getTelemetryClient, trackSpan } from '@aztec/telemetry-client';
27
30
 
28
31
  import type { PeerId } from '@libp2p/interface';
29
32
  import type { ENR } from '@nethermindeth/enr';
30
33
 
31
34
  import { type P2PConfig, getP2PDefaultConfig } from '../config.js';
32
- import type { AttestationPool } from '../mem_pools/attestation_pool/attestation_pool.js';
35
+ import type { AttestationPoolApi } from '../mem_pools/attestation_pool/attestation_pool.js';
33
36
  import type { MemPools } from '../mem_pools/interface.js';
34
- import type { TxPool } from '../mem_pools/tx_pool/index.js';
37
+ import type { TxPoolV2 } from '../mem_pools/tx_pool_v2/interfaces.js';
35
38
  import type { AuthRequest, StatusMessage } from '../services/index.js';
36
39
  import {
37
40
  ReqRespSubProtocol,
@@ -39,8 +42,15 @@ import {
39
42
  type ReqRespSubProtocolValidators,
40
43
  } from '../services/reqresp/interface.js';
41
44
  import { chunkTxHashesRequest } from '../services/reqresp/protocols/tx.js';
42
- import type { P2PBlockReceivedCallback, P2PCheckpointReceivedCallback, P2PService } from '../services/service.js';
45
+ import type {
46
+ DuplicateAttestationInfo,
47
+ DuplicateProposalInfo,
48
+ P2PBlockReceivedCallback,
49
+ P2PCheckpointReceivedCallback,
50
+ P2PService,
51
+ } from '../services/service.js';
43
52
  import { TxCollection } from '../services/tx_collection/tx_collection.js';
53
+ import type { TxFileStore } from '../services/tx_file_store/tx_file_store.js';
44
54
  import { TxProvider } from '../services/tx_provider.js';
45
55
  import { type P2P, P2PClientState, type P2PSyncState } from './interface.js';
46
56
 
@@ -64,8 +74,8 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
64
74
  private l2Tips: L2TipsStore;
65
75
  private synchedLatestSlot: AztecAsyncSingleton<bigint>;
66
76
 
67
- private txPool: TxPool;
68
- private attestationPool: AttestationPool;
77
+ private txPool: TxPoolV2;
78
+ private attestationPool: AttestationPoolApi;
69
79
 
70
80
  private config: P2PConfig;
71
81
 
@@ -75,14 +85,12 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
75
85
 
76
86
  private validatorAddresses: EthAddress[] = [];
77
87
 
78
- /**
79
- * In-memory P2P client constructor.
80
- * @param store - The client's instance of the KV store.
81
- * @param l2BlockSource - P2P client's source for fetching existing blocks.
82
- * @param txPool - The client's instance of a transaction pool. Defaults to in-memory implementation.
83
- * @param p2pService - The concrete instance of p2p networking to use.
84
- * @param log - A logger.
85
- */
88
+ /** Tracks the last slot for which we called prepareForSlot */
89
+ private lastSlotProcessed: SlotNumber = SlotNumber.ZERO;
90
+
91
+ /** Polls for slot changes and calls prepareForSlot on the tx pool */
92
+ private slotMonitor: RunningPromise | undefined;
93
+
86
94
  constructor(
87
95
  _clientType: T,
88
96
  private store: AztecAsyncKVStore,
@@ -90,6 +98,8 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
90
98
  mempools: MemPools,
91
99
  private p2pService: P2PService,
92
100
  private txCollection: TxCollection,
101
+ private txFileStore: TxFileStore | undefined,
102
+ private epochCache: EpochCacheInterface,
93
103
  config: Partial<P2PConfig> = {},
94
104
  private _dateProvider: DateProvider = new DateProvider(),
95
105
  private telemetry: TelemetryClient = getTelemetryClient(),
@@ -159,10 +169,9 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
159
169
  return this.l2Tips.getL2BlockHash(number);
160
170
  }
161
171
 
162
- public updateP2PConfig(config: Partial<P2PConfig>): Promise<void> {
163
- this.txPool.updateConfig(config);
172
+ public async updateP2PConfig(config: Partial<P2PConfig>): Promise<void> {
173
+ await this.txPool.updateConfig(config);
164
174
  this.p2pService.updateConfig(config);
165
- return Promise.resolve();
166
175
  }
167
176
 
168
177
  public getL2Tips(): Promise<L2Tips> {
@@ -191,7 +200,7 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
191
200
  break;
192
201
  case 'chain-pruned':
193
202
  this.txCollection.stopCollectingForBlocksAfter(event.block.number);
194
- await this.handlePruneL2Blocks(event.block.number);
203
+ await this.handlePruneL2Blocks(event.block);
195
204
  break;
196
205
  case 'chain-checkpointed':
197
206
  break;
@@ -207,7 +216,6 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
207
216
  }
208
217
 
209
218
  #assertIsReady() {
210
- // this.log.info('Checking if p2p client is ready, current state: ', this.currentState);
211
219
  if (!this.isReady()) {
212
220
  throw new Error('P2P client not ready');
213
221
  }
@@ -225,6 +233,9 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
225
233
  return this.syncPromise;
226
234
  }
227
235
 
236
+ // Start the tx pool first, as it needs to hydrate state from persistence
237
+ await this.txPool.start();
238
+
228
239
  // get the current latest block numbers
229
240
  const latestBlockNumbers = await this.l2BlockSource.getL2Tips();
230
241
  this.latestBlockNumberAtStart = latestBlockNumbers.proposed.number;
@@ -274,6 +285,16 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
274
285
 
275
286
  this.blockStream!.start();
276
287
  await this.txCollection.start();
288
+ this.txFileStore?.start();
289
+
290
+ // Start slot monitor to call prepareForSlot when the slot changes
291
+ this.slotMonitor = new RunningPromise(
292
+ () => this.maybeCallPrepareForSlot(),
293
+ this.log,
294
+ this.config.slotCheckIntervalMS,
295
+ );
296
+ this.slotMonitor.start();
297
+
277
298
  return this.syncPromise;
278
299
  }
279
300
 
@@ -304,12 +325,18 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
304
325
  */
305
326
  public async stop() {
306
327
  this.log.debug('Stopping p2p client...');
328
+ await this.slotMonitor?.stop();
329
+ this.log.debug('Stopped slot monitor');
307
330
  await tryStop(this.txCollection);
308
331
  this.log.debug('Stopped tx collection service');
332
+ await this.txFileStore?.stop();
333
+ this.log.debug('Stopped tx file store');
309
334
  await this.p2pService.stop();
310
335
  this.log.debug('Stopped p2p service');
311
336
  await this.blockStream?.stop();
312
337
  this.log.debug('Stopped block downloader');
338
+ await this.txPool.stop();
339
+ this.log.debug('Stopped tx pool');
313
340
  await this.runningPromise;
314
341
  this.setCurrentState(P2PClientState.STOPPED);
315
342
  this.log.info('P2P client stopped');
@@ -326,8 +353,21 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
326
353
  [Attributes.BLOCK_ARCHIVE]: proposal.archive.toString(),
327
354
  [Attributes.P2P_ID]: (await proposal.p2pMessageLoggingIdentifier()).toString(),
328
355
  }))
329
- public broadcastProposal(proposal: BlockProposal): Promise<void> {
356
+ public async broadcastProposal(proposal: BlockProposal): Promise<void> {
330
357
  this.log.verbose(`Broadcasting proposal for slot ${proposal.slotNumber} to peers`);
358
+ // Store our own proposal so we can respond to req/resp requests for it
359
+ const { count } = await this.attestationPool.tryAddBlockProposal(proposal);
360
+ if (count > 1) {
361
+ if (this.config.broadcastEquivocatedProposals) {
362
+ this.log.warn(`Broadcasting equivocated block proposal for slot ${proposal.slotNumber}`, {
363
+ slot: proposal.slotNumber,
364
+ archive: proposal.archive.toString(),
365
+ count,
366
+ });
367
+ } else {
368
+ throw new Error(`Attempted to broadcast a duplicate block proposal for slot ${proposal.slotNumber}`);
369
+ }
370
+ }
331
371
  return this.p2pService.propagate(proposal);
332
372
  }
333
373
 
@@ -336,8 +376,13 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
336
376
  [Attributes.BLOCK_ARCHIVE]: proposal.archive.toString(),
337
377
  [Attributes.P2P_ID]: (await proposal.p2pMessageLoggingIdentifier()).toString(),
338
378
  }))
339
- public broadcastCheckpointProposal(proposal: CheckpointProposal): Promise<void> {
379
+ public async broadcastCheckpointProposal(proposal: CheckpointProposal): Promise<void> {
340
380
  this.log.verbose(`Broadcasting checkpoint proposal for slot ${proposal.slotNumber} to peers`);
381
+ const blockProposal = proposal.getBlockProposal();
382
+ if (blockProposal) {
383
+ // Store our own last-block proposal so we can respond to req/resp requests for it.
384
+ await this.attestationPool.tryAddBlockProposal(blockProposal);
385
+ }
341
386
  return this.p2pService.propagate(proposal);
342
387
  }
343
388
 
@@ -355,8 +400,12 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
355
400
  : this.attestationPool.getCheckpointAttestationsForSlot(slot));
356
401
  }
357
402
 
358
- public addCheckpointAttestations(attestations: CheckpointAttestation[]): Promise<void> {
359
- return this.attestationPool.addCheckpointAttestations(attestations);
403
+ public addOwnCheckpointAttestations(attestations: CheckpointAttestation[]): Promise<void> {
404
+ return this.attestationPool.addOwnCheckpointAttestations(attestations);
405
+ }
406
+
407
+ public hasBlockProposalsForSlot(slot: SlotNumber): Promise<boolean> {
408
+ return this.attestationPool.hasBlockProposalsForSlot(slot);
360
409
  }
361
410
 
362
411
  // REVIEW: https://github.com/AztecProtocol/aztec-packages/issues/7963
@@ -369,10 +418,18 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
369
418
  this.p2pService.registerCheckpointReceivedCallback(handler);
370
419
  }
371
420
 
421
+ public registerDuplicateProposalCallback(callback: (info: DuplicateProposalInfo) => void): void {
422
+ this.p2pService.registerDuplicateProposalCallback(callback);
423
+ }
424
+
425
+ public registerDuplicateAttestationCallback(callback: (info: DuplicateAttestationInfo) => void): void {
426
+ this.p2pService.registerDuplicateAttestationCallback(callback);
427
+ }
428
+
372
429
  /**
373
430
  * Uses the batched Request Response protocol to request a set of transactions from the network.
374
431
  */
375
- public async requestTxsByHash(txHashes: TxHash[], pinnedPeerId: PeerId | undefined): Promise<Tx[]> {
432
+ private async requestTxsByHash(txHashes: TxHash[], pinnedPeerId: PeerId | undefined): Promise<Tx[]> {
376
433
  const timeoutMs = 8000; // Longer timeout for now
377
434
  const maxRetryAttempts = 10; // Keep retrying within the timeout
378
435
  const requests = chunkTxHashesRequest(txHashes);
@@ -389,7 +446,7 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
389
446
 
390
447
  const txs = txBatches.flat();
391
448
  if (txs.length > 0) {
392
- await this.txPool.addTxs(txs);
449
+ await this.txPool.addPendingTxs(txs);
393
450
  }
394
451
 
395
452
  const txHashesStr = txHashes.map(tx => tx.toString()).join(', ');
@@ -399,79 +456,49 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
399
456
  return txs;
400
457
  }
401
458
 
402
- public getPendingTxs(limit?: number, after?: TxHash): Promise<Tx[]> {
403
- return this.getTxs('pending', limit, after);
404
- }
405
-
406
- public getPendingTxCount(): Promise<number> {
407
- return this.txPool.getPendingTxCount();
408
- }
409
-
410
- public async *iteratePendingTxs(): AsyncIterableIterator<Tx> {
411
- for (const txHash of await this.txPool.getPendingTxHashes()) {
412
- const tx = await this.txPool.getTxByHash(txHash);
413
- if (tx) {
414
- yield tx;
415
- }
416
- }
417
- }
418
-
419
- /**
420
- * Returns all transactions in the transaction pool.
421
- * @param filter - The type of txs to return
422
- * @param limit - How many txs to return
423
- * @param after - If paginating, the last known tx hash. Will return txs after this hash
424
- * @returns An array of Txs.
425
- */
426
- public async getTxs(filter: 'all' | 'pending' | 'mined', limit?: number, after?: TxHash): Promise<Tx[]> {
459
+ public async getPendingTxs(limit?: number, after?: TxHash): Promise<Tx[]> {
427
460
  if (limit !== undefined && limit <= 0) {
428
461
  throw new TypeError('limit must be greater than 0');
429
462
  }
430
463
 
431
- let txs: Tx[] | undefined = undefined;
432
- let txHashes: TxHash[];
433
-
434
- if (filter === 'all') {
435
- txs = await this.txPool.getAllTxs();
436
- txHashes = await Promise.all(txs.map(tx => tx.getTxHash()));
437
- } else if (filter === 'mined') {
438
- const minedTxHashes = await this.txPool.getMinedTxHashes();
439
- txHashes = minedTxHashes.map(([txHash]) => txHash);
440
- } else if (filter === 'pending') {
441
- txHashes = await this.txPool.getPendingTxHashes();
442
- } else {
443
- const _: never = filter;
444
- throw new Error(`Unknown filter ${filter}`);
445
- }
464
+ let txHashes = await this.txPool.getPendingTxHashes();
446
465
 
447
466
  let startIndex = 0;
448
- let endIndex: number | undefined = undefined;
449
-
450
467
  if (after) {
451
468
  startIndex = txHashes.findIndex(txHash => after.equals(txHash));
452
-
453
- // if we can't find the last tx in our set then return an empty array as pagination is no longer valid.
454
469
  if (startIndex === -1) {
455
470
  return [];
456
471
  }
457
-
458
- // increment by one because we don't want to return the same tx again
459
472
  startIndex++;
460
473
  }
461
474
 
462
- if (limit !== undefined) {
463
- endIndex = startIndex + limit;
464
- }
465
-
475
+ const endIndex = limit !== undefined ? startIndex + limit : undefined;
466
476
  txHashes = txHashes.slice(startIndex, endIndex);
467
- if (txs) {
468
- txs = txs.slice(startIndex, endIndex);
469
- } else {
470
- const maybeTxs = await Promise.all(txHashes.map(txHash => this.txPool.getTxByHash(txHash)));
471
- txs = maybeTxs.filter((tx): tx is Tx => !!tx);
477
+
478
+ const maybeTxs = await Promise.all(txHashes.map(txHash => this.txPool.getTxByHash(txHash)));
479
+ return maybeTxs.filter((tx): tx is Tx => !!tx);
480
+ }
481
+
482
+ public getPendingTxCount(): Promise<number> {
483
+ return this.txPool.getPendingTxCount();
484
+ }
485
+
486
+ public async *iteratePendingTxs(): AsyncIterableIterator<Tx> {
487
+ for (const txHash of await this.txPool.getPendingTxHashes()) {
488
+ const tx = await this.txPool.getTxByHash(txHash);
489
+ if (tx) {
490
+ yield tx;
491
+ }
472
492
  }
493
+ }
473
494
 
474
- return txs;
495
+ public async *iterateEligiblePendingTxs(): AsyncIterableIterator<Tx> {
496
+ for (const txHash of await this.txPool.getEligiblePendingTxHashes()) {
497
+ const tx = await this.txPool.getTxByHash(txHash);
498
+ if (tx) {
499
+ yield tx;
500
+ }
501
+ }
475
502
  }
476
503
 
477
504
  /**
@@ -549,15 +576,19 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
549
576
  }
550
577
 
551
578
  /**
552
- * Verifies the 'tx' and, if valid, adds it to local tx pool and forwards it to other peers.
553
- * @param tx - The tx to verify.
579
+ * Accepts a transaction, adds it to local tx pool and forwards it to other peers.
580
+ * @param tx - The tx to send.
554
581
  * @returns Empty promise.
555
582
  **/
556
583
  public async sendTx(tx: Tx): Promise<void> {
557
- const addedCount = await this.addTxsToPool([tx]);
558
- const txAddedSuccessfully = addedCount === 1;
559
- if (txAddedSuccessfully) {
584
+ this.#assertIsReady();
585
+ const result = await this.txPool.addPendingTxs([tx]);
586
+ if (result.accepted.length === 1) {
560
587
  await this.p2pService.propagate(tx);
588
+ } else {
589
+ this.log.warn(
590
+ `Tx ${tx.getTxHash()} not propagated: accepted=${result.accepted.length} ignored=${result.ignored.length} rejected=${result.rejected.length}`,
591
+ );
561
592
  }
562
593
  }
563
594
 
@@ -567,7 +598,7 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
567
598
  **/
568
599
  public async addTxsToPool(txs: Tx[]): Promise<number> {
569
600
  this.#assertIsReady();
570
- return await this.txPool.addTxs(txs);
601
+ return (await this.txPool.addPendingTxs(txs)).accepted.length;
571
602
  }
572
603
 
573
604
  /**
@@ -575,8 +606,9 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
575
606
  * @param txHash - Hash of the tx to query.
576
607
  * @returns Pending or mined depending on its status, or undefined if not found.
577
608
  */
578
- public getTxStatus(txHash: TxHash): Promise<'pending' | 'mined' | 'deleted' | undefined> {
579
- return this.txPool.getTxStatus(txHash);
609
+ public async getTxStatus(txHash: TxHash): Promise<'pending' | 'mined' | 'deleted' | undefined> {
610
+ const status = await this.txPool.getTxStatus(txHash);
611
+ return status === 'protected' ? 'pending' : status;
580
612
  }
581
613
 
582
614
  public getEnr(): ENR | undefined {
@@ -588,14 +620,12 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
588
620
  }
589
621
 
590
622
  /**
591
- * Deletes the 'txs' from the pool.
592
- * NOT used if we use sendTx as reconcileTxPool will handle this.
593
- * @param txHashes - Hashes of the transactions to delete.
594
- * @returns Empty promise.
623
+ * Handles failed transaction execution by removing txs from the pool.
624
+ * @param txHashes - Hashes of the transactions that failed execution.
595
625
  **/
596
- public async deleteTxs(txHashes: TxHash[]): Promise<void> {
626
+ public async handleFailedExecution(txHashes: TxHash[]): Promise<void> {
597
627
  this.#assertIsReady();
598
- await this.txPool.deleteTxs(txHashes);
628
+ await this.txPool.handleFailedExecution(txHashes);
599
629
  }
600
630
 
601
631
  /**
@@ -655,14 +685,13 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
655
685
  }
656
686
 
657
687
  /**
658
- * Mark all txs from these blocks as mined.
688
+ * Handles mined blocks by marking the txs in them as mined.
659
689
  * @param blocks - A list of existing blocks with txs that the P2P client needs to ensure the tx pool is reconciled with.
660
690
  * @returns Empty promise.
661
691
  */
662
- private async markTxsAsMinedFromBlocks(blocks: L2Block[]): Promise<void> {
692
+ private async handleMinedBlocks(blocks: L2Block[]): Promise<void> {
663
693
  for (const block of blocks) {
664
- const txHashes = block.body.txEffects.map(txEffect => txEffect.txHash);
665
- await this.txPool.markAsMined(txHashes, block.header);
694
+ await this.txPool.handleMinedBlock(block);
666
695
  }
667
696
  }
668
697
 
@@ -673,16 +702,14 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
673
702
  */
674
703
  private async handleLatestL2Blocks(blocks: L2Block[]): Promise<void> {
675
704
  if (!blocks.length) {
676
- return Promise.resolve();
705
+ return;
677
706
  }
678
707
 
679
- await this.markTxsAsMinedFromBlocks(blocks);
680
- await this.txPool.clearNonEvictableTxs();
708
+ await this.handleMinedBlocks(blocks);
709
+ await this.maybeCallPrepareForSlot();
681
710
  await this.startCollectingMissingTxs(blocks);
682
-
683
711
  const lastBlock = blocks.at(-1)!;
684
712
  await this.synchedLatestSlot.set(BigInt(lastBlock.header.getSlot()));
685
- this.log.verbose(`Synched to latest block ${lastBlock.number}`);
686
713
  }
687
714
 
688
715
  /** Request txs for unproven blocks so the prover node has more chances to get them. */
@@ -721,68 +748,31 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
721
748
  */
722
749
  private async handleFinalizedL2Blocks(blocks: L2Block[]): Promise<void> {
723
750
  if (!blocks.length) {
724
- return Promise.resolve();
751
+ return;
725
752
  }
726
- this.log.debug(`Handling finalized blocks ${blocks.length} up to ${blocks.at(-1)?.number}`);
727
-
728
- const lastBlockNum = blocks[blocks.length - 1].number;
729
- const lastBlockSlot = blocks[blocks.length - 1].header.getSlot();
730
-
731
- const txHashes = blocks.flatMap(block => block.body.txEffects.map(txEffect => txEffect.txHash));
732
- this.log.debug(`Deleting ${txHashes.length} txs from pool from finalized blocks up to ${lastBlockNum}`);
733
- await this.txPool.deleteTxs(txHashes, { permanently: true });
734
- await this.txPool.cleanupDeletedMinedTxs(lastBlockNum);
735
-
736
- await this.attestationPool.deleteCheckpointAttestationsOlderThan(lastBlockSlot);
737
753
 
738
- this.log.debug(`Synched to finalized block ${lastBlockNum} at slot ${lastBlockSlot}`);
754
+ // Finalization is monotonic, so we only need to call with the last block
755
+ const lastBlock = blocks.at(-1)!;
756
+ await this.txPool.handleFinalizedBlock(lastBlock.header);
757
+ await this.attestationPool.deleteOlderThan(lastBlock.header.getSlot());
739
758
  }
740
759
 
741
760
  /**
742
761
  * Updates the tx pool after a chain prune.
743
- * @param latestBlock - The block number the chain was pruned to.
762
+ * @param latestBlock - The block ID the chain was pruned to.
744
763
  */
745
- private async handlePruneL2Blocks(latestBlock: BlockNumber): Promise<void> {
746
- const txsToDelete = new Map<string, TxHash>();
747
- const minedTxs = await this.txPool.getMinedTxHashes();
748
-
749
- // Find transactions that reference pruned blocks in their historical header
750
- for (const tx of await this.txPool.getAllTxs()) {
751
- // every tx that's been generated against a block that has now been pruned is no longer valid
752
- if (tx.data.constants.anchorBlockHeader.globalVariables.blockNumber > latestBlock) {
753
- const txHash = tx.getTxHash();
754
- txsToDelete.set(txHash.toString(), txHash);
755
- }
756
- }
757
-
758
- this.log.info(`Detected chain prune. Removing ${txsToDelete.size} txs built against pruned blocks.`, {
759
- newLatestBlock: latestBlock,
760
- previousLatestBlock: await this.getSyncedLatestBlockNum(),
761
- txsToDelete: Array.from(txsToDelete.keys()),
762
- });
763
-
764
- // delete invalid txs (both pending and mined)
765
- await this.txPool.deleteTxs(Array.from(txsToDelete.values()));
766
-
767
- // everything left in the mined set was built against a block on the proven chain so its still valid
768
- // move back to pending the txs that were reorged out of the chain, unless txPoolDeleteTxsAfterReorg is set,
769
- // in which case we clean them up to avoid potential reorg loops
770
- // NOTE: we can't move _all_ txs back to pending because the tx pool could keep hold of mined txs for longer
771
- // (see this.keepProvenTxsFor)
772
- const minedTxsFromReorg: TxHash[] = [];
773
- for (const [txHash, blockNumber] of minedTxs) {
774
- // We keep the txsToDelete out of this list as they have already been deleted above
775
- if (blockNumber > latestBlock && !txsToDelete.has(txHash.toString())) {
776
- minedTxsFromReorg.push(txHash);
777
- }
778
- }
764
+ private async handlePruneL2Blocks(latestBlock: L2BlockId): Promise<void> {
765
+ await this.txPool.handlePrunedBlocks(latestBlock);
766
+ }
779
767
 
780
- if (this.config.txPoolDeleteTxsAfterReorg) {
781
- this.log.info(`Deleting ${minedTxsFromReorg.length} mined txs from reorg`);
782
- await this.txPool.deleteTxs(minedTxsFromReorg);
783
- } else {
784
- await this.txPool.markMinedAsPending(minedTxsFromReorg, latestBlock);
768
+ /** Checks if the slot has changed and calls prepareForSlot if so. */
769
+ private async maybeCallPrepareForSlot(): Promise<void> {
770
+ const { currentSlot } = this.epochCache.getCurrentAndNextSlot();
771
+ if (currentSlot <= this.lastSlotProcessed) {
772
+ return;
785
773
  }
774
+ this.lastSlotProcessed = currentSlot;
775
+ await this.txPool.prepareForSlot(currentSlot);
786
776
  }
787
777
 
788
778
  private async startServiceIfSynched() {
@@ -827,11 +817,23 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
827
817
  }
828
818
 
829
819
  /**
830
- * Marks transactions as non-evictable in the pool.
831
- * @param txHashes - Hashes of the transactions to mark as non-evictable.
820
+ * Protects existing transactions by hash for a given slot.
821
+ * Returns hashes of transactions that weren't found in the pool.
822
+ * @param txHashes - Hashes of the transactions to protect.
823
+ * @param blockHeader - The block header providing slot context.
824
+ * @returns Hashes of transactions not found in the pool.
825
+ */
826
+ public protectTxs(txHashes: TxHash[], blockHeader: BlockHeader): Promise<TxHash[]> {
827
+ return this.txPool.protectTxs(txHashes, blockHeader);
828
+ }
829
+
830
+ /**
831
+ * Prepares the pool for a new slot.
832
+ * Unprotects transactions from earlier slots and validates them.
833
+ * @param slotNumber - The slot number to prepare for
832
834
  */
833
- public markTxsAsNonEvictable(txHashes: TxHash[]): Promise<void> {
834
- return this.txPool.markTxsAsNonEvictable(txHashes);
835
+ public async prepareForSlot(slotNumber: SlotNumber): Promise<void> {
836
+ await this.txPool.prepareForSlot(slotNumber);
835
837
  }
836
838
 
837
839
  public handleAuthRequestFromPeer(authRequest: AuthRequest, peerId: PeerId): Promise<StatusMessage> {