@aztec/p2p 0.0.1-commit.c2595eba → 0.0.1-commit.c2eed6949

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 (439) hide show
  1. package/README.md +129 -3
  2. package/dest/client/factory.d.ts +11 -11
  3. package/dest/client/factory.d.ts.map +1 -1
  4. package/dest/client/factory.js +54 -15
  5. package/dest/client/interface.d.ts +46 -33
  6. package/dest/client/interface.d.ts.map +1 -1
  7. package/dest/client/p2p_client.d.ts +41 -51
  8. package/dest/client/p2p_client.d.ts.map +1 -1
  9. package/dest/client/p2p_client.js +168 -224
  10. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +7 -8
  11. package/dest/config.d.ts +60 -17
  12. package/dest/config.d.ts.map +1 -1
  13. package/dest/config.js +105 -39
  14. package/dest/errors/tx-pool.error.d.ts +8 -0
  15. package/dest/errors/tx-pool.error.d.ts.map +1 -0
  16. package/dest/errors/tx-pool.error.js +9 -0
  17. package/dest/index.d.ts +2 -1
  18. package/dest/index.d.ts.map +1 -1
  19. package/dest/index.js +1 -0
  20. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +104 -88
  21. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  22. package/dest/mem_pools/attestation_pool/attestation_pool.js +445 -3
  23. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +2 -2
  24. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
  25. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +353 -87
  26. package/dest/mem_pools/attestation_pool/index.d.ts +2 -3
  27. package/dest/mem_pools/attestation_pool/index.d.ts.map +1 -1
  28. package/dest/mem_pools/attestation_pool/index.js +1 -2
  29. package/dest/mem_pools/attestation_pool/mocks.d.ts +2 -2
  30. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  31. package/dest/mem_pools/attestation_pool/mocks.js +2 -2
  32. package/dest/mem_pools/index.d.ts +3 -2
  33. package/dest/mem_pools/index.d.ts.map +1 -1
  34. package/dest/mem_pools/index.js +1 -1
  35. package/dest/mem_pools/instrumentation.d.ts +4 -2
  36. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  37. package/dest/mem_pools/instrumentation.js +16 -14
  38. package/dest/mem_pools/interface.d.ts +5 -5
  39. package/dest/mem_pools/interface.d.ts.map +1 -1
  40. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +1 -1
  41. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -1
  42. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +2 -1
  43. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +3 -3
  44. package/dest/mem_pools/tx_pool/priority.d.ts +2 -2
  45. package/dest/mem_pools/tx_pool/priority.d.ts.map +1 -1
  46. package/dest/mem_pools/tx_pool/priority.js +4 -4
  47. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +1 -1
  48. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +1 -1
  49. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +3 -1
  50. package/dest/mem_pools/tx_pool_v2/archive/index.d.ts +2 -0
  51. package/dest/mem_pools/tx_pool_v2/archive/index.d.ts.map +1 -0
  52. package/dest/mem_pools/tx_pool_v2/archive/index.js +1 -0
  53. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts +43 -0
  54. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts.map +1 -0
  55. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.js +103 -0
  56. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +104 -0
  57. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -0
  58. package/dest/mem_pools/tx_pool_v2/deleted_pool.js +251 -0
  59. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts +47 -0
  60. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts.map +1 -0
  61. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.js +128 -0
  62. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +17 -0
  63. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -0
  64. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +94 -0
  65. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +19 -0
  66. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -0
  67. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +97 -0
  68. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +10 -0
  69. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -0
  70. package/dest/mem_pools/tx_pool_v2/eviction/index.js +11 -0
  71. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +180 -0
  72. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -0
  73. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.js +25 -0
  74. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts +15 -0
  75. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -0
  76. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +65 -0
  77. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts +17 -0
  78. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -0
  79. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +93 -0
  80. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +16 -0
  81. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -0
  82. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +78 -0
  83. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +20 -0
  84. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -0
  85. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +75 -0
  86. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +15 -0
  87. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -0
  88. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +19 -0
  89. package/dest/mem_pools/tx_pool_v2/index.d.ts +6 -0
  90. package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -0
  91. package/dest/mem_pools/tx_pool_v2/index.js +5 -0
  92. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts +15 -0
  93. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts.map +1 -0
  94. package/dest/mem_pools/tx_pool_v2/instrumentation.js +43 -0
  95. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +215 -0
  96. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -0
  97. package/dest/mem_pools/tx_pool_v2/interfaces.js +10 -0
  98. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +134 -0
  99. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -0
  100. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +216 -0
  101. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts +26 -0
  102. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts.map +1 -0
  103. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.js +70 -0
  104. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +108 -0
  105. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -0
  106. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +337 -0
  107. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +62 -0
  108. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -0
  109. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +167 -0
  110. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +78 -0
  111. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -0
  112. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +923 -0
  113. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +1 -1
  114. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  115. package/dest/msg_validators/attestation_validator/attestation_validator.js +5 -4
  116. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +3 -3
  117. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
  118. package/dest/msg_validators/clock_tolerance.d.ts +1 -1
  119. package/dest/msg_validators/clock_tolerance.d.ts.map +1 -1
  120. package/dest/msg_validators/clock_tolerance.js +4 -3
  121. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +6 -4
  122. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
  123. package/dest/msg_validators/proposal_validator/block_proposal_validator.js +10 -2
  124. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +6 -4
  125. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
  126. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +16 -2
  127. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +13 -8
  128. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
  129. package/dest/msg_validators/proposal_validator/proposal_validator.js +53 -41
  130. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +4 -4
  131. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  132. package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +3 -3
  133. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +2 -1
  134. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -1
  135. package/dest/msg_validators/tx_validator/allowed_public_setup.js +24 -20
  136. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts +17 -0
  137. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts.map +1 -0
  138. package/dest/msg_validators/tx_validator/allowed_setup_helpers.js +24 -0
  139. package/dest/msg_validators/tx_validator/block_header_validator.d.ts +16 -3
  140. package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
  141. package/dest/msg_validators/tx_validator/block_header_validator.js +1 -1
  142. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts +9 -0
  143. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts.map +1 -0
  144. package/dest/msg_validators/tx_validator/contract_instance_validator.js +48 -0
  145. package/dest/msg_validators/tx_validator/data_validator.d.ts +1 -1
  146. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  147. package/dest/msg_validators/tx_validator/data_validator.js +35 -2
  148. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +13 -3
  149. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
  150. package/dest/msg_validators/tx_validator/double_spend_validator.js +4 -4
  151. package/dest/msg_validators/tx_validator/factory.d.ts +133 -6
  152. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  153. package/dest/msg_validators/tx_validator/factory.js +247 -60
  154. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +1 -1
  155. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -1
  156. package/dest/msg_validators/tx_validator/fee_payer_balance.js +6 -2
  157. package/dest/msg_validators/tx_validator/gas_validator.d.ts +67 -3
  158. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  159. package/dest/msg_validators/tx_validator/gas_validator.js +104 -37
  160. package/dest/msg_validators/tx_validator/index.d.ts +3 -1
  161. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  162. package/dest/msg_validators/tx_validator/index.js +2 -0
  163. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +1 -1
  164. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  165. package/dest/msg_validators/tx_validator/metadata_validator.js +4 -4
  166. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts +14 -0
  167. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts.map +1 -0
  168. package/dest/msg_validators/tx_validator/nullifier_cache.js +24 -0
  169. package/dest/msg_validators/tx_validator/phases_validator.d.ts +22 -2
  170. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
  171. package/dest/msg_validators/tx_validator/phases_validator.js +72 -24
  172. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +20 -4
  173. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
  174. package/dest/msg_validators/tx_validator/timestamp_validator.js +6 -6
  175. package/dest/services/data_store.d.ts +1 -1
  176. package/dest/services/data_store.d.ts.map +1 -1
  177. package/dest/services/data_store.js +10 -6
  178. package/dest/services/discv5/discV5_service.d.ts +1 -1
  179. package/dest/services/discv5/discV5_service.d.ts.map +1 -1
  180. package/dest/services/discv5/discV5_service.js +4 -2
  181. package/dest/services/dummy_service.d.ts +13 -5
  182. package/dest/services/dummy_service.d.ts.map +1 -1
  183. package/dest/services/dummy_service.js +10 -4
  184. package/dest/services/encoding.d.ts +7 -3
  185. package/dest/services/encoding.d.ts.map +1 -1
  186. package/dest/services/encoding.js +18 -11
  187. package/dest/services/gossipsub/index.d.ts +3 -0
  188. package/dest/services/gossipsub/index.d.ts.map +1 -0
  189. package/dest/services/gossipsub/index.js +2 -0
  190. package/dest/services/gossipsub/scoring.d.ts +21 -3
  191. package/dest/services/gossipsub/scoring.d.ts.map +1 -1
  192. package/dest/services/gossipsub/scoring.js +24 -7
  193. package/dest/services/gossipsub/topic_score_params.d.ts +173 -0
  194. package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -0
  195. package/dest/services/gossipsub/topic_score_params.js +346 -0
  196. package/dest/services/index.d.ts +2 -1
  197. package/dest/services/index.d.ts.map +1 -1
  198. package/dest/services/index.js +1 -0
  199. package/dest/services/libp2p/libp2p_service.d.ts +99 -49
  200. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  201. package/dest/services/libp2p/libp2p_service.js +559 -382
  202. package/dest/services/peer-manager/metrics.d.ts +3 -1
  203. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  204. package/dest/services/peer-manager/metrics.js +6 -0
  205. package/dest/services/peer-manager/peer_manager.d.ts +1 -1
  206. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  207. package/dest/services/peer-manager/peer_manager.js +6 -3
  208. package/dest/services/peer-manager/peer_scoring.d.ts +1 -1
  209. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  210. package/dest/services/peer-manager/peer_scoring.js +25 -2
  211. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +14 -10
  212. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -1
  213. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +89 -112
  214. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +4 -7
  215. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
  216. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +11 -13
  217. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -1
  218. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +31 -46
  219. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +19 -11
  220. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -1
  221. package/dest/services/reqresp/batch-tx-requester/peer_collection.js +52 -15
  222. package/dest/services/reqresp/batch-tx-requester/tx_validator.js +2 -2
  223. package/dest/services/reqresp/interface.d.ts +10 -1
  224. package/dest/services/reqresp/interface.d.ts.map +1 -1
  225. package/dest/services/reqresp/interface.js +15 -1
  226. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +7 -5
  227. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
  228. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +17 -12
  229. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +25 -14
  230. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
  231. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +40 -24
  232. package/dest/services/reqresp/protocols/tx.d.ts +7 -1
  233. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  234. package/dest/services/reqresp/protocols/tx.js +20 -0
  235. package/dest/services/reqresp/reqresp.d.ts +1 -1
  236. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  237. package/dest/services/reqresp/reqresp.js +30 -14
  238. package/dest/services/service.d.ts +45 -3
  239. package/dest/services/service.d.ts.map +1 -1
  240. package/dest/services/tx_collection/config.d.ts +22 -4
  241. package/dest/services/tx_collection/config.d.ts.map +1 -1
  242. package/dest/services/tx_collection/config.js +49 -3
  243. package/dest/services/tx_collection/fast_tx_collection.d.ts +6 -8
  244. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
  245. package/dest/services/tx_collection/fast_tx_collection.js +88 -88
  246. package/dest/services/tx_collection/file_store_tx_collection.d.ts +53 -0
  247. package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -0
  248. package/dest/services/tx_collection/file_store_tx_collection.js +167 -0
  249. package/dest/services/tx_collection/file_store_tx_source.d.ts +37 -0
  250. package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -0
  251. package/dest/services/tx_collection/file_store_tx_source.js +90 -0
  252. package/dest/services/tx_collection/index.d.ts +3 -2
  253. package/dest/services/tx_collection/index.d.ts.map +1 -1
  254. package/dest/services/tx_collection/index.js +1 -0
  255. package/dest/services/tx_collection/instrumentation.d.ts +1 -1
  256. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
  257. package/dest/services/tx_collection/instrumentation.js +2 -1
  258. package/dest/services/tx_collection/proposal_tx_collector.d.ts +15 -15
  259. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -1
  260. package/dest/services/tx_collection/proposal_tx_collector.js +6 -6
  261. package/dest/services/tx_collection/request_tracker.d.ts +53 -0
  262. package/dest/services/tx_collection/request_tracker.d.ts.map +1 -0
  263. package/dest/services/tx_collection/request_tracker.js +84 -0
  264. package/dest/services/tx_collection/slow_tx_collection.d.ts +7 -3
  265. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -1
  266. package/dest/services/tx_collection/slow_tx_collection.js +60 -26
  267. package/dest/services/tx_collection/tx_collection.d.ts +23 -13
  268. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  269. package/dest/services/tx_collection/tx_collection.js +75 -3
  270. package/dest/services/tx_collection/tx_collection_sink.d.ts +18 -8
  271. package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -1
  272. package/dest/services/tx_collection/tx_collection_sink.js +26 -29
  273. package/dest/services/tx_collection/tx_source.d.ts +8 -3
  274. package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
  275. package/dest/services/tx_collection/tx_source.js +19 -2
  276. package/dest/services/tx_file_store/config.d.ts +16 -0
  277. package/dest/services/tx_file_store/config.d.ts.map +1 -0
  278. package/dest/services/tx_file_store/config.js +22 -0
  279. package/dest/services/tx_file_store/index.d.ts +4 -0
  280. package/dest/services/tx_file_store/index.d.ts.map +1 -0
  281. package/dest/services/tx_file_store/index.js +3 -0
  282. package/dest/services/tx_file_store/instrumentation.d.ts +15 -0
  283. package/dest/services/tx_file_store/instrumentation.d.ts.map +1 -0
  284. package/dest/services/tx_file_store/instrumentation.js +29 -0
  285. package/dest/services/tx_file_store/tx_file_store.d.ts +48 -0
  286. package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -0
  287. package/dest/services/tx_file_store/tx_file_store.js +152 -0
  288. package/dest/services/tx_provider.d.ts +4 -4
  289. package/dest/services/tx_provider.d.ts.map +1 -1
  290. package/dest/services/tx_provider.js +9 -8
  291. package/dest/test-helpers/make-test-p2p-clients.d.ts +7 -8
  292. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  293. package/dest/test-helpers/make-test-p2p-clients.js +1 -2
  294. package/dest/test-helpers/mock-pubsub.d.ts +35 -4
  295. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  296. package/dest/test-helpers/mock-pubsub.js +114 -5
  297. package/dest/test-helpers/reqresp-nodes.d.ts +2 -3
  298. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  299. package/dest/test-helpers/reqresp-nodes.js +4 -3
  300. package/dest/test-helpers/testbench-utils.d.ts +43 -38
  301. package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
  302. package/dest/test-helpers/testbench-utils.js +149 -61
  303. package/dest/testbench/p2p_client_testbench_worker.d.ts +2 -2
  304. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  305. package/dest/testbench/p2p_client_testbench_worker.js +17 -16
  306. package/dest/testbench/worker_client_manager.d.ts +3 -1
  307. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  308. package/dest/testbench/worker_client_manager.js +6 -2
  309. package/dest/util.d.ts +10 -5
  310. package/dest/util.d.ts.map +1 -1
  311. package/dest/util.js +2 -9
  312. package/package.json +14 -14
  313. package/src/client/factory.ts +103 -28
  314. package/src/client/interface.ts +56 -34
  315. package/src/client/p2p_client.ts +202 -269
  316. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +19 -12
  317. package/src/config.ts +165 -44
  318. package/src/errors/tx-pool.error.ts +12 -0
  319. package/src/index.ts +1 -0
  320. package/src/mem_pools/attestation_pool/attestation_pool.ts +497 -91
  321. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +442 -102
  322. package/src/mem_pools/attestation_pool/index.ts +9 -2
  323. package/src/mem_pools/attestation_pool/mocks.ts +2 -1
  324. package/src/mem_pools/index.ts +4 -1
  325. package/src/mem_pools/instrumentation.ts +17 -13
  326. package/src/mem_pools/interface.ts +4 -4
  327. package/src/mem_pools/tx_pool/README.md +1 -1
  328. package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +2 -1
  329. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +3 -3
  330. package/src/mem_pools/tx_pool/priority.ts +4 -4
  331. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +3 -1
  332. package/src/mem_pools/tx_pool_v2/README.md +283 -0
  333. package/src/mem_pools/tx_pool_v2/archive/index.ts +1 -0
  334. package/src/mem_pools/tx_pool_v2/archive/tx_archive.ts +120 -0
  335. package/src/mem_pools/tx_pool_v2/deleted_pool.ts +321 -0
  336. package/src/mem_pools/tx_pool_v2/eviction/eviction_manager.ts +160 -0
  337. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +122 -0
  338. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +125 -0
  339. package/src/mem_pools/tx_pool_v2/eviction/index.ts +27 -0
  340. package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +219 -0
  341. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +74 -0
  342. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +101 -0
  343. package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +91 -0
  344. package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +99 -0
  345. package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +32 -0
  346. package/src/mem_pools/tx_pool_v2/index.ts +12 -0
  347. package/src/mem_pools/tx_pool_v2/instrumentation.ts +69 -0
  348. package/src/mem_pools/tx_pool_v2/interfaces.ts +247 -0
  349. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +337 -0
  350. package/src/mem_pools/tx_pool_v2/tx_pool_bench_metrics.ts +77 -0
  351. package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +430 -0
  352. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +238 -0
  353. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +1105 -0
  354. package/src/msg_validators/attestation_validator/README.md +49 -0
  355. package/src/msg_validators/attestation_validator/attestation_validator.ts +5 -4
  356. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +2 -2
  357. package/src/msg_validators/clock_tolerance.ts +4 -3
  358. package/src/msg_validators/proposal_validator/README.md +123 -0
  359. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +14 -4
  360. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +20 -7
  361. package/src/msg_validators/proposal_validator/proposal_validator.ts +69 -45
  362. package/src/msg_validators/tx_validator/README.md +119 -0
  363. package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +5 -5
  364. package/src/msg_validators/tx_validator/allowed_public_setup.ts +22 -27
  365. package/src/msg_validators/tx_validator/allowed_setup_helpers.ts +31 -0
  366. package/src/msg_validators/tx_validator/block_header_validator.ts +15 -3
  367. package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
  368. package/src/msg_validators/tx_validator/data_validator.ts +42 -1
  369. package/src/msg_validators/tx_validator/double_spend_validator.ts +11 -6
  370. package/src/msg_validators/tx_validator/factory.ts +394 -78
  371. package/src/msg_validators/tx_validator/fee_payer_balance.ts +6 -2
  372. package/src/msg_validators/tx_validator/gas_validator.ts +123 -27
  373. package/src/msg_validators/tx_validator/index.ts +2 -0
  374. package/src/msg_validators/tx_validator/metadata_validator.ts +12 -4
  375. package/src/msg_validators/tx_validator/nullifier_cache.ts +30 -0
  376. package/src/msg_validators/tx_validator/phases_validator.ts +82 -27
  377. package/src/msg_validators/tx_validator/timestamp_validator.ts +23 -18
  378. package/src/services/data_store.ts +10 -7
  379. package/src/services/discv5/discV5_service.ts +4 -2
  380. package/src/services/dummy_service.ts +18 -6
  381. package/src/services/encoding.ts +18 -10
  382. package/src/services/gossipsub/README.md +641 -0
  383. package/src/services/gossipsub/index.ts +2 -0
  384. package/src/services/gossipsub/scoring.ts +29 -5
  385. package/src/services/gossipsub/topic_score_params.ts +487 -0
  386. package/src/services/index.ts +1 -0
  387. package/src/services/libp2p/libp2p_service.ts +584 -415
  388. package/src/services/peer-manager/metrics.ts +7 -0
  389. package/src/services/peer-manager/peer_manager.ts +7 -3
  390. package/src/services/peer-manager/peer_scoring.ts +25 -0
  391. package/src/services/reqresp/README.md +229 -0
  392. package/src/services/reqresp/batch-tx-requester/README.md +60 -21
  393. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +89 -122
  394. package/src/services/reqresp/batch-tx-requester/interface.ts +3 -6
  395. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +30 -71
  396. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +68 -24
  397. package/src/services/reqresp/batch-tx-requester/tx_validator.ts +2 -2
  398. package/src/services/reqresp/interface.ts +26 -1
  399. package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +24 -15
  400. package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +47 -24
  401. package/src/services/reqresp/protocols/tx.ts +22 -0
  402. package/src/services/reqresp/reqresp.ts +35 -15
  403. package/src/services/service.ts +58 -2
  404. package/src/services/tx_collection/config.ts +74 -6
  405. package/src/services/tx_collection/fast_tx_collection.ts +94 -97
  406. package/src/services/tx_collection/file_store_tx_collection.ts +202 -0
  407. package/src/services/tx_collection/file_store_tx_source.ts +117 -0
  408. package/src/services/tx_collection/index.ts +2 -1
  409. package/src/services/tx_collection/instrumentation.ts +7 -1
  410. package/src/services/tx_collection/proposal_tx_collector.ts +21 -27
  411. package/src/services/tx_collection/request_tracker.ts +127 -0
  412. package/src/services/tx_collection/slow_tx_collection.ts +66 -33
  413. package/src/services/tx_collection/tx_collection.ts +114 -19
  414. package/src/services/tx_collection/tx_collection_sink.ts +30 -34
  415. package/src/services/tx_collection/tx_source.ts +22 -3
  416. package/src/services/tx_file_store/config.ts +37 -0
  417. package/src/services/tx_file_store/index.ts +3 -0
  418. package/src/services/tx_file_store/instrumentation.ts +36 -0
  419. package/src/services/tx_file_store/tx_file_store.ts +175 -0
  420. package/src/services/tx_provider.ts +10 -9
  421. package/src/test-helpers/make-test-p2p-clients.ts +4 -6
  422. package/src/test-helpers/mock-pubsub.ts +155 -9
  423. package/src/test-helpers/reqresp-nodes.ts +5 -7
  424. package/src/test-helpers/testbench-utils.ts +156 -74
  425. package/src/testbench/p2p_client_testbench_worker.ts +24 -22
  426. package/src/testbench/worker_client_manager.ts +13 -5
  427. package/src/util.ts +16 -14
  428. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +0 -40
  429. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +0 -1
  430. package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +0 -218
  431. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +0 -31
  432. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +0 -1
  433. package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +0 -180
  434. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +0 -23
  435. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +0 -1
  436. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +0 -212
  437. package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +0 -320
  438. package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +0 -264
  439. package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +0 -230
@@ -1,6 +1,13 @@
1
+ import type { SlotNumber } from '@aztec/foundation/branded-types';
1
2
  import type { EthAddress } from '@aztec/foundation/eth-address';
2
3
  import type { PeerInfo } from '@aztec/stdlib/interfaces/server';
3
- import type { BlockProposal, CheckpointAttestation, CheckpointProposalCore, Gossipable } from '@aztec/stdlib/p2p';
4
+ import type {
5
+ BlockProposal,
6
+ CheckpointAttestation,
7
+ CheckpointProposalCore,
8
+ Gossipable,
9
+ TopicType,
10
+ } from '@aztec/stdlib/p2p';
4
11
  import type { Tx } from '@aztec/stdlib/tx';
5
12
 
6
13
  import type { PeerId } from '@libp2p/interface';
@@ -43,6 +50,32 @@ export type P2PCheckpointReceivedCallback = (
43
50
 
44
51
  export type AuthReceivedCallback = (peerId: PeerId, authRequest: AuthRequest) => Promise<AuthResponse | undefined>;
45
52
 
53
+ /** Minimal info passed to the duplicate proposal callback. */
54
+ export type DuplicateProposalInfo = {
55
+ slot: SlotNumber;
56
+ proposer: EthAddress;
57
+ type: 'checkpoint' | 'block';
58
+ };
59
+
60
+ /**
61
+ * Callback for when a duplicate proposal is detected (equivocation).
62
+ * Invoked on the first duplicate (when count goes from 1 to 2).
63
+ */
64
+ export type P2PDuplicateProposalCallback = (info: DuplicateProposalInfo) => void;
65
+
66
+ /** Minimal info passed to the duplicate attestation callback. */
67
+ export type DuplicateAttestationInfo = {
68
+ slot: SlotNumber;
69
+ attester: EthAddress;
70
+ };
71
+
72
+ /**
73
+ * Callback for when a duplicate attestation is detected (equivocation).
74
+ * A validator signing attestations for different proposals at the same slot.
75
+ * Invoked on the first duplicate (when count goes from 1 to 2).
76
+ */
77
+ export type P2PDuplicateAttestationCallback = (info: DuplicateAttestationInfo) => void;
78
+
46
79
  /**
47
80
  * The interface for a P2P service implementation.
48
81
  */
@@ -86,11 +119,27 @@ export interface P2PService {
86
119
 
87
120
  registerCheckpointReceivedCallback(callback: P2PCheckpointReceivedCallback): void;
88
121
 
122
+ /**
123
+ * Registers a callback invoked when a duplicate proposal is detected (equivocation).
124
+ * The callback is triggered on the first duplicate (when count goes from 1 to 2).
125
+ */
126
+ registerDuplicateProposalCallback(callback: P2PDuplicateProposalCallback): void;
127
+
128
+ /**
129
+ * Registers a callback invoked when a duplicate attestation is detected (equivocation).
130
+ * A validator signing attestations for different proposals at the same slot.
131
+ * The callback is triggered on the first duplicate (when count goes from 1 to 2).
132
+ */
133
+ registerDuplicateAttestationCallback(callback: P2PDuplicateAttestationCallback): void;
134
+
89
135
  getEnr(): ENR | undefined;
90
136
 
91
137
  getPeers(includePending?: boolean): PeerInfo[];
92
138
 
93
- validate(txs: Tx[]): Promise<void>;
139
+ /** Returns the number of peers in the GossipSub mesh for a given topic type. */
140
+ getGossipMeshPeerCount(topicType: TopicType): number;
141
+
142
+ validateTxsReceivedInBlockProposal(txs: Tx[]): Promise<void>;
94
143
 
95
144
  addReqRespSubProtocol(
96
145
  subProtocol: ReqRespSubProtocol,
@@ -147,6 +196,13 @@ export interface PeerDiscoveryService extends EventEmitter {
147
196
  on(event: 'peer:discovered', listener: (enr: ENR) => void): this;
148
197
  emit(event: 'peer:discovered', enr: ENR): boolean;
149
198
 
199
+ /**
200
+ * Event emitted when our public IP is discovered or changes via discv5 peer interactions.
201
+ * Only emitted when enrUpdate is enabled (i.e. queryForIp=true and no static p2pIp).
202
+ */
203
+ on(event: 'ip:changed', listener: (ip: string) => void): this;
204
+ emit(event: 'ip:changed', ip: string): boolean;
205
+
150
206
  getStatus(): PeerDiscoveryState;
151
207
 
152
208
  getEnr(): ENR | undefined;
@@ -6,7 +6,7 @@ import {
6
6
  } from '@aztec/foundation/config';
7
7
  import { MAX_RPC_TXS_LEN } from '@aztec/stdlib/interfaces/api-limit';
8
8
 
9
- export type ProposalTxCollectorType = 'new' | 'old';
9
+ export type MissingTxsCollectorType = 'new' | 'old';
10
10
 
11
11
  export type TxCollectionConfig = {
12
12
  /** How long to wait before starting reqresp for fast collection */
@@ -29,8 +29,26 @@ export type TxCollectionConfig = {
29
29
  txCollectionFastMaxParallelRequestsPerNode: number;
30
30
  /** Maximum number of transactions to request from a node in a single batch */
31
31
  txCollectionNodeRpcMaxBatchSize: number;
32
- /** Which collector implementation to use for proposal tx collection */
33
- txCollectionProposalTxCollectorType: ProposalTxCollectorType;
32
+ /** Which collector implementation to use for missing txs collection */
33
+ txCollectionMissingTxsCollectorType: MissingTxsCollectorType;
34
+ /** A comma-separated list of file store URLs (s3://, gs://, file://, http://) for tx collection */
35
+ txCollectionFileStoreUrls: string[];
36
+ /** Delay in ms before file store collection starts after slow collection is triggered */
37
+ txCollectionFileStoreSlowDelayMs: number;
38
+ /** Delay in ms before file store collection starts after fast collection is triggered */
39
+ txCollectionFileStoreFastDelayMs: number;
40
+ /** Number of concurrent workers for fast file store collection */
41
+ txCollectionFileStoreFastWorkerCount: number;
42
+ /** Number of concurrent workers for slow file store collection */
43
+ txCollectionFileStoreSlowWorkerCount: number;
44
+ /** Base backoff time in ms for fast file store collection retries */
45
+ txCollectionFileStoreFastBackoffBaseMs: number;
46
+ /** Base backoff time in ms for slow file store collection retries */
47
+ txCollectionFileStoreSlowBackoffBaseMs: number;
48
+ /** Max backoff time in ms for fast file store collection retries */
49
+ txCollectionFileStoreFastBackoffMaxMs: number;
50
+ /** Max backoff time in ms for slow file store collection retries */
51
+ txCollectionFileStoreSlowBackoffMaxMs: number;
34
52
  };
35
53
 
36
54
  export const txCollectionConfigMappings: ConfigMappingsType<TxCollectionConfig> = {
@@ -90,9 +108,59 @@ export const txCollectionConfigMappings: ConfigMappingsType<TxCollectionConfig>
90
108
  description: 'Maximum number of transactions to request from a node in a single batch',
91
109
  ...numberConfigHelper(MAX_RPC_TXS_LEN),
92
110
  },
93
- txCollectionProposalTxCollectorType: {
94
- env: 'TX_COLLECTION_PROPOSAL_TX_COLLECTOR_TYPE',
95
- description: 'Which collector implementation to use for proposal tx collection (new or old)',
111
+ txCollectionMissingTxsCollectorType: {
112
+ env: 'TX_COLLECTION_MISSING_TXS_COLLECTOR_TYPE',
113
+ description: 'Which collector implementation to use for missing txs collection (new or old)',
96
114
  ...enumConfigHelper(['new', 'old'] as const, 'new'),
97
115
  },
116
+ txCollectionFileStoreUrls: {
117
+ env: 'TX_COLLECTION_FILE_STORE_URLS',
118
+ description: 'A comma-separated list of file store URLs (s3://, gs://, file://, http://) for tx collection',
119
+ parseEnv: (val: string) =>
120
+ val
121
+ .split(',')
122
+ .map(url => url.trim())
123
+ .filter(url => url.length > 0),
124
+ defaultValue: [],
125
+ },
126
+ txCollectionFileStoreSlowDelayMs: {
127
+ env: 'TX_COLLECTION_FILE_STORE_SLOW_DELAY_MS',
128
+ description: 'Delay before file store collection starts after slow collection',
129
+ ...numberConfigHelper(24_000),
130
+ },
131
+ txCollectionFileStoreFastDelayMs: {
132
+ env: 'TX_COLLECTION_FILE_STORE_FAST_DELAY_MS',
133
+ description: 'Delay before file store collection starts after fast collection',
134
+ ...numberConfigHelper(2_000),
135
+ },
136
+ txCollectionFileStoreFastWorkerCount: {
137
+ env: 'TX_COLLECTION_FILE_STORE_FAST_WORKER_COUNT',
138
+ description: 'Number of concurrent workers for fast file store collection',
139
+ ...numberConfigHelper(5),
140
+ },
141
+ txCollectionFileStoreSlowWorkerCount: {
142
+ env: 'TX_COLLECTION_FILE_STORE_SLOW_WORKER_COUNT',
143
+ description: 'Number of concurrent workers for slow file store collection',
144
+ ...numberConfigHelper(2),
145
+ },
146
+ txCollectionFileStoreFastBackoffBaseMs: {
147
+ env: 'TX_COLLECTION_FILE_STORE_FAST_BACKOFF_BASE_MS',
148
+ description: 'Base backoff time in ms for fast file store collection retries',
149
+ ...numberConfigHelper(1_000),
150
+ },
151
+ txCollectionFileStoreSlowBackoffBaseMs: {
152
+ env: 'TX_COLLECTION_FILE_STORE_SLOW_BACKOFF_BASE_MS',
153
+ description: 'Base backoff time in ms for slow file store collection retries',
154
+ ...numberConfigHelper(5_000),
155
+ },
156
+ txCollectionFileStoreFastBackoffMaxMs: {
157
+ env: 'TX_COLLECTION_FILE_STORE_FAST_BACKOFF_MAX_MS',
158
+ description: 'Max backoff time in ms for fast file store collection retries',
159
+ ...numberConfigHelper(5_000),
160
+ },
161
+ txCollectionFileStoreSlowBackoffMaxMs: {
162
+ env: 'TX_COLLECTION_FILE_STORE_SLOW_BACKOFF_MAX_MS',
163
+ description: 'Max backoff time in ms for slow file store collection retries',
164
+ ...numberConfigHelper(30_000),
165
+ },
98
166
  };
@@ -1,56 +1,53 @@
1
1
  import { BlockNumber } from '@aztec/foundation/branded-types';
2
2
  import { times } from '@aztec/foundation/collection';
3
- import { AbortError, TimeoutError } from '@aztec/foundation/error';
4
3
  import { type Logger, createLogger } from '@aztec/foundation/log';
5
- import { boundInclusive } from '@aztec/foundation/number';
6
- import { promiseWithResolvers } from '@aztec/foundation/promise';
7
4
  import { sleep } from '@aztec/foundation/sleep';
8
5
  import { DateProvider, elapsed } from '@aztec/foundation/timer';
9
6
  import type { L2BlockInfo } from '@aztec/stdlib/block';
10
- import type { BlockProposal } from '@aztec/stdlib/p2p';
11
7
  import { type Tx, TxHash } from '@aztec/stdlib/tx';
12
8
 
13
9
  import type { PeerId } from '@libp2p/interface';
14
10
 
15
11
  import type { BatchTxRequesterConfig } from '../reqresp/batch-tx-requester/config.js';
16
12
  import type { BatchTxRequesterLibP2PService } from '../reqresp/batch-tx-requester/interface.js';
17
- import { ReqRespSubProtocol } from '../reqresp/interface.js';
18
- import { chunkTxHashesRequest } from '../reqresp/protocols/tx.js';
19
13
  import type { TxCollectionConfig } from './config.js';
20
14
  import {
21
15
  BatchTxRequesterCollector,
22
- type ProposalTxCollector,
16
+ type MissingTxsCollector,
23
17
  SendBatchRequestCollector,
24
18
  } from './proposal_tx_collector.js';
19
+ import { RequestTracker } from './request_tracker.js';
25
20
  import type { FastCollectionRequest, FastCollectionRequestInput } from './tx_collection.js';
26
- import type { TxCollectionSink } from './tx_collection_sink.js';
21
+ import type { TxAddContext, TxCollectionSink } from './tx_collection_sink.js';
27
22
  import type { TxSource } from './tx_source.js';
28
23
 
29
24
  export class FastTxCollection {
30
25
  // eslint-disable-next-line aztec-custom/no-non-primitive-in-collections
31
26
  protected requests: Set<FastCollectionRequest> = new Set();
32
- private proposalTxCollector: ProposalTxCollector;
27
+ private missingTxsCollector: MissingTxsCollector;
33
28
 
34
29
  constructor(
35
- private p2pService: BatchTxRequesterLibP2PService,
30
+ p2pService: BatchTxRequesterLibP2PService,
36
31
  private nodes: TxSource[],
37
32
  private txCollectionSink: TxCollectionSink,
38
33
  private config: TxCollectionConfig,
39
34
  private dateProvider: DateProvider = new DateProvider(),
40
35
  private log: Logger = createLogger('p2p:tx_collection_service'),
41
- proposalTxCollector?: ProposalTxCollector,
36
+ missingTxsCollector?: MissingTxsCollector,
42
37
  ) {
43
38
  const batchTxRequesterConfig = this.config as Partial<BatchTxRequesterConfig>;
44
- const proposalCollectorType = this.config.txCollectionProposalTxCollectorType;
45
- this.proposalTxCollector =
46
- proposalTxCollector ??
47
- (proposalCollectorType === 'old'
39
+ const missingTxsCollectorType = this.config.txCollectionMissingTxsCollectorType;
40
+ this.missingTxsCollector =
41
+ missingTxsCollector ??
42
+ (missingTxsCollectorType === 'old'
48
43
  ? new SendBatchRequestCollector(p2pService)
49
44
  : new BatchTxRequesterCollector(p2pService, log, dateProvider, undefined, batchTxRequesterConfig));
50
45
  }
51
46
 
52
47
  public async stop() {
53
- this.requests.forEach(request => request.promise.reject(new AbortError(`Stopped collection service`)));
48
+ this.requests.forEach(request => {
49
+ request.requestTracker.cancel();
50
+ });
54
51
  await Promise.resolve();
55
52
  }
56
53
 
@@ -77,81 +74,65 @@ export class FastTxCollection {
77
74
  ? { ...input.blockProposal.toBlockInfo(), blockNumber: input.blockNumber }
78
75
  : { ...input.block.toBlockInfo() };
79
76
 
80
- // This promise is used to await for the collection to finish during the main collectFast method.
81
- // It gets resolved in `foundTxs` when all txs have been collected, or rejected if the request is aborted or hits the deadline.
82
- const promise = promiseWithResolvers<void>();
83
- setTimeout(() => promise.reject(new TimeoutError(`Timed out while collecting txs`)), timeout);
84
-
85
77
  const request: FastCollectionRequest = {
86
78
  ...input,
87
79
  blockInfo,
88
- promise,
89
- foundTxs: new Map<string, Tx>(),
90
- missingTxHashes: new Set(txHashes.map(t => t.toString())),
91
- deadline: opts.deadline,
80
+ requestTracker: RequestTracker.create(txHashes, opts.deadline, this.dateProvider),
92
81
  };
93
82
 
94
83
  const [duration] = await elapsed(() => this.collectFast(request, { ...opts }));
95
84
 
96
85
  this.log.verbose(
97
- `Collected ${request.foundTxs.size} txs out of ${txHashes.length} for ${input.type} at slot ${blockInfo.slotNumber}`,
86
+ `Collected ${request.requestTracker.collectedTxs.length} txs out of ${txHashes.length} for ${input.type} at slot ${blockInfo.slotNumber}`,
98
87
  {
99
88
  ...blockInfo,
100
89
  duration,
101
90
  requestType: input.type,
102
- missingTxs: [...request.missingTxHashes],
91
+ missingTxs: [...request.requestTracker.missingTxHashes],
103
92
  },
104
93
  );
105
- return [...request.foundTxs.values()];
94
+ return request.requestTracker.collectedTxs;
106
95
  }
107
96
 
108
- protected async collectFast(
109
- request: FastCollectionRequest,
110
- opts: { proposal?: BlockProposal; deadline: Date; pinnedPeer?: PeerId },
111
- ) {
97
+ protected async collectFast(request: FastCollectionRequest, opts: { pinnedPeer?: PeerId }) {
112
98
  this.requests.add(request);
113
99
  const { blockInfo } = request;
114
100
 
115
101
  this.log.debug(
116
- `Starting fast collection of ${request.missingTxHashes.size} txs for ${request.type} at slot ${blockInfo.slotNumber}`,
117
- { ...blockInfo, requestType: request.type, deadline: opts.deadline },
102
+ `Starting fast collection of ${request.requestTracker.numberOfMissingTxs} txs for ${request.type} at slot ${blockInfo.slotNumber}`,
103
+ { ...blockInfo, requestType: request.type, deadline: request.requestTracker.deadline },
118
104
  );
119
105
 
120
106
  try {
121
107
  // Start blasting all nodes for the txs. We give them a little time to respond before we start reqresp.
122
- // And keep an eye on the request promise to ensure we don't wait longer than the deadline or return as soon
123
- // as we have collected all txs, whatever the source.
124
- const nodeCollectionPromise = this.collectFastFromNodes(request, opts);
108
+ // We race against the cancellation token to exit as soon as all txs are collected, the deadline expires,
109
+ // or the request is externally cancelled.
110
+ const nodeCollectionPromise = this.collectFastFromNodes(request);
125
111
  const waitBeforeReqResp = sleep(this.config.txCollectionFastNodesTimeoutBeforeReqRespMs);
126
- await Promise.race([request.promise.promise, waitBeforeReqResp]);
112
+ await Promise.race([request.requestTracker.cancellationToken, waitBeforeReqResp]);
127
113
 
128
- // If we have collected all txs, we can stop here
129
- if (request.missingTxHashes.size === 0) {
130
- this.log.debug(`All txs collected for slot ${blockInfo.slotNumber} without reqresp`, blockInfo);
114
+ // If we have collected all txs or the request was cancelled, we can stop here.
115
+ // Wait for node collection to settle so inner tasks finish before we return.
116
+ if (request.requestTracker.checkCancelled()) {
117
+ if (request.requestTracker.allFetched()) {
118
+ this.log.debug(`All txs collected for slot ${blockInfo.slotNumber} without reqresp`, blockInfo);
119
+ }
120
+ await nodeCollectionPromise;
131
121
  return;
132
122
  }
133
123
 
134
124
  // Start blasting reqresp for the remaining txs. Note that node collection keeps running in parallel.
135
125
  // We stop when we have collected all txs, timed out, or both node collection and reqresp have given up.
136
- const collectionPromise = Promise.allSettled([this.collectFastViaReqResp(request, opts), nodeCollectionPromise]);
137
- await Promise.race([collectionPromise, request.promise.promise]);
126
+ // Inner tasks observe requestTracker.checkCancelled() and stop themselves, so this settles shortly after cancellation.
127
+ await Promise.allSettled([this.collectFastViaReqResp(request, opts), nodeCollectionPromise]);
138
128
  } catch (err) {
139
- // Log and swallow all errors
140
- const logCtx = {
129
+ this.log.error(`Error collecting txs for ${request.type} for slot ${blockInfo.slotNumber}`, err, {
141
130
  ...blockInfo,
142
- errorMessage: err instanceof Error ? err.message : undefined,
143
- missingTxs: [...request.missingTxHashes].map(txHash => txHash.toString()),
144
- };
145
- if (err instanceof Error && err.name === 'TimeoutError') {
146
- this.log.warn(`Timed out collecting txs for ${request.type} at slot ${blockInfo.slotNumber}`, logCtx);
147
- } else if (err instanceof Error && err.name === 'AbortError') {
148
- this.log.warn(`Aborted collecting txs for ${request.type} at slot ${blockInfo.slotNumber}`, logCtx);
149
- } else {
150
- this.log.error(`Error collecting txs for ${request.type} for slot ${blockInfo.slotNumber}`, err, logCtx);
151
- }
131
+ missingTxs: request.requestTracker.missingTxHashes.values().map(txHash => txHash.toString()),
132
+ });
152
133
  } finally {
153
134
  // Ensure no unresolved promises and remove the request from the set
154
- request.promise.resolve();
135
+ request.requestTracker.cancel();
155
136
  this.requests.delete(request);
156
137
  }
157
138
  }
@@ -162,26 +143,28 @@ export class FastTxCollection {
162
143
  * the txs that have been requested less often whenever we need to send a new batch of requests. We ensure that no
163
144
  * tx is requested more than once at the same time to the same node.
164
145
  */
165
- private async collectFastFromNodes(request: FastCollectionRequest, opts: { deadline: Date }): Promise<void> {
146
+ private async collectFastFromNodes(request: FastCollectionRequest): Promise<void> {
166
147
  if (this.nodes.length === 0) {
167
148
  return;
168
149
  }
169
150
 
170
151
  // Keep a shared priority queue of all txs pending to be requested, sorted by the number of attempts made to collect them.
171
- const attemptsPerTx = [...request.missingTxHashes].map(txHash => ({ txHash, attempts: 0, found: false }));
152
+ const attemptsPerTx = [...request.requestTracker.missingTxHashes].map(txHash => ({
153
+ txHash,
154
+ attempts: 0,
155
+ found: false,
156
+ }));
172
157
 
173
158
  // Returns once we have finished all node loops. Each loop finishes when the deadline is hit, or all txs have been collected.
174
- await Promise.allSettled(this.nodes.map(node => this.collectFastFromNode(request, node, attemptsPerTx, opts)));
159
+ await Promise.allSettled(this.nodes.map(node => this.collectFastFromNode(request, node, attemptsPerTx)));
175
160
  }
176
161
 
177
162
  private async collectFastFromNode(
178
163
  request: FastCollectionRequest,
179
164
  node: TxSource,
180
165
  attemptsPerTx: { txHash: string; attempts: number; found: boolean }[],
181
- opts: { deadline: Date },
182
166
  ) {
183
- const notFinished = () =>
184
- this.dateProvider.now() <= +opts.deadline && request.missingTxHashes.size > 0 && this.requests.has(request);
167
+ const notFinished = () => !request.requestTracker.checkCancelled();
185
168
 
186
169
  const maxParallelRequests = this.config.txCollectionFastMaxParallelRequestsPerNode;
187
170
  const maxBatchSize = this.config.txCollectionNodeRpcMaxBatchSize;
@@ -198,7 +181,7 @@ export class FastTxCollection {
198
181
  if (!txToRequest) {
199
182
  // No more txs to process
200
183
  break;
201
- } else if (!request.missingTxHashes.has(txToRequest.txHash)) {
184
+ } else if (!request.requestTracker.isMissing(txToRequest.txHash)) {
202
185
  // Mark as found if it was found somewhere else, we'll then remove it from the array.
203
186
  // We don't delete it now since 'array.splice' is pretty expensive, so we do it after sorting.
204
187
  txToRequest.found = true;
@@ -227,16 +210,24 @@ export class FastTxCollection {
227
210
  return;
228
211
  }
229
212
 
213
+ const txHashes = batch.map(({ txHash }) => txHash);
230
214
  // Collect this batch from the node
231
215
  await this.txCollectionSink.collect(
232
- txHashes => node.getTxsByHash(txHashes),
233
- batch.map(({ txHash }) => TxHash.fromString(txHash)),
216
+ async () => {
217
+ const result = await node.getTxsByHash(txHashes.map(TxHash.fromString));
218
+ for (const tx of result.validTxs) {
219
+ request.requestTracker.markFetched(tx);
220
+ }
221
+ return result;
222
+ },
223
+ txHashes,
234
224
  {
235
225
  description: `fast ${node.getInfo()}`,
236
226
  node: node.getInfo(),
237
227
  method: 'fast-node-rpc',
238
228
  ...request.blockInfo,
239
229
  },
230
+ this.getAddContext(request),
240
231
  );
241
232
 
242
233
  // Clear from the active requests the txs we just requested
@@ -244,9 +235,12 @@ export class FastTxCollection {
244
235
  activeRequestsToThisNode.delete(requestedTx.txHash);
245
236
  }
246
237
 
247
- // Sleep a bit until hitting the node again (or not, depending on config)
238
+ // Sleep a bit until hitting the node again, but wake up immediately on cancellation
248
239
  if (notFinished()) {
249
- await sleep(this.config.txCollectionFastNodeIntervalMs);
240
+ await Promise.race([
241
+ sleep(this.config.txCollectionFastNodeIntervalMs),
242
+ request.requestTracker.cancellationToken,
243
+ ]);
250
244
  }
251
245
  }
252
246
  };
@@ -256,56 +250,64 @@ export class FastTxCollection {
256
250
  }
257
251
 
258
252
  private async collectFastViaReqResp(request: FastCollectionRequest, opts: { pinnedPeer?: PeerId }) {
259
- const timeoutMs = +request.deadline - this.dateProvider.now();
260
253
  const pinnedPeer = opts.pinnedPeer;
261
- const maxPeers = boundInclusive(Math.ceil(request.missingTxHashes.size / 2), 8, 32);
262
- const maxRetryAttempts = 5;
263
254
  const blockInfo = request.blockInfo;
264
255
  const slotNumber = blockInfo.slotNumber;
265
- if (timeoutMs < 100) {
256
+ if (request.requestTracker.timeoutMs < 100) {
266
257
  this.log.warn(
267
258
  `Not initiating fast reqresp for txs for ${request.type} at slot ${blockInfo.slotNumber} due to timeout`,
268
- { timeoutMs, ...blockInfo },
259
+ { timeoutMs: request.requestTracker.timeoutMs, ...blockInfo },
269
260
  );
270
261
  return;
271
262
  }
272
263
 
273
264
  this.log.debug(
274
- `Starting fast reqresp for ${request.missingTxHashes.size} txs for ${request.type} at slot ${blockInfo.slotNumber}`,
275
- { ...blockInfo, timeoutMs, pinnedPeer },
265
+ `Starting fast reqresp for ${request.requestTracker.numberOfMissingTxs} txs for ${request.type} at slot ${blockInfo.slotNumber}`,
266
+ { ...blockInfo, timeoutMs: request.requestTracker.timeoutMs, pinnedPeer },
276
267
  );
277
268
 
278
269
  try {
279
270
  await this.txCollectionSink.collect(
280
- async txHashes => {
271
+ async () => {
272
+ let result: Tx[];
281
273
  if (request.type === 'proposal') {
282
- return await this.proposalTxCollector.collectTxs(txHashes, request.blockProposal, pinnedPeer, timeoutMs);
283
- } else if (request.type === 'block') {
284
- const txs = await this.p2pService.reqResp.sendBatchRequest<ReqRespSubProtocol.TX>(
285
- ReqRespSubProtocol.TX,
286
- chunkTxHashesRequest(txHashes),
274
+ result = await this.missingTxsCollector.collectTxs(
275
+ request.requestTracker,
276
+ request.blockProposal,
287
277
  pinnedPeer,
288
- timeoutMs,
289
- maxPeers,
290
- maxRetryAttempts,
291
278
  );
292
-
293
- return txs.flat();
279
+ } else if (request.type === 'block') {
280
+ const blockTxsSource = {
281
+ txHashes: request.block.body.txEffects.map(e => e.txHash),
282
+ archive: request.block.archive.root,
283
+ };
284
+ result = await this.missingTxsCollector.collectTxs(request.requestTracker, blockTxsSource, pinnedPeer);
294
285
  } else {
295
286
  throw new Error(`Unknown request type: ${(request as any).type}`);
296
287
  }
288
+ return { validTxs: result, invalidTxHashes: [] };
297
289
  },
298
- Array.from(request.missingTxHashes).map(txHash => TxHash.fromString(txHash)),
290
+ Array.from(request.requestTracker.missingTxHashes),
299
291
  { description: `reqresp for slot ${slotNumber}`, method: 'fast-req-resp', ...opts, ...request.blockInfo },
292
+ this.getAddContext(request),
300
293
  );
301
294
  } catch (err) {
302
295
  this.log.error(`Error sending fast reqresp request for txs`, err, {
303
- txs: [...request.missingTxHashes],
296
+ txs: [...request.requestTracker.missingTxHashes],
304
297
  ...blockInfo,
305
298
  });
306
299
  }
307
300
  }
308
301
 
302
+ /** Returns the TxAddContext for the given request, used by the sink to add txs to the pool correctly. */
303
+ private getAddContext(request: FastCollectionRequest): TxAddContext {
304
+ if (request.type === 'proposal') {
305
+ return { type: 'proposal', blockHeader: request.blockProposal.blockHeader };
306
+ } else {
307
+ return { type: 'mined', block: request.block };
308
+ }
309
+ }
310
+
309
311
  /**
310
312
  * Handle txs by marking them as found for the requests that are waiting for them, and resolves the request if all its txs have been found.
311
313
  * Called internally and from the main tx collection manager whenever the tx pool emits a tx-added event.
@@ -315,21 +317,18 @@ export class FastTxCollection {
315
317
  for (const tx of txs) {
316
318
  const txHash = tx.txHash.toString();
317
319
  // Remove the tx hash from the missing set, and add it to the found set.
318
- if (request.missingTxHashes.has(txHash)) {
319
- request.missingTxHashes.delete(txHash);
320
- request.foundTxs.set(txHash, tx);
320
+ if (request.requestTracker.markFetched(tx)) {
321
321
  this.log.trace(`Found tx ${txHash} for fast collection request`, {
322
322
  ...request.blockInfo,
323
323
  txHash: tx.txHash.toString(),
324
324
  type: request.type,
325
325
  });
326
- // If we found all txs for this request, we resolve the promise
327
- if (request.missingTxHashes.size === 0) {
326
+ if (request.requestTracker.allFetched()) {
328
327
  this.log.trace(`All txs found for fast collection request`, {
329
328
  ...request.blockInfo,
330
329
  type: request.type,
331
330
  });
332
- request.promise.resolve();
331
+ break;
333
332
  }
334
333
  }
335
334
  }
@@ -343,8 +342,7 @@ export class FastTxCollection {
343
342
  public stopCollectingForBlocksUpTo(blockNumber: BlockNumber): void {
344
343
  for (const request of this.requests) {
345
344
  if (request.blockInfo.blockNumber <= blockNumber) {
346
- request.promise.reject(new AbortError(`Stopped collecting txs up to block ${blockNumber}`));
347
- this.requests.delete(request);
345
+ request.requestTracker.cancel();
348
346
  }
349
347
  }
350
348
  }
@@ -356,8 +354,7 @@ export class FastTxCollection {
356
354
  public stopCollectingForBlocksAfter(blockNumber: BlockNumber): void {
357
355
  for (const request of this.requests) {
358
356
  if (request.blockInfo.blockNumber > blockNumber) {
359
- request.promise.reject(new AbortError(`Stopped collecting txs after block ${blockNumber}`));
360
- this.requests.delete(request);
357
+ request.requestTracker.cancel();
361
358
  }
362
359
  }
363
360
  }