@aztec/p2p 0.0.1-commit.d3ec352c → 0.0.1-commit.e3c1de76

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 (379) 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 +2 -2
  5. package/dest/client/factory.d.ts.map +1 -1
  6. package/dest/client/factory.js +8 -8
  7. package/dest/client/interface.d.ts +18 -5
  8. package/dest/client/interface.d.ts.map +1 -1
  9. package/dest/client/p2p_client.d.ts +11 -14
  10. package/dest/client/p2p_client.d.ts.map +1 -1
  11. package/dest/client/p2p_client.js +459 -125
  12. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts +2 -0
  13. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts.map +1 -0
  14. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +305 -0
  15. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts +73 -0
  16. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts.map +1 -0
  17. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.js +8 -0
  18. package/dest/config.d.ts +11 -8
  19. package/dest/config.d.ts.map +1 -1
  20. package/dest/config.js +12 -13
  21. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +61 -42
  22. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  23. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +1 -1
  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 +239 -265
  26. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +21 -18
  27. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +1 -1
  28. package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +114 -109
  29. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +17 -16
  30. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +1 -1
  31. package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +89 -128
  32. package/dest/mem_pools/attestation_pool/mocks.d.ts +11 -8
  33. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  34. package/dest/mem_pools/attestation_pool/mocks.js +17 -13
  35. package/dest/mem_pools/instrumentation.d.ts +7 -1
  36. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  37. package/dest/mem_pools/instrumentation.js +31 -13
  38. package/dest/mem_pools/interface.d.ts +3 -4
  39. package/dest/mem_pools/interface.d.ts.map +1 -1
  40. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +35 -26
  41. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +1 -1
  42. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +314 -335
  43. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +32 -0
  44. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +1 -0
  45. package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +112 -0
  46. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +157 -0
  47. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +1 -0
  48. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +52 -0
  49. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +16 -0
  50. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -0
  51. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +122 -0
  52. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +17 -0
  53. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -0
  54. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +84 -0
  55. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +19 -0
  56. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -0
  57. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +78 -0
  58. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +26 -0
  59. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +1 -0
  60. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +84 -0
  61. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +25 -0
  62. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +1 -0
  63. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +57 -0
  64. package/dest/mem_pools/tx_pool/index.d.ts +1 -2
  65. package/dest/mem_pools/tx_pool/index.d.ts.map +1 -1
  66. package/dest/mem_pools/tx_pool/index.js +0 -1
  67. package/dest/mem_pools/tx_pool/priority.d.ts +5 -1
  68. package/dest/mem_pools/tx_pool/priority.d.ts.map +1 -1
  69. package/dest/mem_pools/tx_pool/priority.js +6 -1
  70. package/dest/mem_pools/tx_pool/tx_pool.d.ts +8 -4
  71. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +1 -1
  72. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +1 -1
  73. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +1 -1
  74. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +25 -20
  75. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +4 -4
  76. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  77. package/dest/msg_validators/attestation_validator/attestation_validator.js +52 -19
  78. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +5 -5
  79. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
  80. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +22 -13
  81. package/dest/msg_validators/clock_tolerance.d.ts +21 -0
  82. package/dest/msg_validators/clock_tolerance.d.ts.map +1 -0
  83. package/dest/msg_validators/clock_tolerance.js +37 -0
  84. package/dest/msg_validators/index.d.ts +2 -2
  85. package/dest/msg_validators/index.d.ts.map +1 -1
  86. package/dest/msg_validators/index.js +1 -1
  87. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +9 -0
  88. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -0
  89. package/dest/msg_validators/proposal_validator/block_proposal_validator.js +6 -0
  90. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +9 -0
  91. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -0
  92. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +6 -0
  93. package/dest/msg_validators/proposal_validator/index.d.ts +4 -0
  94. package/dest/msg_validators/proposal_validator/index.d.ts.map +1 -0
  95. package/dest/msg_validators/proposal_validator/index.js +3 -0
  96. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +13 -0
  97. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -0
  98. package/dest/msg_validators/proposal_validator/proposal_validator.js +104 -0
  99. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +23 -0
  100. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +1 -0
  101. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +212 -0
  102. package/dest/msg_validators/tx_validator/archive_cache.d.ts +3 -3
  103. package/dest/msg_validators/tx_validator/archive_cache.d.ts.map +1 -1
  104. package/dest/msg_validators/tx_validator/archive_cache.js +1 -1
  105. package/dest/msg_validators/tx_validator/block_header_validator.d.ts +5 -4
  106. package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
  107. package/dest/msg_validators/tx_validator/block_header_validator.js +3 -2
  108. package/dest/msg_validators/tx_validator/data_validator.d.ts +3 -1
  109. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  110. package/dest/msg_validators/tx_validator/data_validator.js +4 -1
  111. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +3 -2
  112. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
  113. package/dest/msg_validators/tx_validator/double_spend_validator.js +3 -2
  114. package/dest/msg_validators/tx_validator/factory.d.ts +9 -4
  115. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  116. package/dest/msg_validators/tx_validator/factory.js +22 -12
  117. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +10 -0
  118. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -0
  119. package/dest/msg_validators/tx_validator/fee_payer_balance.js +20 -0
  120. package/dest/msg_validators/tx_validator/gas_validator.d.ts +3 -2
  121. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  122. package/dest/msg_validators/tx_validator/gas_validator.js +11 -16
  123. package/dest/msg_validators/tx_validator/index.d.ts +2 -1
  124. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  125. package/dest/msg_validators/tx_validator/index.js +1 -0
  126. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +4 -3
  127. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  128. package/dest/msg_validators/tx_validator/metadata_validator.js +2 -2
  129. package/dest/msg_validators/tx_validator/phases_validator.d.ts +3 -2
  130. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
  131. package/dest/msg_validators/tx_validator/phases_validator.js +3 -3
  132. package/dest/msg_validators/tx_validator/size_validator.d.ts +8 -0
  133. package/dest/msg_validators/tx_validator/size_validator.d.ts.map +1 -0
  134. package/dest/msg_validators/tx_validator/size_validator.js +23 -0
  135. package/dest/msg_validators/tx_validator/test_utils.d.ts +2 -2
  136. package/dest/msg_validators/tx_validator/test_utils.d.ts.map +1 -1
  137. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +3 -2
  138. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
  139. package/dest/msg_validators/tx_validator/timestamp_validator.js +2 -2
  140. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts +3 -2
  141. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts.map +1 -1
  142. package/dest/msg_validators/tx_validator/tx_permitted_validator.js +2 -2
  143. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +3 -2
  144. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
  145. package/dest/msg_validators/tx_validator/tx_proof_validator.js +2 -2
  146. package/dest/services/data_store.d.ts +1 -1
  147. package/dest/services/data_store.d.ts.map +1 -1
  148. package/dest/services/data_store.js +10 -6
  149. package/dest/services/discv5/discV5_service.js +1 -1
  150. package/dest/services/dummy_service.d.ts +18 -2
  151. package/dest/services/dummy_service.d.ts.map +1 -1
  152. package/dest/services/dummy_service.js +42 -0
  153. package/dest/services/encoding.d.ts +1 -1
  154. package/dest/services/encoding.d.ts.map +1 -1
  155. package/dest/services/encoding.js +7 -6
  156. package/dest/services/libp2p/instrumentation.d.ts +1 -1
  157. package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
  158. package/dest/services/libp2p/instrumentation.js +30 -72
  159. package/dest/services/libp2p/libp2p_service.d.ts +39 -16
  160. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  161. package/dest/services/libp2p/libp2p_service.js +750 -187
  162. package/dest/services/peer-manager/metrics.d.ts +7 -2
  163. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  164. package/dest/services/peer-manager/metrics.js +33 -21
  165. package/dest/services/peer-manager/peer_manager.d.ts +2 -2
  166. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  167. package/dest/services/peer-manager/peer_manager.js +4 -12
  168. package/dest/services/peer-manager/peer_scoring.d.ts +1 -1
  169. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  170. package/dest/services/peer-manager/peer_scoring.js +7 -4
  171. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +47 -0
  172. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -0
  173. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +566 -0
  174. package/dest/services/reqresp/batch-tx-requester/config.d.ts +17 -0
  175. package/dest/services/reqresp/batch-tx-requester/config.d.ts.map +1 -0
  176. package/dest/services/reqresp/batch-tx-requester/config.js +27 -0
  177. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +50 -0
  178. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -0
  179. package/dest/services/reqresp/batch-tx-requester/interface.js +1 -0
  180. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +37 -0
  181. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -0
  182. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +151 -0
  183. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +54 -0
  184. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -0
  185. package/dest/services/reqresp/batch-tx-requester/peer_collection.js +139 -0
  186. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +20 -0
  187. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -0
  188. package/dest/services/reqresp/batch-tx-requester/tx_validator.js +21 -0
  189. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +22 -3
  190. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +1 -1
  191. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +63 -4
  192. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +2 -1
  193. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -1
  194. package/dest/services/reqresp/connection-sampler/connection_sampler.js +12 -0
  195. package/dest/services/reqresp/constants.d.ts +12 -0
  196. package/dest/services/reqresp/constants.d.ts.map +1 -0
  197. package/dest/services/reqresp/constants.js +7 -0
  198. package/dest/services/reqresp/interface.d.ts +4 -2
  199. package/dest/services/reqresp/interface.d.ts.map +1 -1
  200. package/dest/services/reqresp/interface.js +1 -1
  201. package/dest/services/reqresp/metrics.d.ts +6 -5
  202. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  203. package/dest/services/reqresp/metrics.js +17 -21
  204. package/dest/services/reqresp/protocols/auth.d.ts +2 -2
  205. package/dest/services/reqresp/protocols/auth.d.ts.map +1 -1
  206. package/dest/services/reqresp/protocols/auth.js +2 -2
  207. package/dest/services/reqresp/protocols/block.js +1 -1
  208. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +5 -1
  209. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -1
  210. package/dest/services/reqresp/protocols/block_txs/bitvector.js +12 -0
  211. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +1 -1
  212. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
  213. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +16 -3
  214. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +19 -7
  215. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
  216. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +44 -14
  217. package/dest/services/reqresp/protocols/status.d.ts +1 -1
  218. package/dest/services/reqresp/protocols/status.d.ts.map +1 -1
  219. package/dest/services/reqresp/protocols/status.js +4 -1
  220. package/dest/services/reqresp/protocols/tx.d.ts +2 -3
  221. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  222. package/dest/services/reqresp/reqresp.d.ts +6 -1
  223. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  224. package/dest/services/reqresp/reqresp.js +460 -46
  225. package/dest/services/service.d.ts +19 -3
  226. package/dest/services/service.d.ts.map +1 -1
  227. package/dest/services/tx_collection/config.d.ts +4 -1
  228. package/dest/services/tx_collection/config.d.ts.map +1 -1
  229. package/dest/services/tx_collection/config.js +10 -2
  230. package/dest/services/tx_collection/fast_tx_collection.d.ts +6 -4
  231. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
  232. package/dest/services/tx_collection/fast_tx_collection.js +16 -5
  233. package/dest/services/tx_collection/index.d.ts +2 -1
  234. package/dest/services/tx_collection/index.d.ts.map +1 -1
  235. package/dest/services/tx_collection/index.js +1 -0
  236. package/dest/services/tx_collection/instrumentation.d.ts +1 -1
  237. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
  238. package/dest/services/tx_collection/instrumentation.js +10 -13
  239. package/dest/services/tx_collection/proposal_tx_collector.d.ts +48 -0
  240. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -0
  241. package/dest/services/tx_collection/proposal_tx_collector.js +50 -0
  242. package/dest/services/tx_collection/tx_collection.d.ts +6 -6
  243. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  244. package/dest/services/tx_collection/tx_collection.js +6 -6
  245. package/dest/services/tx_provider.d.ts +4 -3
  246. package/dest/services/tx_provider.d.ts.map +1 -1
  247. package/dest/services/tx_provider.js +11 -2
  248. package/dest/services/tx_provider_instrumentation.d.ts +5 -2
  249. package/dest/services/tx_provider_instrumentation.d.ts.map +1 -1
  250. package/dest/services/tx_provider_instrumentation.js +14 -14
  251. package/dest/test-helpers/index.d.ts +3 -1
  252. package/dest/test-helpers/index.d.ts.map +1 -1
  253. package/dest/test-helpers/index.js +2 -0
  254. package/dest/test-helpers/mock-tx-helpers.js +1 -1
  255. package/dest/test-helpers/reqresp-nodes.d.ts +2 -2
  256. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  257. package/dest/test-helpers/test_tx_provider.d.ts +40 -0
  258. package/dest/test-helpers/test_tx_provider.d.ts.map +1 -0
  259. package/dest/test-helpers/test_tx_provider.js +41 -0
  260. package/dest/test-helpers/testbench-utils.d.ts +158 -0
  261. package/dest/test-helpers/testbench-utils.d.ts.map +1 -0
  262. package/dest/test-helpers/testbench-utils.js +297 -0
  263. package/dest/testbench/p2p_client_testbench_worker.d.ts +28 -2
  264. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  265. package/dest/testbench/p2p_client_testbench_worker.js +218 -123
  266. package/dest/testbench/worker_client_manager.d.ts +51 -6
  267. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  268. package/dest/testbench/worker_client_manager.js +226 -39
  269. package/package.json +16 -16
  270. package/src/bootstrap/bootstrap.ts +7 -4
  271. package/src/client/factory.ts +11 -20
  272. package/src/client/interface.ts +19 -4
  273. package/src/client/p2p_client.ts +92 -145
  274. package/src/client/test/tx_proposal_collector/README.md +227 -0
  275. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +336 -0
  276. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.ts +43 -0
  277. package/src/config.ts +18 -19
  278. package/src/mem_pools/attestation_pool/attestation_pool.ts +68 -41
  279. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +241 -289
  280. package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +163 -141
  281. package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +141 -164
  282. package/src/mem_pools/attestation_pool/mocks.ts +21 -15
  283. package/src/mem_pools/instrumentation.ts +39 -14
  284. package/src/mem_pools/interface.ts +2 -4
  285. package/src/mem_pools/tx_pool/README.md +270 -0
  286. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +362 -367
  287. package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +132 -0
  288. package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +208 -0
  289. package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +162 -0
  290. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +104 -0
  291. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +93 -0
  292. package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +106 -0
  293. package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +75 -0
  294. package/src/mem_pools/tx_pool/index.ts +0 -1
  295. package/src/mem_pools/tx_pool/priority.ts +8 -1
  296. package/src/mem_pools/tx_pool/tx_pool.ts +8 -3
  297. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +18 -13
  298. package/src/msg_validators/attestation_validator/attestation_validator.ts +37 -22
  299. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +19 -16
  300. package/src/msg_validators/clock_tolerance.ts +51 -0
  301. package/src/msg_validators/index.ts +1 -1
  302. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +10 -0
  303. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +13 -0
  304. package/src/msg_validators/proposal_validator/index.ts +3 -0
  305. package/src/msg_validators/proposal_validator/proposal_validator.ts +92 -0
  306. package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +230 -0
  307. package/src/msg_validators/tx_validator/archive_cache.ts +3 -3
  308. package/src/msg_validators/tx_validator/block_header_validator.ts +6 -5
  309. package/src/msg_validators/tx_validator/data_validator.ts +18 -6
  310. package/src/msg_validators/tx_validator/double_spend_validator.ts +4 -3
  311. package/src/msg_validators/tx_validator/factory.ts +65 -24
  312. package/src/msg_validators/tx_validator/fee_payer_balance.ts +40 -0
  313. package/src/msg_validators/tx_validator/gas_validator.ts +17 -28
  314. package/src/msg_validators/tx_validator/index.ts +1 -0
  315. package/src/msg_validators/tx_validator/metadata_validator.ts +19 -8
  316. package/src/msg_validators/tx_validator/phases_validator.ts +5 -3
  317. package/src/msg_validators/tx_validator/size_validator.ts +22 -0
  318. package/src/msg_validators/tx_validator/test_utils.ts +1 -1
  319. package/src/msg_validators/tx_validator/timestamp_validator.ts +9 -4
  320. package/src/msg_validators/tx_validator/tx_permitted_validator.ts +8 -3
  321. package/src/msg_validators/tx_validator/tx_proof_validator.ts +8 -3
  322. package/src/services/data_store.ts +10 -7
  323. package/src/services/discv5/discV5_service.ts +1 -1
  324. package/src/services/dummy_service.ts +51 -0
  325. package/src/services/encoding.ts +6 -5
  326. package/src/services/libp2p/instrumentation.ts +32 -73
  327. package/src/services/libp2p/libp2p_service.ts +418 -173
  328. package/src/services/peer-manager/metrics.ts +39 -21
  329. package/src/services/peer-manager/peer_manager.ts +5 -4
  330. package/src/services/peer-manager/peer_scoring.ts +3 -4
  331. package/src/services/reqresp/batch-tx-requester/README.md +305 -0
  332. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +706 -0
  333. package/src/services/reqresp/batch-tx-requester/config.ts +40 -0
  334. package/src/services/reqresp/batch-tx-requester/interface.ts +57 -0
  335. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +209 -0
  336. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +205 -0
  337. package/src/services/reqresp/batch-tx-requester/tx_validator.ts +37 -0
  338. package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +65 -4
  339. package/src/services/reqresp/connection-sampler/connection_sampler.ts +19 -1
  340. package/src/services/reqresp/constants.ts +14 -0
  341. package/src/services/reqresp/interface.ts +4 -1
  342. package/src/services/reqresp/metrics.ts +36 -27
  343. package/src/services/reqresp/protocols/auth.ts +2 -2
  344. package/src/services/reqresp/protocols/block.ts +1 -1
  345. package/src/services/reqresp/protocols/block_txs/bitvector.ts +16 -0
  346. package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +18 -4
  347. package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +52 -10
  348. package/src/services/reqresp/protocols/status.ts +7 -4
  349. package/src/services/reqresp/protocols/tx.ts +1 -2
  350. package/src/services/reqresp/reqresp.ts +66 -19
  351. package/src/services/service.ts +23 -4
  352. package/src/services/tx_collection/config.ts +16 -2
  353. package/src/services/tx_collection/fast_tx_collection.ts +36 -13
  354. package/src/services/tx_collection/index.ts +5 -0
  355. package/src/services/tx_collection/instrumentation.ts +5 -13
  356. package/src/services/tx_collection/proposal_tx_collector.ts +114 -0
  357. package/src/services/tx_collection/tx_collection.ts +7 -7
  358. package/src/services/tx_provider.ts +19 -4
  359. package/src/services/tx_provider_instrumentation.ts +24 -14
  360. package/src/test-helpers/index.ts +2 -0
  361. package/src/test-helpers/mock-pubsub.ts +1 -1
  362. package/src/test-helpers/mock-tx-helpers.ts +1 -1
  363. package/src/test-helpers/reqresp-nodes.ts +1 -1
  364. package/src/test-helpers/test_tx_provider.ts +64 -0
  365. package/src/test-helpers/testbench-utils.ts +374 -0
  366. package/src/testbench/p2p_client_testbench_worker.ts +338 -119
  367. package/src/testbench/worker_client_manager.ts +304 -42
  368. package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts +0 -81
  369. package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts.map +0 -1
  370. package/dest/mem_pools/tx_pool/memory_tx_pool.js +0 -239
  371. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts +0 -12
  372. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts.map +0 -1
  373. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.js +0 -82
  374. package/dest/msg_validators/block_proposal_validator/index.d.ts +0 -2
  375. package/dest/msg_validators/block_proposal_validator/index.d.ts.map +0 -1
  376. package/dest/msg_validators/block_proposal_validator/index.js +0 -1
  377. package/src/mem_pools/tx_pool/memory_tx_pool.ts +0 -285
  378. package/src/msg_validators/block_proposal_validator/block_proposal_validator.ts +0 -97
  379. package/src/msg_validators/block_proposal_validator/index.ts +0 -1
@@ -12,9 +12,16 @@ import { type Tx, TxHash } from '@aztec/stdlib/tx';
12
12
 
13
13
  import type { PeerId } from '@libp2p/interface';
14
14
 
15
- import { type ReqRespInterface, ReqRespSubProtocol } from '../reqresp/interface.js';
15
+ import type { BatchTxRequesterConfig } from '../reqresp/batch-tx-requester/config.js';
16
+ import type { BatchTxRequesterLibP2PService } from '../reqresp/batch-tx-requester/interface.js';
17
+ import { ReqRespSubProtocol } from '../reqresp/interface.js';
16
18
  import { chunkTxHashesRequest } from '../reqresp/protocols/tx.js';
17
19
  import type { TxCollectionConfig } from './config.js';
20
+ import {
21
+ BatchTxRequesterCollector,
22
+ type ProposalTxCollector,
23
+ SendBatchRequestCollector,
24
+ } from './proposal_tx_collector.js';
18
25
  import type { FastCollectionRequest, FastCollectionRequestInput } from './tx_collection.js';
19
26
  import type { TxCollectionSink } from './tx_collection_sink.js';
20
27
  import type { TxSource } from './tx_source.js';
@@ -22,15 +29,25 @@ import type { TxSource } from './tx_source.js';
22
29
  export class FastTxCollection {
23
30
  // eslint-disable-next-line aztec-custom/no-non-primitive-in-collections
24
31
  protected requests: Set<FastCollectionRequest> = new Set();
32
+ private proposalTxCollector: ProposalTxCollector;
25
33
 
26
34
  constructor(
27
- private reqResp: Pick<ReqRespInterface, 'sendBatchRequest'>,
35
+ private p2pService: BatchTxRequesterLibP2PService,
28
36
  private nodes: TxSource[],
29
37
  private txCollectionSink: TxCollectionSink,
30
38
  private config: TxCollectionConfig,
31
39
  private dateProvider: DateProvider = new DateProvider(),
32
40
  private log: Logger = createLogger('p2p:tx_collection_service'),
33
- ) {}
41
+ proposalTxCollector?: ProposalTxCollector,
42
+ ) {
43
+ const batchTxRequesterConfig = this.config as Partial<BatchTxRequesterConfig>;
44
+ const proposalCollectorType = this.config.txCollectionProposalTxCollectorType;
45
+ this.proposalTxCollector =
46
+ proposalTxCollector ??
47
+ (proposalCollectorType === 'old'
48
+ ? new SendBatchRequestCollector(p2pService)
49
+ : new BatchTxRequesterCollector(p2pService, log, dateProvider, undefined, batchTxRequesterConfig));
50
+ }
34
51
 
35
52
  public async stop() {
36
53
  this.requests.forEach(request => request.promise.reject(new AbortError(`Stopped collection service`)));
@@ -261,16 +278,22 @@ export class FastTxCollection {
261
278
  try {
262
279
  await this.txCollectionSink.collect(
263
280
  async txHashes => {
264
- const txs = await this.reqResp.sendBatchRequest<ReqRespSubProtocol.TX>(
265
- ReqRespSubProtocol.TX,
266
- chunkTxHashesRequest(txHashes),
267
- pinnedPeer,
268
- timeoutMs,
269
- maxPeers,
270
- maxRetryAttempts,
271
- );
272
-
273
- return txs.flat();
281
+ 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),
287
+ pinnedPeer,
288
+ timeoutMs,
289
+ maxPeers,
290
+ maxRetryAttempts,
291
+ );
292
+
293
+ return txs.flat();
294
+ } else {
295
+ throw new Error(`Unknown request type: ${(request as any).type}`);
296
+ }
274
297
  },
275
298
  Array.from(request.missingTxHashes).map(txHash => TxHash.fromString(txHash)),
276
299
  { description: `reqresp for slot ${slotNumber}`, method: 'fast-req-resp', ...opts, ...request.blockInfo },
@@ -1,2 +1,7 @@
1
1
  export { TxCollection, type FastCollectionRequestInput } from './tx_collection.js';
2
2
  export { type TxSource, createNodeRpcTxSources, NodeRpcTxSource } from './tx_source.js';
3
+ export {
4
+ type ProposalTxCollector,
5
+ BatchTxRequesterCollector,
6
+ SendBatchRequestCollector,
7
+ } from './proposal_tx_collector.js';
@@ -4,7 +4,7 @@ import {
4
4
  Metrics,
5
5
  type TelemetryClient,
6
6
  type UpDownCounter,
7
- ValueType,
7
+ createUpDownCounterWithDefault,
8
8
  } from '@aztec/telemetry-client';
9
9
 
10
10
  import type { CollectionMethod } from './tx_collection.js';
@@ -17,21 +17,13 @@ export class TxCollectionInstrumentation {
17
17
  constructor(client: TelemetryClient, name: string) {
18
18
  const meter = client.getMeter(name);
19
19
 
20
- this.txsCollected = meter.createUpDownCounter(Metrics.TX_COLLECTOR_COUNT, {
21
- description: 'The number of txs collected',
20
+ this.txsCollected = createUpDownCounterWithDefault(meter, Metrics.TX_COLLECTOR_COUNT, {
21
+ [Attributes.TX_COLLECTION_METHOD]: ['fast-req-resp', 'fast-node-rpc', 'slow-req-resp', 'slow-node-rpc'],
22
22
  });
23
23
 
24
- this.collectionDurationPerTx = meter.createHistogram(Metrics.TX_COLLECTOR_DURATION_PER_TX, {
25
- unit: 'ms',
26
- description: 'Average duration per tx of an individual tx collection request',
27
- valueType: ValueType.INT,
28
- });
24
+ this.collectionDurationPerTx = meter.createHistogram(Metrics.TX_COLLECTOR_DURATION_PER_TX);
29
25
 
30
- this.collectionDurationPerRequest = meter.createHistogram(Metrics.TX_COLLECTOR_DURATION_PER_REQUEST, {
31
- unit: 'ms',
32
- description: 'Total duration of an individual tx collection request',
33
- valueType: ValueType.INT,
34
- });
26
+ this.collectionDurationPerRequest = meter.createHistogram(Metrics.TX_COLLECTOR_DURATION_PER_REQUEST);
35
27
  }
36
28
 
37
29
  increaseTxsFor(what: CollectionMethod, count: number, duration: number) {
@@ -0,0 +1,114 @@
1
+ import type { Logger } from '@aztec/foundation/log';
2
+ import type { DateProvider } from '@aztec/foundation/timer';
3
+ import type { BlockProposal } from '@aztec/stdlib/p2p';
4
+ import type { Tx, TxHash } from '@aztec/stdlib/tx';
5
+
6
+ import type { PeerId } from '@libp2p/interface';
7
+
8
+ import { BatchTxRequester } from '../reqresp/batch-tx-requester/batch_tx_requester.js';
9
+ import type { BatchTxRequesterConfig } from '../reqresp/batch-tx-requester/config.js';
10
+ import type { BatchTxRequesterLibP2PService } from '../reqresp/batch-tx-requester/interface.js';
11
+ import type { IBatchRequestTxValidator } from '../reqresp/batch-tx-requester/tx_validator.js';
12
+ import { ReqRespSubProtocol } from '../reqresp/interface.js';
13
+ import { chunkTxHashesRequest } from '../reqresp/protocols/tx.js';
14
+
15
+ /**
16
+ * Strategy interface for collecting transactions for block proposals.
17
+ * Allows swapping between different tx collection implementations for benchmarking.
18
+ */
19
+ export interface ProposalTxCollector {
20
+ /**
21
+ * Collect transactions for a block proposal.
22
+ * @param txHashes - The transaction hashes to collect
23
+ * @param blockProposal - The block proposal containing the transactions
24
+ * @param pinnedPeer - Optional peer that sent the proposal (expected to have all txs)
25
+ * @param timeoutMs - Timeout in milliseconds
26
+ * @returns The collected transactions
27
+ */
28
+ collectTxs(
29
+ txHashes: TxHash[],
30
+ blockProposal: BlockProposal,
31
+ pinnedPeer: PeerId | undefined,
32
+ timeoutMs: number,
33
+ ): Promise<Tx[]>;
34
+ }
35
+
36
+ /**
37
+ * Collects transactions using the BatchTxRequester implementation.
38
+ * This uses a smart/dumb peer strategy with parallel workers.
39
+ */
40
+ export class BatchTxRequesterCollector implements ProposalTxCollector {
41
+ constructor(
42
+ private p2pService: BatchTxRequesterLibP2PService,
43
+ private log: Logger,
44
+ private dateProvider: DateProvider,
45
+ private txValidator?: IBatchRequestTxValidator,
46
+ private batchTxRequesterConfig?: Partial<BatchTxRequesterConfig>,
47
+ ) {}
48
+
49
+ async collectTxs(
50
+ txHashes: TxHash[],
51
+ blockProposal: BlockProposal,
52
+ pinnedPeer: PeerId | undefined,
53
+ timeoutMs: number,
54
+ ): Promise<Tx[]> {
55
+ const {
56
+ batchTxRequesterSmartParallelWorkerCount: smartParallelWorkerCount,
57
+ batchTxRequesterDumbParallelWorkerCount: dumbParallelWorkerCount,
58
+ batchTxRequesterTxBatchSize: txBatchSize,
59
+ batchTxRequesterBadPeerThreshold: badPeerThreshold,
60
+ } = this.batchTxRequesterConfig ?? {};
61
+
62
+ const batchRequester = new BatchTxRequester(
63
+ txHashes,
64
+ blockProposal,
65
+ pinnedPeer,
66
+ timeoutMs,
67
+ this.p2pService,
68
+ this.log,
69
+ this.dateProvider,
70
+ {
71
+ smartParallelWorkerCount,
72
+ dumbParallelWorkerCount,
73
+ txBatchSize,
74
+ badPeerThreshold,
75
+ txValidator: this.txValidator,
76
+ },
77
+ );
78
+
79
+ return await BatchTxRequester.collectAllTxs(batchRequester.run());
80
+ }
81
+ }
82
+
83
+ const DEFAULT_MAX_PEERS = 10;
84
+ const DEFAULT_MAX_RETRY_ATTEMPTS = 3;
85
+
86
+ /**
87
+ * Collects transactions using the sendBatchRequest implementation from ReqResp.
88
+ * This is the original implementation that balances requests across peers.
89
+ */
90
+ export class SendBatchRequestCollector implements ProposalTxCollector {
91
+ constructor(
92
+ private p2pService: BatchTxRequesterLibP2PService,
93
+ private maxPeers: number = DEFAULT_MAX_PEERS,
94
+ private maxRetryAttempts: number = DEFAULT_MAX_RETRY_ATTEMPTS,
95
+ ) {}
96
+
97
+ async collectTxs(
98
+ txHashes: TxHash[],
99
+ _blockProposal: BlockProposal,
100
+ pinnedPeer: PeerId | undefined,
101
+ timeoutMs: number,
102
+ ): Promise<Tx[]> {
103
+ const txs = await this.p2pService.reqResp.sendBatchRequest<ReqRespSubProtocol.TX>(
104
+ ReqRespSubProtocol.TX,
105
+ chunkTxHashesRequest(txHashes),
106
+ pinnedPeer,
107
+ timeoutMs,
108
+ this.maxPeers,
109
+ this.maxRetryAttempts,
110
+ );
111
+
112
+ return txs.flat();
113
+ }
114
+ }
@@ -3,7 +3,7 @@ import { compactArray } from '@aztec/foundation/collection';
3
3
  import { type Logger, createLogger } from '@aztec/foundation/log';
4
4
  import { type PromiseWithResolvers, RunningPromise } from '@aztec/foundation/promise';
5
5
  import { DateProvider } from '@aztec/foundation/timer';
6
- import type { L2Block, L2BlockInfo, L2BlockNew } from '@aztec/stdlib/block';
6
+ import type { L2Block, L2BlockInfo } from '@aztec/stdlib/block';
7
7
  import type { L1RollupConstants } from '@aztec/stdlib/epoch-helpers';
8
8
  import type { BlockProposal } from '@aztec/stdlib/p2p';
9
9
  import { Tx, TxHash } from '@aztec/stdlib/tx';
@@ -13,7 +13,7 @@ import type { PeerId } from '@libp2p/interface';
13
13
 
14
14
  import type { TxPool } from '../../mem_pools/index.js';
15
15
  import type { TxPoolEvents } from '../../mem_pools/tx_pool/tx_pool.js';
16
- import type { ReqRespInterface } from '../reqresp/interface.js';
16
+ import type { BatchTxRequesterLibP2PService } from '../reqresp/batch-tx-requester/interface.js';
17
17
  import type { TxCollectionConfig } from './config.js';
18
18
  import { FastTxCollection } from './fast_tx_collection.js';
19
19
  import { SlowTxCollection } from './slow_tx_collection.js';
@@ -25,7 +25,7 @@ export type CollectionMethod = 'fast-req-resp' | 'fast-node-rpc' | 'slow-req-res
25
25
  export type MissingTxInfo = { blockNumber: BlockNumber; deadline: Date; readyForReqResp: boolean };
26
26
 
27
27
  export type FastCollectionRequestInput =
28
- | { type: 'block'; block: L2BlockNew }
28
+ | { type: 'block'; block: L2Block }
29
29
  | { type: 'proposal'; blockProposal: BlockProposal; blockNumber: BlockNumber };
30
30
 
31
31
  export type FastCollectionRequest = FastCollectionRequestInput & {
@@ -67,7 +67,7 @@ export class TxCollection {
67
67
  protected readonly handleTxsFound: TxPoolEvents['txs-added'];
68
68
 
69
69
  constructor(
70
- private readonly reqResp: Pick<ReqRespInterface, 'sendBatchRequest'>,
70
+ private readonly p2pService: BatchTxRequesterLibP2PService,
71
71
  private readonly nodes: TxSource[],
72
72
  private readonly constants: L1RollupConstants,
73
73
  private readonly txPool: TxPool,
@@ -79,7 +79,7 @@ export class TxCollection {
79
79
  this.txCollectionSink = new TxCollectionSink(this.txPool, telemetryClient, this.log);
80
80
 
81
81
  this.fastCollection = new FastTxCollection(
82
- this.reqResp,
82
+ this.p2pService,
83
83
  this.nodes,
84
84
  this.txCollectionSink,
85
85
  this.config,
@@ -88,7 +88,7 @@ export class TxCollection {
88
88
  );
89
89
 
90
90
  this.slowCollection = new SlowTxCollection(
91
- this.reqResp,
91
+ this.p2pService.reqResp,
92
92
  this.nodes,
93
93
  this.txCollectionSink,
94
94
  this.fastCollection,
@@ -166,7 +166,7 @@ export class TxCollection {
166
166
  txHashes: TxHash[] | string[],
167
167
  opts: { deadline: Date; pinnedPeer?: PeerId },
168
168
  ) {
169
- return this.collectFastFor({ type: 'block', block: block.toL2Block() }, txHashes, opts);
169
+ return this.collectFastFor({ type: 'block', block }, txHashes, opts);
170
170
  }
171
171
 
172
172
  /** Collects the set of txs for the given proposal or block as fast as possible */
@@ -2,7 +2,7 @@ import { BlockNumber } from '@aztec/foundation/branded-types';
2
2
  import { compactArray } from '@aztec/foundation/collection';
3
3
  import { type Logger, createLogger } from '@aztec/foundation/log';
4
4
  import { elapsed } from '@aztec/foundation/timer';
5
- import type { L2BlockInfo, L2BlockNew } from '@aztec/stdlib/block';
5
+ import type { L2Block, L2BlockInfo } from '@aztec/stdlib/block';
6
6
  import type { ITxProvider } from '@aztec/stdlib/interfaces/server';
7
7
  import type { BlockProposal } from '@aztec/stdlib/p2p';
8
8
  import { Tx, TxHash } from '@aztec/stdlib/tx';
@@ -68,7 +68,7 @@ export class TxProvider implements ITxProvider {
68
68
  }
69
69
 
70
70
  /** Gathers txs from the tx pool, remote rpc nodes, and reqresp. */
71
- public getTxsForBlock(block: L2BlockNew, opts: { deadline: Date }): Promise<{ txs: Tx[]; missingTxs: TxHash[] }> {
71
+ public getTxsForBlock(block: L2Block, opts: { deadline: Date }): Promise<{ txs: Tx[]; missingTxs: TxHash[] }> {
72
72
  return this.getOrderedTxsFromAllSources(
73
73
  { type: 'block', block },
74
74
  block.toBlockInfo(),
@@ -137,6 +137,7 @@ export class TxProvider implements ITxProvider {
137
137
  );
138
138
 
139
139
  if (missingTxHashes.size === 0) {
140
+ this.instrumentation.incTxsFromP2P(0, txHashes.length);
140
141
  return { txsFromMempool };
141
142
  }
142
143
 
@@ -155,24 +156,26 @@ export class TxProvider implements ITxProvider {
155
156
 
156
157
  if (missingTxHashes.size === 0) {
157
158
  await this.processProposalTxs(txsFromProposal);
159
+ this.instrumentation.incTxsFromP2P(0, txHashes.length);
158
160
  return { txsFromMempool, txsFromProposal };
159
161
  }
160
162
 
161
163
  // Start tx collection from the network if needed, while we validate the txs taken from the proposal in parallel
162
164
  const [txsFromNetwork] = await Promise.all([
163
- this.txCollection.collectFastFor(request, [...missingTxHashes], opts),
165
+ this.collectFromP2P(request, [...missingTxHashes], opts),
164
166
  this.processProposalTxs(txsFromProposal),
165
167
  ] as const);
166
168
 
167
169
  if (txsFromNetwork.length > 0) {
168
170
  txsFromNetwork.forEach(tx => missingTxHashes.delete(tx.txHash.toString()));
169
- this.instrumentation.incTxsFromP2P(txsFromNetwork.length);
170
171
  this.log.debug(
171
172
  `Retrieved ${txsFromNetwork.length} txs from network for block proposal (${missingTxHashes.size} pending)`,
172
173
  { ...blockInfo, missingTxHashes: [...missingTxHashes] },
173
174
  );
174
175
  }
175
176
 
177
+ this.instrumentation.incTxsFromP2P(txsFromNetwork.length, txHashes.length);
178
+
176
179
  if (missingTxHashes.size === 0) {
177
180
  return { txsFromNetwork, txsFromMempool, txsFromProposal };
178
181
  }
@@ -200,6 +203,18 @@ export class TxProvider implements ITxProvider {
200
203
  };
201
204
  }
202
205
 
206
+ private async collectFromP2P(
207
+ input: FastCollectionRequestInput,
208
+ txHashes: TxHash[] | string[],
209
+ opts: { deadline: Date; pinnedPeer?: PeerId },
210
+ ): Promise<Tx[]> {
211
+ const requestedAt = Date.now();
212
+ const result = await this.txCollection.collectFastFor(input, txHashes, opts);
213
+ const requestProcessedAt = Date.now();
214
+ this.instrumentation.recordTxsRequestDelay(requestProcessedAt - requestedAt);
215
+ return result;
216
+ }
217
+
203
218
  private extractFromProposal(proposal: BlockProposal | undefined, missingTxHashes: string[]): Tx[] {
204
219
  if (!proposal) {
205
220
  return [];
@@ -1,4 +1,10 @@
1
- import { Metrics, type TelemetryClient, type UpDownCounter } from '@aztec/telemetry-client';
1
+ import {
2
+ type Histogram,
3
+ Metrics,
4
+ type TelemetryClient,
5
+ type UpDownCounter,
6
+ createUpDownCounterWithDefault,
7
+ } from '@aztec/telemetry-client';
2
8
 
3
9
  export class TxProviderInstrumentation {
4
10
  private txFromProposalCount: UpDownCounter;
@@ -6,24 +12,23 @@ export class TxProviderInstrumentation {
6
12
  private txFromP2PCount: UpDownCounter;
7
13
  private missingTxsCount: UpDownCounter;
8
14
 
15
+ private fractionOfTxsRequestedFromP2P: Histogram;
16
+ private txsRequestDelay: Histogram;
17
+
9
18
  constructor(client: TelemetryClient, name: string) {
10
19
  const meter = client.getMeter(name);
11
20
 
12
- this.txFromProposalCount = meter.createUpDownCounter(Metrics.TX_PROVIDER_TXS_FROM_PROPOSALS_COUNT, {
13
- description: 'The number of txs taken from block proposals',
14
- });
21
+ this.txFromProposalCount = createUpDownCounterWithDefault(meter, Metrics.TX_PROVIDER_TXS_FROM_PROPOSALS_COUNT);
22
+
23
+ this.txFromMempoolCount = createUpDownCounterWithDefault(meter, Metrics.TX_PROVIDER_TXS_FROM_MEMPOOL_COUNT);
24
+
25
+ this.txFromP2PCount = createUpDownCounterWithDefault(meter, Metrics.TX_PROVIDER_TXS_FROM_P2P_COUNT);
15
26
 
16
- this.txFromMempoolCount = meter.createUpDownCounter(Metrics.TX_PROVIDER_TXS_FROM_MEMPOOL_COUNT, {
17
- description: 'The number of txs taken from the local mempool',
18
- });
27
+ this.missingTxsCount = createUpDownCounterWithDefault(meter, Metrics.TX_PROVIDER_MISSING_TXS_COUNT);
19
28
 
20
- this.txFromP2PCount = meter.createUpDownCounter(Metrics.TX_PROVIDER_TXS_FROM_P2P_COUNT, {
21
- description: 'The number of txs taken from the p2p network',
22
- });
29
+ this.fractionOfTxsRequestedFromP2P = meter.createHistogram(Metrics.TX_PROVIDER_P2P_TXS_REQUESTED_FRACTION);
23
30
 
24
- this.missingTxsCount = meter.createUpDownCounter(Metrics.TX_PROVIDER_MISSING_TXS_COUNT, {
25
- description: 'The number of txs not found anywhere',
26
- });
31
+ this.txsRequestDelay = meter.createHistogram(Metrics.TX_PROVIDER_P2P_TXS_REQUEST_DELAY);
27
32
  }
28
33
 
29
34
  incTxsFromProposals(count: number) {
@@ -34,8 +39,13 @@ export class TxProviderInstrumentation {
34
39
  this.txFromMempoolCount.add(count);
35
40
  }
36
41
 
37
- incTxsFromP2P(count: number) {
42
+ incTxsFromP2P(count: number, total: number) {
38
43
  this.txFromP2PCount.add(count);
44
+ this.fractionOfTxsRequestedFromP2P.record(count / total);
45
+ }
46
+
47
+ recordTxsRequestDelay(delay: number) {
48
+ this.txsRequestDelay.record(delay);
39
49
  }
40
50
 
41
51
  incMissingTxs(count: number) {
@@ -4,3 +4,5 @@ export * from './make-enrs.js';
4
4
  export * from './make-test-p2p-clients.js';
5
5
  export * from './reqresp-nodes.js';
6
6
  export * from './mock-pubsub.js';
7
+ export * from './test_tx_provider.js';
8
+ export * from './testbench-utils.js';
@@ -39,7 +39,7 @@ export function getMockPubSubP2PServiceFactory<T extends P2PClientType>(
39
39
  peerId: PeerId,
40
40
  deps: {
41
41
  packageVersion: string;
42
- mempools: MemPools<T>;
42
+ mempools: MemPools;
43
43
  l2BlockSource: L2BlockSource & ContractDataSource;
44
44
  epochCache: EpochCacheInterface;
45
45
  proofVerifier: ClientProtocolCircuitVerifier;
@@ -1,4 +1,4 @@
1
- import { Fr } from '@aztec/foundation/fields';
1
+ import { Fr } from '@aztec/foundation/curves/bn254';
2
2
  import { getVKTreeRoot } from '@aztec/noir-protocol-circuits-types/vk-tree';
3
3
  import { protocolContractsHash } from '@aztec/protocol-contracts';
4
4
  import { mockTx } from '@aztec/stdlib/testing';
@@ -112,7 +112,7 @@ export async function createTestLibP2PService<T extends P2PClientType>(
112
112
  archiver: L2BlockSource & ContractDataSource,
113
113
  worldStateSynchronizer: WorldStateSynchronizer,
114
114
  epochCache: EpochCache,
115
- mempools: MemPools<T>,
115
+ mempools: MemPools,
116
116
  telemetry: TelemetryClient,
117
117
  port: number = 0,
118
118
  peerId?: PeerId,
@@ -0,0 +1,64 @@
1
+ import type { BlockNumber } from '@aztec/foundation/branded-types';
2
+ import type { L2Block } from '@aztec/stdlib/block';
3
+ import type { ITxProvider } from '@aztec/stdlib/interfaces/server';
4
+ import type { BlockProposal } from '@aztec/stdlib/p2p';
5
+ import { type Tx, TxHash } from '@aztec/stdlib/tx';
6
+
7
+ import type { PeerId } from '@libp2p/interface';
8
+
9
+ /**
10
+ * Test transaction provider that can be seeded with transactions.
11
+ * Returns seeded txs when requested by hash, useful for testing block
12
+ * proposal handling without requiring a full P2P network.
13
+ */
14
+ export class TestTxProvider implements ITxProvider {
15
+ private txs: Map<string, Tx> = new Map();
16
+
17
+ /** Seed transactions that will be returned when requested. */
18
+ seed(txs: Tx[]) {
19
+ for (const tx of txs) {
20
+ this.txs.set(tx.getTxHash().toString(), tx);
21
+ }
22
+ }
23
+
24
+ /** Clear all seeded transactions. */
25
+ clear() {
26
+ this.txs.clear();
27
+ }
28
+
29
+ /** Returns txs from the seeded collection given their hashes. */
30
+ getAvailableTxs(txHashes: TxHash[]): Promise<{ txs: Tx[]; missingTxs: TxHash[] }> {
31
+ return this.getTxsByHashes(txHashes);
32
+ }
33
+
34
+ /** Get txs for a block proposal, returning any seeded txs that match the requested hashes. */
35
+ getTxsForBlockProposal(
36
+ blockProposal: BlockProposal,
37
+ _blockNumber: BlockNumber,
38
+ _opts: { pinnedPeer: PeerId | undefined; deadline: Date },
39
+ ): Promise<{ txs: Tx[]; missingTxs: TxHash[] }> {
40
+ return this.getTxsByHashes(blockProposal.txHashes);
41
+ }
42
+
43
+ /** Get txs for a block, returning any seeded txs that match the tx effects in the block. */
44
+ getTxsForBlock(block: L2Block, _opts: { deadline: Date }): Promise<{ txs: Tx[]; missingTxs: TxHash[] }> {
45
+ const txHashes = block.body.txEffects.map(txEffect => txEffect.txHash);
46
+ return this.getTxsByHashes(txHashes);
47
+ }
48
+
49
+ private getTxsByHashes(txHashes: TxHash[]): Promise<{ txs: Tx[]; missingTxs: TxHash[] }> {
50
+ const txs: Tx[] = [];
51
+ const missingTxs: TxHash[] = [];
52
+
53
+ for (const txHash of txHashes) {
54
+ const tx = this.txs.get(txHash.toString());
55
+ if (tx) {
56
+ txs.push(tx);
57
+ } else {
58
+ missingTxs.push(txHash);
59
+ }
60
+ }
61
+
62
+ return Promise.resolve({ txs, missingTxs });
63
+ }
64
+ }