@aztec/p2p 0.0.1-commit.e61ad554 → 0.0.1-commit.ec5f612

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 (445) 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 +10 -10
  5. package/dest/client/factory.d.ts.map +1 -1
  6. package/dest/client/factory.js +45 -18
  7. package/dest/client/interface.d.ts +46 -33
  8. package/dest/client/interface.d.ts.map +1 -1
  9. package/dest/client/p2p_client.d.ts +41 -51
  10. package/dest/client/p2p_client.d.ts.map +1 -1
  11. package/dest/client/p2p_client.js +156 -200
  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 +304 -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 +35 -7
  19. package/dest/config.d.ts.map +1 -1
  20. package/dest/config.js +21 -7
  21. package/dest/errors/tx-pool.error.d.ts +8 -0
  22. package/dest/errors/tx-pool.error.d.ts.map +1 -0
  23. package/dest/errors/tx-pool.error.js +9 -0
  24. package/dest/index.d.ts +2 -1
  25. package/dest/index.d.ts.map +1 -1
  26. package/dest/index.js +1 -0
  27. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +104 -88
  28. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  29. package/dest/mem_pools/attestation_pool/attestation_pool.js +441 -3
  30. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +2 -2
  31. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
  32. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +353 -87
  33. package/dest/mem_pools/attestation_pool/index.d.ts +2 -3
  34. package/dest/mem_pools/attestation_pool/index.d.ts.map +1 -1
  35. package/dest/mem_pools/attestation_pool/index.js +1 -2
  36. package/dest/mem_pools/attestation_pool/mocks.d.ts +2 -2
  37. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  38. package/dest/mem_pools/attestation_pool/mocks.js +2 -2
  39. package/dest/mem_pools/index.d.ts +3 -2
  40. package/dest/mem_pools/index.d.ts.map +1 -1
  41. package/dest/mem_pools/index.js +1 -1
  42. package/dest/mem_pools/instrumentation.d.ts +1 -1
  43. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  44. package/dest/mem_pools/instrumentation.js +2 -2
  45. package/dest/mem_pools/interface.d.ts +5 -5
  46. package/dest/mem_pools/interface.d.ts.map +1 -1
  47. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +3 -3
  48. package/dest/mem_pools/tx_pool_v2/archive/index.d.ts +2 -0
  49. package/dest/mem_pools/tx_pool_v2/archive/index.d.ts.map +1 -0
  50. package/dest/mem_pools/tx_pool_v2/archive/index.js +1 -0
  51. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts +43 -0
  52. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts.map +1 -0
  53. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.js +103 -0
  54. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +104 -0
  55. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -0
  56. package/dest/mem_pools/tx_pool_v2/deleted_pool.js +251 -0
  57. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts +47 -0
  58. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts.map +1 -0
  59. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.js +128 -0
  60. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +17 -0
  61. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -0
  62. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +93 -0
  63. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +19 -0
  64. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -0
  65. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +97 -0
  66. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +10 -0
  67. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -0
  68. package/dest/mem_pools/tx_pool_v2/eviction/index.js +11 -0
  69. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +174 -0
  70. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -0
  71. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.js +25 -0
  72. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts +15 -0
  73. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -0
  74. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +65 -0
  75. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts +17 -0
  76. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -0
  77. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +93 -0
  78. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +16 -0
  79. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -0
  80. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +78 -0
  81. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +20 -0
  82. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -0
  83. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +73 -0
  84. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +15 -0
  85. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -0
  86. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +19 -0
  87. package/dest/mem_pools/tx_pool_v2/index.d.ts +6 -0
  88. package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -0
  89. package/dest/mem_pools/tx_pool_v2/index.js +5 -0
  90. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts +15 -0
  91. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts.map +1 -0
  92. package/dest/mem_pools/tx_pool_v2/instrumentation.js +43 -0
  93. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +211 -0
  94. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -0
  95. package/dest/mem_pools/tx_pool_v2/interfaces.js +9 -0
  96. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +119 -0
  97. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -0
  98. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +193 -0
  99. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts +26 -0
  100. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts.map +1 -0
  101. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.js +70 -0
  102. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +108 -0
  103. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -0
  104. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +354 -0
  105. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +60 -0
  106. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -0
  107. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +161 -0
  108. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +77 -0
  109. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -0
  110. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +905 -0
  111. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +3 -3
  112. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
  113. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +7 -2
  114. package/dest/msg_validators/proposal_validator/proposal_validator.js +5 -5
  115. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +4 -4
  116. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  117. package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +3 -3
  118. package/dest/msg_validators/tx_validator/archive_cache.d.ts +3 -3
  119. package/dest/msg_validators/tx_validator/archive_cache.d.ts.map +1 -1
  120. package/dest/msg_validators/tx_validator/archive_cache.js +1 -1
  121. package/dest/msg_validators/tx_validator/block_header_validator.d.ts +20 -6
  122. package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
  123. package/dest/msg_validators/tx_validator/block_header_validator.js +5 -4
  124. package/dest/msg_validators/tx_validator/data_validator.d.ts +3 -1
  125. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  126. package/dest/msg_validators/tx_validator/data_validator.js +4 -1
  127. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +15 -4
  128. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
  129. package/dest/msg_validators/tx_validator/double_spend_validator.js +7 -6
  130. package/dest/msg_validators/tx_validator/factory.d.ts +118 -5
  131. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  132. package/dest/msg_validators/tx_validator/factory.js +228 -57
  133. package/dest/msg_validators/tx_validator/gas_validator.d.ts +59 -3
  134. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  135. package/dest/msg_validators/tx_validator/gas_validator.js +76 -38
  136. package/dest/msg_validators/tx_validator/index.d.ts +2 -1
  137. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  138. package/dest/msg_validators/tx_validator/index.js +1 -0
  139. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +3 -2
  140. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  141. package/dest/msg_validators/tx_validator/metadata_validator.js +2 -2
  142. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts +14 -0
  143. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts.map +1 -0
  144. package/dest/msg_validators/tx_validator/nullifier_cache.js +24 -0
  145. package/dest/msg_validators/tx_validator/phases_validator.d.ts +3 -2
  146. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
  147. package/dest/msg_validators/tx_validator/phases_validator.js +3 -3
  148. package/dest/msg_validators/tx_validator/size_validator.d.ts +3 -1
  149. package/dest/msg_validators/tx_validator/size_validator.d.ts.map +1 -1
  150. package/dest/msg_validators/tx_validator/size_validator.js +4 -1
  151. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +22 -5
  152. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
  153. package/dest/msg_validators/tx_validator/timestamp_validator.js +8 -8
  154. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts +3 -2
  155. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts.map +1 -1
  156. package/dest/msg_validators/tx_validator/tx_permitted_validator.js +2 -2
  157. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +3 -2
  158. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
  159. package/dest/msg_validators/tx_validator/tx_proof_validator.js +2 -2
  160. package/dest/services/data_store.d.ts +1 -1
  161. package/dest/services/data_store.d.ts.map +1 -1
  162. package/dest/services/data_store.js +10 -6
  163. package/dest/services/discv5/discV5_service.js +1 -1
  164. package/dest/services/dummy_service.d.ts +24 -4
  165. package/dest/services/dummy_service.d.ts.map +1 -1
  166. package/dest/services/dummy_service.js +46 -1
  167. package/dest/services/encoding.d.ts +3 -3
  168. package/dest/services/encoding.d.ts.map +1 -1
  169. package/dest/services/encoding.js +11 -10
  170. package/dest/services/gossipsub/index.d.ts +3 -0
  171. package/dest/services/gossipsub/index.d.ts.map +1 -0
  172. package/dest/services/gossipsub/index.js +2 -0
  173. package/dest/services/gossipsub/scoring.d.ts +21 -3
  174. package/dest/services/gossipsub/scoring.d.ts.map +1 -1
  175. package/dest/services/gossipsub/scoring.js +24 -7
  176. package/dest/services/gossipsub/topic_score_params.d.ts +173 -0
  177. package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -0
  178. package/dest/services/gossipsub/topic_score_params.js +346 -0
  179. package/dest/services/index.d.ts +2 -1
  180. package/dest/services/index.d.ts.map +1 -1
  181. package/dest/services/index.js +1 -0
  182. package/dest/services/libp2p/instrumentation.d.ts +1 -1
  183. package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
  184. package/dest/services/libp2p/instrumentation.js +14 -3
  185. package/dest/services/libp2p/libp2p_service.d.ts +100 -42
  186. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  187. package/dest/services/libp2p/libp2p_service.js +451 -359
  188. package/dest/services/peer-manager/metrics.d.ts +2 -2
  189. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  190. package/dest/services/peer-manager/metrics.js +20 -5
  191. package/dest/services/peer-manager/peer_scoring.d.ts +1 -1
  192. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  193. package/dest/services/peer-manager/peer_scoring.js +33 -4
  194. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +48 -0
  195. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -0
  196. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +539 -0
  197. package/dest/services/reqresp/batch-tx-requester/config.d.ts +17 -0
  198. package/dest/services/reqresp/batch-tx-requester/config.d.ts.map +1 -0
  199. package/dest/services/reqresp/batch-tx-requester/config.js +27 -0
  200. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +46 -0
  201. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -0
  202. package/dest/services/reqresp/batch-tx-requester/interface.js +1 -0
  203. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +34 -0
  204. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -0
  205. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +130 -0
  206. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +60 -0
  207. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -0
  208. package/dest/services/reqresp/batch-tx-requester/peer_collection.js +173 -0
  209. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +20 -0
  210. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -0
  211. package/dest/services/reqresp/batch-tx-requester/tx_validator.js +21 -0
  212. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +22 -3
  213. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +1 -1
  214. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +63 -4
  215. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +2 -1
  216. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -1
  217. package/dest/services/reqresp/connection-sampler/connection_sampler.js +12 -0
  218. package/dest/services/reqresp/interface.d.ts +12 -1
  219. package/dest/services/reqresp/interface.d.ts.map +1 -1
  220. package/dest/services/reqresp/interface.js +15 -1
  221. package/dest/services/reqresp/metrics.d.ts +6 -5
  222. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  223. package/dest/services/reqresp/metrics.js +17 -5
  224. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +5 -1
  225. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -1
  226. package/dest/services/reqresp/protocols/block_txs/bitvector.js +5 -0
  227. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +7 -5
  228. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
  229. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +27 -9
  230. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +29 -6
  231. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
  232. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +59 -13
  233. package/dest/services/reqresp/protocols/tx.d.ts +7 -1
  234. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  235. package/dest/services/reqresp/protocols/tx.js +20 -0
  236. package/dest/services/reqresp/reqresp.d.ts +6 -1
  237. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  238. package/dest/services/reqresp/reqresp.js +71 -27
  239. package/dest/services/service.d.ts +42 -3
  240. package/dest/services/service.d.ts.map +1 -1
  241. package/dest/services/tx_collection/config.d.ts +22 -1
  242. package/dest/services/tx_collection/config.d.ts.map +1 -1
  243. package/dest/services/tx_collection/config.js +55 -1
  244. package/dest/services/tx_collection/fast_tx_collection.d.ts +7 -4
  245. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
  246. package/dest/services/tx_collection/fast_tx_collection.js +71 -44
  247. package/dest/services/tx_collection/file_store_tx_collection.d.ts +53 -0
  248. package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -0
  249. package/dest/services/tx_collection/file_store_tx_collection.js +167 -0
  250. package/dest/services/tx_collection/file_store_tx_source.d.ts +37 -0
  251. package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -0
  252. package/dest/services/tx_collection/file_store_tx_source.js +90 -0
  253. package/dest/services/tx_collection/index.d.ts +3 -1
  254. package/dest/services/tx_collection/index.d.ts.map +1 -1
  255. package/dest/services/tx_collection/index.js +2 -0
  256. package/dest/services/tx_collection/instrumentation.d.ts +1 -1
  257. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
  258. package/dest/services/tx_collection/instrumentation.js +10 -2
  259. package/dest/services/tx_collection/missing_txs_tracker.d.ts +32 -0
  260. package/dest/services/tx_collection/missing_txs_tracker.d.ts.map +1 -0
  261. package/dest/services/tx_collection/missing_txs_tracker.js +27 -0
  262. package/dest/services/tx_collection/proposal_tx_collector.d.ts +49 -0
  263. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -0
  264. package/dest/services/tx_collection/proposal_tx_collector.js +50 -0
  265. package/dest/services/tx_collection/slow_tx_collection.d.ts +7 -3
  266. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -1
  267. package/dest/services/tx_collection/slow_tx_collection.js +60 -26
  268. package/dest/services/tx_collection/tx_collection.d.ts +25 -12
  269. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  270. package/dest/services/tx_collection/tx_collection.js +79 -7
  271. package/dest/services/tx_collection/tx_collection_sink.d.ts +18 -8
  272. package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -1
  273. package/dest/services/tx_collection/tx_collection_sink.js +26 -29
  274. package/dest/services/tx_collection/tx_source.d.ts +8 -3
  275. package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
  276. package/dest/services/tx_collection/tx_source.js +19 -2
  277. package/dest/services/tx_file_store/config.d.ts +16 -0
  278. package/dest/services/tx_file_store/config.d.ts.map +1 -0
  279. package/dest/services/tx_file_store/config.js +22 -0
  280. package/dest/services/tx_file_store/index.d.ts +4 -0
  281. package/dest/services/tx_file_store/index.d.ts.map +1 -0
  282. package/dest/services/tx_file_store/index.js +3 -0
  283. package/dest/services/tx_file_store/instrumentation.d.ts +15 -0
  284. package/dest/services/tx_file_store/instrumentation.d.ts.map +1 -0
  285. package/dest/services/tx_file_store/instrumentation.js +29 -0
  286. package/dest/services/tx_file_store/tx_file_store.d.ts +48 -0
  287. package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -0
  288. package/dest/services/tx_file_store/tx_file_store.js +152 -0
  289. package/dest/services/tx_provider.d.ts +4 -4
  290. package/dest/services/tx_provider.d.ts.map +1 -1
  291. package/dest/services/tx_provider.js +9 -8
  292. package/dest/services/tx_provider_instrumentation.d.ts +1 -1
  293. package/dest/services/tx_provider_instrumentation.d.ts.map +1 -1
  294. package/dest/services/tx_provider_instrumentation.js +5 -5
  295. package/dest/test-helpers/index.d.ts +3 -1
  296. package/dest/test-helpers/index.d.ts.map +1 -1
  297. package/dest/test-helpers/index.js +2 -0
  298. package/dest/test-helpers/make-test-p2p-clients.d.ts +7 -8
  299. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  300. package/dest/test-helpers/make-test-p2p-clients.js +1 -2
  301. package/dest/test-helpers/mock-pubsub.d.ts +30 -4
  302. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  303. package/dest/test-helpers/mock-pubsub.js +105 -4
  304. package/dest/test-helpers/reqresp-nodes.d.ts +2 -3
  305. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  306. package/dest/test-helpers/reqresp-nodes.js +4 -3
  307. package/dest/test-helpers/test_tx_provider.d.ts +40 -0
  308. package/dest/test-helpers/test_tx_provider.d.ts.map +1 -0
  309. package/dest/test-helpers/test_tx_provider.js +41 -0
  310. package/dest/test-helpers/testbench-utils.d.ts +163 -0
  311. package/dest/test-helpers/testbench-utils.d.ts.map +1 -0
  312. package/dest/test-helpers/testbench-utils.js +366 -0
  313. package/dest/testbench/p2p_client_testbench_worker.d.ts +28 -2
  314. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  315. package/dest/testbench/p2p_client_testbench_worker.js +219 -138
  316. package/dest/testbench/worker_client_manager.d.ts +51 -6
  317. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  318. package/dest/testbench/worker_client_manager.js +226 -44
  319. package/dest/util.d.ts +2 -2
  320. package/dest/util.d.ts.map +1 -1
  321. package/package.json +14 -14
  322. package/src/bootstrap/bootstrap.ts +7 -4
  323. package/src/client/factory.ts +83 -36
  324. package/src/client/interface.ts +56 -34
  325. package/src/client/p2p_client.ts +192 -247
  326. package/src/client/test/tx_proposal_collector/README.md +227 -0
  327. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +345 -0
  328. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.ts +43 -0
  329. package/src/config.ts +47 -11
  330. package/src/errors/tx-pool.error.ts +12 -0
  331. package/src/index.ts +1 -0
  332. package/src/mem_pools/attestation_pool/attestation_pool.ts +496 -91
  333. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +442 -102
  334. package/src/mem_pools/attestation_pool/index.ts +9 -2
  335. package/src/mem_pools/attestation_pool/mocks.ts +2 -1
  336. package/src/mem_pools/index.ts +4 -1
  337. package/src/mem_pools/instrumentation.ts +2 -1
  338. package/src/mem_pools/interface.ts +4 -4
  339. package/src/mem_pools/tx_pool/README.md +1 -1
  340. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +3 -3
  341. package/src/mem_pools/tx_pool_v2/README.md +275 -0
  342. package/src/mem_pools/tx_pool_v2/archive/index.ts +1 -0
  343. package/src/mem_pools/tx_pool_v2/archive/tx_archive.ts +120 -0
  344. package/src/mem_pools/tx_pool_v2/deleted_pool.ts +321 -0
  345. package/src/mem_pools/tx_pool_v2/eviction/eviction_manager.ts +160 -0
  346. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +121 -0
  347. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +125 -0
  348. package/src/mem_pools/tx_pool_v2/eviction/index.ts +27 -0
  349. package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +209 -0
  350. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +74 -0
  351. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +101 -0
  352. package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +91 -0
  353. package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +90 -0
  354. package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +31 -0
  355. package/src/mem_pools/tx_pool_v2/index.ts +12 -0
  356. package/src/mem_pools/tx_pool_v2/instrumentation.ts +69 -0
  357. package/src/mem_pools/tx_pool_v2/interfaces.ts +242 -0
  358. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +297 -0
  359. package/src/mem_pools/tx_pool_v2/tx_pool_bench_metrics.ts +77 -0
  360. package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +444 -0
  361. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +223 -0
  362. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +1083 -0
  363. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +10 -4
  364. package/src/msg_validators/proposal_validator/proposal_validator.ts +5 -5
  365. package/src/msg_validators/tx_validator/README.md +115 -0
  366. package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +5 -5
  367. package/src/msg_validators/tx_validator/archive_cache.ts +3 -3
  368. package/src/msg_validators/tx_validator/block_header_validator.ts +22 -11
  369. package/src/msg_validators/tx_validator/data_validator.ts +6 -2
  370. package/src/msg_validators/tx_validator/double_spend_validator.ts +15 -9
  371. package/src/msg_validators/tx_validator/factory.ts +372 -55
  372. package/src/msg_validators/tx_validator/gas_validator.ts +98 -29
  373. package/src/msg_validators/tx_validator/index.ts +1 -0
  374. package/src/msg_validators/tx_validator/metadata_validator.ts +6 -3
  375. package/src/msg_validators/tx_validator/nullifier_cache.ts +30 -0
  376. package/src/msg_validators/tx_validator/phases_validator.ts +5 -3
  377. package/src/msg_validators/tx_validator/size_validator.ts +6 -2
  378. package/src/msg_validators/tx_validator/timestamp_validator.ts +29 -21
  379. package/src/msg_validators/tx_validator/tx_permitted_validator.ts +8 -3
  380. package/src/msg_validators/tx_validator/tx_proof_validator.ts +8 -3
  381. package/src/services/data_store.ts +10 -7
  382. package/src/services/discv5/discV5_service.ts +1 -1
  383. package/src/services/dummy_service.ts +59 -2
  384. package/src/services/encoding.ts +9 -9
  385. package/src/services/gossipsub/README.md +641 -0
  386. package/src/services/gossipsub/index.ts +2 -0
  387. package/src/services/gossipsub/scoring.ts +29 -5
  388. package/src/services/gossipsub/topic_score_params.ts +487 -0
  389. package/src/services/index.ts +1 -0
  390. package/src/services/libp2p/instrumentation.ts +15 -2
  391. package/src/services/libp2p/libp2p_service.ts +496 -397
  392. package/src/services/peer-manager/metrics.ts +21 -4
  393. package/src/services/peer-manager/peer_scoring.ts +29 -1
  394. package/src/services/reqresp/batch-tx-requester/README.md +305 -0
  395. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +678 -0
  396. package/src/services/reqresp/batch-tx-requester/config.ts +40 -0
  397. package/src/services/reqresp/batch-tx-requester/interface.ts +53 -0
  398. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +161 -0
  399. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +244 -0
  400. package/src/services/reqresp/batch-tx-requester/tx_validator.ts +37 -0
  401. package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +65 -4
  402. package/src/services/reqresp/connection-sampler/connection_sampler.ts +16 -0
  403. package/src/services/reqresp/interface.ts +29 -1
  404. package/src/services/reqresp/metrics.ts +34 -9
  405. package/src/services/reqresp/protocols/block_txs/bitvector.ts +7 -0
  406. package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +35 -12
  407. package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +74 -9
  408. package/src/services/reqresp/protocols/tx.ts +22 -0
  409. package/src/services/reqresp/reqresp.ts +82 -23
  410. package/src/services/service.ts +55 -2
  411. package/src/services/tx_collection/config.ts +83 -1
  412. package/src/services/tx_collection/fast_tx_collection.ts +93 -47
  413. package/src/services/tx_collection/file_store_tx_collection.ts +202 -0
  414. package/src/services/tx_collection/file_store_tx_source.ts +117 -0
  415. package/src/services/tx_collection/index.ts +6 -0
  416. package/src/services/tx_collection/instrumentation.ts +17 -2
  417. package/src/services/tx_collection/missing_txs_tracker.ts +52 -0
  418. package/src/services/tx_collection/proposal_tx_collector.ts +113 -0
  419. package/src/services/tx_collection/slow_tx_collection.ts +66 -33
  420. package/src/services/tx_collection/tx_collection.ts +117 -20
  421. package/src/services/tx_collection/tx_collection_sink.ts +30 -34
  422. package/src/services/tx_collection/tx_source.ts +22 -3
  423. package/src/services/tx_file_store/config.ts +37 -0
  424. package/src/services/tx_file_store/index.ts +3 -0
  425. package/src/services/tx_file_store/instrumentation.ts +36 -0
  426. package/src/services/tx_file_store/tx_file_store.ts +175 -0
  427. package/src/services/tx_provider.ts +10 -9
  428. package/src/services/tx_provider_instrumentation.ts +11 -5
  429. package/src/test-helpers/index.ts +2 -0
  430. package/src/test-helpers/make-test-p2p-clients.ts +3 -5
  431. package/src/test-helpers/mock-pubsub.ts +146 -9
  432. package/src/test-helpers/reqresp-nodes.ts +4 -6
  433. package/src/test-helpers/test_tx_provider.ts +64 -0
  434. package/src/test-helpers/testbench-utils.ts +430 -0
  435. package/src/testbench/p2p_client_testbench_worker.ts +333 -131
  436. package/src/testbench/worker_client_manager.ts +304 -47
  437. package/src/util.ts +7 -1
  438. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +0 -40
  439. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +0 -1
  440. package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +0 -218
  441. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +0 -31
  442. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +0 -1
  443. package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +0 -180
  444. package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +0 -320
  445. package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +0 -264
@@ -0,0 +1,40 @@
1
+ import { type ConfigMappingsType, numberConfigHelper } from '@aztec/foundation/config';
2
+
3
+ export const DEFAULT_BATCH_TX_REQUESTER_SMART_PARALLEL_WORKER_COUNT = 10;
4
+ export const DEFAULT_BATCH_TX_REQUESTER_DUMB_PARALLEL_WORKER_COUNT = 10;
5
+ export const DEFAULT_BATCH_TX_REQUESTER_TX_BATCH_SIZE = 8;
6
+ export const DEFAULT_BATCH_TX_REQUESTER_BAD_PEER_THRESHOLD = 2;
7
+
8
+ export interface BatchTxRequesterConfig {
9
+ /** Max concurrent requests to smart peers. */
10
+ batchTxRequesterSmartParallelWorkerCount: number;
11
+ /** Max concurrent requests to dumb peers. */
12
+ batchTxRequesterDumbParallelWorkerCount: number;
13
+ /** Max transactions per request / chunk size. */
14
+ batchTxRequesterTxBatchSize: number;
15
+ /** Failures before a peer is considered bad (see > threshold logic). */
16
+ batchTxRequesterBadPeerThreshold: number;
17
+ }
18
+
19
+ export const batchTxRequesterConfigMappings: ConfigMappingsType<BatchTxRequesterConfig> = {
20
+ batchTxRequesterSmartParallelWorkerCount: {
21
+ env: 'P2P_BATCH_TX_REQUESTER_SMART_PARALLEL_WORKER_COUNT',
22
+ description: 'Max concurrent requests to smart peers for batch tx requester.',
23
+ ...numberConfigHelper(DEFAULT_BATCH_TX_REQUESTER_SMART_PARALLEL_WORKER_COUNT),
24
+ },
25
+ batchTxRequesterDumbParallelWorkerCount: {
26
+ env: 'P2P_BATCH_TX_REQUESTER_DUMB_PARALLEL_WORKER_COUNT',
27
+ description: 'Max concurrent requests to dumb peers for batch tx requester.',
28
+ ...numberConfigHelper(DEFAULT_BATCH_TX_REQUESTER_DUMB_PARALLEL_WORKER_COUNT),
29
+ },
30
+ batchTxRequesterTxBatchSize: {
31
+ env: 'P2P_BATCH_TX_REQUESTER_TX_BATCH_SIZE',
32
+ description: 'Max transactions per request / chunk size for batch tx requester.',
33
+ ...numberConfigHelper(DEFAULT_BATCH_TX_REQUESTER_TX_BATCH_SIZE),
34
+ },
35
+ batchTxRequesterBadPeerThreshold: {
36
+ env: 'P2P_BATCH_TX_REQUESTER_BAD_PEER_THRESHOLD',
37
+ description: 'Failures before a peer is considered bad (see > threshold logic).',
38
+ ...numberConfigHelper(DEFAULT_BATCH_TX_REQUESTER_BAD_PEER_THRESHOLD),
39
+ },
40
+ };
@@ -0,0 +1,53 @@
1
+ import type { ISemaphore } from '@aztec/foundation/queue';
2
+ import type { PeerErrorSeverity } from '@aztec/stdlib/p2p';
3
+ import type { Tx, TxHash } from '@aztec/stdlib/tx';
4
+
5
+ import type { PeerId } from '@libp2p/interface';
6
+
7
+ import type { ConnectionSampler } from '../connection-sampler/connection_sampler.js';
8
+ import type { ReqRespInterface } from '../interface.js';
9
+ import type { IPeerCollection } from './peer_collection.js';
10
+ import type { BatchRequestTxValidatorConfig, IBatchRequestTxValidator } from './tx_validator.js';
11
+
12
+ export interface IPeerPenalizer {
13
+ penalizePeer(peerId: PeerId, penalty: PeerErrorSeverity): void;
14
+ }
15
+
16
+ export interface ITxMetadataCollection {
17
+ getMissingTxHashes(): Set<string>;
18
+ markFetched(peerId: PeerId, tx: Tx): boolean;
19
+ getTxsToRequestFromThePeer(peer: PeerId): TxHash[];
20
+ markRequested(txHash: TxHash): void;
21
+ markInFlightBySmartPeer(txHash: TxHash): void;
22
+ markNotInFlightBySmartPeer(txHash: TxHash): void;
23
+ alreadyFetched(txHash: TxHash): boolean;
24
+ // Returns true if tx was marked as fetched, false if it was already marked as fetched
25
+ markPeerHas(peerId: PeerId, txHashes: TxHash[]): void;
26
+ }
27
+
28
+ /**
29
+ * Interface for BatchTxRequester dependencies that can be injected from upstream
30
+ */
31
+ export interface BatchTxRequesterLibP2PService {
32
+ /** ReqResp interface for sending requests to peers */
33
+ reqResp: Pick<ReqRespInterface, 'sendBatchRequest' | 'sendRequestToPeer'>;
34
+ /** Connection sampler for getting peer lists */
35
+ connectionSampler: Pick<ConnectionSampler, 'getPeerListSortedByConnectionCountAsc'>;
36
+ /** Configuration needed for transaction validation */
37
+ txValidatorConfig: BatchRequestTxValidatorConfig;
38
+ /** Peer scoring for penalizing peers */
39
+ peerScoring: IPeerPenalizer;
40
+ }
41
+
42
+ export interface BatchTxRequesterOptions {
43
+ smartParallelWorkerCount?: number;
44
+ dumbParallelWorkerCount?: number;
45
+ txBatchSize?: number;
46
+ badPeerThreshold?: number;
47
+ //Injectable for testing purposes
48
+ semaphore?: ISemaphore;
49
+ peerCollection?: IPeerCollection;
50
+ abortSignal?: AbortSignal;
51
+ /** Optional tx validator for testing - if not provided, one is created from p2pService.txValidatorConfig */
52
+ txValidator?: IBatchRequestTxValidator;
53
+ }
@@ -0,0 +1,161 @@
1
+ import { type Tx, TxHash } from '@aztec/stdlib/tx';
2
+
3
+ import type { PeerId } from '@libp2p/interface';
4
+
5
+ import type { IMissingTxsTracker } from '../../tx_collection/missing_txs_tracker.js';
6
+ import { DEFAULT_BATCH_TX_REQUESTER_TX_BATCH_SIZE } from './config.js';
7
+ import type { ITxMetadataCollection } from './interface.js';
8
+
9
+ class MissingTxMetadata {
10
+ constructor(
11
+ public readonly txHash: string,
12
+ public requestedCount = 0,
13
+ public inFlightCount = 0,
14
+ public tx: Tx | undefined = undefined,
15
+ public readonly peers = new Set<string>(),
16
+ ) {}
17
+
18
+ public markAsRequested() {
19
+ this.requestedCount++;
20
+ }
21
+
22
+ public markInFlight() {
23
+ this.inFlightCount++;
24
+ }
25
+
26
+ public markNotInFlight() {
27
+ this.inFlightCount = Math.max(--this.inFlightCount, 0);
28
+ }
29
+
30
+ public isInFlight(): boolean {
31
+ return this.inFlightCount > 0;
32
+ }
33
+ }
34
+
35
+ /*
36
+ * Single source or truth for transactions we are fetching
37
+ * This could be better optimized but given expected count of missing txs (N < 100)
38
+ * At the moment there is no need for it. And benefit is that we have everything in single store
39
+ * */
40
+ export class MissingTxMetadataCollection implements ITxMetadataCollection {
41
+ private txMetadata = new Map<string, MissingTxMetadata>();
42
+
43
+ constructor(
44
+ private missingTxsTracker: IMissingTxsTracker,
45
+ private readonly txBatchSize: number = DEFAULT_BATCH_TX_REQUESTER_TX_BATCH_SIZE,
46
+ ) {
47
+ missingTxsTracker.missingTxHashes.forEach(hash => this.txMetadata.set(hash, new MissingTxMetadata(hash)));
48
+ }
49
+
50
+ public getPrioritizingNotInFlightAndLowerRequestCount(txs: string[]): MissingTxMetadata[] {
51
+ const filtered = Array.from(this.txMetadata.values()).filter(txMeta => txs.includes(txMeta.txHash.toString()));
52
+
53
+ const [notInFlight, inFlight] = filtered.reduce<[MissingTxMetadata[], MissingTxMetadata[]]>(
54
+ (buckets, tx) => {
55
+ tx.isInFlight() ? buckets[1].push(tx) : buckets[0].push(tx);
56
+ return buckets;
57
+ },
58
+ [[], []],
59
+ );
60
+
61
+ notInFlight.sort((a, b) => a.requestedCount - b.requestedCount);
62
+ inFlight.sort((a, b) => a.inFlightCount - b.inFlightCount);
63
+
64
+ return [...notInFlight, ...inFlight];
65
+ }
66
+
67
+ public getMissingTxHashes(): Set<string> {
68
+ return this.missingTxsTracker.missingTxHashes;
69
+ }
70
+
71
+ public getTxsPeerHas(peer: PeerId): Set<string> {
72
+ const peerIdStr = peer.toString();
73
+ const txsPeerHas = new Set<string>();
74
+
75
+ this.txMetadata.values().forEach(txMeta => {
76
+ if (txMeta.peers.has(peerIdStr)) {
77
+ txsPeerHas.add(txMeta.txHash.toString());
78
+ }
79
+ });
80
+
81
+ return txsPeerHas;
82
+ }
83
+
84
+ public getTxsToRequestFromThePeer(peer: PeerId): TxHash[] {
85
+ const txsPeerHas = this.getTxsPeerHas(peer);
86
+ const missingTxHashes = this.getMissingTxHashes();
87
+
88
+ const txsToRequest = txsPeerHas.intersection(missingTxHashes);
89
+
90
+ if (txsToRequest.size >= this.txBatchSize) {
91
+ return this.getPrioritizingNotInFlightAndLowerRequestCount(Array.from(txsToRequest))
92
+ .map(t => TxHash.fromString(t.txHash))
93
+ .slice(0, this.txBatchSize);
94
+ }
95
+
96
+ // Otherwise fill the txs to request till txBatchSize with random txs we are missing
97
+ // Who knows, maybe we get lucky and peer received these txs in the meantime
98
+
99
+ const countToFill = this.txBatchSize - txsToRequest.size;
100
+ const txsToFill = this.getPrioritizingNotInFlightAndLowerRequestCount(
101
+ Array.from(this.getMissingTxHashes().difference(txsToRequest)),
102
+ )
103
+ .slice(0, countToFill)
104
+ .map(t => TxHash.fromString(t.txHash));
105
+
106
+ return [...Array.from(txsToRequest).map(t => TxHash.fromString(t)), ...txsToFill];
107
+ }
108
+
109
+ public markRequested(txHash: TxHash) {
110
+ this.txMetadata.get(txHash.toString())?.markAsRequested();
111
+ }
112
+
113
+ /*
114
+ * This should be called only when requesting tx from smart peer
115
+ * Because the smart peer should return this tx, whereas
116
+ * "dumb" peer might return it, or might not - we don't know
117
+ * */
118
+ public markInFlightBySmartPeer(txHash: TxHash) {
119
+ this.txMetadata.get(txHash.toString())?.markInFlight();
120
+ }
121
+
122
+ /*
123
+ * This should be called only when requesting tx from smart peer
124
+ * Because the smart peer should return this tx, whereas
125
+ * "dumb" peer might return it, or might not - we don't know*/
126
+ public markNotInFlightBySmartPeer(txHash: TxHash) {
127
+ this.txMetadata.get(txHash.toString())?.markNotInFlight();
128
+ }
129
+
130
+ public alreadyFetched(txHash: TxHash): boolean {
131
+ return !this.missingTxsTracker.isMissing(txHash.toString());
132
+ }
133
+
134
+ public markFetched(peerId: PeerId, tx: Tx): boolean {
135
+ const txHashStr = tx.txHash.toString();
136
+ const txMeta = this.txMetadata.get(txHashStr);
137
+ if (!txMeta) {
138
+ //TODO: what to do about peer which sent txs we didn't request?
139
+ // 1. don't request from it in the scope of this batch request
140
+ // 2. ban it immediately?
141
+ // 3. track it and ban it?
142
+ //
143
+ return false;
144
+ }
145
+
146
+ txMeta.peers.add(peerId.toString());
147
+ return this.missingTxsTracker.markFetched(tx);
148
+ }
149
+
150
+ public markPeerHas(peerId: PeerId, txHash: TxHash[]) {
151
+ const peerIdStr = peerId.toString();
152
+ txHash
153
+ .map(t => t.toString())
154
+ .forEach(txh => {
155
+ const txMeta = this.txMetadata.get(txh);
156
+ if (txMeta) {
157
+ txMeta.peers.add(peerIdStr);
158
+ }
159
+ });
160
+ }
161
+ }
@@ -0,0 +1,244 @@
1
+ import type { DateProvider } from '@aztec/foundation/timer';
2
+ import type { PeerErrorSeverity } from '@aztec/stdlib/p2p';
3
+
4
+ import type { PeerId } from '@libp2p/interface';
5
+ import { peerIdFromString } from '@libp2p/peer-id';
6
+
7
+ import type { ConnectionSampler } from '../connection-sampler/connection_sampler.js';
8
+ import { DEFAULT_BATCH_TX_REQUESTER_BAD_PEER_THRESHOLD } from './config.js';
9
+ import type { IPeerPenalizer } from './interface.js';
10
+
11
+ export const RATE_LIMIT_EXCEEDED_PEER_CACHE_TTL = 1000; // 1s
12
+
13
+ export interface IPeerCollection {
14
+ markPeerSmart(peerId: PeerId): void;
15
+
16
+ /** Sample next peer in round-robin fashion. No smart peers if returns undefined */
17
+ nextSmartPeerToQuery(): PeerId | undefined;
18
+ /** Sample next peer in round-robin fashion. No dumb peers if returns undefined */
19
+ nextDumbPeerToQuery(): PeerId | undefined;
20
+
21
+ thereAreSomeDumbRatelimitExceededPeers(): boolean;
22
+ penalisePeer(peerId: PeerId, severity: PeerErrorSeverity): void;
23
+ unMarkPeerAsBad(peerId: PeerId): void;
24
+ getBadPeers(): Set<string>;
25
+ markPeerInFlight(peerId: PeerId): void;
26
+ unMarkPeerInFlight(peerId: PeerId): void;
27
+ markPeerRateLimitExceeded(peerId: PeerId): void;
28
+ getRateLimitExceededPeers(): Set<string>;
29
+ getPeerRateLimitDelayMs(peerId: PeerId): number | undefined;
30
+ getNextDumbPeerAvailabilityDelayMs(): number | undefined;
31
+ getNextSmartPeerAvailabilityDelayMs(): number | undefined;
32
+ }
33
+
34
+ export class PeerCollection implements IPeerCollection {
35
+ private readonly smartPeers = new Set<string>();
36
+ private readonly inFlightPeers = new Set<string>();
37
+ private readonly rateLimitExceededPeers = new Map<string, number>();
38
+ private readonly peerPenaltyCounters = new Map<string, number>();
39
+ private readonly badPeers = new Set<string>();
40
+
41
+ constructor(
42
+ private readonly connectionSampler: Pick<ConnectionSampler, 'getPeerListSortedByConnectionCountAsc'>,
43
+ private readonly pinnedPeerId: PeerId | undefined,
44
+ private readonly dateProvider: DateProvider,
45
+ private readonly badPeerThreshold: number = DEFAULT_BATCH_TX_REQUESTER_BAD_PEER_THRESHOLD,
46
+ private readonly peerPenalizer?: IPeerPenalizer,
47
+ ) {
48
+ // Pinned peer is treated specially, always mark it as in-flight
49
+ // and never return it as part of smart/dumb peers
50
+ if (this.pinnedPeerId) {
51
+ const peerIdStr = this.pinnedPeerId.toString();
52
+ this.inFlightPeers.add(peerIdStr);
53
+ }
54
+ }
55
+
56
+ public markPeerSmart(peerId: PeerId): void {
57
+ this.smartPeers.add(peerId.toString());
58
+ }
59
+
60
+ // We keep track of all peers that are queried for peer sampling algorithm
61
+ private queriedSmartPeers: Set<string> = new Set<string>();
62
+ private queriedDumbPeers: Set<string> = new Set<string>();
63
+
64
+ private static nextPeer(allPeers: Set<string>, queried: Set<string>): PeerId | undefined {
65
+ if (allPeers.size === 0) {
66
+ return undefined;
67
+ }
68
+ const availablePeers = allPeers.difference(queried);
69
+ let [first] = availablePeers;
70
+ if (first === undefined) {
71
+ // We queried all peers. Start over
72
+ [first] = allPeers;
73
+ queried.clear();
74
+ }
75
+ queried.add(first);
76
+ return peerIdFromString(first);
77
+ }
78
+
79
+ public nextSmartPeerToQuery(): PeerId | undefined {
80
+ return PeerCollection.nextPeer(this.availableSmartPeers, this.queriedSmartPeers);
81
+ }
82
+
83
+ public nextDumbPeerToQuery(): PeerId | undefined {
84
+ return PeerCollection.nextPeer(this.availableDumbPeers, this.queriedDumbPeers);
85
+ }
86
+
87
+ private get availableSmartPeers(): Set<string> {
88
+ return this.peers.intersection(
89
+ this.smartPeers.difference(this.getBadPeers().union(this.inFlightPeers).union(this.getRateLimitExceededPeers())),
90
+ );
91
+ }
92
+
93
+ private get availableDumbPeers(): Set<string> {
94
+ return this.peers.difference(
95
+ this.smartPeers.union(this.getBadPeers()).union(this.inFlightPeers).union(this.getRateLimitExceededPeers()),
96
+ );
97
+ }
98
+
99
+ public thereAreSomeDumbRatelimitExceededPeers(): boolean {
100
+ return (
101
+ this.getRateLimitExceededPeers().difference(this.smartPeers.union(this.badPeers).union(this.inFlightPeers)).size >
102
+ 0
103
+ );
104
+ }
105
+
106
+ public markPeerInFlight(peerId: PeerId) {
107
+ this.inFlightPeers.add(peerId.toString());
108
+ }
109
+
110
+ public unMarkPeerInFlight(peerId: PeerId) {
111
+ // Never unmark the pinned peer as in-flight
112
+ if (this.pinnedPeerId && this.pinnedPeerId.toString() === peerId.toString()) {
113
+ return;
114
+ }
115
+ this.inFlightPeers.delete(peerId.toString());
116
+ }
117
+
118
+ public markPeerRateLimitExceeded(peerId: PeerId) {
119
+ const ttl = this.dateProvider.now() + RATE_LIMIT_EXCEEDED_PEER_CACHE_TTL;
120
+ this.rateLimitExceededPeers.set(peerId.toString(), ttl);
121
+ }
122
+
123
+ public getRateLimitExceededPeers(): Set<string> {
124
+ const now = this.dateProvider.now();
125
+ const rateLimitedPeers = new Set<string>();
126
+
127
+ for (const [peerId, expirationTime] of this.rateLimitExceededPeers) {
128
+ if (expirationTime <= now) {
129
+ this.rateLimitExceededPeers.delete(peerId);
130
+ } else {
131
+ rateLimitedPeers.add(peerId);
132
+ }
133
+ }
134
+
135
+ return rateLimitedPeers;
136
+ }
137
+
138
+ public penalisePeer(peerId: PeerId, severity: PeerErrorSeverity): void {
139
+ const key = peerId.toString();
140
+ const newPenaltyCount = (this.peerPenaltyCounters.get(key) ?? 0) + 1;
141
+ this.peerPenaltyCounters.set(key, newPenaltyCount);
142
+ this.peerPenalizer?.penalizePeer(peerId, severity);
143
+ if (newPenaltyCount > this.badPeerThreshold) {
144
+ this.badPeers.add(key);
145
+ }
146
+ }
147
+
148
+ public unMarkPeerAsBad(peerId: PeerId) {
149
+ const key = peerId.toString();
150
+ this.badPeers.delete(key);
151
+ this.peerPenaltyCounters.delete(key);
152
+ }
153
+
154
+ public getBadPeers(): Set<string> {
155
+ return new Set(this.badPeers);
156
+ }
157
+
158
+ public getPeerRateLimitDelayMs(peerId: PeerId): number | undefined {
159
+ const key = peerId.toString();
160
+ const expiry = this.rateLimitExceededPeers.get(key);
161
+ const peerIsNotRateLimited = expiry === undefined;
162
+ if (peerIsNotRateLimited) {
163
+ return undefined;
164
+ }
165
+
166
+ const now = this.dateProvider.now();
167
+ const rateLimitHasExpired = expiry <= now;
168
+ if (rateLimitHasExpired) {
169
+ this.rateLimitExceededPeers.delete(key);
170
+ return undefined;
171
+ }
172
+ return expiry - now;
173
+ }
174
+
175
+ public getNextDumbPeerAvailabilityDelayMs(): number | undefined {
176
+ // Note: this _is_ suboptimal
177
+ // (we could've tracked rate limits ) per dumb/smart peers - different collections
178
+ // but everything is in memory and small scale so this, wile suboptimal is not slow
179
+ return this.getNextRateLimitDelayMs(
180
+ peerIdStr =>
181
+ !this.smartPeers.has(peerIdStr) &&
182
+ !this.getBadPeers().has(peerIdStr) &&
183
+ !this.inFlightPeers.has(peerIdStr) &&
184
+ this.peers.has(peerIdStr),
185
+ );
186
+ }
187
+
188
+ public getNextSmartPeerAvailabilityDelayMs(): number | undefined {
189
+ return this.getNextRateLimitDelayMs(
190
+ peerIdStr =>
191
+ this.smartPeers.has(peerIdStr) && !this.getBadPeers().has(peerIdStr) && !this.inFlightPeers.has(peerIdStr),
192
+ );
193
+ }
194
+
195
+ private getNextRateLimitDelayMs(filter: (peerIdStr: string) => boolean): number | undefined {
196
+ const now = this.dateProvider.now();
197
+ let minExpiry: number | undefined;
198
+
199
+ for (const [peerIdStr, expiry] of this.rateLimitExceededPeers) {
200
+ const rateLimitHasExpired = expiry <= now;
201
+ if (rateLimitHasExpired) {
202
+ this.rateLimitExceededPeers.delete(peerIdStr);
203
+ continue;
204
+ }
205
+
206
+ const peerDoesNotMatchFilter = !filter(peerIdStr);
207
+ if (peerDoesNotMatchFilter) {
208
+ continue;
209
+ }
210
+
211
+ minExpiry = minExpiry === undefined ? expiry : Math.min(minExpiry, expiry);
212
+ }
213
+
214
+ const noRateLimitedPeersMatchFilter = minExpiry === undefined;
215
+ if (noRateLimitedPeersMatchFilter) {
216
+ return undefined;
217
+ }
218
+
219
+ return minExpiry! - now;
220
+ }
221
+
222
+ private orderedPeers: Set<string> = new Set();
223
+
224
+ private get peers(): Set<string> {
225
+ const pinnedStr = this.pinnedPeerId?.toString();
226
+ const currentlyConnected = new Set(
227
+ this.connectionSampler
228
+ .getPeerListSortedByConnectionCountAsc()
229
+ .map(p => p.toString())
230
+ .filter(p => p !== pinnedStr),
231
+ );
232
+
233
+ // Remove disconnected peers, preserving order of the rest.
234
+ this.orderedPeers = this.orderedPeers.intersection(currentlyConnected);
235
+
236
+ // Append newly connected peers at the end (lowest priority).
237
+ for (const peer of currentlyConnected) {
238
+ if (!this.orderedPeers.has(peer)) {
239
+ this.orderedPeers.add(peer);
240
+ }
241
+ }
242
+ return this.orderedPeers;
243
+ }
244
+ }
@@ -0,0 +1,37 @@
1
+ import type { ClientProtocolCircuitVerifier } from '@aztec/stdlib/interfaces/server';
2
+ import { Tx, type TxValidationResult, type TxValidator } from '@aztec/stdlib/tx';
3
+
4
+ import { createTxValidatorForReqResponseReceivedTxs } from '../../../msg_validators/index.js';
5
+
6
+ export interface BatchRequestTxValidatorConfig {
7
+ l1ChainId: number;
8
+ rollupVersion: number;
9
+ proofVerifier: ClientProtocolCircuitVerifier;
10
+ }
11
+
12
+ export interface IBatchRequestTxValidator {
13
+ validateRequestedTx(tx: Tx): Promise<TxValidationResult>;
14
+ validateRequestedTxs(txs: Tx[]): Promise<TxValidationResult[]>;
15
+ }
16
+
17
+ export class BatchRequestTxValidator implements IBatchRequestTxValidator {
18
+ readonly txValidator: TxValidator;
19
+ constructor(private readonly config: BatchRequestTxValidatorConfig) {
20
+ this.txValidator = BatchRequestTxValidator.createRequestedTxValidator(this.config);
21
+ }
22
+
23
+ public async validateRequestedTx(tx: Tx): Promise<TxValidationResult> {
24
+ return await this.txValidator.validateTx(tx);
25
+ }
26
+
27
+ public async validateRequestedTxs(txs: Tx[]): Promise<TxValidationResult[]> {
28
+ return await Promise.all(txs.map(tx => this.validateRequestedTx(tx)));
29
+ }
30
+
31
+ static createRequestedTxValidator(config: BatchRequestTxValidatorConfig): TxValidator {
32
+ return createTxValidatorForReqResponseReceivedTxs(config.proofVerifier, {
33
+ l1ChainId: config.l1ChainId,
34
+ rollupVersion: config.rollupVersion,
35
+ });
36
+ }
37
+ }
@@ -20,6 +20,8 @@ import type { ConnectionSampler } from './connection_sampler.js';
20
20
  export class BatchConnectionSampler {
21
21
  private readonly batch: PeerId[] = [];
22
22
  private readonly requestsPerPeer: number;
23
+ /** Tracks peer-index combinations that returned empty/invalid responses */
24
+ private readonly failedPeerIndices: Map<string, Set<number>> = new Map();
23
25
 
24
26
  constructor(
25
27
  private readonly connectionSampler: ConnectionSampler,
@@ -44,10 +46,12 @@ export class BatchConnectionSampler {
44
46
  }
45
47
 
46
48
  /**
47
- * Gets the peer responsible for handling a specific request index
49
+ * Gets the peer responsible for handling a specific request index.
50
+ * If the primary peer has previously failed for this index, tries other peers.
51
+ * If all batch peers have failed, attempts to sample a new peer.
48
52
  *
49
53
  * @param index - The request index
50
- * @returns The peer assigned to handle this request
54
+ * @returns The peer assigned to handle this request, or undefined if no peer available
51
55
  */
52
56
  getPeerForRequest(index: number): PeerId | undefined {
53
57
  if (this.batch.length === 0) {
@@ -55,8 +59,65 @@ export class BatchConnectionSampler {
55
59
  }
56
60
 
57
61
  // Calculate which peer bucket this index belongs to
58
- const peerIndex = Math.floor(index / this.requestsPerPeer) % this.batch.length;
59
- return this.batch[peerIndex];
62
+ const primaryPeerIndex = Math.floor(index / this.requestsPerPeer) % this.batch.length;
63
+
64
+ // Try peers starting from primary, wrapping around
65
+ for (let offset = 0; offset < this.batch.length; offset++) {
66
+ const peerIndex = (primaryPeerIndex + offset) % this.batch.length;
67
+ const peer = this.batch[peerIndex];
68
+ const peerKey = peer.toString();
69
+
70
+ const failedIndices = this.failedPeerIndices.get(peerKey);
71
+ if (!failedIndices || !failedIndices.has(index)) {
72
+ return peer;
73
+ }
74
+ }
75
+
76
+ // All batch peers have failed for this index - try to sample a new peer
77
+ const newPeer = this.sampleNewPeer();
78
+ if (newPeer) {
79
+ return newPeer;
80
+ }
81
+
82
+ return undefined;
83
+ }
84
+
85
+ /**
86
+ * Attempts to sample a new peer that isn't already in the batch.
87
+ * If successful, adds the peer to the batch.
88
+ *
89
+ * @returns The new peer if one was sampled, undefined otherwise
90
+ */
91
+ private sampleNewPeer(): PeerId | undefined {
92
+ // Exclude all current batch peers
93
+ const excluding = new Map(this.batch.map(p => [p.toString(), true] as const));
94
+ const newPeer = this.connectionSampler.getPeer(excluding);
95
+
96
+ if (newPeer) {
97
+ this.batch.push(newPeer);
98
+ this.logger.trace('Sampled new peer for exhausted index', { newPeer: newPeer.toString() });
99
+ return newPeer;
100
+ }
101
+
102
+ return undefined;
103
+ }
104
+
105
+ /**
106
+ * Marks that a peer returned an empty/invalid response for a specific request index.
107
+ * The peer will not be assigned this index again.
108
+ *
109
+ * @param peerId - The peer that failed
110
+ * @param index - The request index that failed
111
+ */
112
+ markPeerFailedForIndex(peerId: PeerId, index: number): void {
113
+ const peerKey = peerId.toString();
114
+ let failedIndices = this.failedPeerIndices.get(peerKey);
115
+ if (!failedIndices) {
116
+ failedIndices = new Set();
117
+ this.failedPeerIndices.set(peerKey, failedIndices);
118
+ }
119
+ failedIndices.add(index);
120
+ this.logger.trace('Marked peer failed for index', { peerId: peerKey, index });
60
121
  }
61
122
 
62
123
  /**
@@ -125,6 +125,22 @@ export class ConnectionSampler {
125
125
  return { peer: lastPeer, sampledPeers };
126
126
  }
127
127
 
128
+ /*
129
+ * Returns all peers sorted by connection count ascending,
130
+ * meaning that the peers with the least number of active connections are earlier in an array
131
+ *
132
+ * @param: excluding - peers to exclude
133
+ * @return: list of peer ids
134
+ * */
135
+ public getPeerListSortedByConnectionCountAsc(excluding?: Set<string>): PeerId[] {
136
+ return this.libp2p
137
+ .getPeers()
138
+ .filter(id => !excluding?.has(id.toString()))
139
+ .map(id => ({ id, count: this.activeConnectionsCount.get(id.toString()) ?? 0 }))
140
+ .sort((a, b) => a.count - b.count)
141
+ .map(p => p.id);
142
+ }
143
+
128
144
  /**
129
145
  * Samples a batch of unique peers from the libp2p node, prioritizing peers without active connections
130
146
  *