@aztec/p2p 0.0.1-commit.3469e52 → 0.0.1-commit.350e0a4d

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 (570) hide show
  1. package/README.md +130 -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 +26 -10
  5. package/dest/client/factory.d.ts +13 -12
  6. package/dest/client/factory.d.ts.map +1 -1
  7. package/dest/client/factory.js +70 -20
  8. package/dest/client/interface.d.ts +90 -40
  9. package/dest/client/interface.d.ts.map +1 -1
  10. package/dest/client/p2p_client.d.ts +69 -64
  11. package/dest/client/p2p_client.d.ts.map +1 -1
  12. package/dest/client/p2p_client.js +247 -244
  13. package/dest/config.d.ts +169 -84
  14. package/dest/config.d.ts.map +1 -1
  15. package/dest/config.js +159 -45
  16. package/dest/errors/p2p-service.error.d.ts +9 -0
  17. package/dest/errors/p2p-service.error.d.ts.map +1 -0
  18. package/dest/errors/p2p-service.error.js +10 -0
  19. package/dest/errors/reqresp.error.d.ts +9 -16
  20. package/dest/errors/reqresp.error.d.ts.map +1 -1
  21. package/dest/errors/reqresp.error.js +10 -17
  22. package/dest/errors/tx-pool.error.d.ts +8 -0
  23. package/dest/errors/tx-pool.error.d.ts.map +1 -0
  24. package/dest/errors/tx-pool.error.js +9 -0
  25. package/dest/index.d.ts +2 -2
  26. package/dest/index.d.ts.map +1 -1
  27. package/dest/index.js +1 -1
  28. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +164 -106
  29. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  30. package/dest/mem_pools/attestation_pool/attestation_pool.js +518 -3
  31. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +2 -2
  32. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
  33. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +550 -125
  34. package/dest/mem_pools/attestation_pool/index.d.ts +2 -3
  35. package/dest/mem_pools/attestation_pool/index.d.ts.map +1 -1
  36. package/dest/mem_pools/attestation_pool/index.js +1 -2
  37. package/dest/mem_pools/attestation_pool/mocks.d.ts +2 -2
  38. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  39. package/dest/mem_pools/attestation_pool/mocks.js +7 -5
  40. package/dest/mem_pools/index.d.ts +3 -3
  41. package/dest/mem_pools/index.d.ts.map +1 -1
  42. package/dest/mem_pools/index.js +1 -1
  43. package/dest/mem_pools/instrumentation.d.ts +12 -5
  44. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  45. package/dest/mem_pools/instrumentation.js +40 -19
  46. package/dest/mem_pools/interface.d.ts +5 -5
  47. package/dest/mem_pools/interface.d.ts.map +1 -1
  48. package/dest/mem_pools/tx_pool_v2/archive/index.d.ts +2 -0
  49. package/dest/mem_pools/tx_pool_v2/archive/index.d.ts.map +1 -0
  50. package/dest/mem_pools/tx_pool_v2/archive/index.js +1 -0
  51. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts +39 -0
  52. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts.map +1 -0
  53. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.js +97 -0
  54. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +104 -0
  55. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -0
  56. package/dest/mem_pools/tx_pool_v2/deleted_pool.js +251 -0
  57. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts +47 -0
  58. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts.map +1 -0
  59. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.js +128 -0
  60. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +17 -0
  61. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -0
  62. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +94 -0
  63. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +19 -0
  64. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -0
  65. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +97 -0
  66. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +11 -0
  67. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -0
  68. package/dest/mem_pools/tx_pool_v2/eviction/index.js +12 -0
  69. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts +16 -0
  70. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts.map +1 -0
  71. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.js +62 -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 → tx_pool_v2}/eviction/invalid_txs_after_mining_rule.js +16 -35
  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 +243 -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 +11 -0
  99. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +137 -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 +223 -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 +122 -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 +368 -0
  108. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +68 -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 +178 -0
  111. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +91 -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 +1013 -0
  114. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +11 -4
  115. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  116. package/dest/msg_validators/attestation_validator/attestation_validator.js +67 -13
  117. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +9 -5
  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 +22 -11
  120. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +12 -5
  121. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
  122. package/dest/msg_validators/proposal_validator/block_proposal_validator.js +11 -3
  123. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +12 -5
  124. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
  125. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +23 -3
  126. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +36 -9
  127. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
  128. package/dest/msg_validators/proposal_validator/proposal_validator.js +156 -43
  129. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +4 -4
  130. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  131. package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +11 -18
  132. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +2 -1
  133. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -1
  134. package/dest/msg_validators/tx_validator/allowed_public_setup.js +25 -21
  135. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts +17 -0
  136. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts.map +1 -0
  137. package/dest/msg_validators/tx_validator/allowed_setup_helpers.js +24 -0
  138. package/dest/msg_validators/tx_validator/archive_cache.d.ts +3 -3
  139. package/dest/msg_validators/tx_validator/archive_cache.d.ts.map +1 -1
  140. package/dest/msg_validators/tx_validator/block_header_validator.d.ts +20 -6
  141. package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
  142. package/dest/msg_validators/tx_validator/block_header_validator.js +4 -3
  143. package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts +15 -0
  144. package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts.map +1 -0
  145. package/dest/msg_validators/tx_validator/cached_tx_validator.js +19 -0
  146. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts +9 -0
  147. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts.map +1 -0
  148. package/dest/msg_validators/tx_validator/contract_instance_validator.js +48 -0
  149. package/dest/msg_validators/tx_validator/data_validator.d.ts +4 -1
  150. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  151. package/dest/msg_validators/tx_validator/data_validator.js +40 -3
  152. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +15 -4
  153. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
  154. package/dest/msg_validators/tx_validator/double_spend_validator.js +7 -6
  155. package/dest/msg_validators/tx_validator/factory.d.ts +136 -5
  156. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  157. package/dest/msg_validators/tx_validator/factory.js +268 -58
  158. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +1 -1
  159. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -1
  160. package/dest/msg_validators/tx_validator/fee_payer_balance.js +6 -2
  161. package/dest/msg_validators/tx_validator/gas_validator.d.ts +105 -3
  162. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  163. package/dest/msg_validators/tx_validator/gas_validator.js +138 -53
  164. package/dest/msg_validators/tx_validator/index.d.ts +5 -1
  165. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  166. package/dest/msg_validators/tx_validator/index.js +4 -0
  167. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +3 -2
  168. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  169. package/dest/msg_validators/tx_validator/metadata_validator.js +6 -6
  170. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts +14 -0
  171. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts.map +1 -0
  172. package/dest/msg_validators/tx_validator/nullifier_cache.js +24 -0
  173. package/dest/msg_validators/tx_validator/phases_validator.d.ts +24 -3
  174. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
  175. package/dest/msg_validators/tx_validator/phases_validator.js +75 -27
  176. package/dest/msg_validators/tx_validator/size_validator.d.ts +3 -1
  177. package/dest/msg_validators/tx_validator/size_validator.d.ts.map +1 -1
  178. package/dest/msg_validators/tx_validator/size_validator.js +4 -1
  179. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +22 -5
  180. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
  181. package/dest/msg_validators/tx_validator/timestamp_validator.js +8 -8
  182. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts +3 -2
  183. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts.map +1 -1
  184. package/dest/msg_validators/tx_validator/tx_permitted_validator.js +2 -2
  185. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +4 -2
  186. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
  187. package/dest/msg_validators/tx_validator/tx_proof_validator.js +4 -2
  188. package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts +48 -0
  189. package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts.map +1 -0
  190. package/dest/msg_validators/tx_validator/tx_validation_cache.js +68 -0
  191. package/dest/services/data_store.d.ts +1 -1
  192. package/dest/services/data_store.d.ts.map +1 -1
  193. package/dest/services/data_store.js +14 -10
  194. package/dest/services/discv5/discV5_service.d.ts +13 -2
  195. package/dest/services/discv5/discV5_service.d.ts.map +1 -1
  196. package/dest/services/discv5/discV5_service.js +120 -24
  197. package/dest/services/discv5/persisted_enr_store.d.ts +38 -0
  198. package/dest/services/discv5/persisted_enr_store.d.ts.map +1 -0
  199. package/dest/services/discv5/persisted_enr_store.js +145 -0
  200. package/dest/services/dummy_service.d.ts +37 -17
  201. package/dest/services/dummy_service.d.ts.map +1 -1
  202. package/dest/services/dummy_service.js +59 -15
  203. package/dest/services/encoding.d.ts +24 -7
  204. package/dest/services/encoding.d.ts.map +1 -1
  205. package/dest/services/encoding.js +43 -26
  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 +167 -0
  213. package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -0
  214. package/dest/services/gossipsub/topic_score_params.js +336 -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 +28 -3
  221. package/dest/services/libp2p/libp2p_service.d.ts +116 -60
  222. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  223. package/dest/services/libp2p/libp2p_service.js +800 -586
  224. package/dest/services/peer-manager/metrics.d.ts +4 -2
  225. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  226. package/dest/services/peer-manager/metrics.js +26 -5
  227. package/dest/services/peer-manager/peer_manager.d.ts +20 -3
  228. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  229. package/dest/services/peer-manager/peer_manager.js +83 -26
  230. package/dest/services/peer-manager/peer_scoring.d.ts +34 -2
  231. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  232. package/dest/services/peer-manager/peer_scoring.js +135 -17
  233. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +44 -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 +534 -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 +50 -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 +11 -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 +7 -0
  251. package/dest/services/reqresp/config.d.ts +15 -3
  252. package/dest/services/reqresp/config.d.ts.map +1 -1
  253. package/dest/services/reqresp/config.js +11 -0
  254. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +2 -1
  255. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -1
  256. package/dest/services/reqresp/connection-sampler/connection_sampler.js +12 -0
  257. package/dest/services/reqresp/interface.d.ts +27 -18
  258. package/dest/services/reqresp/interface.d.ts.map +1 -1
  259. package/dest/services/reqresp/interface.js +23 -19
  260. package/dest/services/reqresp/metrics.d.ts +6 -5
  261. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  262. package/dest/services/reqresp/metrics.js +16 -5
  263. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +8 -3
  264. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -1
  265. package/dest/services/reqresp/protocols/block_txs/bitvector.js +8 -2
  266. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +7 -5
  267. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
  268. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +35 -14
  269. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +36 -8
  270. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
  271. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +84 -20
  272. package/dest/services/reqresp/protocols/index.d.ts +1 -2
  273. package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
  274. package/dest/services/reqresp/protocols/index.js +0 -1
  275. package/dest/services/reqresp/protocols/tx.d.ts +7 -1
  276. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  277. package/dest/services/reqresp/protocols/tx.js +21 -3
  278. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +5 -4
  279. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
  280. package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -8
  281. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
  282. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
  283. package/dest/services/reqresp/rate-limiter/rate_limits.js +3 -13
  284. package/dest/services/reqresp/reqresp.d.ts +12 -29
  285. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  286. package/dest/services/reqresp/reqresp.js +90 -188
  287. package/dest/services/service.d.ts +65 -13
  288. package/dest/services/service.d.ts.map +1 -1
  289. package/dest/services/tx_collection/config.d.ts +11 -11
  290. package/dest/services/tx_collection/config.d.ts.map +1 -1
  291. package/dest/services/tx_collection/config.js +27 -26
  292. package/dest/services/tx_collection/file_store_tx_collection.d.ts +37 -0
  293. package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -0
  294. package/dest/services/tx_collection/file_store_tx_collection.js +127 -0
  295. package/dest/services/tx_collection/file_store_tx_source.d.ts +38 -0
  296. package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -0
  297. package/dest/services/tx_collection/file_store_tx_source.js +100 -0
  298. package/dest/services/tx_collection/index.d.ts +3 -2
  299. package/dest/services/tx_collection/index.d.ts.map +1 -1
  300. package/dest/services/tx_collection/index.js +1 -0
  301. package/dest/services/tx_collection/instrumentation.d.ts +1 -1
  302. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
  303. package/dest/services/tx_collection/instrumentation.js +8 -2
  304. package/dest/services/tx_collection/request_tracker.d.ts +53 -0
  305. package/dest/services/tx_collection/request_tracker.d.ts.map +1 -0
  306. package/dest/services/tx_collection/request_tracker.js +84 -0
  307. package/dest/services/tx_collection/tx_collection.d.ts +50 -56
  308. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  309. package/dest/services/tx_collection/tx_collection.js +298 -70
  310. package/dest/services/tx_collection/tx_collection_sink.d.ts +19 -9
  311. package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -1
  312. package/dest/services/tx_collection/tx_collection_sink.js +28 -31
  313. package/dest/services/tx_collection/tx_source.d.ts +13 -7
  314. package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
  315. package/dest/services/tx_collection/tx_source.js +29 -7
  316. package/dest/services/tx_file_store/config.d.ts +16 -0
  317. package/dest/services/tx_file_store/config.d.ts.map +1 -0
  318. package/dest/services/tx_file_store/config.js +22 -0
  319. package/dest/services/tx_file_store/index.d.ts +4 -0
  320. package/dest/services/tx_file_store/index.d.ts.map +1 -0
  321. package/dest/services/tx_file_store/index.js +3 -0
  322. package/dest/services/tx_file_store/instrumentation.d.ts +15 -0
  323. package/dest/services/tx_file_store/instrumentation.d.ts.map +1 -0
  324. package/dest/services/tx_file_store/instrumentation.js +29 -0
  325. package/dest/services/tx_file_store/tx_file_store.d.ts +46 -0
  326. package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -0
  327. package/dest/services/tx_file_store/tx_file_store.js +142 -0
  328. package/dest/services/tx_provider.d.ts +8 -6
  329. package/dest/services/tx_provider.d.ts.map +1 -1
  330. package/dest/services/tx_provider.js +12 -8
  331. package/dest/services/tx_provider_instrumentation.d.ts +1 -1
  332. package/dest/services/tx_provider_instrumentation.d.ts.map +1 -1
  333. package/dest/services/tx_provider_instrumentation.js +5 -5
  334. package/dest/test-helpers/index.d.ts +3 -1
  335. package/dest/test-helpers/index.d.ts.map +1 -1
  336. package/dest/test-helpers/index.js +2 -0
  337. package/dest/test-helpers/make-test-p2p-clients.d.ts +7 -8
  338. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  339. package/dest/test-helpers/make-test-p2p-clients.js +5 -3
  340. package/dest/test-helpers/mock-pubsub.d.ts +46 -6
  341. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  342. package/dest/test-helpers/mock-pubsub.js +115 -14
  343. package/dest/test-helpers/reqresp-nodes.d.ts +5 -7
  344. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  345. package/dest/test-helpers/reqresp-nodes.js +19 -20
  346. package/dest/test-helpers/test_tx_provider.d.ts +42 -0
  347. package/dest/test-helpers/test_tx_provider.d.ts.map +1 -0
  348. package/dest/test-helpers/test_tx_provider.js +44 -0
  349. package/dest/test-helpers/testbench-utils.d.ts +164 -0
  350. package/dest/test-helpers/testbench-utils.d.ts.map +1 -0
  351. package/dest/test-helpers/testbench-utils.js +400 -0
  352. package/dest/testbench/p2p_client_testbench_worker.d.ts +26 -2
  353. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  354. package/dest/testbench/p2p_client_testbench_worker.js +284 -139
  355. package/dest/testbench/worker_client_manager.d.ts +57 -6
  356. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  357. package/dest/testbench/worker_client_manager.js +277 -49
  358. package/dest/util.d.ts +13 -8
  359. package/dest/util.d.ts.map +1 -1
  360. package/dest/util.js +35 -14
  361. package/dest/versioning.d.ts +3 -6
  362. package/dest/versioning.d.ts.map +1 -1
  363. package/dest/versioning.js +3 -24
  364. package/package.json +16 -16
  365. package/src/bootstrap/bootstrap.ts +24 -7
  366. package/src/client/factory.ts +139 -39
  367. package/src/client/interface.ts +97 -48
  368. package/src/client/p2p_client.ts +291 -312
  369. package/src/client/test/p2p_client.batch_tx_requester.bench.README.md +197 -0
  370. package/src/config.ts +287 -49
  371. package/src/errors/p2p-service.error.ts +11 -0
  372. package/src/errors/reqresp.error.ts +13 -19
  373. package/src/errors/tx-pool.error.ts +12 -0
  374. package/src/index.ts +1 -1
  375. package/src/mem_pools/attestation_pool/attestation_pool.ts +585 -94
  376. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +656 -141
  377. package/src/mem_pools/attestation_pool/index.ts +9 -2
  378. package/src/mem_pools/attestation_pool/mocks.ts +14 -8
  379. package/src/mem_pools/index.ts +2 -2
  380. package/src/mem_pools/instrumentation.ts +29 -18
  381. package/src/mem_pools/interface.ts +4 -4
  382. package/src/mem_pools/tx_pool_v2/README.md +283 -0
  383. package/src/mem_pools/tx_pool_v2/archive/index.ts +1 -0
  384. package/src/mem_pools/tx_pool_v2/archive/tx_archive.ts +112 -0
  385. package/src/mem_pools/tx_pool_v2/deleted_pool.ts +321 -0
  386. package/src/mem_pools/tx_pool_v2/eviction/eviction_manager.ts +160 -0
  387. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +122 -0
  388. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +125 -0
  389. package/src/mem_pools/tx_pool_v2/eviction/index.ts +28 -0
  390. package/src/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.ts +65 -0
  391. package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +219 -0
  392. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +74 -0
  393. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +101 -0
  394. package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +91 -0
  395. package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +99 -0
  396. package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +32 -0
  397. package/src/mem_pools/tx_pool_v2/index.ts +12 -0
  398. package/src/mem_pools/tx_pool_v2/instrumentation.ts +69 -0
  399. package/src/mem_pools/tx_pool_v2/interfaces.ts +274 -0
  400. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +349 -0
  401. package/src/mem_pools/tx_pool_v2/tx_pool_bench_metrics.ts +77 -0
  402. package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +465 -0
  403. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +252 -0
  404. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +1215 -0
  405. package/src/msg_validators/attestation_validator/README.md +49 -0
  406. package/src/msg_validators/attestation_validator/attestation_validator.ts +60 -16
  407. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +30 -16
  408. package/src/msg_validators/proposal_validator/README.md +123 -0
  409. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +26 -4
  410. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +43 -7
  411. package/src/msg_validators/proposal_validator/proposal_validator.ts +163 -50
  412. package/src/msg_validators/tx_validator/README.md +129 -0
  413. package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +8 -17
  414. package/src/msg_validators/tx_validator/allowed_public_setup.ts +22 -27
  415. package/src/msg_validators/tx_validator/allowed_setup_helpers.ts +31 -0
  416. package/src/msg_validators/tx_validator/archive_cache.ts +2 -2
  417. package/src/msg_validators/tx_validator/block_header_validator.ts +21 -8
  418. package/src/msg_validators/tx_validator/cached_tx_validator.ts +31 -0
  419. package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
  420. package/src/msg_validators/tx_validator/data_validator.ts +50 -3
  421. package/src/msg_validators/tx_validator/double_spend_validator.ts +15 -9
  422. package/src/msg_validators/tx_validator/factory.ts +430 -56
  423. package/src/msg_validators/tx_validator/fee_payer_balance.ts +6 -2
  424. package/src/msg_validators/tx_validator/gas_validator.ts +198 -51
  425. package/src/msg_validators/tx_validator/index.ts +4 -0
  426. package/src/msg_validators/tx_validator/metadata_validator.ts +18 -7
  427. package/src/msg_validators/tx_validator/nullifier_cache.ts +30 -0
  428. package/src/msg_validators/tx_validator/phases_validator.ts +87 -30
  429. package/src/msg_validators/tx_validator/size_validator.ts +6 -2
  430. package/src/msg_validators/tx_validator/timestamp_validator.ts +29 -21
  431. package/src/msg_validators/tx_validator/tx_permitted_validator.ts +8 -3
  432. package/src/msg_validators/tx_validator/tx_proof_validator.ts +10 -3
  433. package/src/msg_validators/tx_validator/tx_validation_cache.ts +101 -0
  434. package/src/services/data_store.ts +14 -19
  435. package/src/services/discv5/discV5_service.ts +127 -15
  436. package/src/services/discv5/persisted_enr_store.ts +158 -0
  437. package/src/services/dummy_service.ts +77 -39
  438. package/src/services/encoding.ts +42 -26
  439. package/src/services/gossipsub/README.md +663 -0
  440. package/src/services/gossipsub/index.ts +2 -0
  441. package/src/services/gossipsub/scoring.ts +29 -5
  442. package/src/services/gossipsub/topic_score_params.ts +478 -0
  443. package/src/services/index.ts +1 -0
  444. package/src/services/libp2p/instrumentation.ts +29 -2
  445. package/src/services/libp2p/libp2p_service.ts +893 -648
  446. package/src/services/peer-manager/metrics.ts +28 -4
  447. package/src/services/peer-manager/peer_manager.ts +91 -25
  448. package/src/services/peer-manager/peer_scoring.ts +131 -9
  449. package/src/services/reqresp/README.md +194 -0
  450. package/src/services/reqresp/batch-tx-requester/README.md +344 -0
  451. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +660 -0
  452. package/src/services/reqresp/batch-tx-requester/config.ts +40 -0
  453. package/src/services/reqresp/batch-tx-requester/interface.ts +61 -0
  454. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +168 -0
  455. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +249 -0
  456. package/src/services/reqresp/batch-tx-requester/tx_validator.ts +24 -0
  457. package/src/services/reqresp/config.ts +19 -2
  458. package/src/services/reqresp/connection-sampler/connection_sampler.ts +16 -0
  459. package/src/services/reqresp/interface.ts +48 -46
  460. package/src/services/reqresp/metrics.ts +33 -9
  461. package/src/services/reqresp/protocols/block_txs/bitvector.ts +10 -2
  462. package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +44 -17
  463. package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +108 -16
  464. package/src/services/reqresp/protocols/index.ts +0 -1
  465. package/src/services/reqresp/protocols/tx.ts +23 -3
  466. package/src/services/reqresp/rate-limiter/rate_limiter.ts +13 -9
  467. package/src/services/reqresp/rate-limiter/rate_limits.ts +3 -13
  468. package/src/services/reqresp/reqresp.ts +107 -223
  469. package/src/services/service.ts +85 -29
  470. package/src/services/tx_collection/config.ts +41 -36
  471. package/src/services/tx_collection/file_store_tx_collection.ts +153 -0
  472. package/src/services/tx_collection/file_store_tx_source.ts +129 -0
  473. package/src/services/tx_collection/index.ts +2 -1
  474. package/src/services/tx_collection/instrumentation.ts +11 -2
  475. package/src/services/tx_collection/request_tracker.ts +127 -0
  476. package/src/services/tx_collection/tx_collection.ts +367 -115
  477. package/src/services/tx_collection/tx_collection_sink.ts +32 -36
  478. package/src/services/tx_collection/tx_source.ts +29 -8
  479. package/src/services/tx_file_store/config.ts +37 -0
  480. package/src/services/tx_file_store/index.ts +3 -0
  481. package/src/services/tx_file_store/instrumentation.ts +36 -0
  482. package/src/services/tx_file_store/tx_file_store.ts +163 -0
  483. package/src/services/tx_provider.ts +17 -11
  484. package/src/services/tx_provider_instrumentation.ts +11 -5
  485. package/src/test-helpers/index.ts +2 -0
  486. package/src/test-helpers/make-test-p2p-clients.ts +7 -6
  487. package/src/test-helpers/mock-pubsub.ts +137 -14
  488. package/src/test-helpers/reqresp-nodes.ts +17 -29
  489. package/src/test-helpers/test_tx_provider.ts +69 -0
  490. package/src/test-helpers/testbench-utils.ts +465 -0
  491. package/src/testbench/p2p_client_testbench_worker.ts +389 -133
  492. package/src/testbench/worker_client_manager.ts +355 -51
  493. package/src/util.ts +40 -19
  494. package/src/versioning.ts +3 -33
  495. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +0 -40
  496. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +0 -1
  497. package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +0 -218
  498. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +0 -31
  499. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +0 -1
  500. package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +0 -180
  501. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +0 -125
  502. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +0 -1
  503. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +0 -596
  504. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +0 -31
  505. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +0 -1
  506. package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +0 -112
  507. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +0 -156
  508. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +0 -1
  509. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +0 -52
  510. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +0 -16
  511. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +0 -1
  512. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +0 -115
  513. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +0 -17
  514. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +0 -1
  515. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +0 -19
  516. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +0 -1
  517. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +0 -76
  518. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +0 -26
  519. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +0 -1
  520. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +0 -84
  521. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +0 -25
  522. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +0 -1
  523. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +0 -57
  524. package/dest/mem_pools/tx_pool/index.d.ts +0 -3
  525. package/dest/mem_pools/tx_pool/index.d.ts.map +0 -1
  526. package/dest/mem_pools/tx_pool/index.js +0 -2
  527. package/dest/mem_pools/tx_pool/priority.d.ts +0 -12
  528. package/dest/mem_pools/tx_pool/priority.d.ts.map +0 -1
  529. package/dest/mem_pools/tx_pool/priority.js +0 -15
  530. package/dest/mem_pools/tx_pool/tx_pool.d.ts +0 -127
  531. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +0 -1
  532. package/dest/mem_pools/tx_pool/tx_pool.js +0 -3
  533. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +0 -7
  534. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +0 -1
  535. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +0 -400
  536. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +0 -23
  537. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +0 -1
  538. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +0 -157
  539. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +0 -45
  540. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +0 -1
  541. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +0 -92
  542. package/dest/services/reqresp/protocols/block.d.ts +0 -9
  543. package/dest/services/reqresp/protocols/block.d.ts.map +0 -1
  544. package/dest/services/reqresp/protocols/block.js +0 -32
  545. package/dest/services/tx_collection/fast_tx_collection.d.ts +0 -51
  546. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +0 -1
  547. package/dest/services/tx_collection/fast_tx_collection.js +0 -300
  548. package/dest/services/tx_collection/slow_tx_collection.d.ts +0 -53
  549. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +0 -1
  550. package/dest/services/tx_collection/slow_tx_collection.js +0 -177
  551. package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +0 -320
  552. package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +0 -264
  553. package/src/mem_pools/tx_pool/README.md +0 -270
  554. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -746
  555. package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +0 -131
  556. package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +0 -207
  557. package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +0 -159
  558. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +0 -104
  559. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +0 -91
  560. package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +0 -106
  561. package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +0 -75
  562. package/src/mem_pools/tx_pool/index.ts +0 -2
  563. package/src/mem_pools/tx_pool/priority.ts +0 -20
  564. package/src/mem_pools/tx_pool/tx_pool.ts +0 -141
  565. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +0 -319
  566. package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +0 -191
  567. package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +0 -100
  568. package/src/services/reqresp/protocols/block.ts +0 -37
  569. package/src/services/tx_collection/fast_tx_collection.ts +0 -341
  570. package/src/services/tx_collection/slow_tx_collection.ts +0 -233
@@ -6,17 +6,19 @@ import {
6
6
  type TelemetryClient,
7
7
  type Tracer,
8
8
  type UpDownCounter,
9
+ createUpDownCounterWithDefault,
9
10
  getTelemetryClient,
10
11
  } from '@aztec/telemetry-client';
11
12
 
12
13
  import type { PeerId } from '@libp2p/interface';
13
14
 
14
- import { type GoodByeReason, prettyGoodbyeReason } from '../reqresp/protocols/index.js';
15
+ import { GoodByeReason, prettyGoodbyeReason } from '../reqresp/protocols/index.js';
15
16
 
16
17
  export class PeerManagerMetrics {
17
18
  private sentGoodbyes: UpDownCounter;
18
19
  private receivedGoodbyes: UpDownCounter;
19
20
  private peerCount: Gauge;
21
+ private healthyPeerCount: Gauge;
20
22
  private lowScoreDisconnects: UpDownCounter;
21
23
  private peerConnectionDuration: Histogram;
22
24
 
@@ -31,10 +33,27 @@ export class PeerManagerMetrics {
31
33
  this.tracer = telemetryClient.getTracer(name);
32
34
 
33
35
  const meter = telemetryClient.getMeter(name);
34
- this.sentGoodbyes = meter.createUpDownCounter(Metrics.PEER_MANAGER_GOODBYES_SENT);
35
- this.receivedGoodbyes = meter.createUpDownCounter(Metrics.PEER_MANAGER_GOODBYES_RECEIVED);
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
+ );
36
52
  this.peerCount = meter.createGauge(Metrics.PEER_MANAGER_PEER_COUNT);
37
- this.lowScoreDisconnects = meter.createUpDownCounter(Metrics.PEER_MANAGER_LOW_SCORE_DISCONNECTS);
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'],
56
+ });
38
57
  this.peerConnectionDuration = meter.createHistogram(Metrics.PEER_MANAGER_PEER_CONNECTION_DURATION);
39
58
  }
40
59
 
@@ -50,6 +69,10 @@ export class PeerManagerMetrics {
50
69
  this.peerCount.record(count);
51
70
  }
52
71
 
72
+ public recordHealthyPeerCount(count: number) {
73
+ this.healthyPeerCount.record(count);
74
+ }
75
+
53
76
  public recordLowScoreDisconnect(scoreState: 'Banned' | 'Disconnect') {
54
77
  this.lowScoreDisconnects.add(1, { [Attributes.P2P_PEER_SCORE_STATE]: scoreState });
55
78
  }
@@ -62,6 +85,7 @@ export class PeerManagerMetrics {
62
85
  const connectedAt = this.peerConnectedAt.get(id.toString());
63
86
  if (connectedAt) {
64
87
  this.peerConnectionDuration.record(Date.now() - connectedAt);
88
+ this.peerConnectedAt.delete(id.toString());
65
89
  }
66
90
  }
67
91
  }
@@ -1,4 +1,5 @@
1
1
  import type { EpochCacheInterface } from '@aztec/epoch-cache';
2
+ import { compactArray } from '@aztec/foundation/collection';
2
3
  import { makeEthSignDigest, tryRecoverAddress } from '@aztec/foundation/crypto/secp256k1-signer';
3
4
  import { Fr } from '@aztec/foundation/curves/bn254';
4
5
  import type { EthAddress } from '@aztec/foundation/eth-address';
@@ -32,7 +33,7 @@ import { PeerScoreState, type PeerScoring } from './peer_scoring.js';
32
33
  const MAX_DIAL_ATTEMPTS = 3;
33
34
  const MAX_CACHED_PEERS = 100;
34
35
  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
36
+ const DEFAULT_FAILED_PEER_BAN_TIME_MS = 5 * 60 * 1000; // 5 minutes timeout after failing MAX_DIAL_ATTEMPTS
36
37
  const GOODBYE_DIAL_TIMEOUT_MS = 1000;
37
38
  const FAILED_AUTH_HANDSHAKE_EXPIRY_MS = 60 * 60 * 1000; // 1 hour
38
39
 
@@ -164,6 +165,7 @@ export class PeerManager implements PeerManagerInterface {
164
165
  public async heartbeat() {
165
166
  this.heartbeatCounter++;
166
167
  this.peerScoring.decayAllScores();
168
+ this.peerScoring.pruneExpiredBans();
167
169
  this.cleanupExpiredTimeouts();
168
170
 
169
171
  await this.setupDirectPeersIfValidator();
@@ -198,21 +200,27 @@ export class PeerManager implements PeerManagerInterface {
198
200
  .then(peerIds => peerIds.forEach(peerId => this.preferredPeers.add(peerId.toString())))
199
201
  .catch(e => this.logger.error('Error initializing preferred peers', e));
200
202
 
201
- const directPeers = (
203
+ const directPeers = compactArray(
202
204
  await Promise.all(
203
205
  preferredPeersEnrs.map(async enr => {
204
- const peerId = await enr.peerId();
205
- const address = enr.getLocationMultiaddr('tcp');
206
- if (address === undefined) {
207
- throw new Error(`Direct peer ${peerId.toString()} has no TCP address, ENR: ${enr.encodeTxt()}`);
206
+ try {
207
+ const peerId = await enr.peerId();
208
+ const address = enr.getLocationMultiaddr('tcp');
209
+ if (address === undefined) {
210
+ throw new Error(`Direct peer ${peerId.toString()} has no TCP address, ENR: ${enr.encodeTxt()}`);
211
+ }
212
+ return {
213
+ id: peerId,
214
+ addrs: [address],
215
+ };
216
+ } catch (err) {
217
+ // A malformed configured ENR shouldn't abort preferred-peer setup — skip it and log.
218
+ this.logger.warn(`Skipping preferred peer with invalid ENR`, { err });
219
+ return undefined;
208
220
  }
209
- return {
210
- id: peerId,
211
- addrs: [address],
212
- };
213
221
  }),
214
- )
215
- ).filter(peer => peer !== undefined);
222
+ ),
223
+ );
216
224
 
217
225
  await Promise.all(
218
226
  directPeers.map(peer => {
@@ -226,20 +234,30 @@ export class PeerManager implements PeerManagerInterface {
226
234
  }
227
235
 
228
236
  /**
229
- * Cleans up expired timeouts.
237
+ * Cleans up expired timeouts and stale failed-auth-handshake entries.
230
238
  *
231
239
  * When peers fail to dial after a number of retries, they are temporarily timed out.
232
240
  * This function removes any peers that have been in the timed out state for too long.
233
241
  * To give them a chance to reconnect.
242
+ *
243
+ * Also evicts entries from the failed-auth-handshake map whose expiry window has passed.
244
+ * Without this, peers that probe once and never reconnect would leave their entries in the
245
+ * map forever, causing an unbounded memory leak.
234
246
  */
235
247
  private cleanupExpiredTimeouts() {
236
- // Clean up expired timeouts
237
248
  const now = this.dateProvider.now();
249
+
238
250
  for (const [peerId, timedOutPeer] of this.timedOutPeers.entries()) {
239
251
  if (now >= timedOutPeer.timeoutUntilMs) {
240
252
  this.timedOutPeers.delete(peerId);
241
253
  }
242
254
  }
255
+
256
+ for (const [id, entry] of this.failedAuthHandshakes.entries()) {
257
+ if (now - entry.lastFailureTimestamp > FAILED_AUTH_HANDSHAKE_EXPIRY_MS) {
258
+ this.failedAuthHandshakes.delete(id);
259
+ }
260
+ }
243
261
  }
244
262
 
245
263
  /**
@@ -303,15 +321,20 @@ export class PeerManager implements PeerManagerInterface {
303
321
  */
304
322
  private handleDisconnectedPeerEvent(e: CustomEvent<PeerId>) {
305
323
  const peerId = e.detail;
324
+ const peerIdStr = peerId.toString();
306
325
  this.metrics.peerDisconnected(peerId);
307
- this.logger.verbose(`Disconnected from peer ${peerId.toString()}`);
308
- const validatorAddress = this.authenticatedPeerIdToValidatorAddress.get(peerId.toString());
326
+ this.logger.verbose(`Disconnected from peer ${peerIdStr}`);
327
+ const validatorAddress = this.authenticatedPeerIdToValidatorAddress.get(peerIdStr);
309
328
  if (validatorAddress !== undefined) {
310
329
  this.logger.info(
311
- `Removing authentication for validator ${validatorAddress} at peer id ${peerId.toString()} due to disconnection`,
330
+ `Removing authentication for validator ${validatorAddress} at peer id ${peerIdStr} due to disconnection`,
312
331
  );
313
332
  this.authenticatedValidatorAddressToPeerId.delete(validatorAddress.toString());
314
- this.authenticatedPeerIdToValidatorAddress.delete(peerId.toString());
333
+ this.authenticatedPeerIdToValidatorAddress.delete(peerIdStr);
334
+ }
335
+
336
+ if (this.peerScoring.getScoreState(peerIdStr) === PeerScoreState.Healthy) {
337
+ this.peerScoring.removePeer(peerIdStr);
315
338
  }
316
339
  }
317
340
 
@@ -479,15 +502,38 @@ export class PeerManager implements PeerManagerInterface {
479
502
  *
480
503
  * @returns: True if node is allowed to connect, otherwise false
481
504
  * */
482
- public isNodeAllowedToConnect(id: string | PeerId): boolean {
483
- const entry = this.failedAuthHandshakes.get(id.toString());
505
+ /**
506
+ * Whether a peer is allowed to connect, given its peer id. Rejects peers serving an active ban and
507
+ * peers that have exceeded the failed auth-handshake limit. Use this once the peer id is known —
508
+ * i.e. for the encrypted-inbound gater and when dialing.
509
+ */
510
+ public isPeerAllowedToConnect(peerId: string | PeerId): boolean {
511
+ const id = peerId.toString();
512
+ if (this.peerScoring.getScoreState(id) === PeerScoreState.Banned) {
513
+ return false;
514
+ }
515
+ return this.isWithinFailedAuthLimit(id);
516
+ }
517
+
518
+ /**
519
+ * Whether a connection from an address is allowed. Bans are keyed by peer id, which isn't known at
520
+ * the raw-inbound layer, so only the failed auth-handshake limit (also tracked per address) is
521
+ * enforced here; the ban is applied once the peer id is known via {@link isPeerAllowedToConnect}.
522
+ */
523
+ public isAddressAllowedToConnect(address: string): boolean {
524
+ return this.isWithinFailedAuthLimit(address);
525
+ }
526
+
527
+ /** Whether the failed auth-handshake count for a peer id or address is below the configured limit. */
528
+ private isWithinFailedAuthLimit(key: string): boolean {
529
+ const entry = this.failedAuthHandshakes.get(key);
484
530
  if (!entry) {
485
531
  return true;
486
532
  }
487
533
 
488
534
  // In case entry is too old, remove it and allow connection
489
535
  if (this.dateProvider.now() - entry.lastFailureTimestamp > FAILED_AUTH_HANDSHAKE_EXPIRY_MS) {
490
- this.failedAuthHandshakes.delete(id.toString());
536
+ this.failedAuthHandshakes.delete(key);
491
537
  return true;
492
538
  }
493
539
 
@@ -512,10 +558,12 @@ export class PeerManager implements PeerManagerInterface {
512
558
  protectedConnections: protectedPeerCount,
513
559
  maxPeerCount: this.config.maxPeerCount,
514
560
  cachedPeers: this.cachedPeers.size,
561
+ discv5KadPeers: this.peerDiscoveryService.getKadValues().length,
515
562
  ...this.peerScoring.getStats(),
516
563
  });
517
564
 
518
- this.metrics.recordPeerCount(healthyConnections.length);
565
+ this.metrics.recordPeerCount(connections.length);
566
+ this.metrics.recordHealthyPeerCount(healthyConnections.length);
519
567
 
520
568
  // Exit if no peers to connect
521
569
  if (peersToConnect <= 0) {
@@ -712,6 +760,12 @@ export class PeerManager implements PeerManagerInterface {
712
760
  return;
713
761
  }
714
762
 
763
+ // Don't dial banned peers or those that have exceeded the auth failure threshold
764
+ if (!this.isPeerAllowedToConnect(peerId)) {
765
+ this.logger.trace(`Skipping peer ${peerId} due to ban or failed auth handshake attempts`);
766
+ return;
767
+ }
768
+
715
769
  const [multiaddrTcp] = await Promise.all([enr.getFullMultiaddr('tcp')]);
716
770
 
717
771
  this.logger.trace(`Handling discovered peer ${peerId} at ${multiaddrTcp?.toString() ?? 'undefined address'}`);
@@ -775,7 +829,8 @@ export class PeerManager implements PeerManagerInterface {
775
829
  // Add to timed out peers
776
830
  this.timedOutPeers.set(id, {
777
831
  peerId: id,
778
- timeoutUntilMs: this.dateProvider.now() + FAILED_PEER_BAN_TIME_MS,
832
+ timeoutUntilMs:
833
+ this.dateProvider.now() + (this.config.peerFailedBanTimeMs ?? DEFAULT_FAILED_PEER_BAN_TIME_MS),
779
834
  });
780
835
  }
781
836
  }
@@ -937,6 +992,8 @@ export class PeerManager implements PeerManagerInterface {
937
992
  `Received auth for validator ${sender.toString()} from peer ${peerIdString}, but this validator is already authenticated to peer ${peerForAddress.toString()}`,
938
993
  { ...logData, address: sender.toString() },
939
994
  );
995
+ this.markAuthHandshakeFailed(peerId);
996
+ this.markPeerForDisconnect(peerId);
940
997
  return;
941
998
  }
942
999
 
@@ -966,14 +1023,14 @@ export class PeerManager implements PeerManagerInterface {
966
1023
  const peerIdStr = peerId.toString();
967
1024
 
968
1025
  const existingEntry = this.failedAuthHandshakes.get(peerIdStr);
1026
+ const failureCount = (existingEntry?.count || 0) + 1;
969
1027
  this.failedAuthHandshakes.set(peerIdStr, {
970
- count: (existingEntry?.count || 0) + 1,
1028
+ count: failureCount,
971
1029
  lastFailureTimestamp: now,
972
1030
  });
973
1031
 
974
1032
  const connections = this.libP2PNode.getConnections(peerId);
975
1033
  connections.forEach(conn => {
976
- // We mark the IP address
977
1034
  const address = conn.remoteAddr.nodeAddress().address;
978
1035
  const existingAddressEntry = this.failedAuthHandshakes.get(address);
979
1036
  this.failedAuthHandshakes.set(address, {
@@ -981,6 +1038,15 @@ export class PeerManager implements PeerManagerInterface {
981
1038
  lastFailureTimestamp: now,
982
1039
  });
983
1040
  });
1041
+
1042
+ // Ban the peer from being re-dialed for a cooldown period (exponential backoff)
1043
+ const banTimeMs = this.config.peerFailedBanTimeMs ?? DEFAULT_FAILED_PEER_BAN_TIME_MS;
1044
+ const backoffMs = banTimeMs * Math.pow(2, Math.min(failureCount - 1, 5));
1045
+ this.timedOutPeers.set(peerIdStr, {
1046
+ peerId: peerIdStr,
1047
+ timeoutUntilMs: now + backoffMs,
1048
+ });
1049
+ this.cachedPeers.delete(peerIdStr);
984
1050
  }
985
1051
 
986
1052
  /*
@@ -1,11 +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,
10
+ createUpDownCounterWithDefault,
9
11
  getTelemetryClient,
10
12
  } from '@aztec/telemetry-client';
11
13
 
@@ -13,6 +15,21 @@ import type { PeerId } from '@libp2p/interface';
13
15
 
14
16
  import type { P2PConfig } from '../../config.js';
15
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
+ */
16
33
  const DefaultPeerPenalties = {
17
34
  [PeerErrorSeverity.LowToleranceError]: 50,
18
35
  [PeerErrorSeverity.MidToleranceError]: 10,
@@ -25,9 +42,23 @@ export enum PeerScoreState {
25
42
  Healthy,
26
43
  }
27
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
+ */
28
55
  // TODO: move into config / constants
29
56
  const MIN_SCORE_BEFORE_BAN = -100;
30
57
  const MIN_SCORE_BEFORE_DISCONNECT = -50;
58
+ const SCORE_CLEANUP_THRESHOLD = 0.1;
59
+
60
+ /** An active ban: the score the peer held when banned, and the timestamp at which the ban lifts. */
61
+ type BanRecord = { score: number; expiry: number };
31
62
 
32
63
  export class PeerScoring {
33
64
  private logger = createLogger('p2p:peer-scoring');
@@ -39,7 +70,21 @@ export class PeerScoring {
39
70
 
40
71
  private peerStateCounter: UpDownCounter;
41
72
 
42
- constructor(config: P2PConfig, telemetry: TelemetryClient = getTelemetryClient()) {
73
+ /** Active bans, keyed by peer id. Held in memory only, so they are cleared on restart. */
74
+ private bannedPeers: Map<string, BanRecord> = new Map();
75
+ /**
76
+ * How long a peer remains banned once its score crosses MIN_SCORE_BEFORE_BAN. While banned, the
77
+ * peer's ban score is returned by getScore regardless of decay, so it cannot recover its way out
78
+ * of the ban early. After the ban expires the live (decayed) score takes over again.
79
+ */
80
+ private readonly banDurationMs: number;
81
+
82
+ constructor(
83
+ config: P2PConfig,
84
+ telemetry: TelemetryClient = getTelemetryClient(),
85
+ private readonly dateProvider: DateProvider = new DateProvider(),
86
+ ) {
87
+ this.banDurationMs = config.peerBanDurationSeconds * 1000;
43
88
  const orderedValues = config.peerPenaltyValues?.sort((a, b) => a - b);
44
89
  this.peerPenalties = {
45
90
  [PeerErrorSeverity.HighToleranceError]:
@@ -52,7 +97,9 @@ export class PeerScoring {
52
97
 
53
98
  const meter = telemetry.getMeter('PeerScoring');
54
99
 
55
- this.peerStateCounter = meter.createUpDownCounter(Metrics.P2P_PEER_STATE_COUNT);
100
+ this.peerStateCounter = createUpDownCounterWithDefault(meter, Metrics.P2P_PEER_STATE_COUNT, {
101
+ [Attributes.P2P_PEER_SCORE_STATE]: ['Healthy', 'Disconnect', 'Banned'],
102
+ });
56
103
  }
57
104
 
58
105
  public penalizePeer(peerId: PeerId, penalty: PeerErrorSeverity) {
@@ -64,7 +111,7 @@ export class PeerScoring {
64
111
  }
65
112
 
66
113
  updateScore(peerId: string, scoreDelta: number): number {
67
- const currentTime = Date.now();
114
+ const currentTime = this.dateProvider.now();
68
115
  const lastUpdate = this.lastUpdateTime.get(peerId) || currentTime;
69
116
  const timePassed = currentTime - lastUpdate;
70
117
  const decayPeriods = Math.floor(timePassed / this.decayInterval);
@@ -79,29 +126,102 @@ export class PeerScoring {
79
126
 
80
127
  this.scores.set(peerId, currentScore);
81
128
  this.lastUpdateTime.set(peerId, currentTime);
129
+
130
+ this.maybeBanPeer(peerId, currentScore);
131
+
82
132
  return currentScore;
83
133
  }
84
134
 
135
+ /**
136
+ * Records a ban for a peer whose score has crossed the ban threshold, with an expiry banDurationMs
137
+ * in the future. No-op if the score is above the threshold or the peer is already serving an active
138
+ * ban (an existing ban is not extended; the original window stands). A previously expired ban does
139
+ * not block a fresh one — getActiveBanScore prunes it first.
140
+ */
141
+ private maybeBanPeer(peerId: string, score: number): void {
142
+ if (score >= MIN_SCORE_BEFORE_BAN || this.getActiveBanScore(peerId) !== undefined) {
143
+ return;
144
+ }
145
+ const record: BanRecord = { score, expiry: this.dateProvider.now() + this.banDurationMs };
146
+ this.bannedPeers.set(peerId, record);
147
+ this.logger.verbose(`Banning peer ${peerId} until ${new Date(record.expiry).toISOString()}`, {
148
+ peerId,
149
+ score,
150
+ expiry: record.expiry,
151
+ });
152
+ }
153
+
85
154
  decayAllScores(): void {
86
- const currentTime = Date.now();
155
+ const currentTime = this.dateProvider.now();
87
156
  for (const [peerId, lastUpdate] of this.lastUpdateTime.entries()) {
88
157
  const timePassed = currentTime - lastUpdate;
89
158
  const decayPeriods = Math.floor(timePassed / this.decayInterval);
90
159
  if (decayPeriods > 0) {
91
160
  let score = this.scores.get(peerId) || 0;
92
161
  score *= Math.pow(this.decayFactor, decayPeriods);
93
- this.scores.set(peerId, score);
94
- this.lastUpdateTime.set(peerId, currentTime);
162
+ if (Math.abs(score) < SCORE_CLEANUP_THRESHOLD) {
163
+ this.scores.delete(peerId);
164
+ this.lastUpdateTime.delete(peerId);
165
+ } else {
166
+ this.scores.set(peerId, score);
167
+ this.lastUpdateTime.set(peerId, currentTime);
168
+ }
95
169
  }
96
170
  }
97
171
  }
98
172
 
173
+ /**
174
+ * Removes bans whose window has elapsed. Expired bans are otherwise only pruned lazily when their
175
+ * peer's score is next queried, so a banned peer that disconnects and is never queried again would
176
+ * linger in the map. Called periodically (per heartbeat) to bound the ban map's size.
177
+ */
178
+ pruneExpiredBans(): void {
179
+ const now = this.dateProvider.now();
180
+ const expired = [...this.bannedPeers.entries()].filter(([, ban]) => ban.expiry <= now).map(([peerId]) => peerId);
181
+ for (const peerId of expired) {
182
+ this.bannedPeers.delete(peerId);
183
+ }
184
+ }
185
+
186
+ /** Resets all peer scores. Useful for benchmarks to prevent cross-case contamination. */
187
+ resetAllScores(): void {
188
+ this.scores.clear();
189
+ this.lastUpdateTime.clear();
190
+ this.bannedPeers.clear();
191
+ }
192
+
193
+ removePeer(peerId: string): void {
194
+ this.scores.delete(peerId);
195
+ this.lastUpdateTime.delete(peerId);
196
+ }
197
+
198
+ /**
199
+ * The single source of truth for whether a peer is banned. Returns the ban score while the ban is
200
+ * active, or undefined if the peer is not banned. A ban that has expired is lazily lifted before
201
+ * returning undefined, so callers never see a stale ban.
202
+ */
203
+ private getActiveBanScore(peerId: string): number | undefined {
204
+ const ban = this.bannedPeers.get(peerId);
205
+ if (ban === undefined) {
206
+ return undefined;
207
+ }
208
+ if (ban.expiry > this.dateProvider.now()) {
209
+ return ban.score;
210
+ }
211
+ // Ban expired: lift it so the peer can recover.
212
+ this.bannedPeers.delete(peerId);
213
+ return undefined;
214
+ }
215
+
99
216
  getScore(peerId: string): number {
100
- return this.scores.get(peerId) || 0;
217
+ // While a ban is active its ban score is returned regardless of how the live score has decayed,
218
+ // so the peer stays banned for the full duration.
219
+ return this.getActiveBanScore(peerId) ?? this.scores.get(peerId) ?? 0;
101
220
  }
102
221
 
103
222
  public getScoreState(peerId: string): PeerScoreState {
104
- // TODO(#11329): permanently store banned peers?
223
+ // A banned peer stays banned for the full ban duration regardless of score decay (see getScore /
224
+ // maybeBanPeer), rather than silently recovering once its decayed score is cleaned up.
105
225
  const score = this.getScore(peerId);
106
226
  if (score < MIN_SCORE_BEFORE_BAN) {
107
227
  return PeerScoreState.Banned;
@@ -115,7 +235,9 @@ export class PeerScoring {
115
235
  getStats(): { medianScore: number; healthyCount: number; disconnectCount: number; bannedCount: number } {
116
236
  const stateCounts = { healthy: 0, disconnect: 0, banned: 0 };
117
237
 
118
- for (const peerId of this.scores.keys()) {
238
+ // Include banned peers whose live score may have been decayed away but whose ban is still active.
239
+ const peerIds = new Set([...this.scores.keys(), ...this.bannedPeers.keys()]);
240
+ for (const peerId of peerIds) {
119
241
  const state = this.getScoreState(peerId);
120
242
  switch (state) {
121
243
  case PeerScoreState.Healthy: