@aztec/p2p 0.0.1-commit.9b94fc1 → 0.0.1-commit.9badcec54

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 (563) hide show
  1. package/README.md +129 -3
  2. package/dest/bootstrap/bootstrap.d.ts +4 -3
  3. package/dest/bootstrap/bootstrap.d.ts.map +1 -1
  4. package/dest/bootstrap/bootstrap.js +4 -4
  5. package/dest/client/factory.d.ts +11 -11
  6. package/dest/client/factory.d.ts.map +1 -1
  7. package/dest/client/factory.js +60 -20
  8. package/dest/client/interface.d.ts +68 -35
  9. package/dest/client/interface.d.ts.map +1 -1
  10. package/dest/client/p2p_client.d.ts +53 -65
  11. package/dest/client/p2p_client.d.ts.map +1 -1
  12. package/dest/client/p2p_client.js +632 -335
  13. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts +2 -0
  14. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts.map +1 -0
  15. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +315 -0
  16. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts +73 -0
  17. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts.map +1 -0
  18. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.js +8 -0
  19. package/dest/config.d.ts +137 -87
  20. package/dest/config.d.ts.map +1 -1
  21. package/dest/config.js +124 -54
  22. package/dest/errors/p2p-service.error.d.ts +9 -0
  23. package/dest/errors/p2p-service.error.d.ts.map +1 -0
  24. package/dest/errors/p2p-service.error.js +10 -0
  25. package/dest/errors/tx-pool.error.d.ts +8 -0
  26. package/dest/errors/tx-pool.error.d.ts.map +1 -0
  27. package/dest/errors/tx-pool.error.js +9 -0
  28. package/dest/index.d.ts +2 -2
  29. package/dest/index.d.ts.map +1 -1
  30. package/dest/index.js +1 -1
  31. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +113 -76
  32. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  33. package/dest/mem_pools/attestation_pool/attestation_pool.js +448 -3
  34. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +2 -2
  35. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
  36. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +529 -289
  37. package/dest/mem_pools/attestation_pool/index.d.ts +2 -3
  38. package/dest/mem_pools/attestation_pool/index.d.ts.map +1 -1
  39. package/dest/mem_pools/attestation_pool/index.js +1 -2
  40. package/dest/mem_pools/attestation_pool/mocks.d.ts +11 -8
  41. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  42. package/dest/mem_pools/attestation_pool/mocks.js +17 -13
  43. package/dest/mem_pools/index.d.ts +3 -3
  44. package/dest/mem_pools/index.d.ts.map +1 -1
  45. package/dest/mem_pools/index.js +1 -1
  46. package/dest/mem_pools/instrumentation.d.ts +9 -1
  47. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  48. package/dest/mem_pools/instrumentation.js +33 -13
  49. package/dest/mem_pools/interface.d.ts +6 -7
  50. package/dest/mem_pools/interface.d.ts.map +1 -1
  51. package/dest/mem_pools/tx_pool_v2/archive/index.d.ts +2 -0
  52. package/dest/mem_pools/tx_pool_v2/archive/index.d.ts.map +1 -0
  53. package/dest/mem_pools/tx_pool_v2/archive/index.js +1 -0
  54. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts +43 -0
  55. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts.map +1 -0
  56. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.js +103 -0
  57. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +104 -0
  58. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -0
  59. package/dest/mem_pools/tx_pool_v2/deleted_pool.js +251 -0
  60. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts +47 -0
  61. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts.map +1 -0
  62. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.js +128 -0
  63. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +17 -0
  64. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -0
  65. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +94 -0
  66. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +19 -0
  67. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -0
  68. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +97 -0
  69. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +10 -0
  70. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -0
  71. package/dest/mem_pools/tx_pool_v2/eviction/index.js +11 -0
  72. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +180 -0
  73. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -0
  74. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.js +25 -0
  75. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts +15 -0
  76. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -0
  77. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +65 -0
  78. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts +17 -0
  79. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -0
  80. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +93 -0
  81. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +16 -0
  82. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -0
  83. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +78 -0
  84. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +20 -0
  85. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -0
  86. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +75 -0
  87. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +15 -0
  88. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -0
  89. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +19 -0
  90. package/dest/mem_pools/tx_pool_v2/index.d.ts +6 -0
  91. package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -0
  92. package/dest/mem_pools/tx_pool_v2/index.js +5 -0
  93. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts +15 -0
  94. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts.map +1 -0
  95. package/dest/mem_pools/tx_pool_v2/instrumentation.js +43 -0
  96. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +215 -0
  97. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -0
  98. package/dest/mem_pools/tx_pool_v2/interfaces.js +10 -0
  99. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +134 -0
  100. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -0
  101. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +220 -0
  102. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts +26 -0
  103. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts.map +1 -0
  104. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.js +70 -0
  105. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +108 -0
  106. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -0
  107. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +337 -0
  108. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +62 -0
  109. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -0
  110. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +167 -0
  111. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +78 -0
  112. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -0
  113. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +923 -0
  114. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +8 -5
  115. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  116. package/dest/msg_validators/attestation_validator/attestation_validator.js +63 -21
  117. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +9 -7
  118. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
  119. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +24 -15
  120. package/dest/msg_validators/clock_tolerance.d.ts +32 -0
  121. package/dest/msg_validators/clock_tolerance.d.ts.map +1 -0
  122. package/dest/msg_validators/clock_tolerance.js +88 -0
  123. package/dest/msg_validators/index.d.ts +2 -2
  124. package/dest/msg_validators/index.d.ts.map +1 -1
  125. package/dest/msg_validators/index.js +1 -1
  126. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +12 -0
  127. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -0
  128. package/dest/msg_validators/proposal_validator/block_proposal_validator.js +14 -0
  129. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +12 -0
  130. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -0
  131. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +20 -0
  132. package/dest/msg_validators/proposal_validator/index.d.ts +4 -0
  133. package/dest/msg_validators/proposal_validator/index.d.ts.map +1 -0
  134. package/dest/msg_validators/proposal_validator/index.js +3 -0
  135. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +20 -0
  136. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -0
  137. package/dest/msg_validators/proposal_validator/proposal_validator.js +124 -0
  138. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +4 -4
  139. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  140. package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +3 -3
  141. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +2 -1
  142. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -1
  143. package/dest/msg_validators/tx_validator/allowed_public_setup.js +24 -20
  144. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts +17 -0
  145. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts.map +1 -0
  146. package/dest/msg_validators/tx_validator/allowed_setup_helpers.js +24 -0
  147. package/dest/msg_validators/tx_validator/archive_cache.d.ts +3 -3
  148. package/dest/msg_validators/tx_validator/archive_cache.d.ts.map +1 -1
  149. package/dest/msg_validators/tx_validator/block_header_validator.d.ts +20 -6
  150. package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
  151. package/dest/msg_validators/tx_validator/block_header_validator.js +4 -3
  152. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts +9 -0
  153. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts.map +1 -0
  154. package/dest/msg_validators/tx_validator/contract_instance_validator.js +48 -0
  155. package/dest/msg_validators/tx_validator/data_validator.d.ts +3 -1
  156. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  157. package/dest/msg_validators/tx_validator/data_validator.js +39 -3
  158. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +15 -4
  159. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
  160. package/dest/msg_validators/tx_validator/double_spend_validator.js +7 -6
  161. package/dest/msg_validators/tx_validator/factory.d.ts +139 -6
  162. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  163. package/dest/msg_validators/tx_validator/factory.js +255 -58
  164. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +10 -0
  165. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -0
  166. package/dest/msg_validators/tx_validator/fee_payer_balance.js +24 -0
  167. package/dest/msg_validators/tx_validator/gas_validator.d.ts +68 -3
  168. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  169. package/dest/msg_validators/tx_validator/gas_validator.js +122 -58
  170. package/dest/msg_validators/tx_validator/index.d.ts +4 -1
  171. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  172. package/dest/msg_validators/tx_validator/index.js +3 -0
  173. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +4 -3
  174. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  175. package/dest/msg_validators/tx_validator/metadata_validator.js +6 -6
  176. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts +14 -0
  177. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts.map +1 -0
  178. package/dest/msg_validators/tx_validator/nullifier_cache.js +24 -0
  179. package/dest/msg_validators/tx_validator/phases_validator.d.ts +24 -3
  180. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
  181. package/dest/msg_validators/tx_validator/phases_validator.js +75 -27
  182. package/dest/msg_validators/tx_validator/size_validator.d.ts +8 -0
  183. package/dest/msg_validators/tx_validator/size_validator.d.ts.map +1 -0
  184. package/dest/msg_validators/tx_validator/size_validator.js +23 -0
  185. package/dest/msg_validators/tx_validator/test_utils.d.ts +2 -2
  186. package/dest/msg_validators/tx_validator/test_utils.d.ts.map +1 -1
  187. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +23 -5
  188. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
  189. package/dest/msg_validators/tx_validator/timestamp_validator.js +8 -8
  190. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts +3 -2
  191. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts.map +1 -1
  192. package/dest/msg_validators/tx_validator/tx_permitted_validator.js +2 -2
  193. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +3 -2
  194. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
  195. package/dest/msg_validators/tx_validator/tx_proof_validator.js +2 -2
  196. package/dest/services/data_store.d.ts +1 -1
  197. package/dest/services/data_store.d.ts.map +1 -1
  198. package/dest/services/data_store.js +14 -10
  199. package/dest/services/discv5/discV5_service.js +1 -1
  200. package/dest/services/dummy_service.d.ts +31 -4
  201. package/dest/services/dummy_service.d.ts.map +1 -1
  202. package/dest/services/dummy_service.js +54 -1
  203. package/dest/services/encoding.d.ts +7 -3
  204. package/dest/services/encoding.d.ts.map +1 -1
  205. package/dest/services/encoding.js +23 -15
  206. package/dest/services/gossipsub/index.d.ts +3 -0
  207. package/dest/services/gossipsub/index.d.ts.map +1 -0
  208. package/dest/services/gossipsub/index.js +2 -0
  209. package/dest/services/gossipsub/scoring.d.ts +21 -3
  210. package/dest/services/gossipsub/scoring.d.ts.map +1 -1
  211. package/dest/services/gossipsub/scoring.js +24 -7
  212. package/dest/services/gossipsub/topic_score_params.d.ts +184 -0
  213. package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -0
  214. package/dest/services/gossipsub/topic_score_params.js +363 -0
  215. package/dest/services/index.d.ts +2 -1
  216. package/dest/services/index.d.ts.map +1 -1
  217. package/dest/services/index.js +1 -0
  218. package/dest/services/libp2p/instrumentation.d.ts +3 -1
  219. package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
  220. package/dest/services/libp2p/instrumentation.js +43 -71
  221. package/dest/services/libp2p/libp2p_service.d.ts +109 -44
  222. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  223. package/dest/services/libp2p/libp2p_service.js +1128 -431
  224. package/dest/services/peer-manager/metrics.d.ts +9 -2
  225. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  226. package/dest/services/peer-manager/metrics.js +39 -21
  227. package/dest/services/peer-manager/peer_manager.d.ts +7 -3
  228. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  229. package/dest/services/peer-manager/peer_manager.js +43 -23
  230. package/dest/services/peer-manager/peer_scoring.d.ts +7 -2
  231. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  232. package/dest/services/peer-manager/peer_scoring.js +64 -16
  233. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +51 -0
  234. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -0
  235. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +543 -0
  236. package/dest/services/reqresp/batch-tx-requester/config.d.ts +17 -0
  237. package/dest/services/reqresp/batch-tx-requester/config.d.ts.map +1 -0
  238. package/dest/services/reqresp/batch-tx-requester/config.js +27 -0
  239. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +47 -0
  240. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -0
  241. package/dest/services/reqresp/batch-tx-requester/interface.js +1 -0
  242. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +35 -0
  243. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -0
  244. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +136 -0
  245. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +62 -0
  246. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -0
  247. package/dest/services/reqresp/batch-tx-requester/peer_collection.js +176 -0
  248. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +20 -0
  249. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -0
  250. package/dest/services/reqresp/batch-tx-requester/tx_validator.js +21 -0
  251. package/dest/services/reqresp/config.d.ts +3 -3
  252. package/dest/services/reqresp/config.d.ts.map +1 -1
  253. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +22 -3
  254. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +1 -1
  255. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +63 -4
  256. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +2 -1
  257. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -1
  258. package/dest/services/reqresp/connection-sampler/connection_sampler.js +12 -0
  259. package/dest/services/reqresp/constants.d.ts +12 -0
  260. package/dest/services/reqresp/constants.d.ts.map +1 -0
  261. package/dest/services/reqresp/constants.js +7 -0
  262. package/dest/services/reqresp/interface.d.ts +25 -9
  263. package/dest/services/reqresp/interface.d.ts.map +1 -1
  264. package/dest/services/reqresp/interface.js +23 -10
  265. package/dest/services/reqresp/metrics.d.ts +6 -5
  266. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  267. package/dest/services/reqresp/metrics.js +16 -21
  268. package/dest/services/reqresp/protocols/auth.d.ts +2 -2
  269. package/dest/services/reqresp/protocols/auth.d.ts.map +1 -1
  270. package/dest/services/reqresp/protocols/auth.js +2 -2
  271. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +5 -1
  272. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -1
  273. package/dest/services/reqresp/protocols/block_txs/bitvector.js +12 -0
  274. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +7 -5
  275. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
  276. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +27 -9
  277. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +30 -7
  278. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
  279. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +60 -14
  280. package/dest/services/reqresp/protocols/index.d.ts +1 -2
  281. package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
  282. package/dest/services/reqresp/protocols/index.js +0 -1
  283. package/dest/services/reqresp/protocols/status.d.ts +5 -4
  284. package/dest/services/reqresp/protocols/status.d.ts.map +1 -1
  285. package/dest/services/reqresp/protocols/status.js +7 -3
  286. package/dest/services/reqresp/protocols/tx.d.ts +8 -3
  287. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  288. package/dest/services/reqresp/protocols/tx.js +21 -3
  289. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +5 -4
  290. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
  291. package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -8
  292. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
  293. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
  294. package/dest/services/reqresp/rate-limiter/rate_limits.js +0 -10
  295. package/dest/services/reqresp/reqresp.d.ts +9 -2
  296. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  297. package/dest/services/reqresp/reqresp.js +497 -58
  298. package/dest/services/service.d.ts +59 -4
  299. package/dest/services/service.d.ts.map +1 -1
  300. package/dest/services/tx_collection/config.d.ts +22 -1
  301. package/dest/services/tx_collection/config.d.ts.map +1 -1
  302. package/dest/services/tx_collection/config.js +56 -2
  303. package/dest/services/tx_collection/fast_tx_collection.d.ts +10 -9
  304. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
  305. package/dest/services/tx_collection/fast_tx_collection.js +95 -84
  306. package/dest/services/tx_collection/file_store_tx_collection.d.ts +53 -0
  307. package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -0
  308. package/dest/services/tx_collection/file_store_tx_collection.js +167 -0
  309. package/dest/services/tx_collection/file_store_tx_source.d.ts +38 -0
  310. package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -0
  311. package/dest/services/tx_collection/file_store_tx_source.js +100 -0
  312. package/dest/services/tx_collection/index.d.ts +3 -1
  313. package/dest/services/tx_collection/index.d.ts.map +1 -1
  314. package/dest/services/tx_collection/index.js +2 -0
  315. package/dest/services/tx_collection/instrumentation.d.ts +1 -1
  316. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
  317. package/dest/services/tx_collection/instrumentation.js +11 -13
  318. package/dest/services/tx_collection/proposal_tx_collector.d.ts +48 -0
  319. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -0
  320. package/dest/services/tx_collection/proposal_tx_collector.js +50 -0
  321. package/dest/services/tx_collection/request_tracker.d.ts +53 -0
  322. package/dest/services/tx_collection/request_tracker.d.ts.map +1 -0
  323. package/dest/services/tx_collection/request_tracker.js +84 -0
  324. package/dest/services/tx_collection/slow_tx_collection.d.ts +9 -4
  325. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -1
  326. package/dest/services/tx_collection/slow_tx_collection.js +60 -26
  327. package/dest/services/tx_collection/tx_collection.d.ts +31 -20
  328. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  329. package/dest/services/tx_collection/tx_collection.js +79 -7
  330. package/dest/services/tx_collection/tx_collection_sink.d.ts +18 -8
  331. package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -1
  332. package/dest/services/tx_collection/tx_collection_sink.js +26 -29
  333. package/dest/services/tx_collection/tx_source.d.ts +13 -7
  334. package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
  335. package/dest/services/tx_collection/tx_source.js +26 -7
  336. package/dest/services/tx_file_store/config.d.ts +16 -0
  337. package/dest/services/tx_file_store/config.d.ts.map +1 -0
  338. package/dest/services/tx_file_store/config.js +22 -0
  339. package/dest/services/tx_file_store/index.d.ts +4 -0
  340. package/dest/services/tx_file_store/index.d.ts.map +1 -0
  341. package/dest/services/tx_file_store/index.js +3 -0
  342. package/dest/services/tx_file_store/instrumentation.d.ts +15 -0
  343. package/dest/services/tx_file_store/instrumentation.d.ts.map +1 -0
  344. package/dest/services/tx_file_store/instrumentation.js +29 -0
  345. package/dest/services/tx_file_store/tx_file_store.d.ts +48 -0
  346. package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -0
  347. package/dest/services/tx_file_store/tx_file_store.js +152 -0
  348. package/dest/services/tx_provider.d.ts +7 -5
  349. package/dest/services/tx_provider.d.ts.map +1 -1
  350. package/dest/services/tx_provider.js +20 -10
  351. package/dest/services/tx_provider_instrumentation.d.ts +5 -2
  352. package/dest/services/tx_provider_instrumentation.d.ts.map +1 -1
  353. package/dest/services/tx_provider_instrumentation.js +14 -14
  354. package/dest/test-helpers/index.d.ts +3 -1
  355. package/dest/test-helpers/index.d.ts.map +1 -1
  356. package/dest/test-helpers/index.js +2 -0
  357. package/dest/test-helpers/make-test-p2p-clients.d.ts +7 -8
  358. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  359. package/dest/test-helpers/make-test-p2p-clients.js +1 -2
  360. package/dest/test-helpers/mock-pubsub.d.ts +40 -6
  361. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  362. package/dest/test-helpers/mock-pubsub.js +139 -13
  363. package/dest/test-helpers/mock-tx-helpers.js +1 -1
  364. package/dest/test-helpers/reqresp-nodes.d.ts +2 -3
  365. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  366. package/dest/test-helpers/reqresp-nodes.js +5 -5
  367. package/dest/test-helpers/test_tx_provider.d.ts +40 -0
  368. package/dest/test-helpers/test_tx_provider.d.ts.map +1 -0
  369. package/dest/test-helpers/test_tx_provider.js +41 -0
  370. package/dest/test-helpers/testbench-utils.d.ts +163 -0
  371. package/dest/test-helpers/testbench-utils.d.ts.map +1 -0
  372. package/dest/test-helpers/testbench-utils.js +386 -0
  373. package/dest/testbench/p2p_client_testbench_worker.d.ts +28 -2
  374. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  375. package/dest/testbench/p2p_client_testbench_worker.js +281 -134
  376. package/dest/testbench/worker_client_manager.d.ts +60 -6
  377. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  378. package/dest/testbench/worker_client_manager.js +280 -41
  379. package/dest/util.d.ts +3 -3
  380. package/dest/util.d.ts.map +1 -1
  381. package/package.json +18 -18
  382. package/src/bootstrap/bootstrap.ts +7 -4
  383. package/src/client/factory.ts +116 -45
  384. package/src/client/interface.ts +81 -36
  385. package/src/client/p2p_client.ts +299 -396
  386. package/src/client/test/tx_proposal_collector/README.md +227 -0
  387. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +355 -0
  388. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.ts +43 -0
  389. package/src/config.ts +196 -64
  390. package/src/errors/p2p-service.error.ts +11 -0
  391. package/src/errors/tx-pool.error.ts +12 -0
  392. package/src/index.ts +1 -1
  393. package/src/mem_pools/attestation_pool/attestation_pool.ts +515 -78
  394. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +614 -322
  395. package/src/mem_pools/attestation_pool/index.ts +9 -2
  396. package/src/mem_pools/attestation_pool/mocks.ts +22 -15
  397. package/src/mem_pools/index.ts +2 -2
  398. package/src/mem_pools/instrumentation.ts +43 -14
  399. package/src/mem_pools/interface.ts +5 -7
  400. package/src/mem_pools/tx_pool_v2/README.md +283 -0
  401. package/src/mem_pools/tx_pool_v2/archive/index.ts +1 -0
  402. package/src/mem_pools/tx_pool_v2/archive/tx_archive.ts +120 -0
  403. package/src/mem_pools/tx_pool_v2/deleted_pool.ts +321 -0
  404. package/src/mem_pools/tx_pool_v2/eviction/eviction_manager.ts +160 -0
  405. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +122 -0
  406. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +125 -0
  407. package/src/mem_pools/tx_pool_v2/eviction/index.ts +27 -0
  408. package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +219 -0
  409. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +74 -0
  410. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +101 -0
  411. package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +91 -0
  412. package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +99 -0
  413. package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +32 -0
  414. package/src/mem_pools/tx_pool_v2/index.ts +12 -0
  415. package/src/mem_pools/tx_pool_v2/instrumentation.ts +69 -0
  416. package/src/mem_pools/tx_pool_v2/interfaces.ts +247 -0
  417. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +343 -0
  418. package/src/mem_pools/tx_pool_v2/tx_pool_bench_metrics.ts +77 -0
  419. package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +430 -0
  420. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +238 -0
  421. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +1105 -0
  422. package/src/msg_validators/attestation_validator/README.md +49 -0
  423. package/src/msg_validators/attestation_validator/attestation_validator.ts +51 -24
  424. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +25 -19
  425. package/src/msg_validators/clock_tolerance.ts +120 -0
  426. package/src/msg_validators/index.ts +1 -1
  427. package/src/msg_validators/proposal_validator/README.md +123 -0
  428. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +23 -0
  429. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +29 -0
  430. package/src/msg_validators/proposal_validator/index.ts +3 -0
  431. package/src/msg_validators/proposal_validator/proposal_validator.ts +122 -0
  432. package/src/msg_validators/tx_validator/README.md +119 -0
  433. package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +5 -5
  434. package/src/msg_validators/tx_validator/allowed_public_setup.ts +22 -27
  435. package/src/msg_validators/tx_validator/allowed_setup_helpers.ts +31 -0
  436. package/src/msg_validators/tx_validator/archive_cache.ts +2 -2
  437. package/src/msg_validators/tx_validator/block_header_validator.ts +21 -8
  438. package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
  439. package/src/msg_validators/tx_validator/data_validator.ts +60 -7
  440. package/src/msg_validators/tx_validator/double_spend_validator.ts +15 -9
  441. package/src/msg_validators/tx_validator/factory.ts +416 -58
  442. package/src/msg_validators/tx_validator/fee_payer_balance.ts +44 -0
  443. package/src/msg_validators/tx_validator/gas_validator.ts +162 -61
  444. package/src/msg_validators/tx_validator/index.ts +3 -0
  445. package/src/msg_validators/tx_validator/metadata_validator.ts +31 -12
  446. package/src/msg_validators/tx_validator/nullifier_cache.ts +30 -0
  447. package/src/msg_validators/tx_validator/phases_validator.ts +87 -30
  448. package/src/msg_validators/tx_validator/size_validator.ts +22 -0
  449. package/src/msg_validators/tx_validator/test_utils.ts +1 -1
  450. package/src/msg_validators/tx_validator/timestamp_validator.ts +30 -19
  451. package/src/msg_validators/tx_validator/tx_permitted_validator.ts +8 -3
  452. package/src/msg_validators/tx_validator/tx_proof_validator.ts +8 -3
  453. package/src/services/data_store.ts +14 -19
  454. package/src/services/discv5/discV5_service.ts +1 -1
  455. package/src/services/dummy_service.ts +71 -2
  456. package/src/services/encoding.ts +22 -13
  457. package/src/services/gossipsub/README.md +641 -0
  458. package/src/services/gossipsub/index.ts +2 -0
  459. package/src/services/gossipsub/scoring.ts +29 -5
  460. package/src/services/gossipsub/topic_score_params.ts +519 -0
  461. package/src/services/index.ts +1 -0
  462. package/src/services/libp2p/instrumentation.ts +48 -75
  463. package/src/services/libp2p/libp2p_service.ts +827 -461
  464. package/src/services/peer-manager/metrics.ts +46 -21
  465. package/src/services/peer-manager/peer_manager.ts +50 -15
  466. package/src/services/peer-manager/peer_scoring.ts +55 -9
  467. package/src/services/reqresp/README.md +229 -0
  468. package/src/services/reqresp/batch-tx-requester/README.md +344 -0
  469. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +673 -0
  470. package/src/services/reqresp/batch-tx-requester/config.ts +40 -0
  471. package/src/services/reqresp/batch-tx-requester/interface.ts +54 -0
  472. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +168 -0
  473. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +249 -0
  474. package/src/services/reqresp/batch-tx-requester/tx_validator.ts +37 -0
  475. package/src/services/reqresp/config.ts +2 -2
  476. package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +65 -4
  477. package/src/services/reqresp/connection-sampler/connection_sampler.ts +19 -1
  478. package/src/services/reqresp/constants.ts +14 -0
  479. package/src/services/reqresp/interface.ts +48 -10
  480. package/src/services/reqresp/metrics.ts +35 -27
  481. package/src/services/reqresp/protocols/auth.ts +2 -2
  482. package/src/services/reqresp/protocols/block_txs/bitvector.ts +16 -0
  483. package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +35 -12
  484. package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +75 -10
  485. package/src/services/reqresp/protocols/index.ts +0 -1
  486. package/src/services/reqresp/protocols/status.ts +16 -12
  487. package/src/services/reqresp/protocols/tx.ts +24 -5
  488. package/src/services/reqresp/rate-limiter/rate_limiter.ts +13 -9
  489. package/src/services/reqresp/rate-limiter/rate_limits.ts +0 -10
  490. package/src/services/reqresp/reqresp.ts +116 -32
  491. package/src/services/service.ts +78 -5
  492. package/src/services/tx_collection/config.ts +84 -2
  493. package/src/services/tx_collection/fast_tx_collection.ts +114 -93
  494. package/src/services/tx_collection/file_store_tx_collection.ts +202 -0
  495. package/src/services/tx_collection/file_store_tx_source.ts +129 -0
  496. package/src/services/tx_collection/index.ts +6 -0
  497. package/src/services/tx_collection/instrumentation.ts +11 -13
  498. package/src/services/tx_collection/proposal_tx_collector.ts +108 -0
  499. package/src/services/tx_collection/request_tracker.ts +127 -0
  500. package/src/services/tx_collection/slow_tx_collection.ts +69 -36
  501. package/src/services/tx_collection/tx_collection.ts +123 -27
  502. package/src/services/tx_collection/tx_collection_sink.ts +30 -34
  503. package/src/services/tx_collection/tx_source.ts +28 -8
  504. package/src/services/tx_file_store/config.ts +37 -0
  505. package/src/services/tx_file_store/index.ts +3 -0
  506. package/src/services/tx_file_store/instrumentation.ts +36 -0
  507. package/src/services/tx_file_store/tx_file_store.ts +175 -0
  508. package/src/services/tx_provider.ts +29 -12
  509. package/src/services/tx_provider_instrumentation.ts +24 -14
  510. package/src/test-helpers/index.ts +2 -0
  511. package/src/test-helpers/make-test-p2p-clients.ts +4 -6
  512. package/src/test-helpers/mock-pubsub.ts +178 -15
  513. package/src/test-helpers/mock-tx-helpers.ts +1 -1
  514. package/src/test-helpers/reqresp-nodes.ts +8 -10
  515. package/src/test-helpers/test_tx_provider.ts +64 -0
  516. package/src/test-helpers/testbench-utils.ts +457 -0
  517. package/src/testbench/p2p_client_testbench_worker.ts +410 -131
  518. package/src/testbench/worker_client_manager.ts +367 -43
  519. package/src/util.ts +8 -2
  520. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +0 -37
  521. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +0 -1
  522. package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +0 -213
  523. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +0 -30
  524. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +0 -1
  525. package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +0 -219
  526. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +0 -115
  527. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +0 -1
  528. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +0 -617
  529. package/dest/mem_pools/tx_pool/index.d.ts +0 -4
  530. package/dest/mem_pools/tx_pool/index.d.ts.map +0 -1
  531. package/dest/mem_pools/tx_pool/index.js +0 -3
  532. package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts +0 -80
  533. package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts.map +0 -1
  534. package/dest/mem_pools/tx_pool/memory_tx_pool.js +0 -238
  535. package/dest/mem_pools/tx_pool/priority.d.ts +0 -8
  536. package/dest/mem_pools/tx_pool/priority.d.ts.map +0 -1
  537. package/dest/mem_pools/tx_pool/priority.js +0 -10
  538. package/dest/mem_pools/tx_pool/tx_pool.d.ts +0 -122
  539. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +0 -1
  540. package/dest/mem_pools/tx_pool/tx_pool.js +0 -3
  541. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +0 -7
  542. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +0 -1
  543. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +0 -394
  544. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts +0 -12
  545. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts.map +0 -1
  546. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.js +0 -82
  547. package/dest/msg_validators/block_proposal_validator/index.d.ts +0 -2
  548. package/dest/msg_validators/block_proposal_validator/index.d.ts.map +0 -1
  549. package/dest/msg_validators/block_proposal_validator/index.js +0 -1
  550. package/dest/services/reqresp/protocols/block.d.ts +0 -9
  551. package/dest/services/reqresp/protocols/block.d.ts.map +0 -1
  552. package/dest/services/reqresp/protocols/block.js +0 -31
  553. package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +0 -298
  554. package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +0 -287
  555. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -750
  556. package/src/mem_pools/tx_pool/index.ts +0 -3
  557. package/src/mem_pools/tx_pool/memory_tx_pool.ts +0 -283
  558. package/src/mem_pools/tx_pool/priority.ts +0 -13
  559. package/src/mem_pools/tx_pool/tx_pool.ts +0 -135
  560. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +0 -313
  561. package/src/msg_validators/block_proposal_validator/block_proposal_validator.ts +0 -97
  562. package/src/msg_validators/block_proposal_validator/index.ts +0 -1
  563. package/src/services/reqresp/protocols/block.ts +0 -36
@@ -1,21 +1,28 @@
1
1
  import {
2
2
  Attributes,
3
3
  type Gauge,
4
+ type Histogram,
4
5
  Metrics,
5
6
  type TelemetryClient,
6
7
  type Tracer,
7
8
  type UpDownCounter,
8
- ValueType,
9
+ createUpDownCounterWithDefault,
9
10
  getTelemetryClient,
10
11
  } from '@aztec/telemetry-client';
11
12
 
12
- import { type GoodByeReason, prettyGoodbyeReason } from '../reqresp/protocols/index.js';
13
+ import type { PeerId } from '@libp2p/interface';
14
+
15
+ import { GoodByeReason, prettyGoodbyeReason } from '../reqresp/protocols/index.js';
13
16
 
14
17
  export class PeerManagerMetrics {
15
18
  private sentGoodbyes: UpDownCounter;
16
19
  private receivedGoodbyes: UpDownCounter;
17
20
  private peerCount: Gauge;
21
+ private healthyPeerCount: Gauge;
18
22
  private lowScoreDisconnects: UpDownCounter;
23
+ private peerConnectionDuration: Histogram;
24
+
25
+ private peerConnectedAt: Map<string, number> = new Map<string, number>();
19
26
 
20
27
  public readonly tracer: Tracer;
21
28
 
@@ -26,26 +33,28 @@ export class PeerManagerMetrics {
26
33
  this.tracer = telemetryClient.getTracer(name);
27
34
 
28
35
  const meter = telemetryClient.getMeter(name);
29
- this.sentGoodbyes = meter.createUpDownCounter(Metrics.PEER_MANAGER_GOODBYES_SENT, {
30
- description: 'Number of goodbyes sent to peers',
31
- unit: 'peers',
32
- valueType: ValueType.INT,
33
- });
34
- this.receivedGoodbyes = meter.createUpDownCounter(Metrics.PEER_MANAGER_GOODBYES_RECEIVED, {
35
- description: 'Number of goodbyes received from peers',
36
- unit: 'peers',
37
- valueType: ValueType.INT,
38
- });
39
- this.peerCount = meter.createGauge(Metrics.PEER_MANAGER_PEER_COUNT, {
40
- description: 'Number of peers',
41
- unit: 'peers',
42
- valueType: ValueType.INT,
43
- });
44
- this.lowScoreDisconnects = meter.createUpDownCounter(Metrics.PEER_MANAGER_LOW_SCORE_DISCONNECTS, {
45
- description: 'Number of peers disconnected due to low score',
46
- unit: 'peers',
47
- valueType: ValueType.INT,
36
+ const goodbyeReasonAttrs = {
37
+ [Attributes.P2P_GOODBYE_REASON]: [
38
+ prettyGoodbyeReason(GoodByeReason.SHUTDOWN),
39
+ prettyGoodbyeReason(GoodByeReason.MAX_PEERS),
40
+ prettyGoodbyeReason(GoodByeReason.LOW_SCORE),
41
+ prettyGoodbyeReason(GoodByeReason.BANNED),
42
+ prettyGoodbyeReason(GoodByeReason.WRONG_NETWORK),
43
+ prettyGoodbyeReason(GoodByeReason.UNKNOWN),
44
+ ],
45
+ };
46
+ this.sentGoodbyes = createUpDownCounterWithDefault(meter, Metrics.PEER_MANAGER_GOODBYES_SENT, goodbyeReasonAttrs);
47
+ this.receivedGoodbyes = createUpDownCounterWithDefault(
48
+ meter,
49
+ Metrics.PEER_MANAGER_GOODBYES_RECEIVED,
50
+ goodbyeReasonAttrs,
51
+ );
52
+ this.peerCount = meter.createGauge(Metrics.PEER_MANAGER_PEER_COUNT);
53
+ this.healthyPeerCount = meter.createGauge(Metrics.PEER_MANAGER_HEALTHY_PEER_COUNT);
54
+ this.lowScoreDisconnects = createUpDownCounterWithDefault(meter, Metrics.PEER_MANAGER_LOW_SCORE_DISCONNECTS, {
55
+ [Attributes.P2P_PEER_SCORE_STATE]: ['Banned', 'Disconnect'],
48
56
  });
57
+ this.peerConnectionDuration = meter.createHistogram(Metrics.PEER_MANAGER_PEER_CONNECTION_DURATION);
49
58
  }
50
59
 
51
60
  public recordGoodbyeSent(reason: GoodByeReason) {
@@ -60,7 +69,23 @@ export class PeerManagerMetrics {
60
69
  this.peerCount.record(count);
61
70
  }
62
71
 
72
+ public recordHealthyPeerCount(count: number) {
73
+ this.healthyPeerCount.record(count);
74
+ }
75
+
63
76
  public recordLowScoreDisconnect(scoreState: 'Banned' | 'Disconnect') {
64
77
  this.lowScoreDisconnects.add(1, { [Attributes.P2P_PEER_SCORE_STATE]: scoreState });
65
78
  }
79
+
80
+ public peerConnected(id: PeerId) {
81
+ this.peerConnectedAt.set(id.toString(), Date.now());
82
+ }
83
+
84
+ public peerDisconnected(id: PeerId) {
85
+ const connectedAt = this.peerConnectedAt.get(id.toString());
86
+ if (connectedAt) {
87
+ this.peerConnectionDuration.record(Date.now() - connectedAt);
88
+ this.peerConnectedAt.delete(id.toString());
89
+ }
90
+ }
66
91
  }
@@ -1,13 +1,13 @@
1
1
  import type { EpochCacheInterface } from '@aztec/epoch-cache';
2
- import { makeEthSignDigest, tryRecoverAddress } from '@aztec/foundation/crypto';
2
+ import { makeEthSignDigest, tryRecoverAddress } from '@aztec/foundation/crypto/secp256k1-signer';
3
+ import { Fr } from '@aztec/foundation/curves/bn254';
3
4
  import type { EthAddress } from '@aztec/foundation/eth-address';
4
- import { Fr } from '@aztec/foundation/fields';
5
5
  import { createLogger } from '@aztec/foundation/log';
6
6
  import { bufferToHex } from '@aztec/foundation/string';
7
7
  import { DateProvider } from '@aztec/foundation/timer';
8
8
  import type { PeerInfo, WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
9
9
  import type { PeerErrorSeverity } from '@aztec/stdlib/p2p';
10
- import { type TelemetryClient, trackSpan } from '@aztec/telemetry-client';
10
+ import type { TelemetryClient } from '@aztec/telemetry-client';
11
11
 
12
12
  import type { Connection, PeerId } from '@libp2p/interface';
13
13
  import { peerIdFromString } from '@libp2p/peer-id';
@@ -32,7 +32,7 @@ import { PeerScoreState, type PeerScoring } from './peer_scoring.js';
32
32
  const MAX_DIAL_ATTEMPTS = 3;
33
33
  const MAX_CACHED_PEERS = 100;
34
34
  const MAX_CACHED_PEER_AGE_MS = 5 * 60 * 1000; // 5 minutes
35
- const FAILED_PEER_BAN_TIME_MS = 5 * 60 * 1000; // 5 minutes timeout after failing MAX_DIAL_ATTEMPTS
35
+ const DEFAULT_FAILED_PEER_BAN_TIME_MS = 5 * 60 * 1000; // 5 minutes timeout after failing MAX_DIAL_ATTEMPTS
36
36
  const GOODBYE_DIAL_TIMEOUT_MS = 1000;
37
37
  const FAILED_AUTH_HANDSHAKE_EXPIRY_MS = 60 * 60 * 1000; // 1 hour
38
38
 
@@ -161,7 +161,6 @@ export class PeerManager implements PeerManagerInterface {
161
161
  return this.metrics.tracer;
162
162
  }
163
163
 
164
- @trackSpan('PeerManager.heartbeat')
165
164
  public async heartbeat() {
166
165
  this.heartbeatCounter++;
167
166
  this.peerScoring.decayAllScores();
@@ -227,20 +226,30 @@ export class PeerManager implements PeerManagerInterface {
227
226
  }
228
227
 
229
228
  /**
230
- * Cleans up expired timeouts.
229
+ * Cleans up expired timeouts and stale failed-auth-handshake entries.
231
230
  *
232
231
  * When peers fail to dial after a number of retries, they are temporarily timed out.
233
232
  * This function removes any peers that have been in the timed out state for too long.
234
233
  * To give them a chance to reconnect.
234
+ *
235
+ * Also evicts entries from the failed-auth-handshake map whose expiry window has passed.
236
+ * Without this, peers that probe once and never reconnect would leave their entries in the
237
+ * map forever, causing an unbounded memory leak.
235
238
  */
236
239
  private cleanupExpiredTimeouts() {
237
- // Clean up expired timeouts
238
240
  const now = this.dateProvider.now();
241
+
239
242
  for (const [peerId, timedOutPeer] of this.timedOutPeers.entries()) {
240
243
  if (now >= timedOutPeer.timeoutUntilMs) {
241
244
  this.timedOutPeers.delete(peerId);
242
245
  }
243
246
  }
247
+
248
+ for (const [id, entry] of this.failedAuthHandshakes.entries()) {
249
+ if (now - entry.lastFailureTimestamp > FAILED_AUTH_HANDSHAKE_EXPIRY_MS) {
250
+ this.failedAuthHandshakes.delete(id);
251
+ }
252
+ }
244
253
  }
245
254
 
246
255
  /**
@@ -278,6 +287,7 @@ export class PeerManager implements PeerManagerInterface {
278
287
  private handleConnectedPeerEvent(e: CustomEvent<PeerId>) {
279
288
  const peerId = e.detail;
280
289
  this.logger.verbose(`Connected to peer ${peerId.toString()}`);
290
+ this.metrics.peerConnected(peerId);
281
291
  if (this.config.p2pDisableStatusHandshake) {
282
292
  return;
283
293
  }
@@ -303,14 +313,20 @@ export class PeerManager implements PeerManagerInterface {
303
313
  */
304
314
  private handleDisconnectedPeerEvent(e: CustomEvent<PeerId>) {
305
315
  const peerId = e.detail;
306
- this.logger.verbose(`Disconnected from peer ${peerId.toString()}`);
307
- const validatorAddress = this.authenticatedPeerIdToValidatorAddress.get(peerId.toString());
316
+ const peerIdStr = peerId.toString();
317
+ this.metrics.peerDisconnected(peerId);
318
+ this.logger.verbose(`Disconnected from peer ${peerIdStr}`);
319
+ const validatorAddress = this.authenticatedPeerIdToValidatorAddress.get(peerIdStr);
308
320
  if (validatorAddress !== undefined) {
309
321
  this.logger.info(
310
- `Removing authentication for validator ${validatorAddress} at peer id ${peerId.toString()} due to disconnection`,
322
+ `Removing authentication for validator ${validatorAddress} at peer id ${peerIdStr} due to disconnection`,
311
323
  );
312
324
  this.authenticatedValidatorAddressToPeerId.delete(validatorAddress.toString());
313
- this.authenticatedPeerIdToValidatorAddress.delete(peerId.toString());
325
+ this.authenticatedPeerIdToValidatorAddress.delete(peerIdStr);
326
+ }
327
+
328
+ if (this.peerScoring.getScoreState(peerIdStr) === PeerScoreState.Healthy) {
329
+ this.peerScoring.removePeer(peerIdStr);
314
330
  }
315
331
  }
316
332
 
@@ -514,7 +530,8 @@ export class PeerManager implements PeerManagerInterface {
514
530
  ...this.peerScoring.getStats(),
515
531
  });
516
532
 
517
- this.metrics.recordPeerCount(healthyConnections.length);
533
+ this.metrics.recordPeerCount(connections.length);
534
+ this.metrics.recordHealthyPeerCount(healthyConnections.length);
518
535
 
519
536
  // Exit if no peers to connect
520
537
  if (peersToConnect <= 0) {
@@ -711,6 +728,12 @@ export class PeerManager implements PeerManagerInterface {
711
728
  return;
712
729
  }
713
730
 
731
+ // Don't dial peers that have exceeded the auth failure threshold
732
+ if (!this.isNodeAllowedToConnect(peerId)) {
733
+ this.logger.trace(`Skipping peer ${peerId} due to failed auth handshake attempts`);
734
+ return;
735
+ }
736
+
714
737
  const [multiaddrTcp] = await Promise.all([enr.getFullMultiaddr('tcp')]);
715
738
 
716
739
  this.logger.trace(`Handling discovered peer ${peerId} at ${multiaddrTcp?.toString() ?? 'undefined address'}`);
@@ -774,7 +797,8 @@ export class PeerManager implements PeerManagerInterface {
774
797
  // Add to timed out peers
775
798
  this.timedOutPeers.set(id, {
776
799
  peerId: id,
777
- timeoutUntilMs: this.dateProvider.now() + FAILED_PEER_BAN_TIME_MS,
800
+ timeoutUntilMs:
801
+ this.dateProvider.now() + (this.config.peerFailedBanTimeMs ?? DEFAULT_FAILED_PEER_BAN_TIME_MS),
778
802
  });
779
803
  }
780
804
  }
@@ -936,6 +960,8 @@ export class PeerManager implements PeerManagerInterface {
936
960
  `Received auth for validator ${sender.toString()} from peer ${peerIdString}, but this validator is already authenticated to peer ${peerForAddress.toString()}`,
937
961
  { ...logData, address: sender.toString() },
938
962
  );
963
+ this.markAuthHandshakeFailed(peerId);
964
+ this.markPeerForDisconnect(peerId);
939
965
  return;
940
966
  }
941
967
 
@@ -965,14 +991,14 @@ export class PeerManager implements PeerManagerInterface {
965
991
  const peerIdStr = peerId.toString();
966
992
 
967
993
  const existingEntry = this.failedAuthHandshakes.get(peerIdStr);
994
+ const failureCount = (existingEntry?.count || 0) + 1;
968
995
  this.failedAuthHandshakes.set(peerIdStr, {
969
- count: (existingEntry?.count || 0) + 1,
996
+ count: failureCount,
970
997
  lastFailureTimestamp: now,
971
998
  });
972
999
 
973
1000
  const connections = this.libP2PNode.getConnections(peerId);
974
1001
  connections.forEach(conn => {
975
- // We mark the IP address
976
1002
  const address = conn.remoteAddr.nodeAddress().address;
977
1003
  const existingAddressEntry = this.failedAuthHandshakes.get(address);
978
1004
  this.failedAuthHandshakes.set(address, {
@@ -980,6 +1006,15 @@ export class PeerManager implements PeerManagerInterface {
980
1006
  lastFailureTimestamp: now,
981
1007
  });
982
1008
  });
1009
+
1010
+ // Ban the peer from being re-dialed for a cooldown period (exponential backoff)
1011
+ const banTimeMs = this.config.peerFailedBanTimeMs ?? DEFAULT_FAILED_PEER_BAN_TIME_MS;
1012
+ const backoffMs = banTimeMs * Math.pow(2, Math.min(failureCount - 1, 5));
1013
+ this.timedOutPeers.set(peerIdStr, {
1014
+ peerId: peerIdStr,
1015
+ timeoutUntilMs: now + backoffMs,
1016
+ });
1017
+ this.cachedPeers.delete(peerIdStr);
983
1018
  }
984
1019
 
985
1020
  /*
@@ -1,12 +1,13 @@
1
1
  import { median } from '@aztec/foundation/collection';
2
2
  import { createLogger } from '@aztec/foundation/log';
3
+ import { DateProvider } from '@aztec/foundation/timer';
3
4
  import { PeerErrorSeverity } from '@aztec/stdlib/p2p';
4
5
  import {
5
6
  Attributes,
6
7
  Metrics,
7
8
  type TelemetryClient,
8
9
  type UpDownCounter,
9
- ValueType,
10
+ createUpDownCounterWithDefault,
10
11
  getTelemetryClient,
11
12
  } from '@aztec/telemetry-client';
12
13
 
@@ -14,6 +15,21 @@ import type { PeerId } from '@libp2p/interface';
14
15
 
15
16
  import type { P2PConfig } from '../../config.js';
16
17
 
18
+ /**
19
+ * Application-level peer penalties.
20
+ *
21
+ * These scores are multiplied by appSpecificWeight (10) when contributing to gossipsub score.
22
+ * The values are designed to align with gossipsub thresholds:
23
+ *
24
+ * - LowToleranceError (50): 1 error → app score -50 → gossipsub -500 → gossipThreshold
25
+ * - MidToleranceError (10): 5 errors → app score -50 → gossipsub -500 → gossipThreshold
26
+ * - HighToleranceError (2): 25 errors → app score -50 → gossipsub -500 → gossipThreshold
27
+ *
28
+ * Examples of each severity:
29
+ * - LowToleranceError: Invalid messages, deserialization errors, manipulation attempts
30
+ * - MidToleranceError: Hash mismatches, protocol violations
31
+ * - HighToleranceError: Rate limit exceeded, failed responses, transient errors
32
+ */
17
33
  const DefaultPeerPenalties = {
18
34
  [PeerErrorSeverity.LowToleranceError]: 50,
19
35
  [PeerErrorSeverity.MidToleranceError]: 10,
@@ -26,9 +42,20 @@ export enum PeerScoreState {
26
42
  Healthy,
27
43
  }
28
44
 
45
+ /**
46
+ * Score thresholds for peer states.
47
+ *
48
+ * These values align with gossipsub thresholds when multiplied by appSpecificWeight (10):
49
+ * - MIN_SCORE_BEFORE_DISCONNECT (-50) × 10 = -500 = gossipThreshold
50
+ * - MIN_SCORE_BEFORE_BAN (-100) × 10 = -1000 = publishThreshold
51
+ *
52
+ * This ensures that when a peer is disconnected at the application level,
53
+ * they also stop receiving gossip, and when banned, they cannot publish.
54
+ */
29
55
  // TODO: move into config / constants
30
56
  const MIN_SCORE_BEFORE_BAN = -100;
31
57
  const MIN_SCORE_BEFORE_DISCONNECT = -50;
58
+ const SCORE_CLEANUP_THRESHOLD = 0.1;
32
59
 
33
60
  export class PeerScoring {
34
61
  private logger = createLogger('p2p:peer-scoring');
@@ -40,7 +67,11 @@ export class PeerScoring {
40
67
 
41
68
  private peerStateCounter: UpDownCounter;
42
69
 
43
- constructor(config: P2PConfig, telemetry: TelemetryClient = getTelemetryClient()) {
70
+ constructor(
71
+ config: P2PConfig,
72
+ telemetry: TelemetryClient = getTelemetryClient(),
73
+ private readonly dateProvider: DateProvider = new DateProvider(),
74
+ ) {
44
75
  const orderedValues = config.peerPenaltyValues?.sort((a, b) => a - b);
45
76
  this.peerPenalties = {
46
77
  [PeerErrorSeverity.HighToleranceError]:
@@ -53,9 +84,8 @@ export class PeerScoring {
53
84
 
54
85
  const meter = telemetry.getMeter('PeerScoring');
55
86
 
56
- this.peerStateCounter = meter.createUpDownCounter(Metrics.P2P_PEER_STATE_COUNT, {
57
- description: 'Count of peers by state (Healthy, Disconnect, Banned)',
58
- valueType: ValueType.INT,
87
+ this.peerStateCounter = createUpDownCounterWithDefault(meter, Metrics.P2P_PEER_STATE_COUNT, {
88
+ [Attributes.P2P_PEER_SCORE_STATE]: ['Healthy', 'Disconnect', 'Banned'],
59
89
  });
60
90
  }
61
91
 
@@ -68,7 +98,7 @@ export class PeerScoring {
68
98
  }
69
99
 
70
100
  updateScore(peerId: string, scoreDelta: number): number {
71
- const currentTime = Date.now();
101
+ const currentTime = this.dateProvider.now();
72
102
  const lastUpdate = this.lastUpdateTime.get(peerId) || currentTime;
73
103
  const timePassed = currentTime - lastUpdate;
74
104
  const decayPeriods = Math.floor(timePassed / this.decayInterval);
@@ -87,19 +117,35 @@ export class PeerScoring {
87
117
  }
88
118
 
89
119
  decayAllScores(): void {
90
- const currentTime = Date.now();
120
+ const currentTime = this.dateProvider.now();
91
121
  for (const [peerId, lastUpdate] of this.lastUpdateTime.entries()) {
92
122
  const timePassed = currentTime - lastUpdate;
93
123
  const decayPeriods = Math.floor(timePassed / this.decayInterval);
94
124
  if (decayPeriods > 0) {
95
125
  let score = this.scores.get(peerId) || 0;
96
126
  score *= Math.pow(this.decayFactor, decayPeriods);
97
- this.scores.set(peerId, score);
98
- this.lastUpdateTime.set(peerId, currentTime);
127
+ if (Math.abs(score) < SCORE_CLEANUP_THRESHOLD) {
128
+ this.scores.delete(peerId);
129
+ this.lastUpdateTime.delete(peerId);
130
+ } else {
131
+ this.scores.set(peerId, score);
132
+ this.lastUpdateTime.set(peerId, currentTime);
133
+ }
99
134
  }
100
135
  }
101
136
  }
102
137
 
138
+ /** Resets all peer scores. Useful for benchmarks to prevent cross-case contamination. */
139
+ resetAllScores(): void {
140
+ this.scores.clear();
141
+ this.lastUpdateTime.clear();
142
+ }
143
+
144
+ removePeer(peerId: string): void {
145
+ this.scores.delete(peerId);
146
+ this.lastUpdateTime.delete(peerId);
147
+ }
148
+
103
149
  getScore(peerId: string): number {
104
150
  return this.scores.get(peerId) || 0;
105
151
  }
@@ -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
+