@aztec/p2p 0.0.1-commit.e558bd1c → 0.0.1-commit.e5a3663dd

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 (468) hide show
  1. package/README.md +129 -3
  2. package/dest/client/factory.d.ts +10 -9
  3. package/dest/client/factory.d.ts.map +1 -1
  4. package/dest/client/factory.js +54 -15
  5. package/dest/client/interface.d.ts +47 -34
  6. package/dest/client/interface.d.ts.map +1 -1
  7. package/dest/client/p2p_client.d.ts +39 -51
  8. package/dest/client/p2p_client.d.ts.map +1 -1
  9. package/dest/client/p2p_client.js +173 -226
  10. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +23 -10
  11. package/dest/config.d.ts +137 -92
  12. package/dest/config.d.ts.map +1 -1
  13. package/dest/config.js +113 -40
  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 +2 -2
  21. package/dest/index.d.ts.map +1 -1
  22. package/dest/index.js +1 -1
  23. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +24 -13
  24. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  25. package/dest/mem_pools/attestation_pool/attestation_pool.js +80 -43
  26. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +1 -1
  27. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
  28. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +57 -57
  29. package/dest/mem_pools/attestation_pool/index.d.ts +2 -2
  30. package/dest/mem_pools/attestation_pool/index.d.ts.map +1 -1
  31. package/dest/mem_pools/attestation_pool/index.js +1 -1
  32. package/dest/mem_pools/attestation_pool/mocks.d.ts +2 -2
  33. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  34. package/dest/mem_pools/attestation_pool/mocks.js +7 -5
  35. package/dest/mem_pools/index.d.ts +2 -2
  36. package/dest/mem_pools/index.d.ts.map +1 -1
  37. package/dest/mem_pools/instrumentation.d.ts +4 -2
  38. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  39. package/dest/mem_pools/instrumentation.js +33 -15
  40. package/dest/mem_pools/interface.d.ts +3 -3
  41. package/dest/mem_pools/interface.d.ts.map +1 -1
  42. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +104 -0
  43. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -0
  44. package/dest/mem_pools/tx_pool_v2/deleted_pool.js +251 -0
  45. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts +3 -3
  46. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts.map +1 -1
  47. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.js +18 -9
  48. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +1 -1
  49. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -1
  50. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +7 -3
  51. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +3 -3
  52. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -1
  53. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +12 -4
  54. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +3 -2
  55. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -1
  56. package/dest/mem_pools/tx_pool_v2/eviction/index.js +2 -1
  57. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts +16 -0
  58. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts.map +1 -0
  59. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.js +62 -0
  60. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +54 -5
  61. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -1
  62. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.js +8 -0
  63. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +7 -5
  64. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +9 -7
  65. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +2 -2
  66. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -1
  67. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +14 -6
  68. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +4 -4
  69. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -1
  70. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +16 -4
  71. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +3 -3
  72. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -1
  73. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +3 -3
  74. package/dest/mem_pools/tx_pool_v2/index.d.ts +3 -2
  75. package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -1
  76. package/dest/mem_pools/tx_pool_v2/index.js +2 -1
  77. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts +15 -0
  78. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts.map +1 -0
  79. package/dest/mem_pools/tx_pool_v2/instrumentation.js +43 -0
  80. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +33 -12
  81. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
  82. package/dest/mem_pools/tx_pool_v2/interfaces.js +5 -1
  83. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +81 -15
  84. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
  85. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +147 -19
  86. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +12 -3
  87. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -1
  88. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +50 -45
  89. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +12 -5
  90. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -1
  91. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +17 -6
  92. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +14 -5
  93. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -1
  94. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +365 -189
  95. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +9 -3
  96. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  97. package/dest/msg_validators/attestation_validator/attestation_validator.js +37 -12
  98. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +7 -3
  99. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
  100. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +2 -2
  101. package/dest/msg_validators/clock_tolerance.d.ts +12 -1
  102. package/dest/msg_validators/clock_tolerance.d.ts.map +1 -1
  103. package/dest/msg_validators/clock_tolerance.js +61 -3
  104. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +9 -4
  105. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
  106. package/dest/msg_validators/proposal_validator/block_proposal_validator.js +10 -2
  107. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +9 -4
  108. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
  109. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +16 -2
  110. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +19 -8
  111. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
  112. package/dest/msg_validators/proposal_validator/proposal_validator.js +88 -44
  113. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +4 -4
  114. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  115. package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +3 -3
  116. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +2 -1
  117. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -1
  118. package/dest/msg_validators/tx_validator/allowed_public_setup.js +24 -20
  119. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts +17 -0
  120. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts.map +1 -0
  121. package/dest/msg_validators/tx_validator/allowed_setup_helpers.js +24 -0
  122. package/dest/msg_validators/tx_validator/archive_cache.js +1 -1
  123. package/dest/msg_validators/tx_validator/block_header_validator.d.ts +16 -3
  124. package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
  125. package/dest/msg_validators/tx_validator/block_header_validator.js +1 -1
  126. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts +9 -0
  127. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts.map +1 -0
  128. package/dest/msg_validators/tx_validator/contract_instance_validator.js +48 -0
  129. package/dest/msg_validators/tx_validator/data_validator.d.ts +1 -1
  130. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  131. package/dest/msg_validators/tx_validator/data_validator.js +35 -2
  132. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +13 -3
  133. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
  134. package/dest/msg_validators/tx_validator/double_spend_validator.js +4 -4
  135. package/dest/msg_validators/tx_validator/factory.d.ts +133 -6
  136. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  137. package/dest/msg_validators/tx_validator/factory.js +247 -60
  138. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +1 -1
  139. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -1
  140. package/dest/msg_validators/tx_validator/fee_payer_balance.js +6 -2
  141. package/dest/msg_validators/tx_validator/gas_validator.d.ts +99 -3
  142. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  143. package/dest/msg_validators/tx_validator/gas_validator.js +137 -53
  144. package/dest/msg_validators/tx_validator/index.d.ts +3 -1
  145. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  146. package/dest/msg_validators/tx_validator/index.js +2 -0
  147. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +1 -1
  148. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  149. package/dest/msg_validators/tx_validator/metadata_validator.js +4 -4
  150. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts +14 -0
  151. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts.map +1 -0
  152. package/dest/msg_validators/tx_validator/nullifier_cache.js +24 -0
  153. package/dest/msg_validators/tx_validator/phases_validator.d.ts +22 -2
  154. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
  155. package/dest/msg_validators/tx_validator/phases_validator.js +72 -24
  156. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +20 -4
  157. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
  158. package/dest/msg_validators/tx_validator/timestamp_validator.js +6 -6
  159. package/dest/services/data_store.d.ts +1 -1
  160. package/dest/services/data_store.d.ts.map +1 -1
  161. package/dest/services/data_store.js +5 -5
  162. package/dest/services/dummy_service.d.ts +13 -6
  163. package/dest/services/dummy_service.d.ts.map +1 -1
  164. package/dest/services/dummy_service.js +13 -5
  165. package/dest/services/encoding.d.ts +7 -3
  166. package/dest/services/encoding.d.ts.map +1 -1
  167. package/dest/services/encoding.js +18 -11
  168. package/dest/services/gossipsub/index.d.ts +3 -0
  169. package/dest/services/gossipsub/index.d.ts.map +1 -0
  170. package/dest/services/gossipsub/index.js +2 -0
  171. package/dest/services/gossipsub/scoring.d.ts +21 -3
  172. package/dest/services/gossipsub/scoring.d.ts.map +1 -1
  173. package/dest/services/gossipsub/scoring.js +24 -7
  174. package/dest/services/gossipsub/topic_score_params.d.ts +184 -0
  175. package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -0
  176. package/dest/services/gossipsub/topic_score_params.js +363 -0
  177. package/dest/services/libp2p/instrumentation.d.ts +3 -1
  178. package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
  179. package/dest/services/libp2p/instrumentation.js +14 -0
  180. package/dest/services/libp2p/libp2p_service.d.ts +42 -39
  181. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  182. package/dest/services/libp2p/libp2p_service.js +336 -269
  183. package/dest/services/peer-manager/metrics.d.ts +3 -1
  184. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  185. package/dest/services/peer-manager/metrics.js +6 -0
  186. package/dest/services/peer-manager/peer_manager.d.ts +6 -2
  187. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  188. package/dest/services/peer-manager/peer_manager.js +39 -11
  189. package/dest/services/peer-manager/peer_scoring.d.ts +7 -2
  190. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  191. package/dest/services/peer-manager/peer_scoring.js +57 -12
  192. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +12 -8
  193. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -1
  194. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +83 -106
  195. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +4 -7
  196. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
  197. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +11 -13
  198. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -1
  199. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +31 -46
  200. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +19 -11
  201. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -1
  202. package/dest/services/reqresp/batch-tx-requester/peer_collection.js +52 -15
  203. package/dest/services/reqresp/batch-tx-requester/tx_validator.js +2 -2
  204. package/dest/services/reqresp/config.d.ts +3 -3
  205. package/dest/services/reqresp/config.d.ts.map +1 -1
  206. package/dest/services/reqresp/interface.d.ts +23 -9
  207. package/dest/services/reqresp/interface.d.ts.map +1 -1
  208. package/dest/services/reqresp/interface.js +23 -10
  209. package/dest/services/reqresp/metrics.d.ts +1 -1
  210. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  211. package/dest/services/reqresp/metrics.js +0 -1
  212. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +3 -3
  213. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
  214. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +7 -1
  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 +15 -0
  217. package/dest/services/reqresp/protocols/index.d.ts +1 -2
  218. package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
  219. package/dest/services/reqresp/protocols/index.js +0 -1
  220. package/dest/services/reqresp/protocols/tx.d.ts +7 -1
  221. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  222. package/dest/services/reqresp/protocols/tx.js +21 -3
  223. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +5 -4
  224. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
  225. package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -8
  226. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
  227. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
  228. package/dest/services/reqresp/rate-limiter/rate_limits.js +0 -10
  229. package/dest/services/reqresp/reqresp.d.ts +4 -2
  230. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  231. package/dest/services/reqresp/reqresp.js +40 -15
  232. package/dest/services/service.d.ts +26 -4
  233. package/dest/services/service.d.ts.map +1 -1
  234. package/dest/services/tx_collection/config.d.ts +19 -1
  235. package/dest/services/tx_collection/config.d.ts.map +1 -1
  236. package/dest/services/tx_collection/config.js +46 -0
  237. package/dest/services/tx_collection/fast_tx_collection.d.ts +3 -4
  238. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
  239. package/dest/services/tx_collection/fast_tx_collection.js +80 -76
  240. package/dest/services/tx_collection/file_store_tx_collection.d.ts +53 -0
  241. package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -0
  242. package/dest/services/tx_collection/file_store_tx_collection.js +167 -0
  243. package/dest/services/tx_collection/file_store_tx_source.d.ts +38 -0
  244. package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -0
  245. package/dest/services/tx_collection/file_store_tx_source.js +100 -0
  246. package/dest/services/tx_collection/index.d.ts +2 -1
  247. package/dest/services/tx_collection/index.d.ts.map +1 -1
  248. package/dest/services/tx_collection/index.js +1 -0
  249. package/dest/services/tx_collection/instrumentation.d.ts +1 -1
  250. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
  251. package/dest/services/tx_collection/instrumentation.js +2 -1
  252. package/dest/services/tx_collection/proposal_tx_collector.d.ts +7 -7
  253. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -1
  254. package/dest/services/tx_collection/proposal_tx_collector.js +5 -4
  255. package/dest/services/tx_collection/request_tracker.d.ts +53 -0
  256. package/dest/services/tx_collection/request_tracker.d.ts.map +1 -0
  257. package/dest/services/tx_collection/request_tracker.js +84 -0
  258. package/dest/services/tx_collection/slow_tx_collection.d.ts +7 -3
  259. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -1
  260. package/dest/services/tx_collection/slow_tx_collection.js +60 -26
  261. package/dest/services/tx_collection/tx_collection.d.ts +23 -13
  262. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  263. package/dest/services/tx_collection/tx_collection.js +75 -3
  264. package/dest/services/tx_collection/tx_collection_sink.d.ts +18 -8
  265. package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -1
  266. package/dest/services/tx_collection/tx_collection_sink.js +26 -29
  267. package/dest/services/tx_collection/tx_source.d.ts +13 -7
  268. package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
  269. package/dest/services/tx_collection/tx_source.js +26 -7
  270. package/dest/services/tx_file_store/config.d.ts +1 -3
  271. package/dest/services/tx_file_store/config.d.ts.map +1 -1
  272. package/dest/services/tx_file_store/config.js +0 -4
  273. package/dest/services/tx_file_store/tx_file_store.d.ts +4 -3
  274. package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -1
  275. package/dest/services/tx_file_store/tx_file_store.js +9 -6
  276. package/dest/services/tx_provider.d.ts +4 -4
  277. package/dest/services/tx_provider.d.ts.map +1 -1
  278. package/dest/services/tx_provider.js +9 -8
  279. package/dest/test-helpers/make-test-p2p-clients.d.ts +7 -8
  280. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  281. package/dest/test-helpers/make-test-p2p-clients.js +4 -2
  282. package/dest/test-helpers/mock-pubsub.d.ts +40 -6
  283. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  284. package/dest/test-helpers/mock-pubsub.js +139 -13
  285. package/dest/test-helpers/reqresp-nodes.d.ts +2 -3
  286. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  287. package/dest/test-helpers/reqresp-nodes.js +8 -5
  288. package/dest/test-helpers/testbench-utils.d.ts +35 -24
  289. package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
  290. package/dest/test-helpers/testbench-utils.js +125 -38
  291. package/dest/testbench/p2p_client_testbench_worker.d.ts +2 -2
  292. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  293. package/dest/testbench/p2p_client_testbench_worker.js +84 -27
  294. package/dest/testbench/worker_client_manager.d.ts +10 -1
  295. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  296. package/dest/testbench/worker_client_manager.js +55 -3
  297. package/dest/util.d.ts +3 -3
  298. package/dest/util.d.ts.map +1 -1
  299. package/package.json +14 -14
  300. package/src/client/factory.ts +108 -26
  301. package/src/client/interface.ts +52 -34
  302. package/src/client/p2p_client.ts +201 -269
  303. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +35 -14
  304. package/src/config.ts +181 -46
  305. package/src/errors/p2p-service.error.ts +11 -0
  306. package/src/errors/tx-pool.error.ts +12 -0
  307. package/src/index.ts +1 -1
  308. package/src/mem_pools/attestation_pool/attestation_pool.ts +109 -53
  309. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +61 -57
  310. package/src/mem_pools/attestation_pool/index.ts +3 -3
  311. package/src/mem_pools/attestation_pool/mocks.ts +14 -8
  312. package/src/mem_pools/index.ts +1 -1
  313. package/src/mem_pools/instrumentation.ts +22 -14
  314. package/src/mem_pools/interface.ts +2 -2
  315. package/src/mem_pools/tx_pool_v2/README.md +85 -11
  316. package/src/mem_pools/tx_pool_v2/deleted_pool.ts +321 -0
  317. package/src/mem_pools/tx_pool_v2/eviction/eviction_manager.ts +21 -8
  318. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +7 -3
  319. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +18 -4
  320. package/src/mem_pools/tx_pool_v2/eviction/index.ts +5 -0
  321. package/src/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.ts +65 -0
  322. package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +59 -4
  323. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +5 -5
  324. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +8 -8
  325. package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +14 -9
  326. package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +33 -6
  327. package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +4 -3
  328. package/src/mem_pools/tx_pool_v2/index.ts +2 -1
  329. package/src/mem_pools/tx_pool_v2/instrumentation.ts +69 -0
  330. package/src/mem_pools/tx_pool_v2/interfaces.ts +35 -12
  331. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +215 -27
  332. package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +58 -45
  333. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +34 -8
  334. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +412 -187
  335. package/src/msg_validators/attestation_validator/README.md +49 -0
  336. package/src/msg_validators/attestation_validator/attestation_validator.ts +41 -9
  337. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +12 -2
  338. package/src/msg_validators/clock_tolerance.ts +79 -3
  339. package/src/msg_validators/proposal_validator/README.md +123 -0
  340. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +23 -4
  341. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +34 -7
  342. package/src/msg_validators/proposal_validator/proposal_validator.ts +111 -47
  343. package/src/msg_validators/tx_validator/README.md +127 -0
  344. package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +5 -5
  345. package/src/msg_validators/tx_validator/allowed_public_setup.ts +22 -27
  346. package/src/msg_validators/tx_validator/allowed_setup_helpers.ts +31 -0
  347. package/src/msg_validators/tx_validator/archive_cache.ts +1 -1
  348. package/src/msg_validators/tx_validator/block_header_validator.ts +15 -3
  349. package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
  350. package/src/msg_validators/tx_validator/data_validator.ts +42 -1
  351. package/src/msg_validators/tx_validator/double_spend_validator.ts +11 -6
  352. package/src/msg_validators/tx_validator/factory.ts +396 -78
  353. package/src/msg_validators/tx_validator/fee_payer_balance.ts +6 -2
  354. package/src/msg_validators/tx_validator/gas_validator.ts +199 -54
  355. package/src/msg_validators/tx_validator/index.ts +2 -0
  356. package/src/msg_validators/tx_validator/metadata_validator.ts +12 -4
  357. package/src/msg_validators/tx_validator/nullifier_cache.ts +30 -0
  358. package/src/msg_validators/tx_validator/phases_validator.ts +82 -27
  359. package/src/msg_validators/tx_validator/timestamp_validator.ts +23 -18
  360. package/src/services/data_store.ts +5 -13
  361. package/src/services/dummy_service.ts +19 -7
  362. package/src/services/encoding.ts +18 -10
  363. package/src/services/gossipsub/README.md +641 -0
  364. package/src/services/gossipsub/index.ts +2 -0
  365. package/src/services/gossipsub/scoring.ts +29 -5
  366. package/src/services/gossipsub/topic_score_params.ts +519 -0
  367. package/src/services/libp2p/instrumentation.ts +14 -0
  368. package/src/services/libp2p/libp2p_service.ts +358 -298
  369. package/src/services/peer-manager/metrics.ts +7 -0
  370. package/src/services/peer-manager/peer_manager.ts +45 -11
  371. package/src/services/peer-manager/peer_scoring.ts +52 -5
  372. package/src/services/reqresp/README.md +229 -0
  373. package/src/services/reqresp/batch-tx-requester/README.md +46 -7
  374. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +79 -112
  375. package/src/services/reqresp/batch-tx-requester/interface.ts +3 -6
  376. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +30 -71
  377. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +68 -24
  378. package/src/services/reqresp/batch-tx-requester/tx_validator.ts +2 -2
  379. package/src/services/reqresp/config.ts +2 -2
  380. package/src/services/reqresp/interface.ts +45 -10
  381. package/src/services/reqresp/metrics.ts +0 -1
  382. package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +2 -2
  383. package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +17 -0
  384. package/src/services/reqresp/protocols/index.ts +0 -1
  385. package/src/services/reqresp/protocols/tx.ts +23 -3
  386. package/src/services/reqresp/rate-limiter/rate_limiter.ts +13 -9
  387. package/src/services/reqresp/rate-limiter/rate_limits.ts +0 -10
  388. package/src/services/reqresp/reqresp.ts +53 -16
  389. package/src/services/service.ts +37 -3
  390. package/src/services/tx_collection/config.ts +68 -0
  391. package/src/services/tx_collection/fast_tx_collection.ts +83 -76
  392. package/src/services/tx_collection/file_store_tx_collection.ts +202 -0
  393. package/src/services/tx_collection/file_store_tx_source.ts +129 -0
  394. package/src/services/tx_collection/index.ts +1 -0
  395. package/src/services/tx_collection/instrumentation.ts +7 -1
  396. package/src/services/tx_collection/proposal_tx_collector.ts +9 -13
  397. package/src/services/tx_collection/request_tracker.ts +127 -0
  398. package/src/services/tx_collection/slow_tx_collection.ts +66 -33
  399. package/src/services/tx_collection/tx_collection.ts +114 -19
  400. package/src/services/tx_collection/tx_collection_sink.ts +30 -34
  401. package/src/services/tx_collection/tx_source.ts +28 -8
  402. package/src/services/tx_file_store/config.ts +0 -6
  403. package/src/services/tx_file_store/tx_file_store.ts +10 -8
  404. package/src/services/tx_provider.ts +10 -9
  405. package/src/test-helpers/make-test-p2p-clients.ts +6 -6
  406. package/src/test-helpers/mock-pubsub.ts +180 -14
  407. package/src/test-helpers/reqresp-nodes.ts +9 -9
  408. package/src/test-helpers/testbench-utils.ts +147 -43
  409. package/src/testbench/p2p_client_testbench_worker.ts +93 -30
  410. package/src/testbench/worker_client_manager.ts +68 -6
  411. package/src/util.ts +8 -2
  412. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +0 -125
  413. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +0 -1
  414. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +0 -596
  415. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +0 -32
  416. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +0 -1
  417. package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +0 -112
  418. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +0 -157
  419. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +0 -1
  420. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +0 -52
  421. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +0 -16
  422. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +0 -1
  423. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +0 -122
  424. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +0 -17
  425. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +0 -1
  426. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +0 -84
  427. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +0 -19
  428. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +0 -1
  429. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +0 -78
  430. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +0 -26
  431. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +0 -1
  432. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +0 -84
  433. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +0 -25
  434. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +0 -1
  435. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +0 -57
  436. package/dest/mem_pools/tx_pool/index.d.ts +0 -3
  437. package/dest/mem_pools/tx_pool/index.d.ts.map +0 -1
  438. package/dest/mem_pools/tx_pool/index.js +0 -2
  439. package/dest/mem_pools/tx_pool/priority.d.ts +0 -12
  440. package/dest/mem_pools/tx_pool/priority.d.ts.map +0 -1
  441. package/dest/mem_pools/tx_pool/priority.js +0 -15
  442. package/dest/mem_pools/tx_pool/tx_pool.d.ts +0 -127
  443. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +0 -1
  444. package/dest/mem_pools/tx_pool/tx_pool.js +0 -3
  445. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +0 -7
  446. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +0 -1
  447. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +0 -400
  448. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +0 -23
  449. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +0 -1
  450. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +0 -212
  451. package/dest/services/reqresp/protocols/block.d.ts +0 -9
  452. package/dest/services/reqresp/protocols/block.d.ts.map +0 -1
  453. package/dest/services/reqresp/protocols/block.js +0 -32
  454. package/src/mem_pools/tx_pool/README.md +0 -270
  455. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -746
  456. package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +0 -132
  457. package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +0 -208
  458. package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +0 -162
  459. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +0 -104
  460. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +0 -93
  461. package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +0 -106
  462. package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +0 -75
  463. package/src/mem_pools/tx_pool/index.ts +0 -2
  464. package/src/mem_pools/tx_pool/priority.ts +0 -20
  465. package/src/mem_pools/tx_pool/tx_pool.ts +0 -141
  466. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +0 -319
  467. package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +0 -230
  468. 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,5 +1,3 @@
1
- import { Fr } from '@aztec/foundation/curves/bn254';
2
- import { L2Block } from '@aztec/stdlib/block';
3
1
  import { TxArray, TxHashArray } from '@aztec/stdlib/tx';
4
2
 
5
3
  import type { PeerId } from '@libp2p/interface';
@@ -7,8 +5,13 @@ import type { PeerId } from '@libp2p/interface';
7
5
  import type { P2PReqRespConfig } from './config.js';
8
6
  import type { ConnectionSampler } from './connection-sampler/connection_sampler.js';
9
7
  import { AuthRequest, AuthResponse } from './protocols/auth.js';
10
- import { BlockTxsRequest, BlockTxsResponse } from './protocols/block_txs/block_txs_reqresp.js';
8
+ import {
9
+ BlockTxsRequest,
10
+ BlockTxsResponse,
11
+ calculateBlockTxsResponseSize,
12
+ } from './protocols/block_txs/block_txs_reqresp.js';
11
13
  import { StatusMessage } from './protocols/status.js';
14
+ import { calculateTxResponseSize } from './protocols/tx.js';
12
15
  import type { ReqRespStatus } from './status.js';
13
16
 
14
17
  /*
@@ -18,7 +21,6 @@ export const PING_PROTOCOL = '/aztec/req/ping/1.0.0';
18
21
  export const STATUS_PROTOCOL = '/aztec/req/status/1.0.0';
19
22
  export const GOODBYE_PROTOCOL = '/aztec/req/goodbye/1.0.0';
20
23
  export const TX_REQ_PROTOCOL = '/aztec/req/tx/1.0.0';
21
- export const BLOCK_REQ_PROTOCOL = '/aztec/req/block/1.0.0';
22
24
  export const AUTH_PROTOCOL = '/aztec/req/auth/1.0.0';
23
25
  export const BLOCK_TXS_REQ_PROTOCOL = '/aztec/req/block_txs/1.0.0';
24
26
 
@@ -27,7 +29,6 @@ export enum ReqRespSubProtocol {
27
29
  STATUS = STATUS_PROTOCOL,
28
30
  GOODBYE = GOODBYE_PROTOCOL,
29
31
  TX = TX_REQ_PROTOCOL,
30
- BLOCK = BLOCK_REQ_PROTOCOL,
31
32
  AUTH = AUTH_PROTOCOL,
32
33
  BLOCK_TXS = BLOCK_TXS_REQ_PROTOCOL,
33
34
  }
@@ -94,12 +95,29 @@ export type ReqRespSubProtocolValidators = {
94
95
  [S in ReqRespSubProtocol]: ResponseValidator<any, any>;
95
96
  };
96
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
+
97
116
  export const DEFAULT_SUB_PROTOCOL_VALIDATORS: ReqRespSubProtocolValidators = {
98
117
  [ReqRespSubProtocol.PING]: noopValidator,
99
118
  [ReqRespSubProtocol.STATUS]: noopValidator,
100
119
  [ReqRespSubProtocol.TX]: noopValidator,
101
120
  [ReqRespSubProtocol.GOODBYE]: noopValidator,
102
- [ReqRespSubProtocol.BLOCK]: noopValidator,
103
121
  [ReqRespSubProtocol.AUTH]: noopValidator,
104
122
  [ReqRespSubProtocol.BLOCK_TXS]: noopValidator,
105
123
  };
@@ -197,10 +215,6 @@ export const subProtocolMap = {
197
215
  request: RequestableBuffer,
198
216
  response: RequestableBuffer,
199
217
  },
200
- [ReqRespSubProtocol.BLOCK]: {
201
- request: Fr, // block number
202
- response: L2Block,
203
- },
204
218
  [ReqRespSubProtocol.AUTH]: {
205
219
  request: AuthRequest,
206
220
  response: AuthResponse,
@@ -211,6 +225,24 @@ export const subProtocolMap = {
211
225
  },
212
226
  };
213
227
 
228
+ /**
229
+ * Type for a function that calculates the expected response size in KB for a given request.
230
+ */
231
+ export type ExpectedResponseSizeCalculator = (requestBuffer: Buffer) => number;
232
+
233
+ /**
234
+ * Map of sub-protocols to their expected response size calculators.
235
+ * These are used to validate that responses don't exceed expected sizes based on request parameters.
236
+ */
237
+ export const subProtocolSizeCalculators: Record<ReqRespSubProtocol, ExpectedResponseSizeCalculator> = {
238
+ [ReqRespSubProtocol.TX]: calculateTxResponseSize,
239
+ [ReqRespSubProtocol.BLOCK_TXS]: calculateBlockTxsResponseSize,
240
+ [ReqRespSubProtocol.STATUS]: () => 1,
241
+ [ReqRespSubProtocol.PING]: () => 1,
242
+ [ReqRespSubProtocol.AUTH]: () => 1,
243
+ [ReqRespSubProtocol.GOODBYE]: () => 1, // No response expected, but provide minimal limit
244
+ };
245
+
214
246
  export interface ReqRespInterface {
215
247
  start(
216
248
  subProtocolHandlers: Partial<ReqRespSubProtocolHandlers>,
@@ -239,5 +271,8 @@ export interface ReqRespInterface {
239
271
 
240
272
  updateConfig(config: Partial<P2PReqRespConfig>): void;
241
273
 
274
+ /** Sets the callback used to reject unauthenticated peers on gated req/resp protocols. */
275
+ setShouldRejectPeer(checker: ShouldRejectPeer): void;
276
+
242
277
  getConnectionSampler(): Pick<ConnectionSampler, 'getPeerListSortedByConnectionCountAsc'>;
243
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,7 +5,7 @@ import { TxArray } from '@aztec/stdlib/tx';
5
5
  import type { PeerId } from '@libp2p/interface';
6
6
 
7
7
  import type { AttestationPoolApi } from '../../../../mem_pools/attestation_pool/attestation_pool.js';
8
- import type { TxPool } from '../../../../mem_pools/index.js';
8
+ import type { TxPoolV2 } from '../../../../mem_pools/tx_pool_v2/interfaces.js';
9
9
  import type { ReqRespSubProtocolHandler } from '../../interface.js';
10
10
  import { ReqRespStatus, ReqRespStatusError } from '../../status.js';
11
11
  import { BitVector } from './bitvector.js';
@@ -21,7 +21,7 @@ import { BlockTxsRequest, BlockTxsResponse } from './block_txs_reqresp.js';
21
21
  export function reqRespBlockTxsHandler(
22
22
  attestationPool: AttestationPoolApi,
23
23
  archiver: L2BlockSource,
24
- txPool: TxPool,
24
+ txPool: TxPoolV2,
25
25
  ): ReqRespSubProtocolHandler {
26
26
  /**
27
27
  * Handler for block txs requests
@@ -1,5 +1,6 @@
1
1
  import { Fr } from '@aztec/foundation/curves/bn254';
2
2
  import { BufferReader, serializeToBuffer } from '@aztec/foundation/serialize';
3
+ import { MAX_TX_SIZE_KB } from '@aztec/stdlib/p2p';
3
4
  import { TxArray, type TxHash, TxHashArray } from '@aztec/stdlib/tx';
4
5
 
5
6
  import { BitVector } from './bitvector.js';
@@ -125,3 +126,19 @@ export class BlockTxsResponse {
125
126
  return new BlockTxsResponse(Fr.ZERO, new TxArray(), BitVector.init(0, []));
126
127
  }
127
128
  }
129
+
130
+ /**
131
+ * Calculate the expected response size for a BLOCK_TXS request.
132
+ * @param requestBuffer - The serialized request buffer containing BlockTxsRequest
133
+ * @returns Expected response size in KB
134
+ */
135
+ export function calculateBlockTxsResponseSize(requestBuffer: Buffer): number {
136
+ try {
137
+ const request = BlockTxsRequest.fromBuffer(requestBuffer);
138
+ const requestedTxCount = request.txIndices.getTrueIndices().length;
139
+ return requestedTxCount * MAX_TX_SIZE_KB + 1; // +1 KB overhead for serialization
140
+ } catch {
141
+ // If we can't parse the request, fall back to allowing a single transaction response
142
+ return MAX_TX_SIZE_KB + 1;
143
+ }
144
+ }
@@ -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';
@@ -1,4 +1,5 @@
1
1
  import { chunk } from '@aztec/foundation/collection';
2
+ import { MAX_TX_SIZE_KB } from '@aztec/stdlib/p2p';
2
3
  import { TxArray, TxHash, TxHashArray } from '@aztec/stdlib/tx';
3
4
 
4
5
  import type { PeerId } from '@libp2p/interface';
@@ -50,8 +51,27 @@ export function reqRespTxHandler(mempools: MemPools): ReqRespSubProtocolHandler
50
51
  * Per: https://github.com/AztecProtocol/aztec-packages/issues/15149#issuecomment-2999054485
51
52
  * we define Q as max number of transactions per batch, the comment explains why we use 8.
52
53
  */
53
- //TODO: (mralj) chunk size should by default be 8, this is just temporary until the protocol is implemented correctly
54
- //more info: https://github.com/AztecProtocol/aztec-packages/pull/15516#pullrequestreview-2995474321
55
- export function chunkTxHashesRequest(hashes: TxHash[], chunkSize = 1): Array<TxHashArray> {
54
+ export function chunkTxHashesRequest(hashes: TxHash[], chunkSize = 8): Array<TxHashArray> {
56
55
  return chunk(hashes, chunkSize).map(chunk => new TxHashArray(...chunk));
57
56
  }
57
+
58
+ /**
59
+ * Calculate the expected response size for a TX request.
60
+ * @param requestBuffer - The serialized request buffer containing TxHashArray
61
+ * @returns Expected response size in KB
62
+ */
63
+ export function calculateTxResponseSize(requestBuffer: Buffer): number {
64
+ try {
65
+ const txHashes = TxHashArray.fromBuffer(requestBuffer);
66
+ // TxHashArray.fromBuffer returns empty array on parse failure, so check for that
67
+ if (txHashes.length === 0 && requestBuffer.length > 0) {
68
+ // If we got an empty array but had a non-empty buffer, parsing likely failed
69
+ // Fall back to allowing a single transaction response
70
+ return MAX_TX_SIZE_KB + 1;
71
+ }
72
+ return Math.max(txHashes.length, 1) * MAX_TX_SIZE_KB + 1; // +1 KB overhead, at least 1 tx
73
+ } catch {
74
+ // If we can't parse the request, fall back to allowing a single transaction response
75
+ return MAX_TX_SIZE_KB + 1;
76
+ }
77
+ }
@@ -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,8 +34,11 @@ 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,
41
+ subProtocolSizeCalculators,
39
42
  } from './interface.js';
40
43
  import { ReqRespMetrics } from './metrics.js';
41
44
  import {
@@ -71,6 +74,8 @@ export class ReqResp implements ReqRespInterface {
71
74
 
72
75
  private snappyTransform: SnappyTransform;
73
76
 
77
+ private shouldRejectPeer: ShouldRejectPeer | undefined;
78
+
74
79
  private metrics: ReqRespMetrics;
75
80
 
76
81
  constructor(
@@ -107,6 +112,10 @@ export class ReqResp implements ReqRespInterface {
107
112
  }
108
113
  }
109
114
 
115
+ public setShouldRejectPeer(checker: ShouldRejectPeer): void {
116
+ this.shouldRejectPeer = checker;
117
+ }
118
+
110
119
  get tracer() {
111
120
  return this.metrics.tracer;
112
121
  }
@@ -319,7 +328,7 @@ export class ReqResp implements ReqRespInterface {
319
328
  };
320
329
 
321
330
  for (const index of indices) {
322
- this.logger.info(`Sending request ${index} to peer ${peerAsString}`);
331
+ this.logger.trace(`Sending request ${index} to peer ${peerAsString}`);
323
332
  const response = await this.sendRequestToPeer(peer, subProtocol, requestBuffers[index]);
324
333
 
325
334
  // Check the status of the response buffer
@@ -437,6 +446,9 @@ export class ReqResp implements ReqRespInterface {
437
446
  try {
438
447
  this.metrics.recordRequestSent(subProtocol);
439
448
 
449
+ // Calculate expected response size based on the request payload
450
+ const expectedSizeKb = subProtocolSizeCalculators[subProtocol](payload);
451
+
440
452
  this.logger.trace(`Sending request to peer ${peerId.toString()} on sub protocol ${subProtocol}`);
441
453
  stream = await this.connectionSampler.dialProtocol(peerId, subProtocol, dialTimeout);
442
454
  this.logger.trace(
@@ -444,18 +456,21 @@ export class ReqResp implements ReqRespInterface {
444
456
  );
445
457
 
446
458
  const timeoutErr = new IndividualReqRespTimeoutError();
459
+ // Create a wrapper to pass the expected size to readMessage
460
+ const readMessageWithSizeLimit = (source: AsyncIterable<Uint8ArrayList>) =>
461
+ this.readMessage(source, expectedSizeKb);
447
462
  const [_, resp] = await executeTimeout(
448
463
  signal =>
449
464
  Promise.all([
450
465
  pipeline([payload], stream!.sink, { signal }),
451
- pipeline(stream!.source, this.readMessage.bind(this), { signal }),
466
+ pipeline(stream!.source, readMessageWithSizeLimit, { signal }),
452
467
  ]),
453
468
  this.individualRequestTimeoutMs,
454
469
  () => timeoutErr,
455
470
  );
456
471
  return resp;
457
472
  } catch (e: any) {
458
- this.logger.warn(`SUBPROTOCOL: ${subProtocol}\n`, e);
473
+ this.logger.debug(`SUBPROTOCOL: ${subProtocol}\n`, e);
459
474
  // On error we immediately abort the stream, this is preferred way,
460
475
  // because it signals to the sender that error happened, whereas
461
476
  // closing the stream only closes our side and is much slower
@@ -510,8 +525,11 @@ export class ReqResp implements ReqRespInterface {
510
525
  * The message is split into two components
511
526
  * - The first chunk should contain a control byte, indicating the status of the response see `ReqRespStatus`
512
527
  * - The second chunk should contain the response data
528
+ *
529
+ * @param source - The async iterable source of data chunks
530
+ * @param maxSizeKb - Optional maximum expected size in KB for the decompressed response
513
531
  */
514
- private async readMessage(source: AsyncIterable<Uint8ArrayList>): Promise<ReqRespResponse> {
532
+ private async readMessage(source: AsyncIterable<Uint8ArrayList>, maxSizeKb?: number): Promise<ReqRespResponse> {
515
533
  let status: ReqRespStatus | undefined;
516
534
  const chunks: Uint8Array[] = [];
517
535
 
@@ -536,23 +554,17 @@ export class ReqResp implements ReqRespInterface {
536
554
  }
537
555
 
538
556
  const messageData = Buffer.concat(chunks);
539
- const message: Buffer = this.snappyTransform.inboundTransformData(messageData);
557
+ const message: Buffer = this.snappyTransform.inboundTransformData(messageData, undefined, maxSizeKb);
540
558
 
541
559
  return {
542
560
  status: status ?? ReqRespStatus.UNKNOWN,
543
561
  data: message,
544
562
  };
545
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.
546
566
  this.logger.debug(`Reading message failed: ${e.message}`);
547
-
548
- let status = ReqRespStatus.UNKNOWN;
549
- if (e instanceof ReqRespStatusError) {
550
- status = e.status;
551
- }
552
-
553
- return {
554
- status,
555
- };
567
+ throw e;
556
568
  }
557
569
  }
558
570
 
@@ -592,6 +604,15 @@ export class ReqResp implements ReqRespInterface {
592
604
  throw new ReqRespStatusError(ReqRespStatus.RATE_LIMIT_EXCEEDED);
593
605
  }
594
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
+
595
616
  await this.processStream(protocol, incomingStream);
596
617
  } catch (err: any) {
597
618
  this.metrics.recordResponseError(protocol);
@@ -617,7 +638,9 @@ export class ReqResp implements ReqRespInterface {
617
638
  // and that this stream should be dropped
618
639
  const isMessageToNotWarn =
619
640
  err instanceof Error &&
620
- ['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
+ );
621
644
  const level = isMessageToNotWarn ? 'debug' : 'warn';
622
645
  this.logger[level]('Unknown stream error while handling the stream, aborting', {
623
646
  protocol,
@@ -768,6 +791,20 @@ export class ReqResp implements ReqRespInterface {
768
791
  return undefined;
769
792
  }
770
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
+
771
808
  return this.categorizeConnectionErrors(e, peerId, subProtocol);
772
809
  }
773
810