@aztec/p2p 0.0.1-commit.d6f2b3f94 → 0.0.1-commit.d939eb5aa

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 (420) hide show
  1. package/README.md +129 -3
  2. package/dest/client/factory.d.ts +7 -7
  3. package/dest/client/factory.d.ts.map +1 -1
  4. package/dest/client/factory.js +37 -30
  5. package/dest/client/interface.d.ts +22 -20
  6. package/dest/client/interface.d.ts.map +1 -1
  7. package/dest/client/p2p_client.d.ts +11 -19
  8. package/dest/client/p2p_client.d.ts.map +1 -1
  9. package/dest/client/p2p_client.js +92 -104
  10. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +20 -10
  11. package/dest/config.d.ts +128 -96
  12. package/dest/config.d.ts.map +1 -1
  13. package/dest/config.js +97 -38
  14. package/dest/errors/p2p-service.error.d.ts +9 -0
  15. package/dest/errors/p2p-service.error.d.ts.map +1 -0
  16. package/dest/errors/p2p-service.error.js +10 -0
  17. package/dest/errors/tx-pool.error.d.ts +8 -0
  18. package/dest/errors/tx-pool.error.d.ts.map +1 -0
  19. package/dest/errors/tx-pool.error.js +9 -0
  20. package/dest/index.d.ts +1 -2
  21. package/dest/index.d.ts.map +1 -1
  22. package/dest/index.js +0 -1
  23. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +10 -6
  24. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  25. package/dest/mem_pools/attestation_pool/attestation_pool.js +21 -9
  26. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +6 -6
  27. package/dest/mem_pools/attestation_pool/mocks.d.ts +2 -2
  28. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  29. package/dest/mem_pools/attestation_pool/mocks.js +2 -2
  30. package/dest/mem_pools/index.d.ts +1 -2
  31. package/dest/mem_pools/index.d.ts.map +1 -1
  32. package/dest/mem_pools/instrumentation.d.ts +4 -2
  33. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  34. package/dest/mem_pools/instrumentation.js +16 -14
  35. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +30 -13
  36. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -1
  37. package/dest/mem_pools/tx_pool_v2/deleted_pool.js +91 -20
  38. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts +3 -3
  39. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts.map +1 -1
  40. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.js +18 -9
  41. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +1 -1
  42. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -1
  43. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +7 -3
  44. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +3 -3
  45. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -1
  46. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +12 -4
  47. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +2 -2
  48. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -1
  49. package/dest/mem_pools/tx_pool_v2/eviction/index.js +1 -1
  50. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +54 -5
  51. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -1
  52. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.js +8 -0
  53. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +7 -5
  54. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +9 -7
  55. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +2 -2
  56. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -1
  57. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +14 -6
  58. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +4 -4
  59. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -1
  60. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +16 -4
  61. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +3 -3
  62. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -1
  63. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +3 -3
  64. package/dest/mem_pools/tx_pool_v2/index.d.ts +2 -2
  65. package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -1
  66. package/dest/mem_pools/tx_pool_v2/index.js +1 -1
  67. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts +15 -0
  68. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts.map +1 -0
  69. package/dest/mem_pools/tx_pool_v2/instrumentation.js +43 -0
  70. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +28 -10
  71. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
  72. package/dest/mem_pools/tx_pool_v2/interfaces.js +5 -1
  73. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +56 -15
  74. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
  75. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +113 -20
  76. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +12 -3
  77. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -1
  78. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +50 -45
  79. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +12 -5
  80. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -1
  81. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +17 -6
  82. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +14 -5
  83. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -1
  84. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +319 -147
  85. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +5 -2
  86. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  87. package/dest/msg_validators/attestation_validator/attestation_validator.js +20 -11
  88. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +4 -2
  89. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
  90. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +2 -2
  91. package/dest/msg_validators/clock_tolerance.d.ts +12 -1
  92. package/dest/msg_validators/clock_tolerance.d.ts.map +1 -1
  93. package/dest/msg_validators/clock_tolerance.js +54 -3
  94. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +7 -4
  95. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
  96. package/dest/msg_validators/proposal_validator/block_proposal_validator.js +10 -2
  97. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +7 -4
  98. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
  99. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +16 -2
  100. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +15 -8
  101. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
  102. package/dest/msg_validators/proposal_validator/proposal_validator.js +67 -47
  103. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +2 -2
  104. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  105. package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +3 -3
  106. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +2 -1
  107. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -1
  108. package/dest/msg_validators/tx_validator/allowed_public_setup.js +24 -20
  109. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts +17 -0
  110. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts.map +1 -0
  111. package/dest/msg_validators/tx_validator/allowed_setup_helpers.js +24 -0
  112. package/dest/msg_validators/tx_validator/archive_cache.js +1 -1
  113. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts +9 -0
  114. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts.map +1 -0
  115. package/dest/msg_validators/tx_validator/contract_instance_validator.js +48 -0
  116. package/dest/msg_validators/tx_validator/data_validator.d.ts +1 -1
  117. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  118. package/dest/msg_validators/tx_validator/data_validator.js +35 -2
  119. package/dest/msg_validators/tx_validator/factory.d.ts +133 -6
  120. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  121. package/dest/msg_validators/tx_validator/factory.js +247 -60
  122. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +1 -1
  123. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -1
  124. package/dest/msg_validators/tx_validator/fee_payer_balance.js +6 -2
  125. package/dest/msg_validators/tx_validator/gas_validator.d.ts +67 -3
  126. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  127. package/dest/msg_validators/tx_validator/gas_validator.js +112 -43
  128. package/dest/msg_validators/tx_validator/index.d.ts +3 -1
  129. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  130. package/dest/msg_validators/tx_validator/index.js +2 -0
  131. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +1 -1
  132. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  133. package/dest/msg_validators/tx_validator/metadata_validator.js +4 -4
  134. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts +14 -0
  135. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts.map +1 -0
  136. package/dest/msg_validators/tx_validator/nullifier_cache.js +24 -0
  137. package/dest/msg_validators/tx_validator/phases_validator.d.ts +22 -2
  138. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
  139. package/dest/msg_validators/tx_validator/phases_validator.js +72 -24
  140. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +2 -2
  141. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
  142. package/dest/msg_validators/tx_validator/timestamp_validator.js +6 -6
  143. package/dest/services/data_store.d.ts +1 -1
  144. package/dest/services/data_store.d.ts.map +1 -1
  145. package/dest/services/data_store.js +5 -5
  146. package/dest/services/dummy_service.d.ts +8 -5
  147. package/dest/services/dummy_service.d.ts.map +1 -1
  148. package/dest/services/dummy_service.js +10 -5
  149. package/dest/services/encoding.d.ts +6 -2
  150. package/dest/services/encoding.d.ts.map +1 -1
  151. package/dest/services/encoding.js +16 -9
  152. package/dest/services/gossipsub/topic_score_params.d.ts +30 -7
  153. package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -1
  154. package/dest/services/gossipsub/topic_score_params.js +53 -14
  155. package/dest/services/libp2p/libp2p_service.d.ts +29 -36
  156. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  157. package/dest/services/libp2p/libp2p_service.js +224 -197
  158. package/dest/services/peer-manager/metrics.d.ts +3 -1
  159. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  160. package/dest/services/peer-manager/metrics.js +6 -0
  161. package/dest/services/peer-manager/peer_manager.d.ts +6 -2
  162. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  163. package/dest/services/peer-manager/peer_manager.js +39 -11
  164. package/dest/services/peer-manager/peer_scoring.d.ts +7 -2
  165. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  166. package/dest/services/peer-manager/peer_scoring.js +32 -10
  167. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +12 -8
  168. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -1
  169. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +83 -106
  170. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +4 -7
  171. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
  172. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +11 -13
  173. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -1
  174. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +31 -46
  175. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +19 -11
  176. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -1
  177. package/dest/services/reqresp/batch-tx-requester/peer_collection.js +52 -15
  178. package/dest/services/reqresp/batch-tx-requester/tx_validator.js +2 -2
  179. package/dest/services/reqresp/config.d.ts +3 -3
  180. package/dest/services/reqresp/config.d.ts.map +1 -1
  181. package/dest/services/reqresp/interface.d.ts +14 -9
  182. package/dest/services/reqresp/interface.d.ts.map +1 -1
  183. package/dest/services/reqresp/interface.js +10 -11
  184. package/dest/services/reqresp/metrics.d.ts +1 -1
  185. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  186. package/dest/services/reqresp/metrics.js +0 -1
  187. package/dest/services/reqresp/protocols/index.d.ts +1 -2
  188. package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
  189. package/dest/services/reqresp/protocols/index.js +0 -1
  190. package/dest/services/reqresp/protocols/tx.d.ts +1 -1
  191. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  192. package/dest/services/reqresp/protocols/tx.js +1 -3
  193. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +5 -4
  194. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
  195. package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -8
  196. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
  197. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
  198. package/dest/services/reqresp/rate-limiter/rate_limits.js +0 -10
  199. package/dest/services/reqresp/reqresp.d.ts +4 -2
  200. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  201. package/dest/services/reqresp/reqresp.js +30 -12
  202. package/dest/services/service.d.ts +9 -4
  203. package/dest/services/service.d.ts.map +1 -1
  204. package/dest/services/tx_collection/config.d.ts +13 -1
  205. package/dest/services/tx_collection/config.d.ts.map +1 -1
  206. package/dest/services/tx_collection/config.js +30 -0
  207. package/dest/services/tx_collection/fast_tx_collection.d.ts +1 -4
  208. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
  209. package/dest/services/tx_collection/fast_tx_collection.js +65 -75
  210. package/dest/services/tx_collection/file_store_tx_collection.d.ts +38 -29
  211. package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -1
  212. package/dest/services/tx_collection/file_store_tx_collection.js +126 -77
  213. package/dest/services/tx_collection/file_store_tx_source.d.ts +17 -6
  214. package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -1
  215. package/dest/services/tx_collection/file_store_tx_source.js +53 -10
  216. package/dest/services/tx_collection/instrumentation.d.ts +1 -1
  217. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
  218. package/dest/services/tx_collection/instrumentation.js +2 -1
  219. package/dest/services/tx_collection/proposal_tx_collector.d.ts +7 -7
  220. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -1
  221. package/dest/services/tx_collection/proposal_tx_collector.js +5 -4
  222. package/dest/services/tx_collection/request_tracker.d.ts +53 -0
  223. package/dest/services/tx_collection/request_tracker.d.ts.map +1 -0
  224. package/dest/services/tx_collection/request_tracker.js +84 -0
  225. package/dest/services/tx_collection/slow_tx_collection.d.ts +5 -3
  226. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -1
  227. package/dest/services/tx_collection/slow_tx_collection.js +17 -12
  228. package/dest/services/tx_collection/tx_collection.d.ts +9 -9
  229. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  230. package/dest/services/tx_collection/tx_collection.js +26 -10
  231. package/dest/services/tx_collection/tx_collection_sink.d.ts +6 -5
  232. package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -1
  233. package/dest/services/tx_collection/tx_collection_sink.js +13 -22
  234. package/dest/services/tx_collection/tx_source.d.ts +13 -7
  235. package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
  236. package/dest/services/tx_collection/tx_source.js +26 -7
  237. package/dest/services/tx_file_store/tx_file_store.d.ts +3 -2
  238. package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -1
  239. package/dest/services/tx_file_store/tx_file_store.js +9 -6
  240. package/dest/services/tx_provider.d.ts +3 -3
  241. package/dest/services/tx_provider.d.ts.map +1 -1
  242. package/dest/services/tx_provider.js +4 -4
  243. package/dest/test-helpers/make-test-p2p-clients.d.ts +5 -6
  244. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  245. package/dest/test-helpers/make-test-p2p-clients.js +1 -2
  246. package/dest/test-helpers/mock-pubsub.d.ts +14 -6
  247. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  248. package/dest/test-helpers/mock-pubsub.js +43 -12
  249. package/dest/test-helpers/reqresp-nodes.d.ts +2 -3
  250. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  251. package/dest/test-helpers/reqresp-nodes.js +3 -4
  252. package/dest/test-helpers/testbench-utils.d.ts +8 -3
  253. package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
  254. package/dest/test-helpers/testbench-utils.js +30 -4
  255. package/dest/testbench/p2p_client_testbench_worker.d.ts +2 -2
  256. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  257. package/dest/testbench/p2p_client_testbench_worker.js +78 -26
  258. package/dest/testbench/worker_client_manager.d.ts +10 -1
  259. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  260. package/dest/testbench/worker_client_manager.js +55 -3
  261. package/dest/util.d.ts +3 -3
  262. package/dest/util.d.ts.map +1 -1
  263. package/package.json +14 -14
  264. package/src/client/factory.ts +68 -48
  265. package/src/client/interface.ts +26 -21
  266. package/src/client/p2p_client.ts +102 -135
  267. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +33 -14
  268. package/src/config.ts +146 -44
  269. package/src/errors/p2p-service.error.ts +11 -0
  270. package/src/errors/tx-pool.error.ts +12 -0
  271. package/src/index.ts +0 -1
  272. package/src/mem_pools/attestation_pool/attestation_pool.ts +25 -12
  273. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +6 -6
  274. package/src/mem_pools/attestation_pool/mocks.ts +2 -1
  275. package/src/mem_pools/index.ts +0 -3
  276. package/src/mem_pools/instrumentation.ts +17 -13
  277. package/src/mem_pools/tx_pool_v2/README.md +52 -28
  278. package/src/mem_pools/tx_pool_v2/deleted_pool.ts +109 -22
  279. package/src/mem_pools/tx_pool_v2/eviction/eviction_manager.ts +21 -8
  280. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +7 -3
  281. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +18 -4
  282. package/src/mem_pools/tx_pool_v2/eviction/index.ts +4 -0
  283. package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +59 -4
  284. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +5 -5
  285. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +8 -8
  286. package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +14 -9
  287. package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +33 -6
  288. package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +4 -3
  289. package/src/mem_pools/tx_pool_v2/index.ts +1 -1
  290. package/src/mem_pools/tx_pool_v2/instrumentation.ts +69 -0
  291. package/src/mem_pools/tx_pool_v2/interfaces.ts +30 -10
  292. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +164 -28
  293. package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +58 -45
  294. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +34 -8
  295. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +353 -143
  296. package/src/msg_validators/attestation_validator/README.md +49 -0
  297. package/src/msg_validators/attestation_validator/attestation_validator.ts +21 -9
  298. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +4 -1
  299. package/src/msg_validators/clock_tolerance.ts +72 -3
  300. package/src/msg_validators/proposal_validator/README.md +123 -0
  301. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +17 -4
  302. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +23 -7
  303. package/src/msg_validators/proposal_validator/proposal_validator.ts +79 -49
  304. package/src/msg_validators/tx_validator/README.md +119 -0
  305. package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +3 -3
  306. package/src/msg_validators/tx_validator/allowed_public_setup.ts +22 -27
  307. package/src/msg_validators/tx_validator/allowed_setup_helpers.ts +31 -0
  308. package/src/msg_validators/tx_validator/archive_cache.ts +1 -1
  309. package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
  310. package/src/msg_validators/tx_validator/data_validator.ts +42 -1
  311. package/src/msg_validators/tx_validator/factory.ts +394 -78
  312. package/src/msg_validators/tx_validator/fee_payer_balance.ts +6 -2
  313. package/src/msg_validators/tx_validator/gas_validator.ts +145 -33
  314. package/src/msg_validators/tx_validator/index.ts +2 -0
  315. package/src/msg_validators/tx_validator/metadata_validator.ts +12 -4
  316. package/src/msg_validators/tx_validator/nullifier_cache.ts +30 -0
  317. package/src/msg_validators/tx_validator/phases_validator.ts +82 -27
  318. package/src/msg_validators/tx_validator/timestamp_validator.ts +7 -7
  319. package/src/services/data_store.ts +5 -13
  320. package/src/services/dummy_service.ts +13 -7
  321. package/src/services/encoding.ts +16 -8
  322. package/src/services/gossipsub/README.md +29 -14
  323. package/src/services/gossipsub/topic_score_params.ts +85 -17
  324. package/src/services/libp2p/libp2p_service.ts +240 -225
  325. package/src/services/peer-manager/metrics.ts +7 -0
  326. package/src/services/peer-manager/peer_manager.ts +45 -11
  327. package/src/services/peer-manager/peer_scoring.ts +27 -5
  328. package/src/services/reqresp/README.md +229 -0
  329. package/src/services/reqresp/batch-tx-requester/README.md +46 -7
  330. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +79 -112
  331. package/src/services/reqresp/batch-tx-requester/interface.ts +3 -6
  332. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +30 -71
  333. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +68 -24
  334. package/src/services/reqresp/batch-tx-requester/tx_validator.ts +2 -2
  335. package/src/services/reqresp/config.ts +2 -2
  336. package/src/services/reqresp/interface.ts +21 -11
  337. package/src/services/reqresp/metrics.ts +0 -1
  338. package/src/services/reqresp/protocols/index.ts +0 -1
  339. package/src/services/reqresp/protocols/tx.ts +1 -3
  340. package/src/services/reqresp/rate-limiter/rate_limiter.ts +13 -9
  341. package/src/services/reqresp/rate-limiter/rate_limits.ts +0 -10
  342. package/src/services/reqresp/reqresp.ts +40 -13
  343. package/src/services/service.ts +17 -3
  344. package/src/services/tx_collection/config.ts +42 -0
  345. package/src/services/tx_collection/fast_tx_collection.ts +71 -76
  346. package/src/services/tx_collection/file_store_tx_collection.ts +143 -93
  347. package/src/services/tx_collection/file_store_tx_source.ts +69 -10
  348. package/src/services/tx_collection/instrumentation.ts +7 -1
  349. package/src/services/tx_collection/proposal_tx_collector.ts +9 -13
  350. package/src/services/tx_collection/request_tracker.ts +127 -0
  351. package/src/services/tx_collection/slow_tx_collection.ts +17 -13
  352. package/src/services/tx_collection/tx_collection.ts +46 -17
  353. package/src/services/tx_collection/tx_collection_sink.ts +15 -29
  354. package/src/services/tx_collection/tx_source.ts +28 -8
  355. package/src/services/tx_file_store/tx_file_store.ts +6 -4
  356. package/src/services/tx_provider.ts +2 -2
  357. package/src/test-helpers/make-test-p2p-clients.ts +1 -3
  358. package/src/test-helpers/mock-pubsub.ts +44 -11
  359. package/src/test-helpers/reqresp-nodes.ts +5 -8
  360. package/src/test-helpers/testbench-utils.ts +41 -6
  361. package/src/testbench/p2p_client_testbench_worker.ts +89 -29
  362. package/src/testbench/worker_client_manager.ts +68 -6
  363. package/src/util.ts +8 -2
  364. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +0 -125
  365. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +0 -1
  366. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +0 -596
  367. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +0 -32
  368. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +0 -1
  369. package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +0 -112
  370. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +0 -157
  371. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +0 -1
  372. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +0 -52
  373. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +0 -16
  374. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +0 -1
  375. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +0 -122
  376. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +0 -17
  377. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +0 -1
  378. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +0 -84
  379. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +0 -19
  380. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +0 -1
  381. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +0 -78
  382. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +0 -26
  383. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +0 -1
  384. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +0 -84
  385. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +0 -25
  386. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +0 -1
  387. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +0 -57
  388. package/dest/mem_pools/tx_pool/index.d.ts +0 -3
  389. package/dest/mem_pools/tx_pool/index.d.ts.map +0 -1
  390. package/dest/mem_pools/tx_pool/index.js +0 -2
  391. package/dest/mem_pools/tx_pool/priority.d.ts +0 -12
  392. package/dest/mem_pools/tx_pool/priority.d.ts.map +0 -1
  393. package/dest/mem_pools/tx_pool/priority.js +0 -15
  394. package/dest/mem_pools/tx_pool/tx_pool.d.ts +0 -127
  395. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +0 -1
  396. package/dest/mem_pools/tx_pool/tx_pool.js +0 -3
  397. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +0 -7
  398. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +0 -1
  399. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +0 -400
  400. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +0 -23
  401. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +0 -1
  402. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +0 -212
  403. package/dest/services/reqresp/protocols/block.d.ts +0 -9
  404. package/dest/services/reqresp/protocols/block.d.ts.map +0 -1
  405. package/dest/services/reqresp/protocols/block.js +0 -32
  406. package/src/mem_pools/tx_pool/README.md +0 -270
  407. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -746
  408. package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +0 -132
  409. package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +0 -208
  410. package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +0 -162
  411. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +0 -104
  412. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +0 -93
  413. package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +0 -106
  414. package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +0 -75
  415. package/src/mem_pools/tx_pool/index.ts +0 -2
  416. package/src/mem_pools/tx_pool/priority.ts +0 -20
  417. package/src/mem_pools/tx_pool/tx_pool.ts +0 -141
  418. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +0 -319
  419. package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +0 -230
  420. package/src/services/reqresp/protocols/block.ts +0 -37
@@ -2,18 +2,23 @@ import type { DateProvider } from '@aztec/foundation/timer';
2
2
  import type { PeerErrorSeverity } from '@aztec/stdlib/p2p';
3
3
 
4
4
  import type { PeerId } from '@libp2p/interface';
5
+ import { peerIdFromString } from '@libp2p/peer-id';
5
6
 
7
+ import type { ConnectionSampler } from '../connection-sampler/connection_sampler.js';
6
8
  import { DEFAULT_BATCH_TX_REQUESTER_BAD_PEER_THRESHOLD } from './config.js';
7
9
  import type { IPeerPenalizer } from './interface.js';
8
10
 
9
11
  export const RATE_LIMIT_EXCEEDED_PEER_CACHE_TTL = 1000; // 1s
10
12
 
11
13
  export interface IPeerCollection {
12
- getAllPeers(): Set<string>;
13
- getSmartPeers(): Set<string>;
14
14
  markPeerSmart(peerId: PeerId): void;
15
- getSmartPeersToQuery(): Array<string>;
16
- getDumbPeersToQuery(): Array<string>;
15
+ markPeerDumb(peerId: PeerId): void;
16
+
17
+ /** Sample next peer in round-robin fashion. No smart peers if returns undefined */
18
+ nextSmartPeerToQuery(): PeerId | undefined;
19
+ /** Sample next peer in round-robin fashion. No dumb peers if returns undefined */
20
+ nextDumbPeerToQuery(): PeerId | undefined;
21
+
17
22
  thereAreSomeDumbRatelimitExceededPeers(): boolean;
18
23
  penalisePeer(peerId: PeerId, severity: PeerErrorSeverity): void;
19
24
  unMarkPeerAsBad(peerId: PeerId): void;
@@ -28,8 +33,6 @@ export interface IPeerCollection {
28
33
  }
29
34
 
30
35
  export class PeerCollection implements IPeerCollection {
31
- private readonly peers;
32
-
33
36
  private readonly smartPeers = new Set<string>();
34
37
  private readonly inFlightPeers = new Set<string>();
35
38
  private readonly rateLimitExceededPeers = new Map<string, number>();
@@ -37,46 +40,64 @@ export class PeerCollection implements IPeerCollection {
37
40
  private readonly badPeers = new Set<string>();
38
41
 
39
42
  constructor(
40
- initialPeers: PeerId[],
43
+ private readonly connectionSampler: Pick<ConnectionSampler, 'getPeerListSortedByConnectionCountAsc'>,
41
44
  private readonly pinnedPeerId: PeerId | undefined,
42
45
  private readonly dateProvider: DateProvider,
43
46
  private readonly badPeerThreshold: number = DEFAULT_BATCH_TX_REQUESTER_BAD_PEER_THRESHOLD,
44
47
  private readonly peerPenalizer?: IPeerPenalizer,
45
48
  ) {
46
- this.peers = new Set(initialPeers.map(peer => peer.toString()));
47
-
48
- // Pinned peer is treaded specially, always mark it as in-flight
49
+ // Pinned peer is treated specially, always mark it as in-flight
49
50
  // and never return it as part of smart/dumb peers
50
51
  if (this.pinnedPeerId) {
51
52
  const peerIdStr = this.pinnedPeerId.toString();
52
53
  this.inFlightPeers.add(peerIdStr);
53
- this.peers.delete(peerIdStr);
54
54
  }
55
55
  }
56
56
 
57
- public getAllPeers(): Set<string> {
58
- return this.peers;
57
+ public markPeerSmart(peerId: PeerId): void {
58
+ this.smartPeers.add(peerId.toString());
59
59
  }
60
60
 
61
- public getSmartPeers(): Set<string> {
62
- return this.smartPeers;
61
+ public markPeerDumb(peerId: PeerId): void {
62
+ this.smartPeers.delete(peerId.toString());
63
63
  }
64
64
 
65
- public markPeerSmart(peerId: PeerId): void {
66
- this.smartPeers.add(peerId.toString());
65
+ // We keep track of all peers that are queried for peer sampling algorithm
66
+ private queriedSmartPeers: Set<string> = new Set<string>();
67
+ private queriedDumbPeers: Set<string> = new Set<string>();
68
+
69
+ private static nextPeer(allPeers: Set<string>, queried: Set<string>): PeerId | undefined {
70
+ if (allPeers.size === 0) {
71
+ return undefined;
72
+ }
73
+ const availablePeers = allPeers.difference(queried);
74
+ let [first] = availablePeers;
75
+ if (first === undefined) {
76
+ // We queried all peers. Start over
77
+ [first] = allPeers;
78
+ queried.clear();
79
+ }
80
+ queried.add(first);
81
+ return peerIdFromString(first);
67
82
  }
68
83
 
69
- public getSmartPeersToQuery(): Array<string> {
70
- return Array.from(
84
+ public nextSmartPeerToQuery(): PeerId | undefined {
85
+ return PeerCollection.nextPeer(this.availableSmartPeers, this.queriedSmartPeers);
86
+ }
87
+
88
+ public nextDumbPeerToQuery(): PeerId | undefined {
89
+ return PeerCollection.nextPeer(this.availableDumbPeers, this.queriedDumbPeers);
90
+ }
91
+
92
+ private get availableSmartPeers(): Set<string> {
93
+ return this.peers.intersection(
71
94
  this.smartPeers.difference(this.getBadPeers().union(this.inFlightPeers).union(this.getRateLimitExceededPeers())),
72
95
  );
73
96
  }
74
97
 
75
- public getDumbPeersToQuery(): Array<string> {
76
- return Array.from(
77
- this.peers.difference(
78
- this.smartPeers.union(this.getBadPeers()).union(this.inFlightPeers).union(this.getRateLimitExceededPeers()),
79
- ),
98
+ private get availableDumbPeers(): Set<string> {
99
+ return this.peers.difference(
100
+ this.smartPeers.union(this.getBadPeers()).union(this.inFlightPeers).union(this.getRateLimitExceededPeers()),
80
101
  );
81
102
  }
82
103
 
@@ -202,4 +223,27 @@ export class PeerCollection implements IPeerCollection {
202
223
 
203
224
  return minExpiry! - now;
204
225
  }
226
+
227
+ private orderedPeers: Set<string> = new Set();
228
+
229
+ private get peers(): Set<string> {
230
+ const pinnedStr = this.pinnedPeerId?.toString();
231
+ const currentlyConnected = new Set(
232
+ this.connectionSampler
233
+ .getPeerListSortedByConnectionCountAsc()
234
+ .map(p => p.toString())
235
+ .filter(p => p !== pinnedStr),
236
+ );
237
+
238
+ // Remove disconnected peers, preserving order of the rest.
239
+ this.orderedPeers = this.orderedPeers.intersection(currentlyConnected);
240
+
241
+ // Append newly connected peers at the end (lowest priority).
242
+ for (const peer of currentlyConnected) {
243
+ if (!this.orderedPeers.has(peer)) {
244
+ this.orderedPeers.add(peer);
245
+ }
246
+ }
247
+ return this.orderedPeers;
248
+ }
205
249
  }
@@ -1,7 +1,7 @@
1
1
  import type { ClientProtocolCircuitVerifier } from '@aztec/stdlib/interfaces/server';
2
2
  import { Tx, type TxValidationResult, type TxValidator } from '@aztec/stdlib/tx';
3
3
 
4
- import { createTxReqRespValidator } from '../../../msg_validators/tx_validator/factory.js';
4
+ import { createTxValidatorForReqResponseReceivedTxs } from '../../../msg_validators/index.js';
5
5
 
6
6
  export interface BatchRequestTxValidatorConfig {
7
7
  l1ChainId: number;
@@ -29,7 +29,7 @@ export class BatchRequestTxValidator implements IBatchRequestTxValidator {
29
29
  }
30
30
 
31
31
  static createRequestedTxValidator(config: BatchRequestTxValidatorConfig): TxValidator {
32
- return createTxReqRespValidator(config.proofVerifier, {
32
+ return createTxValidatorForReqResponseReceivedTxs(config.proofVerifier, {
33
33
  l1ChainId: config.l1ChainId,
34
34
  rollupVersion: config.rollupVersion,
35
35
  });
@@ -1,4 +1,4 @@
1
- import { type ConfigMapping, booleanConfigHelper, numberConfigHelper } from '@aztec/foundation/config';
1
+ import { type ConfigMappingsType, booleanConfigHelper, numberConfigHelper } from '@aztec/foundation/config';
2
2
 
3
3
  export const DEFAULT_INDIVIDUAL_REQUEST_TIMEOUT_MS = 10_000;
4
4
  export const DEFAULT_OVERALL_REQUEST_TIMEOUT_MS = 10_000; // Not currently used
@@ -27,7 +27,7 @@ export interface P2PReqRespConfig {
27
27
  dialTimeoutMs: number;
28
28
  }
29
29
 
30
- export const p2pReqRespConfigMappings: Record<keyof P2PReqRespConfig, ConfigMapping> = {
30
+ export const p2pReqRespConfigMappings: ConfigMappingsType<P2PReqRespConfig> = {
31
31
  overallRequestTimeoutMs: {
32
32
  env: 'P2P_REQRESP_OVERALL_REQUEST_TIMEOUT_MS',
33
33
  description: 'The overall timeout for a request response operation.',
@@ -1,6 +1,3 @@
1
- import { Fr } from '@aztec/foundation/curves/bn254';
2
- import { L2Block } from '@aztec/stdlib/block';
3
- import { MAX_L2_BLOCK_SIZE_KB } from '@aztec/stdlib/p2p';
4
1
  import { TxArray, TxHashArray } from '@aztec/stdlib/tx';
5
2
 
6
3
  import type { PeerId } from '@libp2p/interface';
@@ -24,7 +21,6 @@ export const PING_PROTOCOL = '/aztec/req/ping/1.0.0';
24
21
  export const STATUS_PROTOCOL = '/aztec/req/status/1.0.0';
25
22
  export const GOODBYE_PROTOCOL = '/aztec/req/goodbye/1.0.0';
26
23
  export const TX_REQ_PROTOCOL = '/aztec/req/tx/1.0.0';
27
- export const BLOCK_REQ_PROTOCOL = '/aztec/req/block/1.0.0';
28
24
  export const AUTH_PROTOCOL = '/aztec/req/auth/1.0.0';
29
25
  export const BLOCK_TXS_REQ_PROTOCOL = '/aztec/req/block_txs/1.0.0';
30
26
 
@@ -33,7 +29,6 @@ export enum ReqRespSubProtocol {
33
29
  STATUS = STATUS_PROTOCOL,
34
30
  GOODBYE = GOODBYE_PROTOCOL,
35
31
  TX = TX_REQ_PROTOCOL,
36
- BLOCK = BLOCK_REQ_PROTOCOL,
37
32
  AUTH = AUTH_PROTOCOL,
38
33
  BLOCK_TXS = BLOCK_TXS_REQ_PROTOCOL,
39
34
  }
@@ -100,12 +95,29 @@ export type ReqRespSubProtocolValidators = {
100
95
  [S in ReqRespSubProtocol]: ResponseValidator<any, any>;
101
96
  };
102
97
 
98
+ /**
99
+ * Protocols that are always allowed without authentication, even when p2pAllowOnlyValidators is enabled.
100
+ * These are needed for the handshake and connection management flow.
101
+ * All other protocols require the remote peer to be authenticated.
102
+ */
103
+ export const UNAUTHENTICATED_ALLOWED_PROTOCOLS: ReadonlySet<ReqRespSubProtocol> = new Set([
104
+ ReqRespSubProtocol.PING,
105
+ ReqRespSubProtocol.STATUS,
106
+ ReqRespSubProtocol.AUTH,
107
+ ReqRespSubProtocol.GOODBYE,
108
+ ]);
109
+
110
+ /**
111
+ * Callback that checks whether a peer should be rejected from req/resp data protocols.
112
+ * Returns true if the peer should be rejected (i.e. p2pAllowOnlyValidators is on and peer is unauthenticated).
113
+ */
114
+ export type ShouldRejectPeer = (peerId: string) => boolean;
115
+
103
116
  export const DEFAULT_SUB_PROTOCOL_VALIDATORS: ReqRespSubProtocolValidators = {
104
117
  [ReqRespSubProtocol.PING]: noopValidator,
105
118
  [ReqRespSubProtocol.STATUS]: noopValidator,
106
119
  [ReqRespSubProtocol.TX]: noopValidator,
107
120
  [ReqRespSubProtocol.GOODBYE]: noopValidator,
108
- [ReqRespSubProtocol.BLOCK]: noopValidator,
109
121
  [ReqRespSubProtocol.AUTH]: noopValidator,
110
122
  [ReqRespSubProtocol.BLOCK_TXS]: noopValidator,
111
123
  };
@@ -203,10 +215,6 @@ export const subProtocolMap = {
203
215
  request: RequestableBuffer,
204
216
  response: RequestableBuffer,
205
217
  },
206
- [ReqRespSubProtocol.BLOCK]: {
207
- request: Fr, // block number
208
- response: L2Block,
209
- },
210
218
  [ReqRespSubProtocol.AUTH]: {
211
219
  request: AuthRequest,
212
220
  response: AuthResponse,
@@ -229,7 +237,6 @@ export type ExpectedResponseSizeCalculator = (requestBuffer: Buffer) => number;
229
237
  export const subProtocolSizeCalculators: Record<ReqRespSubProtocol, ExpectedResponseSizeCalculator> = {
230
238
  [ReqRespSubProtocol.TX]: calculateTxResponseSize,
231
239
  [ReqRespSubProtocol.BLOCK_TXS]: calculateBlockTxsResponseSize,
232
- [ReqRespSubProtocol.BLOCK]: () => MAX_L2_BLOCK_SIZE_KB,
233
240
  [ReqRespSubProtocol.STATUS]: () => 1,
234
241
  [ReqRespSubProtocol.PING]: () => 1,
235
242
  [ReqRespSubProtocol.AUTH]: () => 1,
@@ -264,5 +271,8 @@ export interface ReqRespInterface {
264
271
 
265
272
  updateConfig(config: Partial<P2PReqRespConfig>): void;
266
273
 
274
+ /** Sets the callback used to reject unauthenticated peers on gated req/resp protocols. */
275
+ setShouldRejectPeer(checker: ShouldRejectPeer): void;
276
+
267
277
  getConnectionSampler(): Pick<ConnectionSampler, 'getPeerListSortedByConnectionCountAsc'>;
268
278
  }
@@ -26,7 +26,6 @@ export class ReqRespMetrics {
26
26
  ReqRespSubProtocol.STATUS,
27
27
  ReqRespSubProtocol.GOODBYE,
28
28
  ReqRespSubProtocol.TX,
29
- ReqRespSubProtocol.BLOCK,
30
29
  ReqRespSubProtocol.AUTH,
31
30
  ReqRespSubProtocol.BLOCK_TXS,
32
31
  ],
@@ -5,6 +5,5 @@ export * from './ping.js';
5
5
  export * from './status.js';
6
6
  export * from './tx.js';
7
7
  export * from './goodbye.js';
8
- export * from './block.js';
9
8
  export * from './auth.js';
10
9
  export * from './block_txs/index.js';
@@ -51,9 +51,7 @@ export function reqRespTxHandler(mempools: MemPools): ReqRespSubProtocolHandler
51
51
  * Per: https://github.com/AztecProtocol/aztec-packages/issues/15149#issuecomment-2999054485
52
52
  * we define Q as max number of transactions per batch, the comment explains why we use 8.
53
53
  */
54
- //TODO: (mralj) chunk size should by default be 8, this is just temporary until the protocol is implemented correctly
55
- //more info: https://github.com/AztecProtocol/aztec-packages/pull/15516#pullrequestreview-2995474321
56
- export function chunkTxHashesRequest(hashes: TxHash[], chunkSize = 1): Array<TxHashArray> {
54
+ export function chunkTxHashesRequest(hashes: TxHash[], chunkSize = 8): Array<TxHashArray> {
57
55
  return chunk(hashes, chunkSize).map(chunk => new TxHashArray(...chunk));
58
56
  }
59
57
 
@@ -97,9 +97,10 @@ export function prettyPrintRateLimitStatus(status: RateLimitStatus) {
97
97
  * 2. Individual rate limits for each peer.
98
98
  *
99
99
  * How it works:
100
- * - When a request comes in, it first checks against the global rate limit.
101
- * - If the global limit allows, it then checks against the specific peer's rate limit.
102
- * - The request is only allowed if both the global and peer-specific limits allow it.
100
+ * - When a request comes in, it first checks against the peer's individual rate limit.
101
+ * - If the peer limit allows, it then checks against the global rate limit.
102
+ * - The request is only allowed if both the peer-specific and global limits allow it.
103
+ * - Checking peer limit first ensures a rate-limited peer cannot exhaust the global quota.
103
104
  * - It automatically creates and manages rate limiters for new peers as they make requests.
104
105
  * - It periodically cleans up rate limiters for inactive peers to conserve memory.
105
106
  *
@@ -119,10 +120,6 @@ export class SubProtocolRateLimiter {
119
120
  }
120
121
 
121
122
  allow(peerId: PeerId): RateLimitStatus {
122
- if (!this.globalLimiter.allow()) {
123
- return RateLimitStatus.DeniedGlobal;
124
- }
125
-
126
123
  const peerIdStr = peerId.toString();
127
124
  let peerLimiter: PeerRateLimiter | undefined = this.peerLimiters.get(peerIdStr);
128
125
  if (!peerLimiter) {
@@ -135,10 +132,17 @@ export class SubProtocolRateLimiter {
135
132
  } else {
136
133
  peerLimiter.lastAccess = Date.now();
137
134
  }
138
- const peerLimitAllowed = peerLimiter.limiter.allow();
139
- if (!peerLimitAllowed) {
135
+
136
+ // Check peer limit first: a rate-limited peer must not consume global quota,
137
+ // otherwise one spamming peer can starve all others by exhausting the global bucket.
138
+ if (!peerLimiter.limiter.allow()) {
140
139
  return RateLimitStatus.DeniedPeer;
141
140
  }
141
+
142
+ if (!this.globalLimiter.allow()) {
143
+ return RateLimitStatus.DeniedGlobal;
144
+ }
145
+
142
146
  return RateLimitStatus.Allowed;
143
147
  }
144
148
 
@@ -42,16 +42,6 @@ export const DEFAULT_RATE_LIMITS: ReqRespSubProtocolRateLimits = {
42
42
  quotaCount: 200,
43
43
  },
44
44
  },
45
- [ReqRespSubProtocol.BLOCK]: {
46
- peerLimit: {
47
- quotaTimeMs: 1000,
48
- quotaCount: 2,
49
- },
50
- globalLimit: {
51
- quotaTimeMs: 1000,
52
- quotaCount: 5,
53
- },
54
- },
55
45
  [ReqRespSubProtocol.GOODBYE]: {
56
46
  peerLimit: {
57
47
  quotaTimeMs: 1000,
@@ -16,7 +16,7 @@ import {
16
16
  IndividualReqRespTimeoutError,
17
17
  InvalidResponseError,
18
18
  } from '../../errors/reqresp.error.js';
19
- import { SnappyTransform } from '../encoding.js';
19
+ import { OversizedSnappyResponseError, SnappyTransform } from '../encoding.js';
20
20
  import type { PeerScoring } from '../peer-manager/peer_scoring.js';
21
21
  import {
22
22
  DEFAULT_INDIVIDUAL_REQUEST_TIMEOUT_MS,
@@ -34,7 +34,9 @@ import {
34
34
  type ReqRespSubProtocolHandlers,
35
35
  type ReqRespSubProtocolRateLimits,
36
36
  type ReqRespSubProtocolValidators,
37
+ type ShouldRejectPeer,
37
38
  type SubProtocolMap,
39
+ UNAUTHENTICATED_ALLOWED_PROTOCOLS,
38
40
  responseFromBuffer,
39
41
  subProtocolSizeCalculators,
40
42
  } from './interface.js';
@@ -72,6 +74,8 @@ export class ReqResp implements ReqRespInterface {
72
74
 
73
75
  private snappyTransform: SnappyTransform;
74
76
 
77
+ private shouldRejectPeer: ShouldRejectPeer | undefined;
78
+
75
79
  private metrics: ReqRespMetrics;
76
80
 
77
81
  constructor(
@@ -108,6 +112,10 @@ export class ReqResp implements ReqRespInterface {
108
112
  }
109
113
  }
110
114
 
115
+ public setShouldRejectPeer(checker: ShouldRejectPeer): void {
116
+ this.shouldRejectPeer = checker;
117
+ }
118
+
111
119
  get tracer() {
112
120
  return this.metrics.tracer;
113
121
  }
@@ -320,7 +328,7 @@ export class ReqResp implements ReqRespInterface {
320
328
  };
321
329
 
322
330
  for (const index of indices) {
323
- this.logger.info(`Sending request ${index} to peer ${peerAsString}`);
331
+ this.logger.trace(`Sending request ${index} to peer ${peerAsString}`);
324
332
  const response = await this.sendRequestToPeer(peer, subProtocol, requestBuffers[index]);
325
333
 
326
334
  // Check the status of the response buffer
@@ -462,7 +470,7 @@ export class ReqResp implements ReqRespInterface {
462
470
  );
463
471
  return resp;
464
472
  } catch (e: any) {
465
- this.logger.warn(`SUBPROTOCOL: ${subProtocol}\n`, e);
473
+ this.logger.debug(`SUBPROTOCOL: ${subProtocol}\n`, e);
466
474
  // On error we immediately abort the stream, this is preferred way,
467
475
  // because it signals to the sender that error happened, whereas
468
476
  // closing the stream only closes our side and is much slower
@@ -553,16 +561,10 @@ export class ReqResp implements ReqRespInterface {
553
561
  data: message,
554
562
  };
555
563
  } catch (e: any) {
564
+ // All errors (invalid status bytes, oversized snappy responses, corrupt data, etc.)
565
+ // are re-thrown so the caller can penalize the peer via handleResponseError.
556
566
  this.logger.debug(`Reading message failed: ${e.message}`);
557
-
558
- let status = ReqRespStatus.UNKNOWN;
559
- if (e instanceof ReqRespStatusError) {
560
- status = e.status;
561
- }
562
-
563
- return {
564
- status,
565
- };
567
+ throw e;
566
568
  }
567
569
  }
568
570
 
@@ -602,6 +604,15 @@ export class ReqResp implements ReqRespInterface {
602
604
  throw new ReqRespStatusError(ReqRespStatus.RATE_LIMIT_EXCEEDED);
603
605
  }
604
606
 
607
+ // When p2pAllowOnlyValidators is enabled, reject unauthenticated peers on data protocols
608
+ if (
609
+ !UNAUTHENTICATED_ALLOWED_PROTOCOLS.has(protocol) &&
610
+ (this.shouldRejectPeer?.(connection.remotePeer.toString()) ?? false)
611
+ ) {
612
+ this.logger.debug(`Rejecting unauthenticated peer ${connection.remotePeer} on gated protocol ${protocol}`);
613
+ throw new ReqRespStatusError(ReqRespStatus.FAILURE);
614
+ }
615
+
605
616
  await this.processStream(protocol, incomingStream);
606
617
  } catch (err: any) {
607
618
  this.metrics.recordResponseError(protocol);
@@ -627,7 +638,9 @@ export class ReqResp implements ReqRespInterface {
627
638
  // and that this stream should be dropped
628
639
  const isMessageToNotWarn =
629
640
  err instanceof Error &&
630
- ['stream reset', 'Cannot push value onto an ended pushable'].some(msg => err.message.includes(msg));
641
+ ['stream reset', 'Cannot push value onto an ended pushable', 'read ECONNRESET'].some(msg =>
642
+ err.message.includes(msg),
643
+ );
631
644
  const level = isMessageToNotWarn ? 'debug' : 'warn';
632
645
  this.logger[level]('Unknown stream error while handling the stream, aborting', {
633
646
  protocol,
@@ -778,6 +791,20 @@ export class ReqResp implements ReqRespInterface {
778
791
  return undefined;
779
792
  }
780
793
 
794
+ // Invalid status byte: the peer sent a status byte that doesn't match any known status code.
795
+ // This is a protocol violation, penalize harshly.
796
+ if (e instanceof ReqRespStatusError) {
797
+ this.logger.warn(`Invalid status byte from peer ${peerId.toString()} in ${subProtocol}: ${e.message}`, logTags);
798
+ return PeerErrorSeverity.LowToleranceError;
799
+ }
800
+
801
+ // Oversized snappy response: the peer is sending data that exceeds the allowed size.
802
+ // This is a protocol violation that wastes bandwidth, so penalize harshly.
803
+ if (e instanceof OversizedSnappyResponseError) {
804
+ this.logger.warn(`Oversized response from peer ${peerId.toString()} in ${subProtocol}: ${e.message}`, logTags);
805
+ return PeerErrorSeverity.LowToleranceError;
806
+ }
807
+
781
808
  return this.categorizeConnectionErrors(e, peerId, subProtocol);
782
809
  }
783
810
 
@@ -1,7 +1,13 @@
1
1
  import type { SlotNumber } from '@aztec/foundation/branded-types';
2
2
  import type { EthAddress } from '@aztec/foundation/eth-address';
3
3
  import type { PeerInfo } from '@aztec/stdlib/interfaces/server';
4
- import type { BlockProposal, CheckpointAttestation, CheckpointProposalCore, Gossipable } from '@aztec/stdlib/p2p';
4
+ import type {
5
+ BlockProposal,
6
+ CheckpointAttestation,
7
+ CheckpointProposalCore,
8
+ Gossipable,
9
+ TopicType,
10
+ } from '@aztec/stdlib/p2p';
5
11
  import type { Tx } from '@aztec/stdlib/tx';
6
12
 
7
13
  import type { PeerId } from '@libp2p/interface';
@@ -111,7 +117,12 @@ export interface P2PService {
111
117
  // Leaky abstraction: fix https://github.com/AztecProtocol/aztec-packages/issues/7963
112
118
  registerBlockReceivedCallback(callback: P2PBlockReceivedCallback): void;
113
119
 
114
- registerCheckpointReceivedCallback(callback: P2PCheckpointReceivedCallback): void;
120
+ registerValidatorCheckpointReceivedCallback(callback: P2PCheckpointReceivedCallback): void;
121
+
122
+ registerAllNodesCheckpointReceivedCallback(callback: P2PCheckpointReceivedCallback): void;
123
+
124
+ /** Fires the all-nodes checkpoint callback for our own proposal (gossipsub doesn't deliver own messages). */
125
+ notifyOwnCheckpointProposal(checkpoint: CheckpointProposalCore): Promise<void>;
115
126
 
116
127
  /**
117
128
  * Registers a callback invoked when a duplicate proposal is detected (equivocation).
@@ -130,7 +141,10 @@ export interface P2PService {
130
141
 
131
142
  getPeers(includePending?: boolean): PeerInfo[];
132
143
 
133
- validate(txs: Tx[]): Promise<void>;
144
+ /** Returns the number of peers in the GossipSub mesh for a given topic type. */
145
+ getGossipMeshPeerCount(topicType: TopicType): number;
146
+
147
+ validateTxsReceivedInBlockProposal(txs: Tx[]): Promise<void>;
134
148
 
135
149
  addReqRespSubProtocol(
136
150
  subProtocol: ReqRespSubProtocol,
@@ -37,6 +37,18 @@ export type TxCollectionConfig = {
37
37
  txCollectionFileStoreSlowDelayMs: number;
38
38
  /** Delay in ms before file store collection starts after fast collection is triggered */
39
39
  txCollectionFileStoreFastDelayMs: number;
40
+ /** Number of concurrent workers for fast file store collection */
41
+ txCollectionFileStoreFastWorkerCount: number;
42
+ /** Number of concurrent workers for slow file store collection */
43
+ txCollectionFileStoreSlowWorkerCount: number;
44
+ /** Base backoff time in ms for fast file store collection retries */
45
+ txCollectionFileStoreFastBackoffBaseMs: number;
46
+ /** Base backoff time in ms for slow file store collection retries */
47
+ txCollectionFileStoreSlowBackoffBaseMs: number;
48
+ /** Max backoff time in ms for fast file store collection retries */
49
+ txCollectionFileStoreFastBackoffMaxMs: number;
50
+ /** Max backoff time in ms for slow file store collection retries */
51
+ txCollectionFileStoreSlowBackoffMaxMs: number;
40
52
  };
41
53
 
42
54
  export const txCollectionConfigMappings: ConfigMappingsType<TxCollectionConfig> = {
@@ -121,4 +133,34 @@ export const txCollectionConfigMappings: ConfigMappingsType<TxCollectionConfig>
121
133
  description: 'Delay before file store collection starts after fast collection',
122
134
  ...numberConfigHelper(2_000),
123
135
  },
136
+ txCollectionFileStoreFastWorkerCount: {
137
+ env: 'TX_COLLECTION_FILE_STORE_FAST_WORKER_COUNT',
138
+ description: 'Number of concurrent workers for fast file store collection',
139
+ ...numberConfigHelper(5),
140
+ },
141
+ txCollectionFileStoreSlowWorkerCount: {
142
+ env: 'TX_COLLECTION_FILE_STORE_SLOW_WORKER_COUNT',
143
+ description: 'Number of concurrent workers for slow file store collection',
144
+ ...numberConfigHelper(2),
145
+ },
146
+ txCollectionFileStoreFastBackoffBaseMs: {
147
+ env: 'TX_COLLECTION_FILE_STORE_FAST_BACKOFF_BASE_MS',
148
+ description: 'Base backoff time in ms for fast file store collection retries',
149
+ ...numberConfigHelper(1_000),
150
+ },
151
+ txCollectionFileStoreSlowBackoffBaseMs: {
152
+ env: 'TX_COLLECTION_FILE_STORE_SLOW_BACKOFF_BASE_MS',
153
+ description: 'Base backoff time in ms for slow file store collection retries',
154
+ ...numberConfigHelper(5_000),
155
+ },
156
+ txCollectionFileStoreFastBackoffMaxMs: {
157
+ env: 'TX_COLLECTION_FILE_STORE_FAST_BACKOFF_MAX_MS',
158
+ description: 'Max backoff time in ms for fast file store collection retries',
159
+ ...numberConfigHelper(5_000),
160
+ },
161
+ txCollectionFileStoreSlowBackoffMaxMs: {
162
+ env: 'TX_COLLECTION_FILE_STORE_SLOW_BACKOFF_MAX_MS',
163
+ description: 'Max backoff time in ms for slow file store collection retries',
164
+ ...numberConfigHelper(30_000),
165
+ },
124
166
  };