@aztec/p2p 0.0.1-commit.42ee6df9b → 0.0.1-commit.431c48d

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 (360) hide show
  1. package/README.md +7 -6
  2. package/dest/bootstrap/bootstrap.d.ts +1 -1
  3. package/dest/bootstrap/bootstrap.d.ts.map +1 -1
  4. package/dest/bootstrap/bootstrap.js +22 -6
  5. package/dest/client/factory.d.ts +4 -3
  6. package/dest/client/factory.d.ts.map +1 -1
  7. package/dest/client/factory.js +32 -23
  8. package/dest/client/interface.d.ts +44 -11
  9. package/dest/client/interface.d.ts.map +1 -1
  10. package/dest/client/p2p_client.d.ts +34 -19
  11. package/dest/client/p2p_client.d.ts.map +1 -1
  12. package/dest/client/p2p_client.js +119 -59
  13. package/dest/config.d.ts +150 -107
  14. package/dest/config.d.ts.map +1 -1
  15. package/dest/config.js +77 -26
  16. package/dest/errors/reqresp.error.d.ts +9 -16
  17. package/dest/errors/reqresp.error.d.ts.map +1 -1
  18. package/dest/errors/reqresp.error.js +10 -17
  19. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +98 -56
  20. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  21. package/dest/mem_pools/attestation_pool/attestation_pool.js +270 -198
  22. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +1 -1
  23. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
  24. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +218 -59
  25. package/dest/mem_pools/attestation_pool/mocks.d.ts +1 -1
  26. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  27. package/dest/mem_pools/attestation_pool/mocks.js +6 -4
  28. package/dest/mem_pools/instrumentation.d.ts +9 -4
  29. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  30. package/dest/mem_pools/instrumentation.js +28 -9
  31. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts +10 -5
  32. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts.map +1 -1
  33. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.js +29 -20
  34. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +3 -3
  35. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -1
  36. package/dest/mem_pools/tx_pool_v2/deleted_pool.js +6 -6
  37. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +1 -1
  38. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -1
  39. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +3 -3
  40. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +1 -1
  41. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -1
  42. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +3 -1
  43. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +2 -1
  44. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -1
  45. package/dest/mem_pools/tx_pool_v2/eviction/index.js +1 -0
  46. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts +16 -0
  47. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts.map +1 -0
  48. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.js +64 -0
  49. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts +1 -1
  50. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -1
  51. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +3 -4
  52. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts +1 -1
  53. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -1
  54. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +6 -7
  55. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +1 -1
  56. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -1
  57. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +6 -5
  58. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts +11 -1
  59. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts.map +1 -1
  60. package/dest/mem_pools/tx_pool_v2/instrumentation.js +24 -0
  61. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +33 -5
  62. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
  63. package/dest/mem_pools/tx_pool_v2/interfaces.js +2 -1
  64. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +5 -2
  65. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
  66. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +8 -5
  67. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +15 -1
  68. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -1
  69. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +31 -0
  70. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +16 -3
  71. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -1
  72. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +83 -32
  73. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +50 -6
  74. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -1
  75. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +243 -127
  76. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +10 -3
  77. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  78. package/dest/msg_validators/attestation_validator/attestation_validator.js +38 -16
  79. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +7 -3
  80. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
  81. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +4 -5
  82. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +8 -3
  83. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
  84. package/dest/msg_validators/proposal_validator/block_proposal_validator.js +2 -2
  85. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +8 -3
  86. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
  87. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +8 -2
  88. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +25 -3
  89. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
  90. package/dest/msg_validators/proposal_validator/proposal_validator.js +85 -15
  91. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +1 -1
  92. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  93. package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +8 -15
  94. package/dest/msg_validators/tx_validator/allowed_public_setup.js +3 -3
  95. package/dest/msg_validators/tx_validator/archive_cache.js +1 -1
  96. package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts +15 -0
  97. package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts.map +1 -0
  98. package/dest/msg_validators/tx_validator/cached_tx_validator.js +19 -0
  99. package/dest/msg_validators/tx_validator/data_validator.d.ts +2 -1
  100. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  101. package/dest/msg_validators/tx_validator/data_validator.js +1 -0
  102. package/dest/msg_validators/tx_validator/factory.d.ts +14 -15
  103. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  104. package/dest/msg_validators/tx_validator/factory.js +29 -16
  105. package/dest/msg_validators/tx_validator/gas_validator.d.ts +47 -10
  106. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  107. package/dest/msg_validators/tx_validator/gas_validator.js +65 -48
  108. package/dest/msg_validators/tx_validator/index.d.ts +3 -1
  109. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  110. package/dest/msg_validators/tx_validator/index.js +2 -0
  111. package/dest/msg_validators/tx_validator/phases_validator.js +2 -2
  112. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +2 -1
  113. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
  114. package/dest/msg_validators/tx_validator/tx_proof_validator.js +2 -0
  115. package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts +48 -0
  116. package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts.map +1 -0
  117. package/dest/msg_validators/tx_validator/tx_validation_cache.js +68 -0
  118. package/dest/services/data_store.d.ts +1 -1
  119. package/dest/services/data_store.d.ts.map +1 -1
  120. package/dest/services/data_store.js +5 -5
  121. package/dest/services/discv5/discV5_service.d.ts +13 -2
  122. package/dest/services/discv5/discV5_service.d.ts.map +1 -1
  123. package/dest/services/discv5/discV5_service.js +119 -23
  124. package/dest/services/discv5/persisted_enr_store.d.ts +38 -0
  125. package/dest/services/discv5/persisted_enr_store.d.ts.map +1 -0
  126. package/dest/services/discv5/persisted_enr_store.js +145 -0
  127. package/dest/services/dummy_service.d.ts +18 -18
  128. package/dest/services/dummy_service.d.ts.map +1 -1
  129. package/dest/services/dummy_service.js +19 -18
  130. package/dest/services/encoding.d.ts +19 -6
  131. package/dest/services/encoding.d.ts.map +1 -1
  132. package/dest/services/encoding.js +25 -15
  133. package/dest/services/gossipsub/topic_score_params.d.ts +6 -12
  134. package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -1
  135. package/dest/services/gossipsub/topic_score_params.js +4 -14
  136. package/dest/services/libp2p/instrumentation.d.ts +6 -1
  137. package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
  138. package/dest/services/libp2p/instrumentation.js +21 -0
  139. package/dest/services/libp2p/libp2p_service.d.ts +40 -43
  140. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  141. package/dest/services/libp2p/libp2p_service.js +370 -276
  142. package/dest/services/peer-manager/peer_manager.d.ts +26 -2
  143. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  144. package/dest/services/peer-manager/peer_manager.js +103 -17
  145. package/dest/services/peer-manager/peer_scoring.d.ts +30 -1
  146. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  147. package/dest/services/peer-manager/peer_scoring.js +74 -3
  148. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +1 -8
  149. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -1
  150. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +35 -44
  151. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +8 -5
  152. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
  153. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +5 -14
  154. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -1
  155. package/dest/services/reqresp/batch-tx-requester/tx_validator.js +6 -20
  156. package/dest/services/reqresp/config.d.ts +15 -3
  157. package/dest/services/reqresp/config.d.ts.map +1 -1
  158. package/dest/services/reqresp/config.js +11 -0
  159. package/dest/services/reqresp/interface.d.ts +16 -18
  160. package/dest/services/reqresp/interface.d.ts.map +1 -1
  161. package/dest/services/reqresp/interface.js +10 -20
  162. package/dest/services/reqresp/metrics.d.ts +1 -1
  163. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  164. package/dest/services/reqresp/metrics.js +0 -1
  165. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +4 -3
  166. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -1
  167. package/dest/services/reqresp/protocols/block_txs/bitvector.js +3 -2
  168. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +1 -1
  169. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
  170. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +31 -28
  171. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +12 -7
  172. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
  173. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +42 -24
  174. package/dest/services/reqresp/protocols/index.d.ts +1 -2
  175. package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
  176. package/dest/services/reqresp/protocols/index.js +0 -1
  177. package/dest/services/reqresp/protocols/tx.d.ts +1 -1
  178. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  179. package/dest/services/reqresp/protocols/tx.js +1 -3
  180. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
  181. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
  182. package/dest/services/reqresp/rate-limiter/rate_limits.js +3 -13
  183. package/dest/services/reqresp/reqresp.d.ts +7 -29
  184. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  185. package/dest/services/reqresp/reqresp.js +59 -209
  186. package/dest/services/service.d.ts +41 -19
  187. package/dest/services/service.d.ts.map +1 -1
  188. package/dest/services/tx_collection/config.d.ts +2 -23
  189. package/dest/services/tx_collection/config.d.ts.map +1 -1
  190. package/dest/services/tx_collection/config.js +2 -55
  191. package/dest/services/tx_collection/file_store_tx_collection.d.ts +12 -28
  192. package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -1
  193. package/dest/services/tx_collection/file_store_tx_collection.js +43 -83
  194. package/dest/services/tx_collection/index.d.ts +2 -3
  195. package/dest/services/tx_collection/index.d.ts.map +1 -1
  196. package/dest/services/tx_collection/index.js +0 -1
  197. package/dest/services/tx_collection/instrumentation.d.ts +1 -1
  198. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
  199. package/dest/services/tx_collection/instrumentation.js +0 -2
  200. package/dest/services/tx_collection/tx_collection.d.ts +35 -51
  201. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  202. package/dest/services/tx_collection/tx_collection.js +275 -119
  203. package/dest/services/tx_collection/tx_collection_sink.d.ts +1 -1
  204. package/dest/services/tx_collection/tx_collection_sink.js +2 -2
  205. package/dest/services/tx_collection/tx_source.d.ts +1 -1
  206. package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
  207. package/dest/services/tx_collection/tx_source.js +4 -1
  208. package/dest/services/tx_file_store/tx_file_store.d.ts +1 -3
  209. package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -1
  210. package/dest/services/tx_file_store/tx_file_store.js +4 -14
  211. package/dest/services/tx_provider.d.ts +3 -1
  212. package/dest/services/tx_provider.d.ts.map +1 -1
  213. package/dest/services/tx_provider.js +3 -0
  214. package/dest/test-helpers/make-test-p2p-clients.d.ts +1 -1
  215. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  216. package/dest/test-helpers/make-test-p2p-clients.js +5 -2
  217. package/dest/test-helpers/mock-pubsub.d.ts +33 -9
  218. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  219. package/dest/test-helpers/mock-pubsub.js +57 -44
  220. package/dest/test-helpers/reqresp-nodes.d.ts +4 -5
  221. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  222. package/dest/test-helpers/reqresp-nodes.js +16 -18
  223. package/dest/test-helpers/test_tx_provider.d.ts +3 -1
  224. package/dest/test-helpers/test_tx_provider.d.ts.map +1 -1
  225. package/dest/test-helpers/test_tx_provider.js +3 -0
  226. package/dest/test-helpers/testbench-utils.d.ts +15 -14
  227. package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
  228. package/dest/test-helpers/testbench-utils.js +28 -13
  229. package/dest/testbench/p2p_client_testbench_worker.d.ts +3 -5
  230. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  231. package/dest/testbench/p2p_client_testbench_worker.js +60 -27
  232. package/dest/testbench/worker_client_manager.d.ts +10 -6
  233. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  234. package/dest/testbench/worker_client_manager.js +51 -8
  235. package/dest/util.d.ts +11 -6
  236. package/dest/util.d.ts.map +1 -1
  237. package/dest/util.js +35 -14
  238. package/dest/versioning.d.ts +3 -6
  239. package/dest/versioning.d.ts.map +1 -1
  240. package/dest/versioning.js +3 -24
  241. package/package.json +17 -17
  242. package/src/bootstrap/bootstrap.ts +17 -3
  243. package/src/client/factory.ts +48 -24
  244. package/src/client/interface.ts +39 -17
  245. package/src/client/p2p_client.ts +135 -92
  246. package/src/client/test/{tx_proposal_collector/README.md → p2p_client.batch_tx_requester.bench.README.md} +23 -53
  247. package/src/config.ts +159 -34
  248. package/src/errors/reqresp.error.ts +13 -19
  249. package/src/mem_pools/attestation_pool/attestation_pool.ts +325 -242
  250. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +238 -63
  251. package/src/mem_pools/attestation_pool/mocks.ts +13 -8
  252. package/src/mem_pools/instrumentation.ts +18 -12
  253. package/src/mem_pools/tx_pool_v2/archive/tx_archive.ts +30 -20
  254. package/src/mem_pools/tx_pool_v2/deleted_pool.ts +7 -7
  255. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +2 -4
  256. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +3 -2
  257. package/src/mem_pools/tx_pool_v2/eviction/index.ts +1 -0
  258. package/src/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.ts +67 -0
  259. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +1 -3
  260. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +5 -7
  261. package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +5 -6
  262. package/src/mem_pools/tx_pool_v2/instrumentation.ts +27 -0
  263. package/src/mem_pools/tx_pool_v2/interfaces.ts +31 -4
  264. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +13 -7
  265. package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +35 -0
  266. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +94 -31
  267. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +270 -133
  268. package/src/msg_validators/attestation_validator/attestation_validator.ts +46 -15
  269. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +15 -7
  270. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +15 -3
  271. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +26 -3
  272. package/src/msg_validators/proposal_validator/proposal_validator.ts +94 -12
  273. package/src/msg_validators/tx_validator/README.md +13 -3
  274. package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +3 -12
  275. package/src/msg_validators/tx_validator/allowed_public_setup.ts +3 -3
  276. package/src/msg_validators/tx_validator/archive_cache.ts +1 -1
  277. package/src/msg_validators/tx_validator/cached_tx_validator.ts +31 -0
  278. package/src/msg_validators/tx_validator/data_validator.ts +2 -0
  279. package/src/msg_validators/tx_validator/factory.ts +37 -20
  280. package/src/msg_validators/tx_validator/gas_validator.ts +99 -54
  281. package/src/msg_validators/tx_validator/index.ts +2 -0
  282. package/src/msg_validators/tx_validator/phases_validator.ts +2 -2
  283. package/src/msg_validators/tx_validator/tx_proof_validator.ts +2 -0
  284. package/src/msg_validators/tx_validator/tx_validation_cache.ts +101 -0
  285. package/src/services/data_store.ts +5 -13
  286. package/src/services/discv5/discV5_service.ts +126 -14
  287. package/src/services/discv5/persisted_enr_store.ts +158 -0
  288. package/src/services/dummy_service.ts +25 -44
  289. package/src/services/encoding.ts +28 -20
  290. package/src/services/gossipsub/README.md +33 -11
  291. package/src/services/gossipsub/topic_score_params.ts +9 -18
  292. package/src/services/libp2p/instrumentation.ts +22 -0
  293. package/src/services/libp2p/libp2p_service.ts +433 -302
  294. package/src/services/peer-manager/peer_manager.ts +112 -16
  295. package/src/services/peer-manager/peer_scoring.ts +81 -3
  296. package/src/services/reqresp/README.md +2 -37
  297. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +39 -52
  298. package/src/services/reqresp/batch-tx-requester/interface.ts +11 -4
  299. package/src/services/reqresp/batch-tx-requester/tx_validator.ts +12 -25
  300. package/src/services/reqresp/config.ts +19 -2
  301. package/src/services/reqresp/interface.ts +21 -47
  302. package/src/services/reqresp/metrics.ts +0 -1
  303. package/src/services/reqresp/protocols/block_txs/bitvector.ts +3 -2
  304. package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +34 -30
  305. package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +47 -20
  306. package/src/services/reqresp/protocols/index.ts +0 -1
  307. package/src/services/reqresp/protocols/tx.ts +1 -3
  308. package/src/services/reqresp/rate-limiter/rate_limits.ts +3 -13
  309. package/src/services/reqresp/reqresp.ts +69 -252
  310. package/src/services/service.ts +48 -37
  311. package/src/services/tx_collection/config.ts +3 -80
  312. package/src/services/tx_collection/file_store_tx_collection.ts +54 -103
  313. package/src/services/tx_collection/index.ts +1 -6
  314. package/src/services/tx_collection/instrumentation.ts +1 -7
  315. package/src/services/tx_collection/tx_collection.ts +330 -173
  316. package/src/services/tx_collection/tx_collection_sink.ts +2 -2
  317. package/src/services/tx_collection/tx_source.ts +2 -1
  318. package/src/services/tx_file_store/tx_file_store.ts +5 -17
  319. package/src/services/tx_provider.ts +5 -0
  320. package/src/test-helpers/make-test-p2p-clients.ts +3 -0
  321. package/src/test-helpers/mock-pubsub.ts +61 -60
  322. package/src/test-helpers/reqresp-nodes.ts +12 -22
  323. package/src/test-helpers/test_tx_provider.ts +5 -0
  324. package/src/test-helpers/testbench-utils.ts +35 -26
  325. package/src/testbench/p2p_client_testbench_worker.ts +68 -44
  326. package/src/testbench/worker_client_manager.ts +59 -19
  327. package/src/util.ts +32 -17
  328. package/src/versioning.ts +3 -33
  329. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts +0 -2
  330. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts.map +0 -1
  331. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +0 -315
  332. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts +0 -73
  333. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts.map +0 -1
  334. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.js +0 -8
  335. package/dest/msg_validators/clock_tolerance.d.ts +0 -21
  336. package/dest/msg_validators/clock_tolerance.d.ts.map +0 -1
  337. package/dest/msg_validators/clock_tolerance.js +0 -38
  338. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +0 -64
  339. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +0 -1
  340. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +0 -151
  341. package/dest/services/reqresp/protocols/block.d.ts +0 -9
  342. package/dest/services/reqresp/protocols/block.d.ts.map +0 -1
  343. package/dest/services/reqresp/protocols/block.js +0 -32
  344. package/dest/services/tx_collection/fast_tx_collection.d.ts +0 -51
  345. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +0 -1
  346. package/dest/services/tx_collection/fast_tx_collection.js +0 -311
  347. package/dest/services/tx_collection/proposal_tx_collector.d.ts +0 -48
  348. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +0 -1
  349. package/dest/services/tx_collection/proposal_tx_collector.js +0 -50
  350. package/dest/services/tx_collection/slow_tx_collection.d.ts +0 -57
  351. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +0 -1
  352. package/dest/services/tx_collection/slow_tx_collection.js +0 -211
  353. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +0 -355
  354. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.ts +0 -43
  355. package/src/msg_validators/clock_tolerance.ts +0 -52
  356. package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +0 -161
  357. package/src/services/reqresp/protocols/block.ts +0 -37
  358. package/src/services/tx_collection/fast_tx_collection.ts +0 -361
  359. package/src/services/tx_collection/proposal_tx_collector.ts +0 -108
  360. package/src/services/tx_collection/slow_tx_collection.ts +0 -266
@@ -40,6 +40,10 @@ export declare class PeerManager implements PeerManagerInterface {
40
40
  private failedAuthHandshakes;
41
41
  private validatorAddresses;
42
42
  private initializedPreferredPeers;
43
+ private consecutiveZeroPeerHeartbeats;
44
+ private zeroPeerWarningHeartbeats;
45
+ private zeroPeerWarningIssued;
46
+ private lastConnectedPeerAtMs;
43
47
  private metrics;
44
48
  private handlers;
45
49
  constructor(libP2PNode: FullLibp2p, peerDiscoveryService: PeerDiscoveryService, config: P2PConfig, telemetryClient: TelemetryClient, logger: import("@aztec/foundation/log").Logger | undefined, peerScoring: PeerScoring, reqresp: ReqResp, worldStateSynchronizer: WorldStateSynchronizer, protocolVersion: string, epochCache: EpochCacheInterface, dateProvider?: DateProvider);
@@ -51,6 +55,13 @@ export declare class PeerManager implements PeerManagerInterface {
51
55
  initializePeers(): Promise<void>;
52
56
  get tracer(): import("@aztec/telemetry-client").Tracer;
53
57
  heartbeat(): Promise<void>;
58
+ /**
59
+ * Flags a node that has been left without any connected peers, since it can neither gossip nor propagate txs.
60
+ *
61
+ * Warnings only start after a few consecutive zero-peer heartbeats so that startup or a transient dip stays quiet,
62
+ * and then repeat roughly once a minute instead of on every heartbeat. Recovery is logged once.
63
+ */
64
+ private checkPeerConnectivity;
54
65
  setupDirectPeersIfValidator(): Promise<void>;
55
66
  /**
56
67
  * Cleans up expired timeouts and stale failed-auth-handshake entries.
@@ -129,7 +140,20 @@ export declare class PeerManager implements PeerManagerInterface {
129
140
  shouldDisableP2PGossip(peerId: string): boolean;
130
141
  getPeers(includePending?: boolean): PeerInfo[];
131
142
  isAuthenticatedPeer(peerId: PeerId): boolean;
132
- isNodeAllowedToConnect(id: string | PeerId): boolean;
143
+ /**
144
+ * Whether a peer is allowed to connect, given its peer id. Rejects peers serving an active ban and
145
+ * peers that have exceeded the failed auth-handshake limit. Use this once the peer id is known —
146
+ * i.e. for the encrypted-inbound gater and when dialing.
147
+ */
148
+ isPeerAllowedToConnect(peerId: string | PeerId): boolean;
149
+ /**
150
+ * Whether a connection from an address is allowed. Bans are keyed by peer id, which isn't known at
151
+ * the raw-inbound layer, so only the failed auth-handshake limit (also tracked per address) is
152
+ * enforced here; the ban is applied once the peer id is known via {@link isPeerAllowedToConnect}.
153
+ */
154
+ isAddressAllowedToConnect(address: string): boolean;
155
+ /** Whether the failed auth-handshake count for a peer id or address is below the configured limit. */
156
+ private isWithinFailedAuthLimit;
133
157
  /**
134
158
  * Discovers peers.
135
159
  */
@@ -175,4 +199,4 @@ export declare class PeerManager implements PeerManagerInterface {
175
199
  handleAuthRequestFromPeer(_authRequest: AuthRequest, peerId: PeerId): Promise<StatusMessage>;
176
200
  private updateAuthenticatedPeers;
177
201
  }
178
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVlcl9tYW5hZ2VyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvcGVlci1tYW5hZ2VyL3BlZXJfbWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRzlELE9BQU8sS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBR2hFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN2RCxPQUFPLEtBQUssRUFBRSxRQUFRLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN4RixPQUFPLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzNELE9BQU8sS0FBSyxFQUFFLGVBQWUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRS9ELE9BQU8sS0FBSyxFQUFjLE1BQU0sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBTTVELE9BQU8sS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRWpELE9BQU8sS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVoRCxPQUFPLEVBQUUsV0FBVyxFQUFnQixNQUFNLDhCQUE4QixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxhQUFhLEVBQXVCLE1BQU0saUNBQWlDLENBQUM7QUFDckYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQy9ELE9BQU8sS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXJELE9BQU8sS0FBSyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFELE9BQU8sS0FBSyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0QsT0FBTyxFQUFrQixLQUFLLFdBQVcsRUFBRSxNQUFNLG1C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
202
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVlcl9tYW5hZ2VyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvcGVlci1tYW5hZ2VyL3BlZXJfbWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBSTlELE9BQU8sS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBR2hFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN2RCxPQUFPLEtBQUssRUFBRSxRQUFRLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN4RixPQUFPLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzNELE9BQU8sS0FBSyxFQUFFLGVBQWUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRS9ELE9BQU8sS0FBSyxFQUFjLE1BQU0sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBTTVELE9BQU8sS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRWpELE9BQU8sS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVoRCxPQUFPLEVBQUUsV0FBVyxFQUFnQixNQUFNLDhCQUE4QixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxhQUFhLEVBQXVCLE1BQU0saUNBQWlDLENBQUM7QUFDckYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQy9ELE9BQU8sS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXJELE9BQU8sS0FBSyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFELE9BQU8sS0FBSyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0QsT0FBTyxFQUFrQixLQUFLLFdBQVcsRUFBRSxNQUFNLG1C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
@@ -1 +1 @@
1
- {"version":3,"file":"peer_manager.d.ts","sourceRoot":"","sources":["../../../src/services/peer-manager/peer_manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"peer_manager.d.ts","sourceRoot":"","sources":["../../../src/services/peer-manager/peer_manager.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { compactArray } from '@aztec/foundation/collection';
1
2
  import { makeEthSignDigest, tryRecoverAddress } from '@aztec/foundation/crypto/secp256k1-signer';
2
3
  import { Fr } from '@aztec/foundation/curves/bn254';
3
4
  import { createLogger } from '@aztec/foundation/log';
@@ -20,6 +21,8 @@ const MAX_CACHED_PEER_AGE_MS = 5 * 60 * 1000; // 5 minutes
20
21
  const DEFAULT_FAILED_PEER_BAN_TIME_MS = 5 * 60 * 1000; // 5 minutes timeout after failing MAX_DIAL_ATTEMPTS
21
22
  const GOODBYE_DIAL_TIMEOUT_MS = 1000;
22
23
  const FAILED_AUTH_HANDSHAKE_EXPIRY_MS = 60 * 60 * 1000; // 1 hour
24
+ const ZERO_PEER_WARNING_THRESHOLD_HEARTBEATS = 3; // tolerate transient dips, such as at startup
25
+ const ZERO_PEER_WARNING_REPEAT_INTERVAL_MS = 60 * 1000;
23
26
  export class PeerManager {
24
27
  libP2PNode;
25
28
  peerDiscoveryService;
@@ -46,6 +49,10 @@ export class PeerManager {
46
49
  failedAuthHandshakes;
47
50
  validatorAddresses;
48
51
  initializedPreferredPeers;
52
+ consecutiveZeroPeerHeartbeats;
53
+ zeroPeerWarningHeartbeats;
54
+ zeroPeerWarningIssued;
55
+ lastConnectedPeerAtMs;
49
56
  metrics;
50
57
  handlers;
51
58
  constructor(libP2PNode, peerDiscoveryService, config, telemetryClient, logger = createLogger('p2p:peer-manager'), peerScoring, reqresp, worldStateSynchronizer, protocolVersion, epochCache, dateProvider = new DateProvider()){
@@ -74,6 +81,9 @@ export class PeerManager {
74
81
  this.failedAuthHandshakes = new Map();
75
82
  this.validatorAddresses = [];
76
83
  this.initializedPreferredPeers = false;
84
+ this.consecutiveZeroPeerHeartbeats = 0;
85
+ this.zeroPeerWarningHeartbeats = 0;
86
+ this.zeroPeerWarningIssued = false;
77
87
  if (this.config.p2pDisableStatusHandshake && this.config.p2pAllowOnlyValidators) {
78
88
  throw new Error('Status handshake disabled but is required to allow only validators to connect.');
79
89
  }
@@ -92,6 +102,7 @@ export class PeerManager {
92
102
  this.peerDiscoveryService?.on(PeerEvent.DISCOVERED, this.handlers.handleDiscoveredPeer);
93
103
  // Display peer counts every 60 seconds
94
104
  this.displayPeerCountsPeerHeartbeat = Math.floor(60_000 / this.config.peerCheckIntervalMS);
105
+ this.zeroPeerWarningHeartbeats = Math.max(1, Math.floor(ZERO_PEER_WARNING_REPEAT_INTERVAL_MS / this.config.peerCheckIntervalMS));
95
106
  }
96
107
  /**
97
108
  * Initializes the trusted peers.
@@ -127,11 +138,46 @@ export class PeerManager {
127
138
  async heartbeat() {
128
139
  this.heartbeatCounter++;
129
140
  this.peerScoring.decayAllScores();
141
+ this.peerScoring.pruneExpiredBans();
130
142
  this.cleanupExpiredTimeouts();
131
143
  await this.setupDirectPeersIfValidator();
132
144
  await this.updateAuthenticatedPeers();
133
145
  await this.processScheduledDisconnects();
134
146
  this.discover();
147
+ this.checkPeerConnectivity();
148
+ }
149
+ /**
150
+ * Flags a node that has been left without any connected peers, since it can neither gossip nor propagate txs.
151
+ *
152
+ * Warnings only start after a few consecutive zero-peer heartbeats so that startup or a transient dip stays quiet,
153
+ * and then repeat roughly once a minute instead of on every heartbeat. Recovery is logged once.
154
+ */ checkPeerConnectivity() {
155
+ const connectedPeerCount = this.libP2PNode.getPeers().length;
156
+ const now = this.dateProvider.now();
157
+ if (connectedPeerCount > 0) {
158
+ if (this.zeroPeerWarningIssued) {
159
+ this.logger.info(`Peer connectivity restored with ${connectedPeerCount} connected peers`, {
160
+ connectedPeerCount,
161
+ zeroPeerHeartbeats: this.consecutiveZeroPeerHeartbeats
162
+ });
163
+ }
164
+ this.consecutiveZeroPeerHeartbeats = 0;
165
+ this.zeroPeerWarningIssued = false;
166
+ this.lastConnectedPeerAtMs = now;
167
+ return;
168
+ }
169
+ this.consecutiveZeroPeerHeartbeats++;
170
+ const heartbeatsSinceThreshold = this.consecutiveZeroPeerHeartbeats - ZERO_PEER_WARNING_THRESHOLD_HEARTBEATS;
171
+ if (heartbeatsSinceThreshold < 0 || heartbeatsSinceThreshold % this.zeroPeerWarningHeartbeats !== 0) {
172
+ return;
173
+ }
174
+ this.zeroPeerWarningIssued = true;
175
+ this.logger.warn('Node has no connected peers; gossip and tx propagation are unavailable', {
176
+ zeroPeerHeartbeats: this.consecutiveZeroPeerHeartbeats,
177
+ peerCheckIntervalMS: this.config.peerCheckIntervalMS,
178
+ msSinceLastConnectedPeer: this.lastConnectedPeerAtMs === undefined ? undefined : now - this.lastConnectedPeerAtMs,
179
+ cachedPeers: this.cachedPeers.size
180
+ });
135
181
  }
136
182
  /*
137
183
  * If this node is connecting to preferred peers, make sure it is registered validator */ async setupDirectPeersIfValidator() {
@@ -150,19 +196,27 @@ export class PeerManager {
150
196
  }
151
197
  const preferredPeersEnrs = this.config.preferredPeers.map((enr)=>ENR.decodeTxt(enr));
152
198
  await Promise.all(preferredPeersEnrs.map((enr)=>enr.peerId())).then((peerIds)=>peerIds.forEach((peerId)=>this.preferredPeers.add(peerId.toString()))).catch((e)=>this.logger.error('Error initializing preferred peers', e));
153
- const directPeers = (await Promise.all(preferredPeersEnrs.map(async (enr)=>{
154
- const peerId = await enr.peerId();
155
- const address = enr.getLocationMultiaddr('tcp');
156
- if (address === undefined) {
157
- throw new Error(`Direct peer ${peerId.toString()} has no TCP address, ENR: ${enr.encodeTxt()}`);
199
+ const directPeers = compactArray(await Promise.all(preferredPeersEnrs.map(async (enr)=>{
200
+ try {
201
+ const peerId = await enr.peerId();
202
+ const address = enr.getLocationMultiaddr('tcp');
203
+ if (address === undefined) {
204
+ throw new Error(`Direct peer ${peerId.toString()} has no TCP address, ENR: ${enr.encodeTxt()}`);
205
+ }
206
+ return {
207
+ id: peerId,
208
+ addrs: [
209
+ address
210
+ ]
211
+ };
212
+ } catch (err) {
213
+ // A malformed configured ENR shouldn't abort preferred-peer setup — skip it and log.
214
+ this.logger.warn(`Skipping preferred peer with invalid ENR`, {
215
+ err
216
+ });
217
+ return undefined;
158
218
  }
159
- return {
160
- id: peerId,
161
- addrs: [
162
- address
163
- ]
164
- };
165
- }))).filter((peer)=>peer !== undefined);
219
+ })));
166
220
  await Promise.all(directPeers.map((peer)=>{
167
221
  this.libP2PNode.services.pubsub.direct.add(peer.id.toString());
168
222
  return this.libP2PNode.peerStore.merge(peer.id, {
@@ -390,14 +444,32 @@ export class PeerManager {
390
444
  * @param id: Address of the node or it's peerId
391
445
  *
392
446
  * @returns: True if node is allowed to connect, otherwise false
393
- * */ isNodeAllowedToConnect(id) {
394
- const entry = this.failedAuthHandshakes.get(id.toString());
447
+ * */ /**
448
+ * Whether a peer is allowed to connect, given its peer id. Rejects peers serving an active ban and
449
+ * peers that have exceeded the failed auth-handshake limit. Use this once the peer id is known —
450
+ * i.e. for the encrypted-inbound gater and when dialing.
451
+ */ isPeerAllowedToConnect(peerId) {
452
+ const id = peerId.toString();
453
+ if (this.peerScoring.getScoreState(id) === PeerScoreState.Banned) {
454
+ return false;
455
+ }
456
+ return this.isWithinFailedAuthLimit(id);
457
+ }
458
+ /**
459
+ * Whether a connection from an address is allowed. Bans are keyed by peer id, which isn't known at
460
+ * the raw-inbound layer, so only the failed auth-handshake limit (also tracked per address) is
461
+ * enforced here; the ban is applied once the peer id is known via {@link isPeerAllowedToConnect}.
462
+ */ isAddressAllowedToConnect(address) {
463
+ return this.isWithinFailedAuthLimit(address);
464
+ }
465
+ /** Whether the failed auth-handshake count for a peer id or address is below the configured limit. */ isWithinFailedAuthLimit(key) {
466
+ const entry = this.failedAuthHandshakes.get(key);
395
467
  if (!entry) {
396
468
  return true;
397
469
  }
398
470
  // In case entry is too old, remove it and allow connection
399
471
  if (this.dateProvider.now() - entry.lastFailureTimestamp > FAILED_AUTH_HANDSHAKE_EXPIRY_MS) {
400
- this.failedAuthHandshakes.delete(id.toString());
472
+ this.failedAuthHandshakes.delete(key);
401
473
  return true;
402
474
  }
403
475
  return entry.count <= this.config.p2pMaxFailedAuthAttemptsAllowed;
@@ -416,6 +488,7 @@ export class PeerManager {
416
488
  protectedConnections: protectedPeerCount,
417
489
  maxPeerCount: this.config.maxPeerCount,
418
490
  cachedPeers: this.cachedPeers.size,
491
+ discv5KadPeers: this.peerDiscoveryService.getKadValues().length,
419
492
  ...this.peerScoring.getStats()
420
493
  });
421
494
  this.metrics.recordPeerCount(connections.length);
@@ -571,6 +644,11 @@ export class PeerManager {
571
644
  if (this.peerScoring.getScoreState(peerIdString) != PeerScoreState.Healthy) {
572
645
  return;
573
646
  }
647
+ // Don't dial banned peers or those that have exceeded the auth failure threshold
648
+ if (!this.isPeerAllowedToConnect(peerId)) {
649
+ this.logger.trace(`Skipping peer ${peerId} due to ban or failed auth handshake attempts`);
650
+ return;
651
+ }
574
652
  const [multiaddrTcp] = await Promise.all([
575
653
  enr.getFullMultiaddr('tcp')
576
654
  ]);
@@ -813,13 +891,13 @@ export class PeerManager {
813
891
  const now = this.dateProvider.now();
814
892
  const peerIdStr = peerId.toString();
815
893
  const existingEntry = this.failedAuthHandshakes.get(peerIdStr);
894
+ const failureCount = (existingEntry?.count || 0) + 1;
816
895
  this.failedAuthHandshakes.set(peerIdStr, {
817
- count: (existingEntry?.count || 0) + 1,
896
+ count: failureCount,
818
897
  lastFailureTimestamp: now
819
898
  });
820
899
  const connections = this.libP2PNode.getConnections(peerId);
821
900
  connections.forEach((conn)=>{
822
- // We mark the IP address
823
901
  const address = conn.remoteAddr.nodeAddress().address;
824
902
  const existingAddressEntry = this.failedAuthHandshakes.get(address);
825
903
  this.failedAuthHandshakes.set(address, {
@@ -827,6 +905,14 @@ export class PeerManager {
827
905
  lastFailureTimestamp: now
828
906
  });
829
907
  });
908
+ // Ban the peer from being re-dialed for a cooldown period (exponential backoff)
909
+ const banTimeMs = this.config.peerFailedBanTimeMs ?? DEFAULT_FAILED_PEER_BAN_TIME_MS;
910
+ const backoffMs = banTimeMs * Math.pow(2, Math.min(failureCount - 1, 5));
911
+ this.timedOutPeers.set(peerIdStr, {
912
+ peerId: peerIdStr,
913
+ timeoutUntilMs: now + backoffMs
914
+ });
915
+ this.cachedPeers.delete(peerIdStr);
830
916
  }
831
917
  /*
832
918
  * Marks when peer exchanges auth handshake
@@ -19,11 +19,40 @@ export declare class PeerScoring {
19
19
  [key in PeerErrorSeverity]: number;
20
20
  };
21
21
  private peerStateCounter;
22
+ /** Active bans, keyed by peer id. Held in memory only, so they are cleared on restart. */
23
+ private bannedPeers;
24
+ /**
25
+ * How long a peer remains banned once its score crosses MIN_SCORE_BEFORE_BAN. While banned, the
26
+ * peer's ban score is returned by getScore regardless of decay, so it cannot recover its way out
27
+ * of the ban early. After the ban expires the live (decayed) score takes over again.
28
+ */
29
+ private readonly banDurationMs;
22
30
  constructor(config: P2PConfig, telemetry?: TelemetryClient, dateProvider?: DateProvider);
23
31
  penalizePeer(peerId: PeerId, penalty: PeerErrorSeverity): number;
24
32
  updateScore(peerId: string, scoreDelta: number): number;
33
+ /**
34
+ * Records a ban for a peer whose score has crossed the ban threshold, with an expiry banDurationMs
35
+ * in the future. No-op if the score is above the threshold or the peer is already serving an active
36
+ * ban (an existing ban is not extended; the original window stands). A previously expired ban does
37
+ * not block a fresh one — getActiveBanScore prunes it first.
38
+ */
39
+ private maybeBanPeer;
25
40
  decayAllScores(): void;
41
+ /**
42
+ * Removes bans whose window has elapsed. Expired bans are otherwise only pruned lazily when their
43
+ * peer's score is next queried, so a banned peer that disconnects and is never queried again would
44
+ * linger in the map. Called periodically (per heartbeat) to bound the ban map's size.
45
+ */
46
+ pruneExpiredBans(): void;
47
+ /** Resets all peer scores. Useful for benchmarks to prevent cross-case contamination. */
48
+ resetAllScores(): void;
26
49
  removePeer(peerId: string): void;
50
+ /**
51
+ * The single source of truth for whether a peer is banned. Returns the ban score while the ban is
52
+ * active, or undefined if the peer is not banned. A ban that has expired is lazily lifted before
53
+ * returning undefined, so callers never see a stale ban.
54
+ */
55
+ private getActiveBanScore;
27
56
  getScore(peerId: string): number;
28
57
  getScoreState(peerId: string): PeerScoreState;
29
58
  getStats(): {
@@ -33,4 +62,4 @@ export declare class PeerScoring {
33
62
  bannedCount: number;
34
63
  };
35
64
  }
36
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVlcl9zY29yaW5nLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvcGVlci1tYW5hZ2VyL3BlZXJfc2NvcmluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDdEQsT0FBTyxFQUdMLEtBQUssZUFBZSxFQUlyQixNQUFNLHlCQUF5QixDQUFDO0FBRWpDLE9BQU8sS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRWhELE9BQU8sS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBdUJqRCxvQkFBWSxjQUFjO0lBQ3hCLE1BQU0sSUFBQTtJQUNOLFVBQVUsSUFBQTtJQUNWLE9BQU8sSUFBQTtDQUNSO0FBaUJELHFCQUFhLFdBQVc7SUFhcEIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxZQUFZO0lBWi9CLE9BQU8sQ0FBQyxNQUFNLENBQW9DO0lBQ2xELE9BQU8sQ0FBQyxNQUFNLENBQWtDO0lBQ2hELE9BQU8sQ0FBQyxjQUFjLENBQWtDO0lBQ3hELE9BQU8sQ0FBQyxhQUFhLENBQWE7SUFDbEMsT0FBTyxDQUFDLFdBQVcsQ0FBTztJQUMxQixhQUFhLEVBQUU7U0FBRyxHQUFHLElBQUksaUJBQWlCLEdBQUcsTUFBTTtLQUFFLENBQUM7SUFFdEQsT0FBTyxDQUFDLGdCQUFnQixDQUFnQjtJQUV4QyxZQUNFLE1BQU0sRUFBRSxTQUFTLEVBQ2pCLFNBQVMsR0FBRSxlQUFzQyxFQUNoQyxZQUFZLEdBQUUsWUFBaUMsRUFpQmpFO0lBRU0sWUFBWSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLGlCQUFpQixVQU03RDtJQUVELFdBQVcsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLEdBQUcsTUFBTSxDQWlCdEQ7SUFFRCxjQUFjLElBQUksSUFBSSxDQWlCckI7SUFFRCxVQUFVLENBQUMsTUFBTSxFQUFFLE1BQU0sR0FBRyxJQUFJLENBRy9CO0lBRUQsUUFBUSxDQUFDLE1BQU0sRUFBRSxNQUFNLEdBQUcsTUFBTSxDQUUvQjtJQUVNLGFBQWEsQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLGNBQWMsQ0FVbkQ7SUFFRCxRQUFRLElBQUk7UUFBRSxXQUFXLEVBQUUsTUFBTSxDQUFDO1FBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQztRQUFDLGVBQWUsRUFBRSxNQUFNLENBQUM7UUFBQyxXQUFXLEVBQUUsTUFBTSxDQUFBO0tBQUUsQ0E0QnRHO0NBQ0YifQ==
65
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVlcl9zY29yaW5nLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvcGVlci1tYW5hZ2VyL3BlZXJfc2NvcmluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDdEQsT0FBTyxFQUdMLEtBQUssZUFBZSxFQUlyQixNQUFNLHlCQUF5QixDQUFDO0FBRWpDLE9BQU8sS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRWhELE9BQU8sS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBdUJqRCxvQkFBWSxjQUFjO0lBQ3hCLE1BQU0sSUFBQTtJQUNOLFVBQVUsSUFBQTtJQUNWLE9BQU8sSUFBQTtDQUNSO0FBb0JELHFCQUFhLFdBQVc7SUFzQnBCLE9BQU8sQ0FBQyxRQUFRLENBQUMsWUFBWTtJQXJCL0IsT0FBTyxDQUFDLE1BQU0sQ0FBb0M7SUFDbEQsT0FBTyxDQUFDLE1BQU0sQ0FBa0M7SUFDaEQsT0FBTyxDQUFDLGNBQWMsQ0FBa0M7SUFDeEQsT0FBTyxDQUFDLGFBQWEsQ0FBYTtJQUNsQyxPQUFPLENBQUMsV0FBVyxDQUFPO0lBQzFCLGFBQWEsRUFBRTtTQUFHLEdBQUcsSUFBSSxpQkFBaUIsR0FBRyxNQUFNO0tBQUUsQ0FBQztJQUV0RCxPQUFPLENBQUMsZ0JBQWdCLENBQWdCO0lBRXhDLDBGQUEwRjtJQUMxRixPQUFPLENBQUMsV0FBVyxDQUFxQztJQUN4RDs7OztPQUlHO0lBQ0gsT0FBTyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQVM7SUFFdkMsWUFDRSxNQUFNLEVBQUUsU0FBUyxFQUNqQixTQUFTLEdBQUUsZUFBc0MsRUFDaEMsWUFBWSxHQUFFLFlBQWlDLEVBa0JqRTtJQUVNLFlBQVksQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxpQkFBaUIsVUFNN0Q7SUFFRCxXQUFXLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxHQUFHLE1BQU0sQ0FvQnREO0lBRUQ7Ozs7O09BS0c7SUFDSCxPQUFPLENBQUMsWUFBWTtJQWFwQixjQUFjLElBQUksSUFBSSxDQWlCckI7SUFFRDs7OztPQUlHO0lBQ0gsZ0JBQWdCLElBQUksSUFBSSxDQU12QjtJQUVELHlGQUF5RjtJQUN6RixjQUFjLElBQUksSUFBSSxDQUlyQjtJQUVELFVBQVUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLElBQUksQ0FHL0I7SUFFRDs7OztPQUlHO0lBQ0gsT0FBTyxDQUFDLGlCQUFpQjtJQWF6QixRQUFRLENBQUMsTUFBTSxFQUFFLE1BQU0sR0FBRyxNQUFNLENBSS9CO0lBRU0sYUFBYSxDQUFDLE1BQU0sRUFBRSxNQUFNLEdBQUcsY0FBYyxDQVduRDtJQUVELFFBQVEsSUFBSTtRQUFFLFdBQVcsRUFBRSxNQUFNLENBQUM7UUFBQyxZQUFZLEVBQUUsTUFBTSxDQUFDO1FBQUMsZUFBZSxFQUFFLE1BQU0sQ0FBQztRQUFDLFdBQVcsRUFBRSxNQUFNLENBQUE7S0FBRSxDQThCdEc7Q0FDRiJ9
@@ -1 +1 @@
1
- {"version":3,"file":"peer_scoring.d.ts","sourceRoot":"","sources":["../../../src/services/peer-manager/peer_scoring.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAGL,KAAK,eAAe,EAIrB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAuBjD,oBAAY,cAAc;IACxB,MAAM,IAAA;IACN,UAAU,IAAA;IACV,OAAO,IAAA;CACR;AAiBD,qBAAa,WAAW;IAapB,OAAO,CAAC,QAAQ,CAAC,YAAY;IAZ/B,OAAO,CAAC,MAAM,CAAoC;IAClD,OAAO,CAAC,MAAM,CAAkC;IAChD,OAAO,CAAC,cAAc,CAAkC;IACxD,OAAO,CAAC,aAAa,CAAa;IAClC,OAAO,CAAC,WAAW,CAAO;IAC1B,aAAa,EAAE;SAAG,GAAG,IAAI,iBAAiB,GAAG,MAAM;KAAE,CAAC;IAEtD,OAAO,CAAC,gBAAgB,CAAgB;IAExC,YACE,MAAM,EAAE,SAAS,EACjB,SAAS,GAAE,eAAsC,EAChC,YAAY,GAAE,YAAiC,EAiBjE;IAEM,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,UAM7D;IAED,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAiBtD;IAED,cAAc,IAAI,IAAI,CAiBrB;IAED,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAG/B;IAED,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAE/B;IAEM,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,CAUnD;IAED,QAAQ,IAAI;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CA4BtG;CACF"}
1
+ {"version":3,"file":"peer_scoring.d.ts","sourceRoot":"","sources":["../../../src/services/peer-manager/peer_scoring.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAGL,KAAK,eAAe,EAIrB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAuBjD,oBAAY,cAAc;IACxB,MAAM,IAAA;IACN,UAAU,IAAA;IACV,OAAO,IAAA;CACR;AAoBD,qBAAa,WAAW;IAsBpB,OAAO,CAAC,QAAQ,CAAC,YAAY;IArB/B,OAAO,CAAC,MAAM,CAAoC;IAClD,OAAO,CAAC,MAAM,CAAkC;IAChD,OAAO,CAAC,cAAc,CAAkC;IACxD,OAAO,CAAC,aAAa,CAAa;IAClC,OAAO,CAAC,WAAW,CAAO;IAC1B,aAAa,EAAE;SAAG,GAAG,IAAI,iBAAiB,GAAG,MAAM;KAAE,CAAC;IAEtD,OAAO,CAAC,gBAAgB,CAAgB;IAExC,0FAA0F;IAC1F,OAAO,CAAC,WAAW,CAAqC;IACxD;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IAEvC,YACE,MAAM,EAAE,SAAS,EACjB,SAAS,GAAE,eAAsC,EAChC,YAAY,GAAE,YAAiC,EAkBjE;IAEM,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,UAM7D;IAED,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAoBtD;IAED;;;;;OAKG;IACH,OAAO,CAAC,YAAY;IAapB,cAAc,IAAI,IAAI,CAiBrB;IAED;;;;OAIG;IACH,gBAAgB,IAAI,IAAI,CAMvB;IAED,yFAAyF;IACzF,cAAc,IAAI,IAAI,CAIrB;IAED,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAG/B;IAED;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IAazB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAI/B;IAEM,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,CAWnD;IAED,QAAQ,IAAI;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CA8BtG;CACF"}
@@ -50,6 +50,12 @@ export class PeerScoring {
50
50
  decayFactor;
51
51
  peerPenalties;
52
52
  peerStateCounter;
53
+ /** Active bans, keyed by peer id. Held in memory only, so they are cleared on restart. */ bannedPeers;
54
+ /**
55
+ * How long a peer remains banned once its score crosses MIN_SCORE_BEFORE_BAN. While banned, the
56
+ * peer's ban score is returned by getScore regardless of decay, so it cannot recover its way out
57
+ * of the ban early. After the ban expires the live (decayed) score takes over again.
58
+ */ banDurationMs;
53
59
  constructor(config, telemetry = getTelemetryClient(), dateProvider = new DateProvider()){
54
60
  this.dateProvider = dateProvider;
55
61
  this.logger = createLogger('p2p:peer-scoring');
@@ -57,6 +63,8 @@ export class PeerScoring {
57
63
  this.lastUpdateTime = new Map();
58
64
  this.decayInterval = 1000 * 60;
59
65
  this.decayFactor = 0.9;
66
+ this.bannedPeers = new Map();
67
+ this.banDurationMs = config.peerBanDurationSeconds * 1000;
60
68
  const orderedValues = config.peerPenaltyValues?.sort((a, b)=>a - b);
61
69
  this.peerPenalties = {
62
70
  [PeerErrorSeverity.HighToleranceError]: orderedValues?.[0] ?? DefaultPeerPenalties[PeerErrorSeverity.HighToleranceError],
@@ -91,8 +99,29 @@ export class PeerScoring {
91
99
  currentScore += scoreDelta;
92
100
  this.scores.set(peerId, currentScore);
93
101
  this.lastUpdateTime.set(peerId, currentTime);
102
+ this.maybeBanPeer(peerId, currentScore);
94
103
  return currentScore;
95
104
  }
105
+ /**
106
+ * Records a ban for a peer whose score has crossed the ban threshold, with an expiry banDurationMs
107
+ * in the future. No-op if the score is above the threshold or the peer is already serving an active
108
+ * ban (an existing ban is not extended; the original window stands). A previously expired ban does
109
+ * not block a fresh one — getActiveBanScore prunes it first.
110
+ */ maybeBanPeer(peerId, score) {
111
+ if (score >= MIN_SCORE_BEFORE_BAN || this.getActiveBanScore(peerId) !== undefined) {
112
+ return;
113
+ }
114
+ const record = {
115
+ score,
116
+ expiry: this.dateProvider.now() + this.banDurationMs
117
+ };
118
+ this.bannedPeers.set(peerId, record);
119
+ this.logger.verbose(`Banning peer ${peerId} until ${new Date(record.expiry).toISOString()}`, {
120
+ peerId,
121
+ score,
122
+ expiry: record.expiry
123
+ });
124
+ }
96
125
  decayAllScores() {
97
126
  const currentTime = this.dateProvider.now();
98
127
  for (const [peerId, lastUpdate] of this.lastUpdateTime.entries()){
@@ -111,15 +140,52 @@ export class PeerScoring {
111
140
  }
112
141
  }
113
142
  }
143
+ /**
144
+ * Removes bans whose window has elapsed. Expired bans are otherwise only pruned lazily when their
145
+ * peer's score is next queried, so a banned peer that disconnects and is never queried again would
146
+ * linger in the map. Called periodically (per heartbeat) to bound the ban map's size.
147
+ */ pruneExpiredBans() {
148
+ const now = this.dateProvider.now();
149
+ const expired = [
150
+ ...this.bannedPeers.entries()
151
+ ].filter(([, ban])=>ban.expiry <= now).map(([peerId])=>peerId);
152
+ for (const peerId of expired){
153
+ this.bannedPeers.delete(peerId);
154
+ }
155
+ }
156
+ /** Resets all peer scores. Useful for benchmarks to prevent cross-case contamination. */ resetAllScores() {
157
+ this.scores.clear();
158
+ this.lastUpdateTime.clear();
159
+ this.bannedPeers.clear();
160
+ }
114
161
  removePeer(peerId) {
115
162
  this.scores.delete(peerId);
116
163
  this.lastUpdateTime.delete(peerId);
117
164
  }
165
+ /**
166
+ * The single source of truth for whether a peer is banned. Returns the ban score while the ban is
167
+ * active, or undefined if the peer is not banned. A ban that has expired is lazily lifted before
168
+ * returning undefined, so callers never see a stale ban.
169
+ */ getActiveBanScore(peerId) {
170
+ const ban = this.bannedPeers.get(peerId);
171
+ if (ban === undefined) {
172
+ return undefined;
173
+ }
174
+ if (ban.expiry > this.dateProvider.now()) {
175
+ return ban.score;
176
+ }
177
+ // Ban expired: lift it so the peer can recover.
178
+ this.bannedPeers.delete(peerId);
179
+ return undefined;
180
+ }
118
181
  getScore(peerId) {
119
- return this.scores.get(peerId) || 0;
182
+ // While a ban is active its ban score is returned regardless of how the live score has decayed,
183
+ // so the peer stays banned for the full duration.
184
+ return this.getActiveBanScore(peerId) ?? this.scores.get(peerId) ?? 0;
120
185
  }
121
186
  getScoreState(peerId) {
122
- // TODO(#11329): permanently store banned peers?
187
+ // A banned peer stays banned for the full ban duration regardless of score decay (see getScore /
188
+ // maybeBanPeer), rather than silently recovering once its decayed score is cleaned up.
123
189
  const score = this.getScore(peerId);
124
190
  if (score < MIN_SCORE_BEFORE_BAN) {
125
191
  return 0;
@@ -135,7 +201,12 @@ export class PeerScoring {
135
201
  disconnect: 0,
136
202
  banned: 0
137
203
  };
138
- for (const peerId of this.scores.keys()){
204
+ // Include banned peers whose live score may have been decayed away but whose ban is still active.
205
+ const peerIds = new Set([
206
+ ...this.scores.keys(),
207
+ ...this.bannedPeers.keys()
208
+ ]);
209
+ for (const peerId of peerIds){
139
210
  const state = this.getScoreState(peerId);
140
211
  switch(state){
141
212
  case 2:
@@ -33,13 +33,6 @@ export declare class BatchTxRequester {
33
33
  private handleSuccessResponseFromPeer;
34
34
  private handleReceivedTxs;
35
35
  private decideIfPeerIsSmart;
36
- /**
37
- * Handles an archive root mismatch between local state and peer response.
38
- *
39
- * - Response archive is Fr.ZERO (peer pruned proposal, legitimate): marks peer dumb.
40
- * - Non-zero archive mismatch (malicious response): penalises + marks dumb.
41
- */
42
- private handleArchiveRootMismatch;
43
36
  private peerHasSomeTxsWeAreMissing;
44
37
  private markTxsPeerHas;
45
38
  private extractHashesPeerHasFromResponse;
@@ -48,4 +41,4 @@ export declare class BatchTxRequester {
48
41
  private unlockSmartRequesterSemaphores;
49
42
  private sleepClampedToDeadline;
50
43
  }
51
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmF0Y2hfdHhfcmVxdWVzdGVyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2VydmljZXMvcmVxcmVzcC9iYXRjaC10eC1yZXF1ZXN0ZXIvYmF0Y2hfdHhfcmVxdWVzdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxLQUFLLE1BQU0sRUFBZ0IsTUFBTSx1QkFBdUIsQ0FBQztBQUdsRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFdkQsT0FBTyxFQUFFLEVBQUUsRUFBbUIsTUFBTSxrQkFBa0IsQ0FBQztBQUV2RCxPQUFPLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUVoRCxPQUFPLEtBQUssRUFBRSxlQUFlLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUU5RSxPQUFPLEVBQXFDLEtBQUssY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFRakcsT0FBTyxLQUFLLEVBQUUsNkJBQTZCLEVBQUUsdUJBQXVCLEVBQXlCLE1BQU0sZ0JBQWdCLENBQUM7QUFzQnBILHFCQUFhLGdCQUFnQjtJQUMzQixPQUFPLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBa0I7SUFDakQsT0FBTyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQWlCO0lBQ2hELE9BQU8sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFxQjtJQUNoRCxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBZ0M7SUFDM0QsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQVM7SUFDaEMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQTBCO0lBQy9DLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFrQjtJQUN4QyxPQUFPLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBd0I7SUFDcEQsT0FBTyxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBYTtJQUNyRCxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBc0I7SUFDOUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQTJCO0lBQ3ZELE9BQU8sQ0FBQyxRQUFRLENBQUMsd0JBQXdCLENBQVM7SUFDbEQsT0FBTyxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBUztJQUNqRCxPQUFPLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBUztJQUVyQyxZQUNFLGNBQWMsRUFBRSxlQUFlLEVBQy9CLGNBQWMsRUFBRSxjQUFjLEVBQzlCLFVBQVUsRUFBRSxNQUFNLEdBQUcsU0FBUyxFQUM5QixVQUFVLEVBQUUsNkJBQTZCLEVBQ3pDLE1BQU0sQ0FBQyxFQUFFLE1BQU0sRUFDZixZQUFZLENBQUMsRUFBRSxZQUFZLEVBQzNCLElBQUksQ0FBQyxFQUFFLHVCQUF1QixFQStCL0I7SUFLYSxHQUFHLElBQUksY0FBYyxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQW1DL0Q7SUFLRCxPQUFvQixhQUFhLENBQUMsU0FBUyxFQUFFLGNBQWMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLFNBQVMsRUFBRSxPQUFPLENBQUMsR0FBRyxPQUFPLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FTdkc7WUFVYSxtQkFBbUI7WUFrRG5CLGFBQWE7WUFrRGIsY0FBYztZQWdEZCxjQUFjO1lBK0JkLGVBQWU7WUE0RWYsY0FBYztJQW1DNUIsT0FBTyxDQUFDLDBCQUEwQjtZQTBCcEIsNkJBQTZCO1lBWTdCLGlCQUFpQjtJQXdEL0IsT0FBTyxDQUFDLG1CQUFtQjtJQStCM0I7Ozs7O09BS0c7SUFDSCxPQUFPLENBQUMseUJBQXlCO0lBU2pDLE9BQU8sQ0FBQywwQkFBMEI7SUFRbEMsT0FBTyxDQUFDLGNBQWM7SUFNdEIsT0FBTyxDQUFDLGdDQUFnQztJQWdCeEMsT0FBTyxDQUFDLHFCQUFxQjtJQXdCN0IsT0FBTyxDQUFDLFVBQVU7SUFZbEIsT0FBTyxDQUFDLDhCQUE4QjtZQVV4QixzQkFBc0I7Q0FNckMifQ==
44
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmF0Y2hfdHhfcmVxdWVzdGVyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2VydmljZXMvcmVxcmVzcC9iYXRjaC10eC1yZXF1ZXN0ZXIvYmF0Y2hfdHhfcmVxdWVzdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxLQUFLLE1BQU0sRUFBZ0IsTUFBTSx1QkFBdUIsQ0FBQztBQUdsRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFdkQsT0FBTyxFQUFFLEVBQUUsRUFBcUMsTUFBTSxrQkFBa0IsQ0FBQztBQUV6RSxPQUFPLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUdoRCxPQUFPLEtBQUssRUFBRSxlQUFlLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUU5RSxPQUFPLEVBQXFDLEtBQUssY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFRakcsT0FBTyxLQUFLLEVBQUUsNkJBQTZCLEVBQUUsdUJBQXVCLEVBQXlCLE1BQU0sZ0JBQWdCLENBQUM7QUFzQnBILHFCQUFhLGdCQUFnQjtJQUMzQixPQUFPLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBa0I7SUFDakQsT0FBTyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQWlCO0lBQ2hELE9BQU8sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFxQjtJQUNoRCxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBZ0M7SUFDM0QsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQVM7SUFDaEMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQTBCO0lBQy9DLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFrQjtJQUN4QyxPQUFPLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBd0I7SUFDcEQsT0FBTyxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBYTtJQUNyRCxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBc0I7SUFDOUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQWM7SUFDMUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyx3QkFBd0IsQ0FBUztJQUNsRCxPQUFPLENBQUMsUUFBUSxDQUFDLHVCQUF1QixDQUFTO0lBQ2pELE9BQU8sQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFTO0lBRXJDLFlBQ0UsY0FBYyxFQUFFLGVBQWUsRUFDL0IsY0FBYyxFQUFFLGNBQWMsRUFDOUIsVUFBVSxFQUFFLE1BQU0sR0FBRyxTQUFTLEVBQzlCLFVBQVUsRUFBRSw2QkFBNkIsRUFDekMsTUFBTSxDQUFDLEVBQUUsTUFBTSxFQUNmLFlBQVksQ0FBQyxFQUFFLFlBQVksRUFDM0IsSUFBSSxDQUFDLEVBQUUsdUJBQXVCLEVBK0IvQjtJQUthLEdBQUcsSUFBSSxjQUFjLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBbUMvRDtJQUtELE9BQW9CLGFBQWEsQ0FBQyxTQUFTLEVBQUUsY0FBYyxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsU0FBUyxFQUFFLE9BQU8sQ0FBQyxHQUFHLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQVN2RztZQVVhLG1CQUFtQjtZQWtEbkIsYUFBYTtZQWtEYixjQUFjO1lBZ0RkLGNBQWM7WUErQmQsZUFBZTtZQTRFZixjQUFjO0lBNkM1QixPQUFPLENBQUMsMEJBQTBCO1lBc0JwQiw2QkFBNkI7WUFZN0IsaUJBQWlCO0lBd0QvQixPQUFPLENBQUMsbUJBQW1CO0lBZ0MzQixPQUFPLENBQUMsMEJBQTBCO0lBUWxDLE9BQU8sQ0FBQyxjQUFjO0lBTXRCLE9BQU8sQ0FBQyxnQ0FBZ0M7SUFVeEMsT0FBTyxDQUFDLHFCQUFxQjtJQXdCN0IsT0FBTyxDQUFDLFVBQVU7SUFZbEIsT0FBTyxDQUFDLDhCQUE4QjtZQVV4QixzQkFBc0I7Q0FNckMifQ==
@@ -1 +1 @@
1
- {"version":3,"file":"batch_tx_requester.d.ts","sourceRoot":"","sources":["../../../../src/services/reqresp/batch-tx-requester/batch_tx_requester.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAGlE,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,OAAO,EAAE,EAAE,EAAmB,MAAM,kBAAkB,CAAC;AAEvD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AAE9E,OAAO,EAAqC,KAAK,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAQjG,OAAO,KAAK,EAAE,6BAA6B,EAAE,uBAAuB,EAAyB,MAAM,gBAAgB,CAAC;AAsBpH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAkB;IACjD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAChD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAqB;IAChD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgC;IAC3D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA0B;IAC/C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAkB;IACxC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAwB;IACpD,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAa;IACrD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsB;IAC9C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA2B;IACvD,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAS;IAClD,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAS;IACjD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IAErC,YACE,cAAc,EAAE,eAAe,EAC/B,cAAc,EAAE,cAAc,EAC9B,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,UAAU,EAAE,6BAA6B,EACzC,MAAM,CAAC,EAAE,MAAM,EACf,YAAY,CAAC,EAAE,YAAY,EAC3B,IAAI,CAAC,EAAE,uBAAuB,EA+B/B;IAKa,GAAG,IAAI,cAAc,CAAC,EAAE,EAAE,EAAE,GAAG,SAAS,EAAE,OAAO,CAAC,CAmC/D;IAKD,OAAoB,aAAa,CAAC,SAAS,EAAE,cAAc,CAAC,EAAE,EAAE,EAAE,GAAG,SAAS,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,EAAE,EAAE,CAAC,CASvG;YAUa,mBAAmB;YAkDnB,aAAa;YAkDb,cAAc;YAgDd,cAAc;YA+Bd,eAAe;YA4Ef,cAAc;IAmC5B,OAAO,CAAC,0BAA0B;YA0BpB,6BAA6B;YAY7B,iBAAiB;IAwD/B,OAAO,CAAC,mBAAmB;IA+B3B;;;;;OAKG;IACH,OAAO,CAAC,yBAAyB;IASjC,OAAO,CAAC,0BAA0B;IAQlC,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,gCAAgC;IAgBxC,OAAO,CAAC,qBAAqB;IAwB7B,OAAO,CAAC,UAAU;IAYlB,OAAO,CAAC,8BAA8B;YAUxB,sBAAsB;CAMrC"}
1
+ {"version":3,"file":"batch_tx_requester.d.ts","sourceRoot":"","sources":["../../../../src/services/reqresp/batch-tx-requester/batch_tx_requester.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAGlE,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,OAAO,EAAE,EAAE,EAAqC,MAAM,kBAAkB,CAAC;AAEzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAGhD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AAE9E,OAAO,EAAqC,KAAK,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAQjG,OAAO,KAAK,EAAE,6BAA6B,EAAE,uBAAuB,EAAyB,MAAM,gBAAgB,CAAC;AAsBpH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAkB;IACjD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAChD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAqB;IAChD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgC;IAC3D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA0B;IAC/C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAkB;IACxC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAwB;IACpD,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAa;IACrD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsB;IAC9C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAS;IAClD,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAS;IACjD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IAErC,YACE,cAAc,EAAE,eAAe,EAC/B,cAAc,EAAE,cAAc,EAC9B,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,UAAU,EAAE,6BAA6B,EACzC,MAAM,CAAC,EAAE,MAAM,EACf,YAAY,CAAC,EAAE,YAAY,EAC3B,IAAI,CAAC,EAAE,uBAAuB,EA+B/B;IAKa,GAAG,IAAI,cAAc,CAAC,EAAE,EAAE,EAAE,GAAG,SAAS,EAAE,OAAO,CAAC,CAmC/D;IAKD,OAAoB,aAAa,CAAC,SAAS,EAAE,cAAc,CAAC,EAAE,EAAE,EAAE,GAAG,SAAS,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,EAAE,EAAE,CAAC,CASvG;YAUa,mBAAmB;YAkDnB,aAAa;YAkDb,cAAc;YAgDd,cAAc;YA+Bd,eAAe;YA4Ef,cAAc;IA6C5B,OAAO,CAAC,0BAA0B;YAsBpB,6BAA6B;YAY7B,iBAAiB;IAwD/B,OAAO,CAAC,mBAAmB;IAgC3B,OAAO,CAAC,0BAA0B;IAQlC,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,gCAAgC;IAUxC,OAAO,CAAC,qBAAqB;IAwB7B,OAAO,CAAC,UAAU;IAYlB,OAAO,CAAC,8BAA8B;YAUxB,sBAAsB;CAMrC"}