@aztec/p2p 0.0.1-commit.6d63667d → 0.0.1-commit.7b97ef96e

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 (291) hide show
  1. package/dest/client/factory.d.ts +7 -6
  2. package/dest/client/factory.d.ts.map +1 -1
  3. package/dest/client/factory.js +46 -11
  4. package/dest/client/interface.d.ts +43 -23
  5. package/dest/client/interface.d.ts.map +1 -1
  6. package/dest/client/p2p_client.d.ts +38 -42
  7. package/dest/client/p2p_client.d.ts.map +1 -1
  8. package/dest/client/p2p_client.js +145 -145
  9. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +6 -6
  10. package/dest/config.d.ts +23 -4
  11. package/dest/config.d.ts.map +1 -1
  12. package/dest/config.js +16 -1
  13. package/dest/errors/tx-pool.error.d.ts +8 -0
  14. package/dest/errors/tx-pool.error.d.ts.map +1 -0
  15. package/dest/errors/tx-pool.error.js +9 -0
  16. package/dest/index.d.ts +2 -1
  17. package/dest/index.d.ts.map +1 -1
  18. package/dest/index.js +1 -0
  19. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +104 -88
  20. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  21. package/dest/mem_pools/attestation_pool/attestation_pool.js +441 -3
  22. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +2 -2
  23. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
  24. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +353 -87
  25. package/dest/mem_pools/attestation_pool/index.d.ts +2 -3
  26. package/dest/mem_pools/attestation_pool/index.d.ts.map +1 -1
  27. package/dest/mem_pools/attestation_pool/index.js +1 -2
  28. package/dest/mem_pools/attestation_pool/mocks.d.ts +2 -2
  29. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  30. package/dest/mem_pools/attestation_pool/mocks.js +2 -2
  31. package/dest/mem_pools/index.d.ts +3 -2
  32. package/dest/mem_pools/index.d.ts.map +1 -1
  33. package/dest/mem_pools/index.js +1 -1
  34. package/dest/mem_pools/interface.d.ts +5 -5
  35. package/dest/mem_pools/interface.d.ts.map +1 -1
  36. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +3 -3
  37. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +104 -0
  38. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -0
  39. package/dest/mem_pools/tx_pool_v2/deleted_pool.js +251 -0
  40. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts +3 -3
  41. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts.map +1 -1
  42. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.js +18 -9
  43. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +1 -1
  44. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -1
  45. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +4 -1
  46. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +3 -3
  47. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -1
  48. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +10 -4
  49. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +2 -2
  50. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -1
  51. package/dest/mem_pools/tx_pool_v2/eviction/index.js +1 -1
  52. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +48 -5
  53. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -1
  54. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.js +8 -0
  55. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +7 -5
  56. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +5 -3
  57. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +1 -1
  58. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -1
  59. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +8 -4
  60. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +4 -4
  61. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -1
  62. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +14 -4
  63. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +3 -3
  64. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -1
  65. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +2 -2
  66. package/dest/mem_pools/tx_pool_v2/index.d.ts +2 -1
  67. package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -1
  68. package/dest/mem_pools/tx_pool_v2/index.js +1 -0
  69. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts +15 -0
  70. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts.map +1 -0
  71. package/dest/mem_pools/tx_pool_v2/instrumentation.js +43 -0
  72. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +16 -4
  73. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
  74. package/dest/mem_pools/tx_pool_v2/interfaces.js +3 -1
  75. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +31 -5
  76. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
  77. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +62 -5
  78. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +12 -3
  79. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -1
  80. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +27 -4
  81. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +8 -3
  82. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -1
  83. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +11 -6
  84. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +12 -4
  85. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -1
  86. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +239 -109
  87. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +3 -3
  88. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
  89. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +3 -3
  90. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  91. package/dest/msg_validators/tx_validator/block_header_validator.d.ts +16 -3
  92. package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
  93. package/dest/msg_validators/tx_validator/block_header_validator.js +1 -1
  94. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +13 -3
  95. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
  96. package/dest/msg_validators/tx_validator/double_spend_validator.js +4 -4
  97. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +20 -4
  98. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
  99. package/dest/msg_validators/tx_validator/timestamp_validator.js +6 -6
  100. package/dest/services/dummy_service.d.ts +12 -3
  101. package/dest/services/dummy_service.d.ts.map +1 -1
  102. package/dest/services/dummy_service.js +9 -0
  103. package/dest/services/encoding.d.ts +2 -2
  104. package/dest/services/encoding.d.ts.map +1 -1
  105. package/dest/services/encoding.js +4 -3
  106. package/dest/services/gossipsub/index.d.ts +3 -0
  107. package/dest/services/gossipsub/index.d.ts.map +1 -0
  108. package/dest/services/gossipsub/index.js +2 -0
  109. package/dest/services/gossipsub/scoring.d.ts +21 -3
  110. package/dest/services/gossipsub/scoring.d.ts.map +1 -1
  111. package/dest/services/gossipsub/scoring.js +24 -7
  112. package/dest/services/gossipsub/topic_score_params.d.ts +173 -0
  113. package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -0
  114. package/dest/services/gossipsub/topic_score_params.js +346 -0
  115. package/dest/services/libp2p/libp2p_service.d.ts +85 -35
  116. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  117. package/dest/services/libp2p/libp2p_service.js +370 -267
  118. package/dest/services/peer-manager/peer_scoring.d.ts +1 -1
  119. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  120. package/dest/services/peer-manager/peer_scoring.js +25 -2
  121. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +4 -3
  122. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -1
  123. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +5 -9
  124. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +2 -6
  125. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
  126. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +10 -13
  127. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -1
  128. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +25 -46
  129. package/dest/services/reqresp/interface.d.ts +10 -1
  130. package/dest/services/reqresp/interface.d.ts.map +1 -1
  131. package/dest/services/reqresp/interface.js +15 -1
  132. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +4 -3
  133. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
  134. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +7 -1
  135. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
  136. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +15 -0
  137. package/dest/services/reqresp/protocols/tx.d.ts +7 -1
  138. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  139. package/dest/services/reqresp/protocols/tx.js +20 -0
  140. package/dest/services/reqresp/reqresp.d.ts +1 -1
  141. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  142. package/dest/services/reqresp/reqresp.js +11 -4
  143. package/dest/services/service.d.ts +38 -2
  144. package/dest/services/service.d.ts.map +1 -1
  145. package/dest/services/tx_collection/config.d.ts +19 -1
  146. package/dest/services/tx_collection/config.d.ts.map +1 -1
  147. package/dest/services/tx_collection/config.js +46 -0
  148. package/dest/services/tx_collection/fast_tx_collection.d.ts +3 -1
  149. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
  150. package/dest/services/tx_collection/fast_tx_collection.js +56 -36
  151. package/dest/services/tx_collection/file_store_tx_collection.d.ts +53 -0
  152. package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -0
  153. package/dest/services/tx_collection/file_store_tx_collection.js +167 -0
  154. package/dest/services/tx_collection/file_store_tx_source.d.ts +37 -0
  155. package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -0
  156. package/dest/services/tx_collection/file_store_tx_source.js +90 -0
  157. package/dest/services/tx_collection/index.d.ts +2 -1
  158. package/dest/services/tx_collection/index.d.ts.map +1 -1
  159. package/dest/services/tx_collection/index.js +1 -0
  160. package/dest/services/tx_collection/instrumentation.d.ts +1 -1
  161. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
  162. package/dest/services/tx_collection/instrumentation.js +2 -1
  163. package/dest/services/tx_collection/missing_txs_tracker.d.ts +32 -0
  164. package/dest/services/tx_collection/missing_txs_tracker.d.ts.map +1 -0
  165. package/dest/services/tx_collection/missing_txs_tracker.js +27 -0
  166. package/dest/services/tx_collection/proposal_tx_collector.d.ts +7 -6
  167. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -1
  168. package/dest/services/tx_collection/proposal_tx_collector.js +5 -4
  169. package/dest/services/tx_collection/slow_tx_collection.d.ts +7 -3
  170. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -1
  171. package/dest/services/tx_collection/slow_tx_collection.js +60 -26
  172. package/dest/services/tx_collection/tx_collection.d.ts +23 -10
  173. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  174. package/dest/services/tx_collection/tx_collection.js +75 -3
  175. package/dest/services/tx_collection/tx_collection_sink.d.ts +18 -8
  176. package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -1
  177. package/dest/services/tx_collection/tx_collection_sink.js +26 -29
  178. package/dest/services/tx_collection/tx_source.d.ts +8 -3
  179. package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
  180. package/dest/services/tx_collection/tx_source.js +19 -2
  181. package/dest/services/tx_file_store/config.d.ts +1 -3
  182. package/dest/services/tx_file_store/config.d.ts.map +1 -1
  183. package/dest/services/tx_file_store/config.js +0 -4
  184. package/dest/services/tx_file_store/tx_file_store.d.ts +4 -3
  185. package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -1
  186. package/dest/services/tx_file_store/tx_file_store.js +9 -6
  187. package/dest/services/tx_provider.d.ts +3 -3
  188. package/dest/services/tx_provider.d.ts.map +1 -1
  189. package/dest/services/tx_provider.js +5 -4
  190. package/dest/test-helpers/make-test-p2p-clients.d.ts +3 -3
  191. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  192. package/dest/test-helpers/mock-pubsub.d.ts +29 -2
  193. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  194. package/dest/test-helpers/mock-pubsub.js +103 -2
  195. package/dest/test-helpers/reqresp-nodes.d.ts +1 -1
  196. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  197. package/dest/test-helpers/reqresp-nodes.js +2 -1
  198. package/dest/test-helpers/testbench-utils.d.ts +43 -38
  199. package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
  200. package/dest/test-helpers/testbench-utils.js +128 -59
  201. package/dest/testbench/p2p_client_testbench_worker.d.ts +2 -2
  202. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  203. package/dest/testbench/p2p_client_testbench_worker.js +10 -10
  204. package/dest/util.d.ts +2 -2
  205. package/dest/util.d.ts.map +1 -1
  206. package/package.json +14 -14
  207. package/src/client/factory.ts +86 -15
  208. package/src/client/interface.ts +59 -23
  209. package/src/client/p2p_client.ts +184 -167
  210. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +19 -9
  211. package/src/config.ts +34 -2
  212. package/src/errors/tx-pool.error.ts +12 -0
  213. package/src/index.ts +1 -0
  214. package/src/mem_pools/attestation_pool/attestation_pool.ts +496 -91
  215. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +442 -102
  216. package/src/mem_pools/attestation_pool/index.ts +9 -2
  217. package/src/mem_pools/attestation_pool/mocks.ts +2 -1
  218. package/src/mem_pools/index.ts +4 -1
  219. package/src/mem_pools/interface.ts +4 -4
  220. package/src/mem_pools/tx_pool/README.md +1 -1
  221. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +3 -3
  222. package/src/mem_pools/tx_pool_v2/README.md +76 -10
  223. package/src/mem_pools/tx_pool_v2/deleted_pool.ts +321 -0
  224. package/src/mem_pools/tx_pool_v2/eviction/eviction_manager.ts +21 -8
  225. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +4 -1
  226. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +15 -4
  227. package/src/mem_pools/tx_pool_v2/eviction/index.ts +4 -0
  228. package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +49 -4
  229. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +5 -5
  230. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +3 -3
  231. package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +8 -7
  232. package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +24 -6
  233. package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +3 -3
  234. package/src/mem_pools/tx_pool_v2/index.ts +1 -0
  235. package/src/mem_pools/tx_pool_v2/instrumentation.ts +69 -0
  236. package/src/mem_pools/tx_pool_v2/interfaces.ts +16 -4
  237. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +90 -9
  238. package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +32 -5
  239. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +17 -6
  240. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +274 -104
  241. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +2 -2
  242. package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +2 -2
  243. package/src/msg_validators/tx_validator/block_header_validator.ts +15 -3
  244. package/src/msg_validators/tx_validator/double_spend_validator.ts +11 -6
  245. package/src/msg_validators/tx_validator/timestamp_validator.ts +23 -18
  246. package/src/services/dummy_service.ts +17 -1
  247. package/src/services/encoding.ts +4 -3
  248. package/src/services/gossipsub/README.md +641 -0
  249. package/src/services/gossipsub/index.ts +2 -0
  250. package/src/services/gossipsub/scoring.ts +29 -5
  251. package/src/services/gossipsub/topic_score_params.ts +487 -0
  252. package/src/services/libp2p/libp2p_service.ts +367 -271
  253. package/src/services/peer-manager/peer_scoring.ts +25 -0
  254. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +6 -6
  255. package/src/services/reqresp/batch-tx-requester/interface.ts +1 -5
  256. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +23 -71
  257. package/src/services/reqresp/interface.ts +26 -1
  258. package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +4 -3
  259. package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +17 -0
  260. package/src/services/reqresp/protocols/tx.ts +22 -0
  261. package/src/services/reqresp/reqresp.ts +13 -3
  262. package/src/services/service.ts +50 -1
  263. package/src/services/tx_collection/config.ts +68 -0
  264. package/src/services/tx_collection/fast_tx_collection.ts +65 -32
  265. package/src/services/tx_collection/file_store_tx_collection.ts +202 -0
  266. package/src/services/tx_collection/file_store_tx_source.ts +117 -0
  267. package/src/services/tx_collection/index.ts +1 -0
  268. package/src/services/tx_collection/instrumentation.ts +7 -1
  269. package/src/services/tx_collection/missing_txs_tracker.ts +52 -0
  270. package/src/services/tx_collection/proposal_tx_collector.ts +8 -7
  271. package/src/services/tx_collection/slow_tx_collection.ts +66 -33
  272. package/src/services/tx_collection/tx_collection.ts +113 -16
  273. package/src/services/tx_collection/tx_collection_sink.ts +30 -34
  274. package/src/services/tx_collection/tx_source.ts +22 -3
  275. package/src/services/tx_file_store/config.ts +0 -6
  276. package/src/services/tx_file_store/tx_file_store.ts +10 -8
  277. package/src/services/tx_provider.ts +8 -7
  278. package/src/test-helpers/make-test-p2p-clients.ts +3 -3
  279. package/src/test-helpers/mock-pubsub.ts +143 -3
  280. package/src/test-helpers/reqresp-nodes.ts +2 -1
  281. package/src/test-helpers/testbench-utils.ts +127 -71
  282. package/src/testbench/p2p_client_testbench_worker.ts +22 -15
  283. package/src/util.ts +7 -1
  284. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +0 -40
  285. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +0 -1
  286. package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +0 -218
  287. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +0 -31
  288. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +0 -1
  289. package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +0 -180
  290. package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +0 -320
  291. package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +0 -264
@@ -14,6 +14,21 @@ import type { PeerId } from '@libp2p/interface';
14
14
 
15
15
  import type { P2PConfig } from '../../config.js';
16
16
 
17
+ /**
18
+ * Application-level peer penalties.
19
+ *
20
+ * These scores are multiplied by appSpecificWeight (10) when contributing to gossipsub score.
21
+ * The values are designed to align with gossipsub thresholds:
22
+ *
23
+ * - LowToleranceError (50): 1 error → app score -50 → gossipsub -500 → gossipThreshold
24
+ * - MidToleranceError (10): 5 errors → app score -50 → gossipsub -500 → gossipThreshold
25
+ * - HighToleranceError (2): 25 errors → app score -50 → gossipsub -500 → gossipThreshold
26
+ *
27
+ * Examples of each severity:
28
+ * - LowToleranceError: Invalid messages, deserialization errors, manipulation attempts
29
+ * - MidToleranceError: Hash mismatches, protocol violations
30
+ * - HighToleranceError: Rate limit exceeded, failed responses, transient errors
31
+ */
17
32
  const DefaultPeerPenalties = {
18
33
  [PeerErrorSeverity.LowToleranceError]: 50,
19
34
  [PeerErrorSeverity.MidToleranceError]: 10,
@@ -26,6 +41,16 @@ export enum PeerScoreState {
26
41
  Healthy,
27
42
  }
28
43
 
44
+ /**
45
+ * Score thresholds for peer states.
46
+ *
47
+ * These values align with gossipsub thresholds when multiplied by appSpecificWeight (10):
48
+ * - MIN_SCORE_BEFORE_DISCONNECT (-50) × 10 = -500 = gossipThreshold
49
+ * - MIN_SCORE_BEFORE_BAN (-100) × 10 = -1000 = publishThreshold
50
+ *
51
+ * This ensures that when a peer is disconnected at the application level,
52
+ * they also stop receiving gossip, and when banned, they cannot publish.
53
+ */
29
54
  // TODO: move into config / constants
30
55
  const MIN_SCORE_BEFORE_BAN = -100;
31
56
  const MIN_SCORE_BEFORE_DISCONNECT = -50;
@@ -10,6 +10,7 @@ import { Tx, TxArray, TxHash } from '@aztec/stdlib/tx';
10
10
  import type { PeerId } from '@libp2p/interface';
11
11
  import { peerIdFromString } from '@libp2p/peer-id';
12
12
 
13
+ import type { IMissingTxsTracker } from '../../tx_collection/missing_txs_tracker.js';
13
14
  import { ReqRespSubProtocol } from '.././interface.js';
14
15
  import { BlockTxsRequest, BlockTxsResponse, type BlockTxsSource } from '.././protocols/index.js';
15
16
  import { ReqRespStatus } from '.././status.js';
@@ -20,7 +21,7 @@ import {
20
21
  DEFAULT_BATCH_TX_REQUESTER_TX_BATCH_SIZE,
21
22
  } from './config.js';
22
23
  import type { BatchTxRequesterLibP2PService, BatchTxRequesterOptions, ITxMetadataCollection } from './interface.js';
23
- import { MissingTxMetadata, MissingTxMetadataCollection } from './missing_txs.js';
24
+ import { MissingTxMetadataCollection } from './missing_txs.js';
24
25
  import { type IPeerCollection, PeerCollection } from './peer_collection.js';
25
26
  import { BatchRequestTxValidator, type IBatchRequestTxValidator } from './tx_validator.js';
26
27
 
@@ -60,7 +61,7 @@ export class BatchTxRequester {
60
61
  private readonly txBatchSize: number;
61
62
 
62
63
  constructor(
63
- missingTxs: TxHash[],
64
+ missingTxsTracker: IMissingTxsTracker,
64
65
  blockTxsSource: BlockTxsSource,
65
66
  pinnedPeer: PeerId | undefined,
66
67
  timeoutMs: number,
@@ -99,8 +100,7 @@ export class BatchTxRequester {
99
100
  this.p2pService.peerScoring,
100
101
  );
101
102
  }
102
- const entries: Array<[string, MissingTxMetadata]> = missingTxs.map(h => [h.toString(), new MissingTxMetadata(h)]);
103
- this.txsMetadata = new MissingTxMetadataCollection(entries, this.txBatchSize);
103
+ this.txsMetadata = new MissingTxMetadataCollection(missingTxsTracker, this.txBatchSize);
104
104
  this.smartRequesterSemaphore = this.opts.semaphore ?? new Semaphore(0);
105
105
  }
106
106
 
@@ -661,7 +661,7 @@ export class BatchTxRequester {
661
661
  /*
662
662
  * @returns true if all missing txs have been fetched */
663
663
  private fetchedAllTxs() {
664
- return Array.from(this.txsMetadata.values()).every(tx => tx.fetched);
664
+ return this.txsMetadata.getMissingTxHashes().size == 0;
665
665
  }
666
666
 
667
667
  /*
@@ -679,7 +679,7 @@ export class BatchTxRequester {
679
679
  this.unlockSmartRequesterSemaphores();
680
680
  }
681
681
 
682
- return aborted || this.txsMetadata.size === 0 || this.fetchedAllTxs() || this.dateProvider.now() > this.deadline;
682
+ return aborted || this.fetchedAllTxs() || this.dateProvider.now() > this.deadline;
683
683
  }
684
684
 
685
685
  /*
@@ -6,7 +6,6 @@ import type { PeerId } from '@libp2p/interface';
6
6
 
7
7
  import type { ConnectionSampler } from '../connection-sampler/connection_sampler.js';
8
8
  import type { ReqRespInterface } from '../interface.js';
9
- import type { MissingTxMetadata } from './missing_txs.js';
10
9
  import type { IPeerCollection } from './peer_collection.js';
11
10
  import type { BatchRequestTxValidatorConfig, IBatchRequestTxValidator } from './tx_validator.js';
12
11
 
@@ -15,18 +14,15 @@ export interface IPeerPenalizer {
15
14
  }
16
15
 
17
16
  export interface ITxMetadataCollection {
18
- size: number;
19
- values(): IterableIterator<MissingTxMetadata>;
20
17
  getMissingTxHashes(): Set<string>;
18
+ markFetched(peerId: PeerId, tx: Tx): boolean;
21
19
  getTxsToRequestFromThePeer(peer: PeerId): TxHash[];
22
20
  markRequested(txHash: TxHash): void;
23
21
  markInFlightBySmartPeer(txHash: TxHash): void;
24
22
  markNotInFlightBySmartPeer(txHash: TxHash): void;
25
23
  alreadyFetched(txHash: TxHash): boolean;
26
24
  // Returns true if tx was marked as fetched, false if it was already marked as fetched
27
- markFetched(peerId: PeerId, tx: Tx): boolean;
28
25
  markPeerHas(peerId: PeerId, txHashes: TxHash[]): void;
29
- getFetchedTxs(): Tx[];
30
26
  }
31
27
 
32
28
  /**
@@ -2,13 +2,13 @@ import { type Tx, TxHash } from '@aztec/stdlib/tx';
2
2
 
3
3
  import type { PeerId } from '@libp2p/interface';
4
4
 
5
+ import type { IMissingTxsTracker } from '../../tx_collection/missing_txs_tracker.js';
5
6
  import { DEFAULT_BATCH_TX_REQUESTER_TX_BATCH_SIZE } from './config.js';
6
7
  import type { ITxMetadataCollection } from './interface.js';
7
8
 
8
- export class MissingTxMetadata {
9
+ class MissingTxMetadata {
9
10
  constructor(
10
- public readonly txHash: TxHash,
11
- public fetched = false,
11
+ public readonly txHash: string,
12
12
  public requestedCount = 0,
13
13
  public inFlightCount = 0,
14
14
  public tx: Tx | undefined = undefined,
@@ -30,24 +30,6 @@ export class MissingTxMetadata {
30
30
  public isInFlight(): boolean {
31
31
  return this.inFlightCount > 0;
32
32
  }
33
-
34
- //Returns true if this is the first time we mark it as fetched
35
- public markAsFetched(peerId: PeerId, tx: Tx): boolean {
36
- if (this.fetched) {
37
- return false;
38
- }
39
-
40
- this.fetched = true;
41
- this.tx = tx;
42
-
43
- this.peers.add(peerId.toString());
44
-
45
- return true;
46
- }
47
-
48
- public toString() {
49
- return this.txHash.toString();
50
- }
51
33
  }
52
34
 
53
35
  /*
@@ -55,21 +37,18 @@ export class MissingTxMetadata {
55
37
  * This could be better optimized but given expected count of missing txs (N < 100)
56
38
  * At the moment there is no need for it. And benefit is that we have everything in single store
57
39
  * */
58
- export class MissingTxMetadataCollection extends Map<string, MissingTxMetadata> implements ITxMetadataCollection {
40
+ export class MissingTxMetadataCollection implements ITxMetadataCollection {
41
+ private txMetadata = new Map<string, MissingTxMetadata>();
42
+
59
43
  constructor(
60
- entries?: readonly (readonly [string, MissingTxMetadata])[] | null,
44
+ private missingTxsTracker: IMissingTxsTracker,
61
45
  private readonly txBatchSize: number = DEFAULT_BATCH_TX_REQUESTER_TX_BATCH_SIZE,
62
46
  ) {
63
- super(entries);
64
- }
65
- public getSortedByRequestedCountAsc(txs: string[]): MissingTxMetadata[] {
66
- return Array.from(this.values().filter(txMeta => txs.includes(txMeta.txHash.toString()))).sort(
67
- (a, b) => a.requestedCount - b.requestedCount,
68
- );
47
+ missingTxsTracker.missingTxHashes.forEach(hash => this.txMetadata.set(hash, new MissingTxMetadata(hash)));
69
48
  }
70
49
 
71
50
  public getPrioritizingNotInFlightAndLowerRequestCount(txs: string[]): MissingTxMetadata[] {
72
- const filtered = Array.from(this.values()).filter(txMeta => txs.includes(txMeta.txHash.toString()));
51
+ const filtered = Array.from(this.txMetadata.values()).filter(txMeta => txs.includes(txMeta.txHash.toString()));
73
52
 
74
53
  const [notInFlight, inFlight] = filtered.reduce<[MissingTxMetadata[], MissingTxMetadata[]]>(
75
54
  (buckets, tx) => {
@@ -85,43 +64,15 @@ export class MissingTxMetadataCollection extends Map<string, MissingTxMetadata>
85
64
  return [...notInFlight, ...inFlight];
86
65
  }
87
66
 
88
- public getFetchedTxHashes(): Set<string> {
89
- return new Set(
90
- this.values()
91
- .filter(t => t.fetched)
92
- .map(t => t.txHash.toString()),
93
- );
94
- }
95
-
96
67
  public getMissingTxHashes(): Set<string> {
97
- return new Set(
98
- this.values()
99
- .filter(t => !t.fetched)
100
- .map(t => t.txHash.toString()),
101
- );
102
- }
103
-
104
- public getInFlightTxHashes(): Set<string> {
105
- return new Set(
106
- this.values()
107
- .filter(t => t.isInFlight())
108
- .map(t => t.txHash.toString()),
109
- );
110
- }
111
-
112
- public getFetchedTxs(): Tx[] {
113
- return Array.from(
114
- this.values()
115
- .map(t => t.tx)
116
- .filter(t => !!t),
117
- );
68
+ return this.missingTxsTracker.missingTxHashes;
118
69
  }
119
70
 
120
71
  public getTxsPeerHas(peer: PeerId): Set<string> {
121
72
  const peerIdStr = peer.toString();
122
73
  const txsPeerHas = new Set<string>();
123
74
 
124
- this.values().forEach(txMeta => {
75
+ this.txMetadata.values().forEach(txMeta => {
125
76
  if (txMeta.peers.has(peerIdStr)) {
126
77
  txsPeerHas.add(txMeta.txHash.toString());
127
78
  }
@@ -132,13 +83,13 @@ export class MissingTxMetadataCollection extends Map<string, MissingTxMetadata>
132
83
 
133
84
  public getTxsToRequestFromThePeer(peer: PeerId): TxHash[] {
134
85
  const txsPeerHas = this.getTxsPeerHas(peer);
135
- const fetchedTxs = this.getFetchedTxHashes();
86
+ const missingTxHashes = this.getMissingTxHashes();
136
87
 
137
- const txsToRequest = txsPeerHas.difference(fetchedTxs);
88
+ const txsToRequest = txsPeerHas.intersection(missingTxHashes);
138
89
 
139
90
  if (txsToRequest.size >= this.txBatchSize) {
140
91
  return this.getPrioritizingNotInFlightAndLowerRequestCount(Array.from(txsToRequest))
141
- .map(t => t.txHash)
92
+ .map(t => TxHash.fromString(t.txHash))
142
93
  .slice(0, this.txBatchSize);
143
94
  }
144
95
 
@@ -150,13 +101,13 @@ export class MissingTxMetadataCollection extends Map<string, MissingTxMetadata>
150
101
  Array.from(this.getMissingTxHashes().difference(txsToRequest)),
151
102
  )
152
103
  .slice(0, countToFill)
153
- .map(t => t.txHash);
104
+ .map(t => TxHash.fromString(t.txHash));
154
105
 
155
106
  return [...Array.from(txsToRequest).map(t => TxHash.fromString(t)), ...txsToFill];
156
107
  }
157
108
 
158
109
  public markRequested(txHash: TxHash) {
159
- this.get(txHash.toString())?.markAsRequested();
110
+ this.txMetadata.get(txHash.toString())?.markAsRequested();
160
111
  }
161
112
 
162
113
  /*
@@ -165,7 +116,7 @@ export class MissingTxMetadataCollection extends Map<string, MissingTxMetadata>
165
116
  * "dumb" peer might return it, or might not - we don't know
166
117
  * */
167
118
  public markInFlightBySmartPeer(txHash: TxHash) {
168
- this.get(txHash.toString())?.markInFlight();
119
+ this.txMetadata.get(txHash.toString())?.markInFlight();
169
120
  }
170
121
 
171
122
  /*
@@ -173,16 +124,16 @@ export class MissingTxMetadataCollection extends Map<string, MissingTxMetadata>
173
124
  * Because the smart peer should return this tx, whereas
174
125
  * "dumb" peer might return it, or might not - we don't know*/
175
126
  public markNotInFlightBySmartPeer(txHash: TxHash) {
176
- this.get(txHash.toString())?.markNotInFlight();
127
+ this.txMetadata.get(txHash.toString())?.markNotInFlight();
177
128
  }
178
129
 
179
130
  public alreadyFetched(txHash: TxHash): boolean {
180
- return this.get(txHash.toString())?.fetched ?? false;
131
+ return !this.missingTxsTracker.isMissing(txHash.toString());
181
132
  }
182
133
 
183
134
  public markFetched(peerId: PeerId, tx: Tx): boolean {
184
135
  const txHashStr = tx.txHash.toString();
185
- const txMeta = this.get(txHashStr);
136
+ const txMeta = this.txMetadata.get(txHashStr);
186
137
  if (!txMeta) {
187
138
  //TODO: what to do about peer which sent txs we didn't request?
188
139
  // 1. don't request from it in the scope of this batch request
@@ -192,7 +143,8 @@ export class MissingTxMetadataCollection extends Map<string, MissingTxMetadata>
192
143
  return false;
193
144
  }
194
145
 
195
- return txMeta.markAsFetched(peerId, tx);
146
+ txMeta.peers.add(peerId.toString());
147
+ return this.missingTxsTracker.markFetched(tx);
196
148
  }
197
149
 
198
150
  public markPeerHas(peerId: PeerId, txHash: TxHash[]) {
@@ -200,7 +152,7 @@ export class MissingTxMetadataCollection extends Map<string, MissingTxMetadata>
200
152
  txHash
201
153
  .map(t => t.toString())
202
154
  .forEach(txh => {
203
- const txMeta = this.get(txh);
155
+ const txMeta = this.txMetadata.get(txh);
204
156
  if (txMeta) {
205
157
  txMeta.peers.add(peerIdStr);
206
158
  }
@@ -1,5 +1,6 @@
1
1
  import { Fr } from '@aztec/foundation/curves/bn254';
2
2
  import { L2Block } from '@aztec/stdlib/block';
3
+ import { MAX_L2_BLOCK_SIZE_KB } from '@aztec/stdlib/p2p';
3
4
  import { TxArray, TxHashArray } from '@aztec/stdlib/tx';
4
5
 
5
6
  import type { PeerId } from '@libp2p/interface';
@@ -7,8 +8,13 @@ import type { PeerId } from '@libp2p/interface';
7
8
  import type { P2PReqRespConfig } from './config.js';
8
9
  import type { ConnectionSampler } from './connection-sampler/connection_sampler.js';
9
10
  import { AuthRequest, AuthResponse } from './protocols/auth.js';
10
- import { BlockTxsRequest, BlockTxsResponse } from './protocols/block_txs/block_txs_reqresp.js';
11
+ import {
12
+ BlockTxsRequest,
13
+ BlockTxsResponse,
14
+ calculateBlockTxsResponseSize,
15
+ } from './protocols/block_txs/block_txs_reqresp.js';
11
16
  import { StatusMessage } from './protocols/status.js';
17
+ import { calculateTxResponseSize } from './protocols/tx.js';
12
18
  import type { ReqRespStatus } from './status.js';
13
19
 
14
20
  /*
@@ -211,6 +217,25 @@ export const subProtocolMap = {
211
217
  },
212
218
  };
213
219
 
220
+ /**
221
+ * Type for a function that calculates the expected response size in KB for a given request.
222
+ */
223
+ export type ExpectedResponseSizeCalculator = (requestBuffer: Buffer) => number;
224
+
225
+ /**
226
+ * Map of sub-protocols to their expected response size calculators.
227
+ * These are used to validate that responses don't exceed expected sizes based on request parameters.
228
+ */
229
+ export const subProtocolSizeCalculators: Record<ReqRespSubProtocol, ExpectedResponseSizeCalculator> = {
230
+ [ReqRespSubProtocol.TX]: calculateTxResponseSize,
231
+ [ReqRespSubProtocol.BLOCK_TXS]: calculateBlockTxsResponseSize,
232
+ [ReqRespSubProtocol.BLOCK]: () => MAX_L2_BLOCK_SIZE_KB,
233
+ [ReqRespSubProtocol.STATUS]: () => 1,
234
+ [ReqRespSubProtocol.PING]: () => 1,
235
+ [ReqRespSubProtocol.AUTH]: () => 1,
236
+ [ReqRespSubProtocol.GOODBYE]: () => 1, // No response expected, but provide minimal limit
237
+ };
238
+
214
239
  export interface ReqRespInterface {
215
240
  start(
216
241
  subProtocolHandlers: Partial<ReqRespSubProtocolHandlers>,
@@ -4,7 +4,8 @@ import { TxArray } from '@aztec/stdlib/tx';
4
4
 
5
5
  import type { PeerId } from '@libp2p/interface';
6
6
 
7
- import type { AttestationPool, TxPool } from '../../../../mem_pools/index.js';
7
+ import type { AttestationPoolApi } from '../../../../mem_pools/attestation_pool/attestation_pool.js';
8
+ import type { TxPoolV2 } from '../../../../mem_pools/tx_pool_v2/interfaces.js';
8
9
  import type { ReqRespSubProtocolHandler } from '../../interface.js';
9
10
  import { ReqRespStatus, ReqRespStatusError } from '../../status.js';
10
11
  import { BitVector } from './bitvector.js';
@@ -18,9 +19,9 @@ import { BlockTxsRequest, BlockTxsResponse } from './block_txs_reqresp.js';
18
19
  * @returns the BlockTxs request handler
19
20
  */
20
21
  export function reqRespBlockTxsHandler(
21
- attestationPool: AttestationPool,
22
+ attestationPool: AttestationPoolApi,
22
23
  archiver: L2BlockSource,
23
- txPool: TxPool,
24
+ txPool: TxPoolV2,
24
25
  ): ReqRespSubProtocolHandler {
25
26
  /**
26
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
+ }
@@ -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';
@@ -55,3 +56,24 @@ export function reqRespTxHandler(mempools: MemPools): ReqRespSubProtocolHandler
55
56
  export function chunkTxHashesRequest(hashes: TxHash[], chunkSize = 1): Array<TxHashArray> {
56
57
  return chunk(hashes, chunkSize).map(chunk => new TxHashArray(...chunk));
57
58
  }
59
+
60
+ /**
61
+ * Calculate the expected response size for a TX request.
62
+ * @param requestBuffer - The serialized request buffer containing TxHashArray
63
+ * @returns Expected response size in KB
64
+ */
65
+ export function calculateTxResponseSize(requestBuffer: Buffer): number {
66
+ try {
67
+ const txHashes = TxHashArray.fromBuffer(requestBuffer);
68
+ // TxHashArray.fromBuffer returns empty array on parse failure, so check for that
69
+ if (txHashes.length === 0 && requestBuffer.length > 0) {
70
+ // If we got an empty array but had a non-empty buffer, parsing likely failed
71
+ // Fall back to allowing a single transaction response
72
+ return MAX_TX_SIZE_KB + 1;
73
+ }
74
+ return Math.max(txHashes.length, 1) * MAX_TX_SIZE_KB + 1; // +1 KB overhead, at least 1 tx
75
+ } catch {
76
+ // If we can't parse the request, fall back to allowing a single transaction response
77
+ return MAX_TX_SIZE_KB + 1;
78
+ }
79
+ }
@@ -36,6 +36,7 @@ import {
36
36
  type ReqRespSubProtocolValidators,
37
37
  type SubProtocolMap,
38
38
  responseFromBuffer,
39
+ subProtocolSizeCalculators,
39
40
  } from './interface.js';
40
41
  import { ReqRespMetrics } from './metrics.js';
41
42
  import {
@@ -437,6 +438,9 @@ export class ReqResp implements ReqRespInterface {
437
438
  try {
438
439
  this.metrics.recordRequestSent(subProtocol);
439
440
 
441
+ // Calculate expected response size based on the request payload
442
+ const expectedSizeKb = subProtocolSizeCalculators[subProtocol](payload);
443
+
440
444
  this.logger.trace(`Sending request to peer ${peerId.toString()} on sub protocol ${subProtocol}`);
441
445
  stream = await this.connectionSampler.dialProtocol(peerId, subProtocol, dialTimeout);
442
446
  this.logger.trace(
@@ -444,11 +448,14 @@ export class ReqResp implements ReqRespInterface {
444
448
  );
445
449
 
446
450
  const timeoutErr = new IndividualReqRespTimeoutError();
451
+ // Create a wrapper to pass the expected size to readMessage
452
+ const readMessageWithSizeLimit = (source: AsyncIterable<Uint8ArrayList>) =>
453
+ this.readMessage(source, expectedSizeKb);
447
454
  const [_, resp] = await executeTimeout(
448
455
  signal =>
449
456
  Promise.all([
450
457
  pipeline([payload], stream!.sink, { signal }),
451
- pipeline(stream!.source, this.readMessage.bind(this), { signal }),
458
+ pipeline(stream!.source, readMessageWithSizeLimit, { signal }),
452
459
  ]),
453
460
  this.individualRequestTimeoutMs,
454
461
  () => timeoutErr,
@@ -510,8 +517,11 @@ export class ReqResp implements ReqRespInterface {
510
517
  * The message is split into two components
511
518
  * - The first chunk should contain a control byte, indicating the status of the response see `ReqRespStatus`
512
519
  * - The second chunk should contain the response data
520
+ *
521
+ * @param source - The async iterable source of data chunks
522
+ * @param maxSizeKb - Optional maximum expected size in KB for the decompressed response
513
523
  */
514
- private async readMessage(source: AsyncIterable<Uint8ArrayList>): Promise<ReqRespResponse> {
524
+ private async readMessage(source: AsyncIterable<Uint8ArrayList>, maxSizeKb?: number): Promise<ReqRespResponse> {
515
525
  let status: ReqRespStatus | undefined;
516
526
  const chunks: Uint8Array[] = [];
517
527
 
@@ -536,7 +546,7 @@ export class ReqResp implements ReqRespInterface {
536
546
  }
537
547
 
538
548
  const messageData = Buffer.concat(chunks);
539
- const message: Buffer = this.snappyTransform.inboundTransformData(messageData);
549
+ const message: Buffer = this.snappyTransform.inboundTransformData(messageData, undefined, maxSizeKb);
540
550
 
541
551
  return {
542
552
  status: status ?? ReqRespStatus.UNKNOWN,
@@ -1,6 +1,13 @@
1
+ import type { SlotNumber } from '@aztec/foundation/branded-types';
1
2
  import type { EthAddress } from '@aztec/foundation/eth-address';
2
3
  import type { PeerInfo } from '@aztec/stdlib/interfaces/server';
3
- import type { BlockProposal, CheckpointAttestation, CheckpointProposalCore, Gossipable } from '@aztec/stdlib/p2p';
4
+ import type {
5
+ BlockProposal,
6
+ CheckpointAttestation,
7
+ CheckpointProposalCore,
8
+ Gossipable,
9
+ TopicType,
10
+ } from '@aztec/stdlib/p2p';
4
11
  import type { Tx } from '@aztec/stdlib/tx';
5
12
 
6
13
  import type { PeerId } from '@libp2p/interface';
@@ -43,6 +50,32 @@ export type P2PCheckpointReceivedCallback = (
43
50
 
44
51
  export type AuthReceivedCallback = (peerId: PeerId, authRequest: AuthRequest) => Promise<AuthResponse | undefined>;
45
52
 
53
+ /** Minimal info passed to the duplicate proposal callback. */
54
+ export type DuplicateProposalInfo = {
55
+ slot: SlotNumber;
56
+ proposer: EthAddress;
57
+ type: 'checkpoint' | 'block';
58
+ };
59
+
60
+ /**
61
+ * Callback for when a duplicate proposal is detected (equivocation).
62
+ * Invoked on the first duplicate (when count goes from 1 to 2).
63
+ */
64
+ export type P2PDuplicateProposalCallback = (info: DuplicateProposalInfo) => void;
65
+
66
+ /** Minimal info passed to the duplicate attestation callback. */
67
+ export type DuplicateAttestationInfo = {
68
+ slot: SlotNumber;
69
+ attester: EthAddress;
70
+ };
71
+
72
+ /**
73
+ * Callback for when a duplicate attestation is detected (equivocation).
74
+ * A validator signing attestations for different proposals at the same slot.
75
+ * Invoked on the first duplicate (when count goes from 1 to 2).
76
+ */
77
+ export type P2PDuplicateAttestationCallback = (info: DuplicateAttestationInfo) => void;
78
+
46
79
  /**
47
80
  * The interface for a P2P service implementation.
48
81
  */
@@ -86,10 +119,26 @@ export interface P2PService {
86
119
 
87
120
  registerCheckpointReceivedCallback(callback: P2PCheckpointReceivedCallback): void;
88
121
 
122
+ /**
123
+ * Registers a callback invoked when a duplicate proposal is detected (equivocation).
124
+ * The callback is triggered on the first duplicate (when count goes from 1 to 2).
125
+ */
126
+ registerDuplicateProposalCallback(callback: P2PDuplicateProposalCallback): void;
127
+
128
+ /**
129
+ * Registers a callback invoked when a duplicate attestation is detected (equivocation).
130
+ * A validator signing attestations for different proposals at the same slot.
131
+ * The callback is triggered on the first duplicate (when count goes from 1 to 2).
132
+ */
133
+ registerDuplicateAttestationCallback(callback: P2PDuplicateAttestationCallback): void;
134
+
89
135
  getEnr(): ENR | undefined;
90
136
 
91
137
  getPeers(includePending?: boolean): PeerInfo[];
92
138
 
139
+ /** Returns the number of peers in the GossipSub mesh for a given topic type. */
140
+ getGossipMeshPeerCount(topicType: TopicType): number;
141
+
93
142
  validate(txs: Tx[]): Promise<void>;
94
143
 
95
144
  addReqRespSubProtocol(
@@ -31,6 +31,24 @@ export type TxCollectionConfig = {
31
31
  txCollectionNodeRpcMaxBatchSize: number;
32
32
  /** Which collector implementation to use for missing txs collection */
33
33
  txCollectionMissingTxsCollectorType: MissingTxsCollectorType;
34
+ /** A comma-separated list of file store URLs (s3://, gs://, file://, http://) for tx collection */
35
+ txCollectionFileStoreUrls: string[];
36
+ /** Delay in ms before file store collection starts after slow collection is triggered */
37
+ txCollectionFileStoreSlowDelayMs: number;
38
+ /** Delay in ms before file store collection starts after fast collection is triggered */
39
+ txCollectionFileStoreFastDelayMs: number;
40
+ /** Number of concurrent workers for fast file store collection */
41
+ txCollectionFileStoreFastWorkerCount: number;
42
+ /** Number of concurrent workers for slow file store collection */
43
+ txCollectionFileStoreSlowWorkerCount: number;
44
+ /** Base backoff time in ms for fast file store collection retries */
45
+ txCollectionFileStoreFastBackoffBaseMs: number;
46
+ /** Base backoff time in ms for slow file store collection retries */
47
+ txCollectionFileStoreSlowBackoffBaseMs: number;
48
+ /** Max backoff time in ms for fast file store collection retries */
49
+ txCollectionFileStoreFastBackoffMaxMs: number;
50
+ /** Max backoff time in ms for slow file store collection retries */
51
+ txCollectionFileStoreSlowBackoffMaxMs: number;
34
52
  };
35
53
 
36
54
  export const txCollectionConfigMappings: ConfigMappingsType<TxCollectionConfig> = {
@@ -95,4 +113,54 @@ export const txCollectionConfigMappings: ConfigMappingsType<TxCollectionConfig>
95
113
  description: 'Which collector implementation to use for missing txs collection (new or old)',
96
114
  ...enumConfigHelper(['new', 'old'] as const, 'new'),
97
115
  },
116
+ txCollectionFileStoreUrls: {
117
+ env: 'TX_COLLECTION_FILE_STORE_URLS',
118
+ description: 'A comma-separated list of file store URLs (s3://, gs://, file://, http://) for tx collection',
119
+ parseEnv: (val: string) =>
120
+ val
121
+ .split(',')
122
+ .map(url => url.trim())
123
+ .filter(url => url.length > 0),
124
+ defaultValue: [],
125
+ },
126
+ txCollectionFileStoreSlowDelayMs: {
127
+ env: 'TX_COLLECTION_FILE_STORE_SLOW_DELAY_MS',
128
+ description: 'Delay before file store collection starts after slow collection',
129
+ ...numberConfigHelper(24_000),
130
+ },
131
+ txCollectionFileStoreFastDelayMs: {
132
+ env: 'TX_COLLECTION_FILE_STORE_FAST_DELAY_MS',
133
+ description: 'Delay before file store collection starts after fast collection',
134
+ ...numberConfigHelper(2_000),
135
+ },
136
+ txCollectionFileStoreFastWorkerCount: {
137
+ env: 'TX_COLLECTION_FILE_STORE_FAST_WORKER_COUNT',
138
+ description: 'Number of concurrent workers for fast file store collection',
139
+ ...numberConfigHelper(5),
140
+ },
141
+ txCollectionFileStoreSlowWorkerCount: {
142
+ env: 'TX_COLLECTION_FILE_STORE_SLOW_WORKER_COUNT',
143
+ description: 'Number of concurrent workers for slow file store collection',
144
+ ...numberConfigHelper(2),
145
+ },
146
+ txCollectionFileStoreFastBackoffBaseMs: {
147
+ env: 'TX_COLLECTION_FILE_STORE_FAST_BACKOFF_BASE_MS',
148
+ description: 'Base backoff time in ms for fast file store collection retries',
149
+ ...numberConfigHelper(1_000),
150
+ },
151
+ txCollectionFileStoreSlowBackoffBaseMs: {
152
+ env: 'TX_COLLECTION_FILE_STORE_SLOW_BACKOFF_BASE_MS',
153
+ description: 'Base backoff time in ms for slow file store collection retries',
154
+ ...numberConfigHelper(5_000),
155
+ },
156
+ txCollectionFileStoreFastBackoffMaxMs: {
157
+ env: 'TX_COLLECTION_FILE_STORE_FAST_BACKOFF_MAX_MS',
158
+ description: 'Max backoff time in ms for fast file store collection retries',
159
+ ...numberConfigHelper(5_000),
160
+ },
161
+ txCollectionFileStoreSlowBackoffMaxMs: {
162
+ env: 'TX_COLLECTION_FILE_STORE_SLOW_BACKOFF_MAX_MS',
163
+ description: 'Max backoff time in ms for slow file store collection retries',
164
+ ...numberConfigHelper(30_000),
165
+ },
98
166
  };