@aztec/p2p 0.0.1-commit.54489865 → 0.0.1-commit.5914bae

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 (410) hide show
  1. package/README.md +129 -3
  2. package/dest/client/factory.d.ts +10 -10
  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 +46 -33
  6. package/dest/client/interface.d.ts.map +1 -1
  7. package/dest/client/p2p_client.d.ts +41 -51
  8. package/dest/client/p2p_client.d.ts.map +1 -1
  9. package/dest/client/p2p_client.js +166 -224
  10. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +7 -8
  11. package/dest/config.d.ts +55 -12
  12. package/dest/config.d.ts.map +1 -1
  13. package/dest/config.js +99 -33
  14. package/dest/errors/tx-pool.error.d.ts +8 -0
  15. package/dest/errors/tx-pool.error.d.ts.map +1 -0
  16. package/dest/errors/tx-pool.error.js +9 -0
  17. package/dest/index.d.ts +2 -1
  18. package/dest/index.d.ts.map +1 -1
  19. package/dest/index.js +1 -0
  20. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +104 -88
  21. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  22. package/dest/mem_pools/attestation_pool/attestation_pool.js +441 -3
  23. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +2 -2
  24. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
  25. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +353 -87
  26. package/dest/mem_pools/attestation_pool/index.d.ts +2 -3
  27. package/dest/mem_pools/attestation_pool/index.d.ts.map +1 -1
  28. package/dest/mem_pools/attestation_pool/index.js +1 -2
  29. package/dest/mem_pools/attestation_pool/mocks.d.ts +2 -2
  30. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  31. package/dest/mem_pools/attestation_pool/mocks.js +2 -2
  32. package/dest/mem_pools/index.d.ts +3 -2
  33. package/dest/mem_pools/index.d.ts.map +1 -1
  34. package/dest/mem_pools/index.js +1 -1
  35. package/dest/mem_pools/interface.d.ts +5 -5
  36. package/dest/mem_pools/interface.d.ts.map +1 -1
  37. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +1 -1
  38. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -1
  39. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +2 -1
  40. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +3 -3
  41. package/dest/mem_pools/tx_pool/priority.d.ts +2 -2
  42. package/dest/mem_pools/tx_pool/priority.d.ts.map +1 -1
  43. package/dest/mem_pools/tx_pool/priority.js +4 -4
  44. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +1 -1
  45. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +1 -1
  46. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +3 -1
  47. package/dest/mem_pools/tx_pool_v2/archive/index.d.ts +2 -0
  48. package/dest/mem_pools/tx_pool_v2/archive/index.d.ts.map +1 -0
  49. package/dest/mem_pools/tx_pool_v2/archive/index.js +1 -0
  50. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts +43 -0
  51. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts.map +1 -0
  52. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.js +103 -0
  53. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +104 -0
  54. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -0
  55. package/dest/mem_pools/tx_pool_v2/deleted_pool.js +251 -0
  56. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts +47 -0
  57. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts.map +1 -0
  58. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.js +128 -0
  59. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +17 -0
  60. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -0
  61. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +94 -0
  62. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +19 -0
  63. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -0
  64. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +97 -0
  65. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +10 -0
  66. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -0
  67. package/dest/mem_pools/tx_pool_v2/eviction/index.js +11 -0
  68. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +180 -0
  69. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -0
  70. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.js +25 -0
  71. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts +15 -0
  72. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -0
  73. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +65 -0
  74. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts +17 -0
  75. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -0
  76. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +93 -0
  77. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +16 -0
  78. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -0
  79. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +78 -0
  80. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +20 -0
  81. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -0
  82. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +75 -0
  83. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +15 -0
  84. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -0
  85. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +19 -0
  86. package/dest/mem_pools/tx_pool_v2/index.d.ts +6 -0
  87. package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -0
  88. package/dest/mem_pools/tx_pool_v2/index.js +5 -0
  89. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts +15 -0
  90. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts.map +1 -0
  91. package/dest/mem_pools/tx_pool_v2/instrumentation.js +43 -0
  92. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +213 -0
  93. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -0
  94. package/dest/mem_pools/tx_pool_v2/interfaces.js +9 -0
  95. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +135 -0
  96. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -0
  97. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +216 -0
  98. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts +26 -0
  99. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts.map +1 -0
  100. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.js +70 -0
  101. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +108 -0
  102. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -0
  103. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +354 -0
  104. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +62 -0
  105. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -0
  106. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +164 -0
  107. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +77 -0
  108. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -0
  109. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +906 -0
  110. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +3 -3
  111. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
  112. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +6 -4
  113. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
  114. package/dest/msg_validators/proposal_validator/block_proposal_validator.js +10 -2
  115. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +6 -4
  116. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
  117. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +16 -2
  118. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +13 -8
  119. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
  120. package/dest/msg_validators/proposal_validator/proposal_validator.js +48 -36
  121. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +4 -4
  122. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  123. package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +3 -3
  124. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +2 -1
  125. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -1
  126. package/dest/msg_validators/tx_validator/allowed_public_setup.js +24 -20
  127. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts +17 -0
  128. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts.map +1 -0
  129. package/dest/msg_validators/tx_validator/allowed_setup_helpers.js +24 -0
  130. package/dest/msg_validators/tx_validator/block_header_validator.d.ts +16 -3
  131. package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
  132. package/dest/msg_validators/tx_validator/block_header_validator.js +1 -1
  133. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts +9 -0
  134. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts.map +1 -0
  135. package/dest/msg_validators/tx_validator/contract_instance_validator.js +48 -0
  136. package/dest/msg_validators/tx_validator/data_validator.d.ts +1 -1
  137. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  138. package/dest/msg_validators/tx_validator/data_validator.js +35 -2
  139. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +13 -3
  140. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
  141. package/dest/msg_validators/tx_validator/double_spend_validator.js +4 -4
  142. package/dest/msg_validators/tx_validator/factory.d.ts +133 -6
  143. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  144. package/dest/msg_validators/tx_validator/factory.js +247 -60
  145. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +1 -1
  146. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -1
  147. package/dest/msg_validators/tx_validator/fee_payer_balance.js +6 -2
  148. package/dest/msg_validators/tx_validator/gas_validator.d.ts +67 -3
  149. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  150. package/dest/msg_validators/tx_validator/gas_validator.js +104 -37
  151. package/dest/msg_validators/tx_validator/index.d.ts +3 -1
  152. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  153. package/dest/msg_validators/tx_validator/index.js +2 -0
  154. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts +14 -0
  155. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts.map +1 -0
  156. package/dest/msg_validators/tx_validator/nullifier_cache.js +24 -0
  157. package/dest/msg_validators/tx_validator/phases_validator.d.ts +22 -2
  158. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
  159. package/dest/msg_validators/tx_validator/phases_validator.js +72 -24
  160. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +20 -4
  161. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
  162. package/dest/msg_validators/tx_validator/timestamp_validator.js +6 -6
  163. package/dest/services/data_store.d.ts +1 -1
  164. package/dest/services/data_store.d.ts.map +1 -1
  165. package/dest/services/data_store.js +10 -6
  166. package/dest/services/dummy_service.d.ts +13 -5
  167. package/dest/services/dummy_service.d.ts.map +1 -1
  168. package/dest/services/dummy_service.js +10 -4
  169. package/dest/services/encoding.d.ts +7 -3
  170. package/dest/services/encoding.d.ts.map +1 -1
  171. package/dest/services/encoding.js +18 -11
  172. package/dest/services/gossipsub/index.d.ts +3 -0
  173. package/dest/services/gossipsub/index.d.ts.map +1 -0
  174. package/dest/services/gossipsub/index.js +2 -0
  175. package/dest/services/gossipsub/scoring.d.ts +21 -3
  176. package/dest/services/gossipsub/scoring.d.ts.map +1 -1
  177. package/dest/services/gossipsub/scoring.js +24 -7
  178. package/dest/services/gossipsub/topic_score_params.d.ts +173 -0
  179. package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -0
  180. package/dest/services/gossipsub/topic_score_params.js +346 -0
  181. package/dest/services/index.d.ts +2 -1
  182. package/dest/services/index.d.ts.map +1 -1
  183. package/dest/services/index.js +1 -0
  184. package/dest/services/libp2p/libp2p_service.d.ts +94 -42
  185. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  186. package/dest/services/libp2p/libp2p_service.js +453 -354
  187. package/dest/services/peer-manager/peer_scoring.d.ts +1 -1
  188. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  189. package/dest/services/peer-manager/peer_scoring.js +25 -2
  190. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +6 -5
  191. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -1
  192. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +13 -17
  193. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +2 -6
  194. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
  195. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +10 -13
  196. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -1
  197. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +25 -46
  198. package/dest/services/reqresp/batch-tx-requester/tx_validator.js +2 -2
  199. package/dest/services/reqresp/interface.d.ts +10 -1
  200. package/dest/services/reqresp/interface.d.ts.map +1 -1
  201. package/dest/services/reqresp/interface.js +15 -1
  202. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +7 -5
  203. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
  204. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +17 -12
  205. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +25 -14
  206. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
  207. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +40 -24
  208. package/dest/services/reqresp/protocols/tx.d.ts +7 -1
  209. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  210. package/dest/services/reqresp/protocols/tx.js +20 -0
  211. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +5 -4
  212. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
  213. package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -8
  214. package/dest/services/reqresp/reqresp.d.ts +1 -1
  215. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  216. package/dest/services/reqresp/reqresp.js +28 -13
  217. package/dest/services/service.d.ts +39 -3
  218. package/dest/services/service.d.ts.map +1 -1
  219. package/dest/services/tx_collection/config.d.ts +22 -4
  220. package/dest/services/tx_collection/config.d.ts.map +1 -1
  221. package/dest/services/tx_collection/config.js +49 -3
  222. package/dest/services/tx_collection/fast_tx_collection.d.ts +6 -5
  223. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
  224. package/dest/services/tx_collection/fast_tx_collection.js +64 -48
  225. package/dest/services/tx_collection/file_store_tx_collection.d.ts +53 -0
  226. package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -0
  227. package/dest/services/tx_collection/file_store_tx_collection.js +167 -0
  228. package/dest/services/tx_collection/file_store_tx_source.d.ts +38 -0
  229. package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -0
  230. package/dest/services/tx_collection/file_store_tx_source.js +100 -0
  231. package/dest/services/tx_collection/index.d.ts +3 -2
  232. package/dest/services/tx_collection/index.d.ts.map +1 -1
  233. package/dest/services/tx_collection/index.js +1 -0
  234. package/dest/services/tx_collection/instrumentation.d.ts +1 -1
  235. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
  236. package/dest/services/tx_collection/instrumentation.js +2 -1
  237. package/dest/services/tx_collection/missing_txs_tracker.d.ts +32 -0
  238. package/dest/services/tx_collection/missing_txs_tracker.d.ts.map +1 -0
  239. package/dest/services/tx_collection/missing_txs_tracker.js +27 -0
  240. package/dest/services/tx_collection/proposal_tx_collector.d.ts +15 -14
  241. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -1
  242. package/dest/services/tx_collection/proposal_tx_collector.js +6 -6
  243. package/dest/services/tx_collection/slow_tx_collection.d.ts +7 -3
  244. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -1
  245. package/dest/services/tx_collection/slow_tx_collection.js +60 -26
  246. package/dest/services/tx_collection/tx_collection.d.ts +23 -10
  247. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  248. package/dest/services/tx_collection/tx_collection.js +75 -3
  249. package/dest/services/tx_collection/tx_collection_sink.d.ts +18 -8
  250. package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -1
  251. package/dest/services/tx_collection/tx_collection_sink.js +26 -29
  252. package/dest/services/tx_collection/tx_source.d.ts +13 -7
  253. package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
  254. package/dest/services/tx_collection/tx_source.js +26 -7
  255. package/dest/services/tx_file_store/config.d.ts +16 -0
  256. package/dest/services/tx_file_store/config.d.ts.map +1 -0
  257. package/dest/services/tx_file_store/config.js +22 -0
  258. package/dest/services/tx_file_store/index.d.ts +4 -0
  259. package/dest/services/tx_file_store/index.d.ts.map +1 -0
  260. package/dest/services/tx_file_store/index.js +3 -0
  261. package/dest/services/tx_file_store/instrumentation.d.ts +15 -0
  262. package/dest/services/tx_file_store/instrumentation.d.ts.map +1 -0
  263. package/dest/services/tx_file_store/instrumentation.js +29 -0
  264. package/dest/services/tx_file_store/tx_file_store.d.ts +48 -0
  265. package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -0
  266. package/dest/services/tx_file_store/tx_file_store.js +152 -0
  267. package/dest/services/tx_provider.d.ts +4 -4
  268. package/dest/services/tx_provider.d.ts.map +1 -1
  269. package/dest/services/tx_provider.js +9 -8
  270. package/dest/test-helpers/make-test-p2p-clients.d.ts +7 -8
  271. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  272. package/dest/test-helpers/make-test-p2p-clients.js +1 -2
  273. package/dest/test-helpers/mock-pubsub.d.ts +30 -4
  274. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  275. package/dest/test-helpers/mock-pubsub.js +105 -4
  276. package/dest/test-helpers/reqresp-nodes.d.ts +2 -3
  277. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  278. package/dest/test-helpers/reqresp-nodes.js +4 -3
  279. package/dest/test-helpers/testbench-utils.d.ts +43 -38
  280. package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
  281. package/dest/test-helpers/testbench-utils.js +129 -59
  282. package/dest/testbench/p2p_client_testbench_worker.d.ts +2 -2
  283. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  284. package/dest/testbench/p2p_client_testbench_worker.js +17 -16
  285. package/dest/testbench/worker_client_manager.d.ts +3 -1
  286. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  287. package/dest/testbench/worker_client_manager.js +4 -1
  288. package/dest/util.d.ts +2 -2
  289. package/dest/util.d.ts.map +1 -1
  290. package/package.json +14 -14
  291. package/src/client/factory.ts +106 -27
  292. package/src/client/interface.ts +56 -34
  293. package/src/client/p2p_client.ts +200 -269
  294. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +20 -11
  295. package/src/config.ts +155 -34
  296. package/src/errors/tx-pool.error.ts +12 -0
  297. package/src/index.ts +1 -0
  298. package/src/mem_pools/attestation_pool/attestation_pool.ts +496 -91
  299. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +442 -102
  300. package/src/mem_pools/attestation_pool/index.ts +9 -2
  301. package/src/mem_pools/attestation_pool/mocks.ts +2 -1
  302. package/src/mem_pools/index.ts +4 -1
  303. package/src/mem_pools/interface.ts +4 -4
  304. package/src/mem_pools/tx_pool/README.md +1 -1
  305. package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +2 -1
  306. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +3 -3
  307. package/src/mem_pools/tx_pool/priority.ts +4 -4
  308. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +3 -1
  309. package/src/mem_pools/tx_pool_v2/README.md +283 -0
  310. package/src/mem_pools/tx_pool_v2/archive/index.ts +1 -0
  311. package/src/mem_pools/tx_pool_v2/archive/tx_archive.ts +120 -0
  312. package/src/mem_pools/tx_pool_v2/deleted_pool.ts +321 -0
  313. package/src/mem_pools/tx_pool_v2/eviction/eviction_manager.ts +160 -0
  314. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +122 -0
  315. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +125 -0
  316. package/src/mem_pools/tx_pool_v2/eviction/index.ts +27 -0
  317. package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +219 -0
  318. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +74 -0
  319. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +101 -0
  320. package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +91 -0
  321. package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +99 -0
  322. package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +32 -0
  323. package/src/mem_pools/tx_pool_v2/index.ts +12 -0
  324. package/src/mem_pools/tx_pool_v2/instrumentation.ts +69 -0
  325. package/src/mem_pools/tx_pool_v2/interfaces.ts +244 -0
  326. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +337 -0
  327. package/src/mem_pools/tx_pool_v2/tx_pool_bench_metrics.ts +77 -0
  328. package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +444 -0
  329. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +235 -0
  330. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +1087 -0
  331. package/src/msg_validators/attestation_validator/README.md +49 -0
  332. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +2 -2
  333. package/src/msg_validators/proposal_validator/README.md +123 -0
  334. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +14 -4
  335. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +20 -7
  336. package/src/msg_validators/proposal_validator/proposal_validator.ts +63 -40
  337. package/src/msg_validators/tx_validator/README.md +119 -0
  338. package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +5 -5
  339. package/src/msg_validators/tx_validator/allowed_public_setup.ts +22 -27
  340. package/src/msg_validators/tx_validator/allowed_setup_helpers.ts +31 -0
  341. package/src/msg_validators/tx_validator/block_header_validator.ts +15 -3
  342. package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
  343. package/src/msg_validators/tx_validator/data_validator.ts +42 -1
  344. package/src/msg_validators/tx_validator/double_spend_validator.ts +11 -6
  345. package/src/msg_validators/tx_validator/factory.ts +394 -78
  346. package/src/msg_validators/tx_validator/fee_payer_balance.ts +6 -2
  347. package/src/msg_validators/tx_validator/gas_validator.ts +123 -27
  348. package/src/msg_validators/tx_validator/index.ts +2 -0
  349. package/src/msg_validators/tx_validator/nullifier_cache.ts +30 -0
  350. package/src/msg_validators/tx_validator/phases_validator.ts +82 -27
  351. package/src/msg_validators/tx_validator/timestamp_validator.ts +23 -18
  352. package/src/services/data_store.ts +10 -7
  353. package/src/services/dummy_service.ts +18 -6
  354. package/src/services/encoding.ts +18 -10
  355. package/src/services/gossipsub/README.md +641 -0
  356. package/src/services/gossipsub/index.ts +2 -0
  357. package/src/services/gossipsub/scoring.ts +29 -5
  358. package/src/services/gossipsub/topic_score_params.ts +487 -0
  359. package/src/services/index.ts +1 -0
  360. package/src/services/libp2p/libp2p_service.ts +481 -376
  361. package/src/services/peer-manager/peer_scoring.ts +25 -0
  362. package/src/services/reqresp/README.md +229 -0
  363. package/src/services/reqresp/batch-tx-requester/README.md +14 -14
  364. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +18 -18
  365. package/src/services/reqresp/batch-tx-requester/interface.ts +1 -5
  366. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +23 -71
  367. package/src/services/reqresp/batch-tx-requester/tx_validator.ts +2 -2
  368. package/src/services/reqresp/interface.ts +26 -1
  369. package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +24 -15
  370. package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +47 -24
  371. package/src/services/reqresp/protocols/tx.ts +22 -0
  372. package/src/services/reqresp/rate-limiter/rate_limiter.ts +13 -9
  373. package/src/services/reqresp/reqresp.ts +32 -14
  374. package/src/services/service.ts +51 -2
  375. package/src/services/tx_collection/config.ts +74 -6
  376. package/src/services/tx_collection/fast_tx_collection.ts +74 -51
  377. package/src/services/tx_collection/file_store_tx_collection.ts +202 -0
  378. package/src/services/tx_collection/file_store_tx_source.ts +129 -0
  379. package/src/services/tx_collection/index.ts +2 -1
  380. package/src/services/tx_collection/instrumentation.ts +7 -1
  381. package/src/services/tx_collection/missing_txs_tracker.ts +52 -0
  382. package/src/services/tx_collection/proposal_tx_collector.ts +20 -21
  383. package/src/services/tx_collection/slow_tx_collection.ts +66 -33
  384. package/src/services/tx_collection/tx_collection.ts +113 -16
  385. package/src/services/tx_collection/tx_collection_sink.ts +30 -34
  386. package/src/services/tx_collection/tx_source.ts +28 -8
  387. package/src/services/tx_file_store/config.ts +37 -0
  388. package/src/services/tx_file_store/index.ts +3 -0
  389. package/src/services/tx_file_store/instrumentation.ts +36 -0
  390. package/src/services/tx_file_store/tx_file_store.ts +175 -0
  391. package/src/services/tx_provider.ts +10 -9
  392. package/src/test-helpers/make-test-p2p-clients.ts +3 -5
  393. package/src/test-helpers/mock-pubsub.ts +146 -9
  394. package/src/test-helpers/reqresp-nodes.ts +4 -6
  395. package/src/test-helpers/testbench-utils.ts +128 -71
  396. package/src/testbench/p2p_client_testbench_worker.ts +25 -21
  397. package/src/testbench/worker_client_manager.ts +11 -4
  398. package/src/util.ts +7 -1
  399. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +0 -40
  400. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +0 -1
  401. package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +0 -218
  402. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +0 -31
  403. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +0 -1
  404. package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +0 -180
  405. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +0 -23
  406. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +0 -1
  407. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +0 -212
  408. package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +0 -320
  409. package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +0 -264
  410. package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +0 -230
@@ -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;
@@ -0,0 +1,229 @@
1
+ # ReqResp Protocols
2
+
3
+ This module implements libp2p request-response protocols for the Aztec P2P network. All protocols share common transport-level validation (rate limiting, timeouts, Snappy decompression, error penalties) with protocol-specific logic layered on top.
4
+
5
+ ## Common Transport Validation
6
+
7
+ ### Rate Limiting (Responder Side)
8
+
9
+ Applied before the protocol handler runs.
10
+
11
+ | Protocol | Peer Limit | Global Limit | File |
12
+ |----------|-----------|-------------|------|
13
+ | PING | 5/s | 10/s | `rate-limiter/rate_limits.ts` |
14
+ | STATUS | 5/s | 10/s | same |
15
+ | AUTH | 5/s | 10/s | same |
16
+ | GOODBYE | 5/s | 10/s | same |
17
+ | BLOCK | 2/s | 5/s | same |
18
+ | BLOCK_TXS | 10/s | 200/s | same |
19
+ | TX | (see rate limits file) | (see rate limits file) | same |
20
+
21
+ - Per-peer limit exceeded: `HighToleranceError` penalty + `RATE_LIMIT_EXCEEDED` status. Penalty fires inside `RequestResponseRateLimiter.allow()`, not the stream handler.
22
+ - Global limit exceeded: `RATE_LIMIT_EXCEEDED` status only (no peer penalty).
23
+
24
+ ### Response Status Byte (Requester Side)
25
+
26
+ | Rule | Consequence | File |
27
+ |------|-------------|------|
28
+ | First chunk must be exactly 1 byte | `ReqRespStatusError(UNKNOWN)` | `status.ts` |
29
+ | Byte must be valid `ReqRespStatus` enum (0-4, 126, 127) | `ReqRespStatusError(UNKNOWN)` | same |
30
+
31
+ Note: `prettyPrintReqRespStatus` is missing a `NOT_FOUND` case (minor logging bug).
32
+
33
+ ### Snappy Decompression (Requester Side)
34
+
35
+ Per-protocol size limits checked via preamble before decompression.
36
+
37
+ ### Timeouts (Requester Side)
38
+
39
+ | Timeout | Default | Penalty |
40
+ |---------|---------|---------|
41
+ | Individual request | 10s | HighToleranceError |
42
+ | Dial | 5s | HighToleranceError |
43
+
44
+ ### Error Penalty Categorization (Requester Side)
45
+
46
+ | Error Type | Severity |
47
+ |------------|----------|
48
+ | GOODBYE subprotocol errors | None |
49
+ | `CollectiveReqRespTimeoutError` / `InvalidResponseError` | None |
50
+ | `AbortError` / connection close / muxer closed | None |
51
+ | `ECONNRESET` / `EPIPE` / `ECONNREFUSED` / `ERR_UNEXPECTED_EOF` | HighToleranceError |
52
+ | `ERR_UNSUPPORTED_PROTOCOL` | HighToleranceError |
53
+ | `IndividualReqRespTimeoutError` / `TimeoutError` | HighToleranceError |
54
+ | Catch-all | HighToleranceError |
55
+
56
+ ### Request Error Penalty (Responder Side)
57
+
58
+ | Error Type | Severity |
59
+ |------------|----------|
60
+ | `BADLY_FORMED_REQUEST` | LowToleranceError |
61
+ | All others | None |
62
+
63
+ ### Notes
64
+
65
+ - Request payloads are NOT snappy-compressed (asymmetric: only responses use snappy).
66
+
67
+ ---
68
+
69
+ ## Handshake Protocols
70
+
71
+ ### Connection-Level Gating (Before Any Handshake)
72
+
73
+ | Rule | Consequence | File |
74
+ |------|-------------|------|
75
+ | Deny inbound connection from IP/peerId with too many failed auth handshakes | Connection denied | `libp2p_service.ts` |
76
+ | Threshold: `p2pMaxFailedAuthAttemptsAllowed` (default 3) | Tracked per peerId AND per IP | `peer_manager.ts` |
77
+ | Failed auth entries expire after 1 hour | Peer can reconnect; no escalating penalty for repeat offenders | same |
78
+
79
+ ### Handshake Trigger Logic (`peer:connect`)
80
+
81
+ 1. `p2pDisableStatusHandshake` = true: no handshake
82
+ 2. `p2pAllowOnlyValidators` = false: STATUS handshake
83
+ 3. Peer is protected (trusted/private/preferred): STATUS handshake
84
+ 4. Otherwise: AUTH handshake (superset of STATUS)
85
+
86
+ Config constraint: `p2pDisableStatusHandshake && p2pAllowOnlyValidators` is disallowed.
87
+
88
+ ### STATUS Protocol (`/aztec/req/status/1.0.0`)
89
+
90
+ **Requester side** (`peer_manager.ts`):
91
+
92
+ | Rule | Consequence |
93
+ |------|-------------|
94
+ | Response status must be SUCCESS | Peer scheduled for disconnect |
95
+ | `compressedComponentsVersion` must match | Peer scheduled for disconnect |
96
+ | Any exception | Peer scheduled for disconnect |
97
+
98
+ `StatusMessage.validate()` currently only checks `compressedComponentsVersion`. Fields `latestBlockNumber`, `latestBlockHash`, `finalizedBlockNumber` are NOT validated (TODO in code).
99
+
100
+ **Responder side**: no validation of incoming request content (always responds with own status). This means the requester leaks its blockchain state to any peer before validation.
101
+
102
+ **Deserialization bounds**: `MAX_VERSION_STRING_LENGTH` = 64 bytes, `MAX_BLOCK_HASH_STRING_LENGTH` = 128 bytes. Expected response size: 1 KB.
103
+
104
+ ### AUTH Protocol (`/aztec/req/auth/1.0.0`)
105
+
106
+ **Requester side** (`peer_manager.ts`):
107
+
108
+ | # | Rule | Consequence |
109
+ |---|------|-------------|
110
+ | 1 | Response status is SUCCESS | `markAuthHandshakeFailed` + disconnect |
111
+ | 2 | `compressedComponentsVersion` match | `markAuthHandshakeFailed` + disconnect |
112
+ | 3 | Valid ECDSA signature recovery from challenge response | `markAuthHandshakeFailed` + disconnect |
113
+ | 4 | Recovered address is a registered validator | `markAuthHandshakeFailed` + disconnect |
114
+ | 5 | Validator address not already authenticated to different peerId | Silent return (no disconnect, no failure marking -- peer stays connected but unauthenticated) |
115
+ | 6 | Any exception | `markAuthHandshakeFailed` + disconnect |
116
+
117
+ Challenge: random `Fr`, payload = `keccak256("Aztec Validator Challenge:" + challenge)`, signed with `eth_sign` style. Challenge is NOT bound to peer identity (transport encryption via Noise is the binding layer).
118
+
119
+ On success: peer added to authenticated maps, prior failures cleared (including IP-based ones -- shared-IP peers benefit from a legitimate validator's success).
120
+
121
+ **Responder side** (`validator-client/src/validator.ts` + `peer_manager.ts`):
122
+
123
+ | # | Rule | Consequence |
124
+ |---|------|-------------|
125
+ | 1 | Peer must be protected (`shouldTrustWithIdentity` in `peer_manager.ts`) | Returns empty buffer (SUCCESS status + empty payload -> requester gets parse error -> `markAuthHandshakeFailed`) |
126
+ | 2 | Node must have registered validator address | Returns empty buffer (same consequence) |
127
+
128
+ **Unauthenticated peer gossip**: when `p2pAllowOnlyValidators` is true, unauthenticated peers get `appSpecificScore = -Infinity`, completely excluding them from all gossip.
129
+
130
+ ### PING Protocol (`/aztec/req/ping/1.0.0`)
131
+
132
+ No validation on either side. Responder returns `Buffer.from('pong')`. Expected response: 1 KB.
133
+
134
+ ### GOODBYE Protocol (`/aztec/req/goodbye/1.0.0`)
135
+
136
+ **Responder**: buffer must be 1 byte (defaults to `UNKNOWN` on invalid length). Goodbye reason byte is NOT validated against the enum -- any byte 0-255 accepted. Peer scheduled for disconnect regardless of reason.
137
+
138
+ **Requester**: response errors are never penalized (GOODBYE subprotocol exempt from error categorization).
139
+
140
+ ### Periodic Re-validation
141
+
142
+ | Rule | Interval | File |
143
+ |------|----------|------|
144
+ | Authenticated validators re-checked against current validator set | Every heartbeat (`peerCheckIntervalMS`) | `peer_manager.ts` |
145
+ | If validator address no longer registered, auth entry removed | Same | same |
146
+
147
+ Protected peers (private/trusted/preferred) are always considered "authenticated" without AUTH handshake.
148
+
149
+ ---
150
+
151
+ ## Block Data Protocols
152
+
153
+ ### BLOCK Protocol (`/aztec/req/block/1.0.0`)
154
+
155
+ **Server side**:
156
+
157
+ | Rule | Consequence | File |
158
+ |------|-------------|------|
159
+ | Request must parse as `Fr` | `BADLY_FORMED_REQUEST` + LowToleranceError | `protocols/block.ts` |
160
+ | Block lookup throws | `INTERNAL_ERROR` status | same |
161
+ | Block not found | SUCCESS + empty buffer (design choice; no `NOT_FOUND` status used) | same |
162
+
163
+ **Requester side** (Snappy limit: 3 MB):
164
+
165
+ | Rule | Consequence | File |
166
+ |------|-------------|------|
167
+ | Response block number must match requested | LowToleranceError; rejected | `libp2p_service.ts` (`validateRequestedBlock`) |
168
+ | Local block must exist for hash verification | Rejected (no penalty) | same |
169
+ | Response block hash must equal local block hash | MidToleranceError; rejected | same |
170
+
171
+ **Limitation**: the local-block requirement means BLOCK req/resp is unusable for initial P2P-only sync (before L1 sync provides local copies for verification). A TODO in the code acknowledges this.
172
+
173
+ ### BLOCK_TXS Protocol (`/aztec/req/block_txs/1.0.0`)
174
+
175
+ **Server side**:
176
+
177
+ | Rule | Consequence | File |
178
+ |------|-------------|------|
179
+ | Request must parse as `BlockTxsRequest` (Fr + TxHashArray + BitVector) | `BADLY_FORMED_REQUEST` + LowToleranceError | `protocols/block_txs/block_txs_handler.ts` |
180
+ | BitVector length: non-negative and <= `MAX_TXS_PER_BLOCK` (65536) | Deserialization throws -> `BADLY_FORMED_REQUEST` | `protocols/block_txs/bitvector.ts` |
181
+ | Archive root not found and no explicit txHashes | `NOT_FOUND` status | handler |
182
+ | Internal error during lookup | Unhandled exception -> stream abort (no `INTERNAL_ERROR` status, unlike BLOCK) | handler |
183
+
184
+ Conditional registration: BLOCK_TXS handler only registered when `config.disableTransactions` is false. Otherwise peers get `ERR_UNSUPPORTED_PROTOCOL`.
185
+
186
+ **Requester side via `sendBatchRequest`** (Snappy limit: `max(N, 1) * 512 + 1` KB):
187
+
188
+ | Rule | Consequence | File |
189
+ |------|-------------|------|
190
+ | Archive root must match request | MidToleranceError | `libp2p_service.ts` (`validateRequestedBlockTxs`) |
191
+ | BitVector length must match request | MidToleranceError | same |
192
+ | No duplicate tx hashes | MidToleranceError | same |
193
+ | Tx count within bounds | MidToleranceError | same |
194
+ | Local block proposal must exist for archive root | Rejected (no penalty) | same |
195
+ | All tx hashes must be in proposal's tx list at allowed indices | LowToleranceError | same |
196
+ | Txs in strictly increasing index order | LowToleranceError | same |
197
+ | Each tx passes well-formedness (Metadata [4 fields], Size, Data, Proof) | LowToleranceError | same |
198
+
199
+ **Requester side via `BatchTxRequester`** (separate validation path):
200
+
201
+ | Rule | Consequence | File |
202
+ |------|-------------|------|
203
+ | Non-SUCCESS status: `FAILURE`/`UNKNOWN` | HighToleranceError + "bad peer" tracking | `batch-tx-requester/batch_tx_requester.ts` |
204
+ | `RATE_LIMIT_EXCEEDED` | Peer marked rate-limited (cooldown) | same |
205
+ | `NOT_FOUND` / `BADLY_FORMED_REQUEST` / `INTERNAL_ERROR` | Falls through silently (no penalty) | same |
206
+ | Each tx validated (Metadata + Size + Data + Proof) | LowToleranceError per invalid tx; valid txs from same response still accepted | same |
207
+ | Archive root match + non-empty txIndices | No penalty on mismatch; peer not promoted to "smart" | same |
208
+
209
+ **Double penalty on transport errors**: when `BatchTxRequester` encounters a transport error (e.g., ECONNRESET), both `sendRequestToPeer`'s internal handler and the `BatchTxRequester`'s catch block penalize the peer, resulting in double HighToleranceError.
210
+
211
+ See [BatchTxRequester README](batch-tx-requester/README.md) for the full architecture (peer classification, worker model, wire protocol).
212
+
213
+ ### TX Protocol (`/aztec/req/tx/1.0.0`)
214
+
215
+ **Server side**:
216
+
217
+ | Rule | Consequence | File |
218
+ |------|-------------|------|
219
+ | Request must parse as `TxHashArray` | `BADLY_FORMED_REQUEST` + LowToleranceError | `protocols/tx.ts` |
220
+
221
+ **Requester side** (validator registered at startup, not the default noop):
222
+
223
+ | Rule | Consequence | File |
224
+ |------|-------------|------|
225
+ | Each returned tx hash must be in the requested set | MidToleranceError | `libp2p_service.ts` (`validateRequestedTxs`) |
226
+ | Each tx passes well-formedness (Metadata + Size + Data + Proof) | LowToleranceError | same |
227
+
228
+ Snappy limit: `max(N, 1) * 512 + 1` KB.
229
+
@@ -1,14 +1,14 @@
1
1
  # BatchTxRequester
2
2
 
3
- The `BatchTxRequester` is a specialized P2P service that aggressively fetches missing transactions from peers when a node receives a block proposal but lacks some of the referenced transactions. This is critical for validators who need all transactions to attest to a proposal.
3
+ The `BatchTxRequester` is a specialized P2P service that aggressively fetches missing transactions from peers when a node lacks some of the referenced transactions. It serves two pathways: (1) block proposals, where validators need all transactions to attest, and (2) block proving, where provers need all transactions to generate proofs.
4
4
 
5
5
  ## Overview
6
6
 
7
- When a validator receives a block proposal, they must verify all transactions in the block. If some transactions are missing from the local mempool (e.g., due to gossip delays), the `BatchTxRequester` kicks in to fetch them via direct peer-to-peer requests before the attestation deadline.
7
+ When a validator receives a block proposal or a prover needs to prove a block, they must have all transactions. If some transactions are missing from the local mempool (e.g., due to gossip delays), the `BatchTxRequester` kicks in to fetch them via direct peer-to-peer requests before the deadline.
8
8
 
9
9
  ```
10
10
  ┌─────────────────────────────────────────────────────────────────────────────┐
11
- Block Proposal Received
11
+ Block Proposal or Block Received
12
12
  │ (contains hashes of N transactions) │
13
13
  └─────────────────────────────────────────────────────────────────────────────┘
14
14
 
@@ -71,7 +71,7 @@ The requester classifies peers into three categories to optimize fetching:
71
71
  ### Blind Phase → Smart Phase Transition
72
72
 
73
73
  Peers transition from "dumb" to "smart" when they respond with a valid `BlockTxsResponse` containing:
74
- 1. A matching `blockHash`
74
+ 1. A matching `archiveRoot`
75
75
  2. A non-empty `txIndices` BitVector indicating which transactions they have
76
76
  3. At least one transaction we're still missing
77
77
 
@@ -81,10 +81,10 @@ Peers transition from "dumb" to "smart" when they respond with a valid `BlockTxs
81
81
  │ ┌────────────────────────────────────────────────────────────────────────┐ │
82
82
  │ │ Initial State: All peers are "dumb" (except pinned peer) │ │
83
83
  │ │ │ │
84
- │ │ Request: [blockHash, txHashes (full list), txIndices (BitVector)] │ │
84
+ │ │ Request: [archiveRoot, txHashes (full list), txIndices (BitVector)] │ │
85
85
  │ │ └─ Include full hashes because peer may not have proposal │ │
86
86
  │ │ │ │
87
- │ │ Response: [blockHash, txs[], txIndices (what peer has)] │ │
87
+ │ │ Response: [archiveRoot, txs[], txIndices (what peer has)] │ │
88
88
  │ │ └─ Tells us exactly which txs this peer can provide │ │
89
89
  │ └────────────────────────────────────────────────────────────────────────┘ │
90
90
  └──────────────────────────────────────────────────────────────────────────────┘
@@ -97,10 +97,10 @@ Peers transition from "dumb" to "smart" when they respond with a valid `BlockTxs
97
97
  │ ┌────────────────────────────────────────────────────────────────────────┐ │
98
98
  │ │ Peer promoted to "smart" - we know exactly what they have │ │
99
99
  │ │ │ │
100
- │ │ Request: [blockHash, txIndices (BitVector only)] │ │
100
+ │ │ Request: [archiveRoot, txIndices (BitVector only)] │ │
101
101
  │ │ └─ No need for full hashes, peer has the proposal │ │
102
102
  │ │ │ │
103
- │ │ Response: [blockHash, txs[], txIndices (updated availability)] │ │
103
+ │ │ Response: [archiveRoot, txs[], txIndices (updated availability)] │ │
104
104
  │ │ └─ May have received more txs since last response │ │
105
105
  │ └────────────────────────────────────────────────────────────────────────┘ │
106
106
  └──────────────────────────────────────────────────────────────────────────────┘
@@ -152,7 +152,7 @@ The `BatchTxRequester` runs three types of workers concurrently:
152
152
 
153
153
  ```typescript
154
154
  class BlockTxsRequest {
155
- blockHash: Fr; // 32-byte hash of the proposed block header
155
+ archiveRoot: Fr; // Archive root after the proposed block is applied
156
156
  txHashes: TxHashArray; // Full tx hashes (for dumb peers without proposal)
157
157
  txIndices: BitVector; // Which txs from proposal we're requesting (1 = want)
158
158
  }
@@ -162,7 +162,7 @@ class BlockTxsRequest {
162
162
 
163
163
  ```typescript
164
164
  class BlockTxsResponse {
165
- blockHash: Fr; // Echo back the block hash
165
+ archiveRoot: Fr; // Echo back the proposal archive root
166
166
  txs: TxArray; // Actual transaction data
167
167
  txIndices: BitVector; // Which txs the peer has available (1 = have)
168
168
  }
@@ -230,8 +230,8 @@ Request to peer fails
230
230
  ```typescript
231
231
  const requester = new BatchTxRequester(
232
232
  missingTxHashes, // TxHash[] - what we need
233
- blockProposal, // BlockProposal - the proposal we're attesting to
234
- pinnedPeer, // PeerId | undefined - who sent us the proposal
233
+ blockTxsSource, // BlockTxsSource - the proposal or block we need txs for
234
+ pinnedPeer, // PeerId | undefined - peer expected to have the txs
235
235
  timeoutMs, // number - how long to try
236
236
  p2pService, // BatchTxRequesterLibP2PService
237
237
  );
@@ -268,14 +268,14 @@ const txs = await BatchTxRequester.collectAllTxs(requester.run());
268
268
  ┌───────────────────────────────────┐ ┌─────────────────────────────────────┐
269
269
  │ FastTxCollection │ │ SlowTxCollection │
270
270
  │ │ │ │
271
- │ Time-critical: attestations │ │ Background: unproven blocks │
271
+ │ Time-critical: proposals/proving │ │ Background: unproven blocks │
272
272
  │ │ │ │
273
273
  │ 1. Try RPC nodes first (fast) │ │ Periodic polling of RPC nodes │
274
274
  │ 2. Fall back to BatchTxRequester │ │ and peers for missing txs │
275
275
  │ │ │ │
276
276
  └───────────────────┬───────────────┘ └─────────────────────────────────────┘
277
277
 
278
- │ For 'proposal' requests
278
+ │ For 'proposal' and 'block' requests
279
279
 
280
280
  ┌─────────────────────────────────────────────────────────────────────────────┐
281
281
  │ BatchTxRequester │
@@ -4,14 +4,15 @@ import { type Logger, createLogger } from '@aztec/foundation/log';
4
4
  import { FifoMemoryQueue, type ISemaphore, Semaphore } from '@aztec/foundation/queue';
5
5
  import { sleep } from '@aztec/foundation/sleep';
6
6
  import { DateProvider, executeTimeout } from '@aztec/foundation/timer';
7
- import { type BlockProposal, PeerErrorSeverity } from '@aztec/stdlib/p2p';
7
+ import { PeerErrorSeverity } from '@aztec/stdlib/p2p';
8
8
  import { Tx, TxArray, TxHash } from '@aztec/stdlib/tx';
9
9
 
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
- import { BlockTxsRequest, BlockTxsResponse } from '.././protocols/index.js';
15
+ import { BlockTxsRequest, BlockTxsResponse, type BlockTxsSource } from '.././protocols/index.js';
15
16
  import { ReqRespStatus } from '.././status.js';
16
17
  import {
17
18
  DEFAULT_BATCH_TX_REQUESTER_BAD_PEER_THRESHOLD,
@@ -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
 
@@ -42,7 +43,7 @@ import { BatchRequestTxValidator, type IBatchRequestTxValidator } from './tx_val
42
43
  * - Is the peer which was unable to send us successful response N times in a row
43
44
  * */
44
45
  export class BatchTxRequester {
45
- private readonly blockProposal: BlockProposal;
46
+ private readonly blockTxsSource: BlockTxsSource;
46
47
  private readonly pinnedPeer: PeerId | undefined;
47
48
  private readonly timeoutMs: number;
48
49
  private readonly p2pService: BatchTxRequesterLibP2PService;
@@ -60,8 +61,8 @@ export class BatchTxRequester {
60
61
  private readonly txBatchSize: number;
61
62
 
62
63
  constructor(
63
- missingTxs: TxHash[],
64
- blockProposal: BlockProposal,
64
+ missingTxsTracker: IMissingTxsTracker,
65
+ blockTxsSource: BlockTxsSource,
65
66
  pinnedPeer: PeerId | undefined,
66
67
  timeoutMs: number,
67
68
  p2pService: BatchTxRequesterLibP2PService,
@@ -69,7 +70,7 @@ export class BatchTxRequester {
69
70
  dateProvider?: DateProvider,
70
71
  opts?: BatchTxRequesterOptions,
71
72
  ) {
72
- this.blockProposal = blockProposal;
73
+ this.blockTxsSource = blockTxsSource;
73
74
  this.pinnedPeer = pinnedPeer;
74
75
  this.timeoutMs = timeoutMs;
75
76
  this.p2pService = p2pService;
@@ -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
 
@@ -205,7 +205,7 @@ export class BatchTxRequester {
205
205
  return;
206
206
  }
207
207
 
208
- const request = BlockTxsRequest.fromBlockProposalAndMissingTxs(this.blockProposal, txs);
208
+ const request = BlockTxsRequest.fromTxsSourceAndMissingTxs(this.blockTxsSource, txs);
209
209
  if (!request) {
210
210
  return;
211
211
  }
@@ -249,8 +249,8 @@ export class BatchTxRequester {
249
249
  // If peer is dumb peer, we don't know yet if they received full blockProposal
250
250
  // there is solid chance that peer didn't receive proposal yet, thus we must send full hashes
251
251
  const includeFullHashesInRequestNotJustIndices = true;
252
- const blockRequest = BlockTxsRequest.fromBlockProposalAndMissingTxs(
253
- this.blockProposal,
252
+ const blockRequest = BlockTxsRequest.fromTxsSourceAndMissingTxs(
253
+ this.blockTxsSource,
254
254
  txs,
255
255
  includeFullHashesInRequestNotJustIndices,
256
256
  );
@@ -342,7 +342,7 @@ export class BatchTxRequester {
342
342
 
343
343
  const makeRequest = (pid: PeerId) => {
344
344
  const txs = this.txsMetadata.getTxsToRequestFromThePeer(pid);
345
- const blockRequest = BlockTxsRequest.fromBlockProposalAndMissingTxs(this.blockProposal, txs);
345
+ const blockRequest = BlockTxsRequest.fromTxsSourceAndMissingTxs(this.blockTxsSource, txs);
346
346
  if (!blockRequest) {
347
347
  return undefined;
348
348
  }
@@ -605,9 +605,9 @@ export class BatchTxRequester {
605
605
  }
606
606
 
607
607
  private isBlockResponseValid(response: BlockTxsResponse): boolean {
608
- const blockIdsMatch = this.blockProposal.archive.toString() === response.blockHash.toString();
608
+ const archiveRootsMatch = this.blockTxsSource.archive.toString() === response.archiveRoot.toString();
609
609
  const peerHasSomeTxsFromProposal = !response.txIndices.isEmpty();
610
- return blockIdsMatch && peerHasSomeTxsFromProposal;
610
+ return archiveRootsMatch && peerHasSomeTxsFromProposal;
611
611
  }
612
612
 
613
613
  private peerHasSomeTxsWeAreMissing(_peerId: PeerId, response: BlockTxsResponse): boolean {
@@ -624,7 +624,7 @@ export class BatchTxRequester {
624
624
  private extractHashesPeerHasFromResponse(response: BlockTxsResponse): Array<TxHash> {
625
625
  const hashes: TxHash[] = [];
626
626
  const indicesOfHashesPeerHas = new Set(response.txIndices.getTrueIndices());
627
- this.blockProposal.txHashes.forEach((hash, idx) => {
627
+ this.blockTxsSource.txHashes.forEach((hash, idx) => {
628
628
  if (indicesOfHashesPeerHas.has(idx)) {
629
629
  hashes.push(hash);
630
630
  }
@@ -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
  /**