@aztec/p2p 0.0.0-test.1 → 0.0.1-commit.017a351

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 (633) hide show
  1. package/README.md +129 -3
  2. package/dest/bootstrap/bootstrap.d.ts +4 -3
  3. package/dest/bootstrap/bootstrap.d.ts.map +1 -1
  4. package/dest/bootstrap/bootstrap.js +34 -13
  5. package/dest/client/factory.d.ts +23 -12
  6. package/dest/client/factory.d.ts.map +1 -1
  7. package/dest/client/factory.js +106 -26
  8. package/dest/client/index.d.ts +2 -1
  9. package/dest/client/index.d.ts.map +1 -1
  10. package/dest/client/index.js +1 -0
  11. package/dest/client/interface.d.ts +192 -0
  12. package/dest/client/interface.d.ts.map +1 -0
  13. package/dest/client/interface.js +9 -0
  14. package/dest/client/p2p_client.d.ts +97 -221
  15. package/dest/client/p2p_client.d.ts.map +1 -1
  16. package/dest/client/p2p_client.js +818 -289
  17. package/dest/config.d.ts +235 -133
  18. package/dest/config.d.ts.map +1 -1
  19. package/dest/config.js +295 -36
  20. package/dest/enr/generate-enr.d.ts +11 -3
  21. package/dest/enr/generate-enr.d.ts.map +1 -1
  22. package/dest/enr/generate-enr.js +27 -5
  23. package/dest/enr/index.d.ts +1 -1
  24. package/dest/errors/attestation-pool.error.d.ts +7 -0
  25. package/dest/errors/attestation-pool.error.d.ts.map +1 -0
  26. package/dest/errors/attestation-pool.error.js +12 -0
  27. package/dest/errors/p2p-service.error.d.ts +9 -0
  28. package/dest/errors/p2p-service.error.d.ts.map +1 -0
  29. package/dest/errors/p2p-service.error.js +10 -0
  30. package/dest/errors/reqresp.error.d.ts +1 -20
  31. package/dest/errors/reqresp.error.d.ts.map +1 -1
  32. package/dest/errors/reqresp.error.js +0 -21
  33. package/dest/errors/tx-pool.error.d.ts +8 -0
  34. package/dest/errors/tx-pool.error.d.ts.map +1 -0
  35. package/dest/errors/tx-pool.error.js +9 -0
  36. package/dest/index.d.ts +5 -2
  37. package/dest/index.d.ts.map +1 -1
  38. package/dest/index.js +3 -1
  39. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +165 -30
  40. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  41. package/dest/mem_pools/attestation_pool/attestation_pool.js +511 -3
  42. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +2 -2
  43. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
  44. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +680 -173
  45. package/dest/mem_pools/attestation_pool/index.d.ts +2 -3
  46. package/dest/mem_pools/attestation_pool/index.d.ts.map +1 -1
  47. package/dest/mem_pools/attestation_pool/index.js +1 -2
  48. package/dest/mem_pools/attestation_pool/mocks.d.ts +234 -11
  49. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  50. package/dest/mem_pools/attestation_pool/mocks.js +21 -21
  51. package/dest/mem_pools/index.d.ts +3 -3
  52. package/dest/mem_pools/index.d.ts.map +1 -1
  53. package/dest/mem_pools/index.js +1 -1
  54. package/dest/mem_pools/instrumentation.d.ts +18 -12
  55. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  56. package/dest/mem_pools/instrumentation.js +74 -41
  57. package/dest/mem_pools/interface.d.ts +6 -7
  58. package/dest/mem_pools/interface.d.ts.map +1 -1
  59. package/dest/mem_pools/tx_pool_v2/archive/index.d.ts +2 -0
  60. package/dest/mem_pools/tx_pool_v2/archive/index.d.ts.map +1 -0
  61. package/dest/mem_pools/tx_pool_v2/archive/index.js +1 -0
  62. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts +39 -0
  63. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts.map +1 -0
  64. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.js +97 -0
  65. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +104 -0
  66. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -0
  67. package/dest/mem_pools/tx_pool_v2/deleted_pool.js +251 -0
  68. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts +47 -0
  69. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts.map +1 -0
  70. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.js +128 -0
  71. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +17 -0
  72. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -0
  73. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +94 -0
  74. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +19 -0
  75. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -0
  76. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +97 -0
  77. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +11 -0
  78. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -0
  79. package/dest/mem_pools/tx_pool_v2/eviction/index.js +12 -0
  80. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts +16 -0
  81. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts.map +1 -0
  82. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.js +62 -0
  83. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +180 -0
  84. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -0
  85. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.js +25 -0
  86. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts +15 -0
  87. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -0
  88. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +65 -0
  89. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts +17 -0
  90. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -0
  91. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +93 -0
  92. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +16 -0
  93. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -0
  94. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +78 -0
  95. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +20 -0
  96. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -0
  97. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +75 -0
  98. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +15 -0
  99. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -0
  100. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +19 -0
  101. package/dest/mem_pools/tx_pool_v2/index.d.ts +6 -0
  102. package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -0
  103. package/dest/mem_pools/tx_pool_v2/index.js +5 -0
  104. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts +15 -0
  105. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts.map +1 -0
  106. package/dest/mem_pools/tx_pool_v2/instrumentation.js +43 -0
  107. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +218 -0
  108. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -0
  109. package/dest/mem_pools/tx_pool_v2/interfaces.js +10 -0
  110. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +137 -0
  111. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -0
  112. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +223 -0
  113. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts +26 -0
  114. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts.map +1 -0
  115. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.js +70 -0
  116. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +108 -0
  117. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -0
  118. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +337 -0
  119. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +62 -0
  120. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -0
  121. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +167 -0
  122. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +78 -0
  123. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -0
  124. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +914 -0
  125. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +14 -6
  126. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  127. package/dest/msg_validators/attestation_validator/attestation_validator.js +106 -12
  128. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +24 -0
  129. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -0
  130. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +75 -0
  131. package/dest/msg_validators/attestation_validator/index.d.ts +2 -1
  132. package/dest/msg_validators/attestation_validator/index.d.ts.map +1 -1
  133. package/dest/msg_validators/attestation_validator/index.js +1 -0
  134. package/dest/msg_validators/clock_tolerance.d.ts +32 -0
  135. package/dest/msg_validators/clock_tolerance.d.ts.map +1 -0
  136. package/dest/msg_validators/clock_tolerance.js +90 -0
  137. package/dest/msg_validators/index.d.ts +2 -2
  138. package/dest/msg_validators/index.d.ts.map +1 -1
  139. package/dest/msg_validators/index.js +1 -1
  140. package/dest/msg_validators/msg_seen_validator/msg_seen_validator.d.ts +10 -0
  141. package/dest/msg_validators/msg_seen_validator/msg_seen_validator.d.ts.map +1 -0
  142. package/dest/msg_validators/msg_seen_validator/msg_seen_validator.js +36 -0
  143. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +15 -0
  144. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -0
  145. package/dest/msg_validators/proposal_validator/block_proposal_validator.js +14 -0
  146. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +15 -0
  147. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -0
  148. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +20 -0
  149. package/dest/msg_validators/proposal_validator/index.d.ts +4 -0
  150. package/dest/msg_validators/proposal_validator/index.d.ts.map +1 -0
  151. package/dest/msg_validators/proposal_validator/index.js +3 -0
  152. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +26 -0
  153. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -0
  154. package/dest/msg_validators/proposal_validator/proposal_validator.js +150 -0
  155. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +4 -4
  156. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  157. package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +11 -18
  158. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +4 -0
  159. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -0
  160. package/dest/msg_validators/tx_validator/allowed_public_setup.js +31 -0
  161. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts +17 -0
  162. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts.map +1 -0
  163. package/dest/msg_validators/tx_validator/allowed_setup_helpers.js +24 -0
  164. package/dest/msg_validators/tx_validator/archive_cache.d.ts +14 -0
  165. package/dest/msg_validators/tx_validator/archive_cache.d.ts.map +1 -0
  166. package/dest/msg_validators/tx_validator/archive_cache.js +22 -0
  167. package/dest/msg_validators/tx_validator/block_header_validator.d.ts +20 -6
  168. package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
  169. package/dest/msg_validators/tx_validator/block_header_validator.js +7 -6
  170. package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts +15 -0
  171. package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts.map +1 -0
  172. package/dest/msg_validators/tx_validator/cached_tx_validator.js +19 -0
  173. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts +9 -0
  174. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts.map +1 -0
  175. package/dest/msg_validators/tx_validator/contract_instance_validator.js +48 -0
  176. package/dest/msg_validators/tx_validator/data_validator.d.ts +4 -1
  177. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  178. package/dest/msg_validators/tx_validator/data_validator.js +94 -87
  179. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +15 -6
  180. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
  181. package/dest/msg_validators/tx_validator/double_spend_validator.js +24 -29
  182. package/dest/msg_validators/tx_validator/factory.d.ts +149 -0
  183. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -0
  184. package/dest/msg_validators/tx_validator/factory.js +275 -0
  185. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +10 -0
  186. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -0
  187. package/dest/msg_validators/tx_validator/fee_payer_balance.js +24 -0
  188. package/dest/msg_validators/tx_validator/gas_validator.d.ts +108 -0
  189. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -0
  190. package/dest/msg_validators/tx_validator/gas_validator.js +194 -0
  191. package/dest/msg_validators/tx_validator/index.d.ts +13 -1
  192. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  193. package/dest/msg_validators/tx_validator/index.js +12 -0
  194. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +10 -5
  195. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  196. package/dest/msg_validators/tx_validator/metadata_validator.js +40 -21
  197. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts +14 -0
  198. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts.map +1 -0
  199. package/dest/msg_validators/tx_validator/nullifier_cache.js +24 -0
  200. package/dest/msg_validators/tx_validator/phases_validator.d.ts +35 -0
  201. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -0
  202. package/dest/msg_validators/tx_validator/phases_validator.js +141 -0
  203. package/dest/msg_validators/tx_validator/size_validator.d.ts +8 -0
  204. package/dest/msg_validators/tx_validator/size_validator.d.ts.map +1 -0
  205. package/dest/msg_validators/tx_validator/size_validator.js +23 -0
  206. package/dest/msg_validators/tx_validator/test_utils.d.ts +17 -0
  207. package/dest/msg_validators/tx_validator/test_utils.d.ts.map +1 -0
  208. package/dest/msg_validators/tx_validator/test_utils.js +22 -0
  209. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +30 -0
  210. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -0
  211. package/dest/msg_validators/tx_validator/timestamp_validator.js +32 -0
  212. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts +9 -0
  213. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts.map +1 -0
  214. package/dest/msg_validators/tx_validator/tx_permitted_validator.js +24 -0
  215. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +4 -2
  216. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
  217. package/dest/msg_validators/tx_validator/tx_proof_validator.js +10 -7
  218. package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts +48 -0
  219. package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts.map +1 -0
  220. package/dest/msg_validators/tx_validator/tx_validation_cache.js +68 -0
  221. package/dest/services/data_store.d.ts +1 -1
  222. package/dest/services/data_store.d.ts.map +1 -1
  223. package/dest/services/data_store.js +14 -10
  224. package/dest/services/discv5/discV5_service.d.ts +11 -9
  225. package/dest/services/discv5/discV5_service.d.ts.map +1 -1
  226. package/dest/services/discv5/discV5_service.js +92 -38
  227. package/dest/services/dummy_service.d.ts +77 -18
  228. package/dest/services/dummy_service.d.ts.map +1 -1
  229. package/dest/services/dummy_service.js +139 -12
  230. package/dest/services/encoding.d.ts +30 -7
  231. package/dest/services/encoding.d.ts.map +1 -1
  232. package/dest/services/encoding.js +88 -12
  233. package/dest/services/gossipsub/index.d.ts +3 -0
  234. package/dest/services/gossipsub/index.d.ts.map +1 -0
  235. package/dest/services/gossipsub/index.js +2 -0
  236. package/dest/services/gossipsub/scoring.d.ts +21 -3
  237. package/dest/services/gossipsub/scoring.d.ts.map +1 -1
  238. package/dest/services/gossipsub/scoring.js +24 -7
  239. package/dest/services/gossipsub/topic_score_params.d.ts +184 -0
  240. package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -0
  241. package/dest/services/gossipsub/topic_score_params.js +363 -0
  242. package/dest/services/index.d.ts +6 -1
  243. package/dest/services/index.d.ts.map +1 -1
  244. package/dest/services/index.js +5 -0
  245. package/dest/services/libp2p/instrumentation.d.ts +22 -0
  246. package/dest/services/libp2p/instrumentation.d.ts.map +1 -0
  247. package/dest/services/libp2p/instrumentation.js +136 -0
  248. package/dest/services/libp2p/libp2p_service.d.ts +165 -111
  249. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  250. package/dest/services/libp2p/libp2p_service.js +1517 -379
  251. package/dest/services/peer-manager/interface.d.ts +23 -0
  252. package/dest/services/peer-manager/interface.d.ts.map +1 -0
  253. package/dest/services/peer-manager/interface.js +1 -0
  254. package/dest/services/peer-manager/metrics.d.ts +14 -3
  255. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  256. package/dest/services/peer-manager/metrics.js +50 -12
  257. package/dest/services/peer-manager/peer_manager.d.ts +108 -24
  258. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  259. package/dest/services/peer-manager/peer_manager.js +583 -85
  260. package/dest/services/peer-manager/peer_scoring.d.ts +12 -2
  261. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  262. package/dest/services/peer-manager/peer_scoring.js +99 -13
  263. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +44 -0
  264. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -0
  265. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +534 -0
  266. package/dest/services/reqresp/batch-tx-requester/config.d.ts +17 -0
  267. package/dest/services/reqresp/batch-tx-requester/config.d.ts.map +1 -0
  268. package/dest/services/reqresp/batch-tx-requester/config.js +27 -0
  269. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +50 -0
  270. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -0
  271. package/dest/services/reqresp/batch-tx-requester/interface.js +1 -0
  272. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +35 -0
  273. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -0
  274. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +136 -0
  275. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +62 -0
  276. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -0
  277. package/dest/services/reqresp/batch-tx-requester/peer_collection.js +176 -0
  278. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +11 -0
  279. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -0
  280. package/dest/services/reqresp/batch-tx-requester/tx_validator.js +7 -0
  281. package/dest/services/reqresp/config.d.ts +13 -11
  282. package/dest/services/reqresp/config.d.ts.map +1 -1
  283. package/dest/services/reqresp/config.js +18 -4
  284. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +32 -17
  285. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -1
  286. package/dest/services/reqresp/connection-sampler/connection_sampler.js +154 -84
  287. package/dest/services/reqresp/constants.d.ts +12 -0
  288. package/dest/services/reqresp/constants.d.ts.map +1 -0
  289. package/dest/services/reqresp/constants.js +7 -0
  290. package/dest/services/reqresp/index.d.ts +3 -2
  291. package/dest/services/reqresp/index.d.ts.map +1 -1
  292. package/dest/services/reqresp/index.js +2 -1
  293. package/dest/services/reqresp/interface.d.ts +88 -30
  294. package/dest/services/reqresp/interface.d.ts.map +1 -1
  295. package/dest/services/reqresp/interface.js +61 -38
  296. package/dest/services/reqresp/metrics.d.ts +6 -5
  297. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  298. package/dest/services/reqresp/metrics.js +16 -21
  299. package/dest/services/reqresp/protocols/auth.d.ts +43 -0
  300. package/dest/services/reqresp/protocols/auth.d.ts.map +1 -0
  301. package/dest/services/reqresp/protocols/auth.js +71 -0
  302. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +35 -0
  303. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -0
  304. package/dest/services/reqresp/protocols/block_txs/bitvector.js +88 -0
  305. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +13 -0
  306. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -0
  307. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +60 -0
  308. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +75 -0
  309. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -0
  310. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +139 -0
  311. package/dest/services/reqresp/protocols/block_txs/index.d.ts +4 -0
  312. package/dest/services/reqresp/protocols/block_txs/index.d.ts.map +1 -0
  313. package/dest/services/reqresp/protocols/block_txs/index.js +3 -0
  314. package/dest/services/reqresp/protocols/goodbye.d.ts +3 -5
  315. package/dest/services/reqresp/protocols/goodbye.d.ts.map +1 -1
  316. package/dest/services/reqresp/protocols/goodbye.js +7 -7
  317. package/dest/services/reqresp/protocols/index.d.ts +3 -2
  318. package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
  319. package/dest/services/reqresp/protocols/index.js +2 -1
  320. package/dest/services/reqresp/protocols/ping.d.ts +1 -3
  321. package/dest/services/reqresp/protocols/ping.d.ts.map +1 -1
  322. package/dest/services/reqresp/protocols/status.d.ts +40 -7
  323. package/dest/services/reqresp/protocols/status.d.ts.map +1 -1
  324. package/dest/services/reqresp/protocols/status.js +76 -5
  325. package/dest/services/reqresp/protocols/tx.d.ts +20 -4
  326. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  327. package/dest/services/reqresp/protocols/tx.js +52 -6
  328. package/dest/services/reqresp/rate-limiter/index.d.ts +1 -1
  329. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +10 -7
  330. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
  331. package/dest/services/reqresp/rate-limiter/rate_limiter.js +20 -10
  332. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
  333. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
  334. package/dest/services/reqresp/rate-limiter/rate_limits.js +16 -6
  335. package/dest/services/reqresp/reqresp.d.ts +32 -91
  336. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  337. package/dest/services/reqresp/reqresp.js +695 -355
  338. package/dest/services/reqresp/status.d.ts +10 -4
  339. package/dest/services/reqresp/status.d.ts.map +1 -1
  340. package/dest/services/reqresp/status.js +9 -2
  341. package/dest/services/service.d.ts +76 -23
  342. package/dest/services/service.d.ts.map +1 -1
  343. package/dest/services/tx_collection/config.d.ts +25 -0
  344. package/dest/services/tx_collection/config.d.ts.map +1 -0
  345. package/dest/services/tx_collection/config.js +59 -0
  346. package/dest/services/tx_collection/file_store_tx_collection.d.ts +37 -0
  347. package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -0
  348. package/dest/services/tx_collection/file_store_tx_collection.js +127 -0
  349. package/dest/services/tx_collection/file_store_tx_source.d.ts +38 -0
  350. package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -0
  351. package/dest/services/tx_collection/file_store_tx_source.js +100 -0
  352. package/dest/services/tx_collection/index.d.ts +4 -0
  353. package/dest/services/tx_collection/index.d.ts.map +1 -0
  354. package/dest/services/tx_collection/index.js +3 -0
  355. package/dest/services/tx_collection/instrumentation.d.ts +10 -0
  356. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -0
  357. package/dest/services/tx_collection/instrumentation.js +30 -0
  358. package/dest/services/tx_collection/request_tracker.d.ts +53 -0
  359. package/dest/services/tx_collection/request_tracker.d.ts.map +1 -0
  360. package/dest/services/tx_collection/request_tracker.js +84 -0
  361. package/dest/services/tx_collection/tx_collection.d.ts +104 -0
  362. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -0
  363. package/dest/services/tx_collection/tx_collection.js +356 -0
  364. package/dest/services/tx_collection/tx_collection_sink.d.ts +40 -0
  365. package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -0
  366. package/dest/services/tx_collection/tx_collection_sink.js +108 -0
  367. package/dest/services/tx_collection/tx_source.d.ts +24 -0
  368. package/dest/services/tx_collection/tx_source.d.ts.map +1 -0
  369. package/dest/services/tx_collection/tx_source.js +50 -0
  370. package/dest/services/tx_file_store/config.d.ts +16 -0
  371. package/dest/services/tx_file_store/config.d.ts.map +1 -0
  372. package/dest/services/tx_file_store/config.js +22 -0
  373. package/dest/services/tx_file_store/index.d.ts +4 -0
  374. package/dest/services/tx_file_store/index.d.ts.map +1 -0
  375. package/dest/services/tx_file_store/index.js +3 -0
  376. package/dest/services/tx_file_store/instrumentation.d.ts +15 -0
  377. package/dest/services/tx_file_store/instrumentation.d.ts.map +1 -0
  378. package/dest/services/tx_file_store/instrumentation.js +29 -0
  379. package/dest/services/tx_file_store/tx_file_store.d.ts +46 -0
  380. package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -0
  381. package/dest/services/tx_file_store/tx_file_store.js +142 -0
  382. package/dest/services/tx_provider.d.ts +53 -0
  383. package/dest/services/tx_provider.d.ts.map +1 -0
  384. package/dest/services/tx_provider.js +223 -0
  385. package/dest/services/tx_provider_instrumentation.d.ts +16 -0
  386. package/dest/services/tx_provider_instrumentation.d.ts.map +1 -0
  387. package/dest/services/tx_provider_instrumentation.js +34 -0
  388. package/dest/test-helpers/generate-peer-id-private-keys.d.ts +1 -1
  389. package/dest/test-helpers/get-ports.d.ts +1 -1
  390. package/dest/test-helpers/get-ports.d.ts.map +1 -1
  391. package/dest/test-helpers/index.d.ts +4 -1
  392. package/dest/test-helpers/index.d.ts.map +1 -1
  393. package/dest/test-helpers/index.js +3 -0
  394. package/dest/test-helpers/make-enrs.d.ts +1 -1
  395. package/dest/test-helpers/make-enrs.d.ts.map +1 -1
  396. package/dest/test-helpers/make-enrs.js +4 -5
  397. package/dest/test-helpers/make-test-p2p-clients.d.ts +35 -8
  398. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  399. package/dest/test-helpers/make-test-p2p-clients.js +89 -17
  400. package/dest/test-helpers/mock-pubsub.d.ts +99 -0
  401. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -0
  402. package/dest/test-helpers/mock-pubsub.js +231 -0
  403. package/dest/test-helpers/mock-tx-helpers.d.ts +12 -0
  404. package/dest/test-helpers/mock-tx-helpers.d.ts.map +1 -0
  405. package/dest/test-helpers/mock-tx-helpers.js +19 -0
  406. package/dest/test-helpers/reqresp-nodes.d.ts +17 -15
  407. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  408. package/dest/test-helpers/reqresp-nodes.js +73 -40
  409. package/dest/test-helpers/test_tx_provider.d.ts +42 -0
  410. package/dest/test-helpers/test_tx_provider.d.ts.map +1 -0
  411. package/dest/test-helpers/test_tx_provider.js +44 -0
  412. package/dest/test-helpers/testbench-utils.d.ts +161 -0
  413. package/dest/test-helpers/testbench-utils.d.ts.map +1 -0
  414. package/dest/test-helpers/testbench-utils.js +391 -0
  415. package/dest/testbench/p2p_client_testbench_worker.d.ts +26 -2
  416. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  417. package/dest/testbench/p2p_client_testbench_worker.js +310 -95
  418. package/dest/testbench/parse_log_file.d.ts +1 -1
  419. package/dest/testbench/parse_log_file.js +4 -4
  420. package/dest/testbench/testbench.d.ts +1 -1
  421. package/dest/testbench/testbench.js +4 -4
  422. package/dest/testbench/worker_client_manager.d.ts +57 -11
  423. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  424. package/dest/testbench/worker_client_manager.js +283 -58
  425. package/dest/types/index.d.ts +4 -2
  426. package/dest/types/index.d.ts.map +1 -1
  427. package/dest/types/index.js +2 -0
  428. package/dest/util.d.ts +33 -20
  429. package/dest/util.d.ts.map +1 -1
  430. package/dest/util.js +98 -71
  431. package/dest/versioning.d.ts +6 -9
  432. package/dest/versioning.d.ts.map +1 -1
  433. package/dest/versioning.js +9 -25
  434. package/package.json +33 -27
  435. package/src/bootstrap/bootstrap.ts +42 -15
  436. package/src/client/factory.ts +242 -60
  437. package/src/client/index.ts +1 -0
  438. package/src/client/interface.ts +239 -0
  439. package/src/client/p2p_client.ts +527 -460
  440. package/src/client/test/p2p_client.batch_tx_requester.bench.README.md +197 -0
  441. package/src/config.ts +518 -127
  442. package/src/enr/generate-enr.ts +39 -6
  443. package/src/errors/attestation-pool.error.ts +13 -0
  444. package/src/errors/p2p-service.error.ts +11 -0
  445. package/src/errors/reqresp.error.ts +0 -25
  446. package/src/errors/tx-pool.error.ts +12 -0
  447. package/src/index.ts +5 -1
  448. package/src/mem_pools/attestation_pool/attestation_pool.ts +605 -29
  449. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +828 -201
  450. package/src/mem_pools/attestation_pool/index.ts +9 -2
  451. package/src/mem_pools/attestation_pool/mocks.ts +32 -19
  452. package/src/mem_pools/index.ts +2 -2
  453. package/src/mem_pools/instrumentation.ts +79 -47
  454. package/src/mem_pools/interface.ts +5 -7
  455. package/src/mem_pools/tx_pool_v2/README.md +283 -0
  456. package/src/mem_pools/tx_pool_v2/archive/index.ts +1 -0
  457. package/src/mem_pools/tx_pool_v2/archive/tx_archive.ts +112 -0
  458. package/src/mem_pools/tx_pool_v2/deleted_pool.ts +321 -0
  459. package/src/mem_pools/tx_pool_v2/eviction/eviction_manager.ts +160 -0
  460. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +122 -0
  461. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +125 -0
  462. package/src/mem_pools/tx_pool_v2/eviction/index.ts +28 -0
  463. package/src/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.ts +65 -0
  464. package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +219 -0
  465. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +74 -0
  466. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +101 -0
  467. package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +91 -0
  468. package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +99 -0
  469. package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +32 -0
  470. package/src/mem_pools/tx_pool_v2/index.ts +12 -0
  471. package/src/mem_pools/tx_pool_v2/instrumentation.ts +69 -0
  472. package/src/mem_pools/tx_pool_v2/interfaces.ts +250 -0
  473. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +349 -0
  474. package/src/mem_pools/tx_pool_v2/tx_pool_bench_metrics.ts +77 -0
  475. package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +430 -0
  476. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +238 -0
  477. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +1090 -0
  478. package/src/msg_validators/attestation_validator/README.md +49 -0
  479. package/src/msg_validators/attestation_validator/attestation_validator.ts +105 -15
  480. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +101 -0
  481. package/src/msg_validators/attestation_validator/index.ts +1 -0
  482. package/src/msg_validators/clock_tolerance.ts +121 -0
  483. package/src/msg_validators/index.ts +1 -1
  484. package/src/msg_validators/msg_seen_validator/msg_seen_validator.ts +36 -0
  485. package/src/msg_validators/proposal_validator/README.md +123 -0
  486. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +30 -0
  487. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +41 -0
  488. package/src/msg_validators/proposal_validator/index.ts +3 -0
  489. package/src/msg_validators/proposal_validator/proposal_validator.ts +159 -0
  490. package/src/msg_validators/tx_validator/README.md +127 -0
  491. package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +8 -17
  492. package/src/msg_validators/tx_validator/allowed_public_setup.ts +30 -0
  493. package/src/msg_validators/tx_validator/allowed_setup_helpers.ts +31 -0
  494. package/src/msg_validators/tx_validator/archive_cache.ts +28 -0
  495. package/src/msg_validators/tx_validator/block_header_validator.ts +23 -10
  496. package/src/msg_validators/tx_validator/cached_tx_validator.ts +31 -0
  497. package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
  498. package/src/msg_validators/tx_validator/data_validator.ts +138 -71
  499. package/src/msg_validators/tx_validator/double_spend_validator.ts +31 -23
  500. package/src/msg_validators/tx_validator/factory.ts +478 -0
  501. package/src/msg_validators/tx_validator/fee_payer_balance.ts +44 -0
  502. package/src/msg_validators/tx_validator/gas_validator.ts +268 -0
  503. package/src/msg_validators/tx_validator/index.ts +12 -0
  504. package/src/msg_validators/tx_validator/metadata_validator.ts +80 -24
  505. package/src/msg_validators/tx_validator/nullifier_cache.ts +30 -0
  506. package/src/msg_validators/tx_validator/phases_validator.ts +173 -0
  507. package/src/msg_validators/tx_validator/size_validator.ts +22 -0
  508. package/src/msg_validators/tx_validator/test_utils.ts +43 -0
  509. package/src/msg_validators/tx_validator/timestamp_validator.ts +57 -0
  510. package/src/msg_validators/tx_validator/tx_permitted_validator.ts +22 -0
  511. package/src/msg_validators/tx_validator/tx_proof_validator.ts +16 -8
  512. package/src/msg_validators/tx_validator/tx_validation_cache.ts +101 -0
  513. package/src/services/data_store.ts +14 -19
  514. package/src/services/discv5/discV5_service.ts +118 -39
  515. package/src/services/dummy_service.ts +196 -20
  516. package/src/services/encoding.ts +95 -11
  517. package/src/services/gossipsub/README.md +641 -0
  518. package/src/services/gossipsub/index.ts +2 -0
  519. package/src/services/gossipsub/scoring.ts +29 -5
  520. package/src/services/gossipsub/topic_score_params.ts +519 -0
  521. package/src/services/index.ts +5 -0
  522. package/src/services/libp2p/instrumentation.ts +140 -0
  523. package/src/services/libp2p/libp2p_service.ts +1373 -438
  524. package/src/services/peer-manager/interface.ts +29 -0
  525. package/src/services/peer-manager/metrics.ts +62 -12
  526. package/src/services/peer-manager/peer_manager.ts +695 -83
  527. package/src/services/peer-manager/peer_scoring.ts +96 -7
  528. package/src/services/reqresp/README.md +215 -0
  529. package/src/services/reqresp/batch-tx-requester/README.md +344 -0
  530. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +660 -0
  531. package/src/services/reqresp/batch-tx-requester/config.ts +40 -0
  532. package/src/services/reqresp/batch-tx-requester/interface.ts +61 -0
  533. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +168 -0
  534. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +249 -0
  535. package/src/services/reqresp/batch-tx-requester/tx_validator.ts +24 -0
  536. package/src/services/reqresp/config.ts +27 -10
  537. package/src/services/reqresp/connection-sampler/connection_sampler.ts +166 -95
  538. package/src/services/reqresp/constants.ts +14 -0
  539. package/src/services/reqresp/index.ts +2 -0
  540. package/src/services/reqresp/interface.ts +116 -59
  541. package/src/services/reqresp/metrics.ts +39 -28
  542. package/src/services/reqresp/protocols/auth.ts +83 -0
  543. package/src/services/reqresp/protocols/block_txs/bitvector.ts +107 -0
  544. package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +80 -0
  545. package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +171 -0
  546. package/src/services/reqresp/protocols/block_txs/index.ts +3 -0
  547. package/src/services/reqresp/protocols/goodbye.ts +9 -7
  548. package/src/services/reqresp/protocols/index.ts +2 -1
  549. package/src/services/reqresp/protocols/status.ts +121 -5
  550. package/src/services/reqresp/protocols/tx.ts +56 -8
  551. package/src/services/reqresp/rate-limiter/rate_limiter.ts +25 -12
  552. package/src/services/reqresp/rate-limiter/rate_limits.ts +16 -6
  553. package/src/services/reqresp/reqresp.ts +397 -422
  554. package/src/services/reqresp/status.ts +12 -3
  555. package/src/services/service.ts +104 -28
  556. package/src/services/tx_collection/config.ts +89 -0
  557. package/src/services/tx_collection/file_store_tx_collection.ts +153 -0
  558. package/src/services/tx_collection/file_store_tx_source.ts +129 -0
  559. package/src/services/tx_collection/index.ts +3 -0
  560. package/src/services/tx_collection/instrumentation.ts +35 -0
  561. package/src/services/tx_collection/request_tracker.ts +127 -0
  562. package/src/services/tx_collection/tx_collection.ts +468 -0
  563. package/src/services/tx_collection/tx_collection_sink.ts +125 -0
  564. package/src/services/tx_collection/tx_source.ts +57 -0
  565. package/src/services/tx_file_store/config.ts +37 -0
  566. package/src/services/tx_file_store/index.ts +3 -0
  567. package/src/services/tx_file_store/instrumentation.ts +36 -0
  568. package/src/services/tx_file_store/tx_file_store.ts +163 -0
  569. package/src/services/tx_provider.ts +238 -0
  570. package/src/services/tx_provider_instrumentation.ts +54 -0
  571. package/src/test-helpers/index.ts +3 -0
  572. package/src/test-helpers/make-enrs.ts +4 -5
  573. package/src/test-helpers/make-test-p2p-clients.ts +117 -26
  574. package/src/test-helpers/mock-pubsub.ts +311 -0
  575. package/src/test-helpers/mock-tx-helpers.ts +24 -0
  576. package/src/test-helpers/reqresp-nodes.ts +101 -62
  577. package/src/test-helpers/test_tx_provider.ts +69 -0
  578. package/src/test-helpers/testbench-utils.ts +453 -0
  579. package/src/testbench/p2p_client_testbench_worker.ts +477 -95
  580. package/src/testbench/parse_log_file.ts +4 -4
  581. package/src/testbench/testbench.ts +4 -4
  582. package/src/testbench/worker_client_manager.ts +366 -63
  583. package/src/types/index.ts +2 -0
  584. package/src/util.ts +128 -93
  585. package/src/versioning.ts +11 -34
  586. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +0 -22
  587. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +0 -1
  588. package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +0 -112
  589. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +0 -17
  590. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +0 -1
  591. package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +0 -129
  592. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +0 -66
  593. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +0 -1
  594. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +0 -245
  595. package/dest/mem_pools/tx_pool/index.d.ts +0 -4
  596. package/dest/mem_pools/tx_pool/index.d.ts.map +0 -1
  597. package/dest/mem_pools/tx_pool/index.js +0 -3
  598. package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts +0 -56
  599. package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts.map +0 -1
  600. package/dest/mem_pools/tx_pool/memory_tx_pool.js +0 -141
  601. package/dest/mem_pools/tx_pool/priority.d.ts +0 -8
  602. package/dest/mem_pools/tx_pool/priority.d.ts.map +0 -1
  603. package/dest/mem_pools/tx_pool/priority.js +0 -10
  604. package/dest/mem_pools/tx_pool/tx_pool.d.ts +0 -66
  605. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +0 -1
  606. package/dest/mem_pools/tx_pool/tx_pool.js +0 -3
  607. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +0 -7
  608. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +0 -1
  609. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +0 -169
  610. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts +0 -8
  611. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts.map +0 -1
  612. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.js +0 -21
  613. package/dest/msg_validators/block_proposal_validator/index.d.ts +0 -2
  614. package/dest/msg_validators/block_proposal_validator/index.d.ts.map +0 -1
  615. package/dest/msg_validators/block_proposal_validator/index.js +0 -1
  616. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +0 -45
  617. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +0 -1
  618. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +0 -88
  619. package/dest/services/reqresp/protocols/block.d.ts +0 -4
  620. package/dest/services/reqresp/protocols/block.d.ts.map +0 -1
  621. package/dest/services/reqresp/protocols/block.js +0 -8
  622. package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +0 -159
  623. package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +0 -161
  624. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -309
  625. package/src/mem_pools/tx_pool/index.ts +0 -3
  626. package/src/mem_pools/tx_pool/memory_tx_pool.ts +0 -174
  627. package/src/mem_pools/tx_pool/priority.ts +0 -13
  628. package/src/mem_pools/tx_pool/tx_pool.ts +0 -76
  629. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +0 -130
  630. package/src/msg_validators/block_proposal_validator/block_proposal_validator.ts +0 -29
  631. package/src/msg_validators/block_proposal_validator/index.ts +0 -1
  632. package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +0 -94
  633. package/src/services/reqresp/protocols/block.ts +0 -15
@@ -1,27 +1,40 @@
1
+ import type { EpochCacheInterface } from '@aztec/epoch-cache';
2
+ import { makeEthSignDigest, tryRecoverAddress } from '@aztec/foundation/crypto/secp256k1-signer';
3
+ import { Fr } from '@aztec/foundation/curves/bn254';
4
+ import type { EthAddress } from '@aztec/foundation/eth-address';
1
5
  import { createLogger } from '@aztec/foundation/log';
2
- import type { PeerInfo } from '@aztec/stdlib/interfaces/server';
6
+ import { bufferToHex } from '@aztec/foundation/string';
7
+ import { DateProvider } from '@aztec/foundation/timer';
8
+ import type { PeerInfo, WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
3
9
  import type { PeerErrorSeverity } from '@aztec/stdlib/p2p';
4
- import { type TelemetryClient, trackSpan } from '@aztec/telemetry-client';
10
+ import type { TelemetryClient } from '@aztec/telemetry-client';
5
11
 
6
- import type { ENR } from '@chainsafe/enr';
7
12
  import type { Connection, PeerId } from '@libp2p/interface';
13
+ import { peerIdFromString } from '@libp2p/peer-id';
8
14
  import type { Multiaddr } from '@multiformats/multiaddr';
15
+ import { ENR } from '@nethermindeth/enr';
9
16
  import { inspect } from 'util';
10
17
 
11
18
  import type { P2PConfig } from '../../config.js';
12
19
  import { PeerEvent } from '../../types/index.js';
13
- import type { PubSubLibp2p } from '../../util.js';
20
+ import type { FullLibp2p } from '../../util.js';
14
21
  import { ReqRespSubProtocol } from '../reqresp/interface.js';
22
+ import { AuthRequest, AuthResponse } from '../reqresp/protocols/auth.js';
15
23
  import { GoodByeReason, prettyGoodbyeReason } from '../reqresp/protocols/goodbye.js';
24
+ import { StatusMessage } from '../reqresp/protocols/status.js';
16
25
  import type { ReqResp } from '../reqresp/reqresp.js';
26
+ import { ReqRespStatus } from '../reqresp/status.js';
17
27
  import type { PeerDiscoveryService } from '../service.js';
28
+ import type { PeerManagerInterface } from './interface.js';
18
29
  import { PeerManagerMetrics } from './metrics.js';
19
30
  import { PeerScoreState, type PeerScoring } from './peer_scoring.js';
20
31
 
21
32
  const MAX_DIAL_ATTEMPTS = 3;
22
33
  const MAX_CACHED_PEERS = 100;
23
34
  const MAX_CACHED_PEER_AGE_MS = 5 * 60 * 1000; // 5 minutes
24
- const FAILED_PEER_BAN_TIME_MS = 5 * 60 * 1000; // 5 minutes timeout after failing MAX_DIAL_ATTEMPTS
35
+ const DEFAULT_FAILED_PEER_BAN_TIME_MS = 5 * 60 * 1000; // 5 minutes timeout after failing MAX_DIAL_ATTEMPTS
36
+ const GOODBYE_DIAL_TIMEOUT_MS = 1000;
37
+ const FAILED_AUTH_HANDSHAKE_EXPIRY_MS = 60 * 60 * 1000; // 1 hour
25
38
 
26
39
  type CachedPeer = {
27
40
  peerId: PeerId;
@@ -36,83 +49,262 @@ type TimedOutPeer = {
36
49
  timeoutUntilMs: number;
37
50
  };
38
51
 
39
- export class PeerManager {
52
+ type FailedAuthHandshakeEntry = {
53
+ count: number;
54
+ lastFailureTimestamp: number;
55
+ };
56
+
57
+ export class PeerManager implements PeerManagerInterface {
40
58
  private cachedPeers: Map<string, CachedPeer> = new Map();
41
59
  private heartbeatCounter: number = 0;
42
60
  private displayPeerCountsPeerHeartbeat: number = 0;
43
61
  private timedOutPeers: Map<string, TimedOutPeer> = new Map();
62
+ private trustedPeers: Set<string> = new Set();
63
+ private trustedPeersInitialized: boolean = false;
64
+ private privatePeers: Set<string> = new Set();
65
+ private privatePeersInitialized: boolean = false;
66
+ private preferredPeers: Set<string> = new Set();
67
+ private authenticatedPeerIdToValidatorAddress: Map<string, EthAddress> = new Map();
68
+ private authenticatedValidatorAddressToPeerId: Map<string, PeerId> = new Map();
69
+ private peersToBeDisconnected: Set<string> = new Set();
70
+ private failedAuthHandshakes: Map<string, FailedAuthHandshakeEntry> = new Map();
71
+ private validatorAddresses: EthAddress[] = [];
72
+ private initializedPreferredPeers: boolean = false;
44
73
 
45
74
  private metrics: PeerManagerMetrics;
46
- private discoveredPeerHandler;
75
+ private handlers: {
76
+ handleConnectedPeerEvent: (e: CustomEvent<PeerId>) => void;
77
+ handleDisconnectedPeerEvent: (e: CustomEvent<PeerId>) => void;
78
+ handleDiscoveredPeer: (enr: ENR) => Promise<void>;
79
+ };
47
80
 
48
81
  constructor(
49
- private libP2PNode: PubSubLibp2p,
82
+ private libP2PNode: FullLibp2p,
50
83
  private peerDiscoveryService: PeerDiscoveryService,
51
84
  private config: P2PConfig,
52
85
  telemetryClient: TelemetryClient,
53
86
  private logger = createLogger('p2p:peer-manager'),
54
87
  private peerScoring: PeerScoring,
55
88
  private reqresp: ReqResp,
89
+ private readonly worldStateSynchronizer: WorldStateSynchronizer,
90
+ private readonly protocolVersion: string,
91
+ private readonly epochCache: EpochCacheInterface,
92
+ private readonly dateProvider: DateProvider = new DateProvider(),
56
93
  ) {
94
+ if (this.config.p2pDisableStatusHandshake && this.config.p2pAllowOnlyValidators) {
95
+ throw new Error('Status handshake disabled but is required to allow only validators to connect.');
96
+ }
57
97
  this.metrics = new PeerManagerMetrics(telemetryClient, 'PeerManager');
58
98
 
99
+ // Handle Discovered peers
100
+ this.handlers = {
101
+ handleConnectedPeerEvent: this.handleConnectedPeerEvent.bind(this),
102
+ handleDisconnectedPeerEvent: this.handleDisconnectedPeerEvent.bind(this),
103
+ handleDiscoveredPeer: (enr: ENR) =>
104
+ this.handleDiscoveredPeer(enr).catch(e => this.logger.error('Error handling discovered peer', e)),
105
+ };
106
+
59
107
  // Handle new established connections
60
- this.libP2PNode.addEventListener(PeerEvent.CONNECTED, this.handleConnectedPeerEvent.bind(this));
108
+ this.libP2PNode.addEventListener(PeerEvent.CONNECTED, this.handlers.handleConnectedPeerEvent);
61
109
  // Handle lost connections
62
- this.libP2PNode.addEventListener(PeerEvent.DISCONNECTED, this.handleDisconnectedPeerEvent.bind(this));
110
+ this.libP2PNode.addEventListener(PeerEvent.DISCONNECTED, this.handlers.handleDisconnectedPeerEvent);
63
111
 
64
- // Handle Discovered peers
65
- this.discoveredPeerHandler = (enr: ENR) =>
66
- this.handleDiscoveredPeer(enr).catch(e => this.logger.error('Error handling discovered peer', e));
67
112
  // eslint-disable-next-line @typescript-eslint/no-misused-promises
68
- this.peerDiscoveryService.on(PeerEvent.DISCOVERED, this.discoveredPeerHandler);
113
+ this.peerDiscoveryService?.on(PeerEvent.DISCOVERED, this.handlers.handleDiscoveredPeer);
69
114
 
70
115
  // Display peer counts every 60 seconds
71
116
  this.displayPeerCountsPeerHeartbeat = Math.floor(60_000 / this.config.peerCheckIntervalMS);
72
117
  }
118
+ /**
119
+ * Initializes the trusted peers.
120
+ *
121
+ * This function is called when the peer manager is initialized.
122
+ */
123
+ async initializePeers() {
124
+ if (this.config.trustedPeers) {
125
+ const trustedPeersEnrs: ENR[] = this.config.trustedPeers.map(enr => ENR.decodeTxt(enr));
126
+ await Promise.all(trustedPeersEnrs.map(enr => enr.peerId()))
127
+ .then(peerIds => peerIds.forEach(peerId => this.trustedPeers.add(peerId.toString())))
128
+ .finally(() => {
129
+ this.trustedPeersInitialized = true;
130
+ })
131
+ .catch(e => this.logger.error('Error initializing trusted peers', e));
132
+ }
133
+
134
+ if (this.config.privatePeers) {
135
+ const privatePeersEnrs: ENR[] = this.config.privatePeers.map(enr => ENR.decodeTxt(enr));
136
+ await Promise.all(privatePeersEnrs.map(enr => enr.peerId()))
137
+ .then(peerIds =>
138
+ peerIds.forEach(peerId => {
139
+ this.trustedPeers.add(peerId.toString());
140
+ this.privatePeers.add(peerId.toString());
141
+ }),
142
+ )
143
+ .finally(() => {
144
+ if (!this.config.trustedPeers) {
145
+ this.trustedPeersInitialized = true;
146
+ }
147
+ this.privatePeersInitialized = true;
148
+ })
149
+ .catch(e => this.logger.error('Error initializing private peers', e));
150
+ }
151
+
152
+ if (this.config.preferredPeers) {
153
+ const preferredPeersEnrs: ENR[] = this.config.preferredPeers.map(enr => ENR.decodeTxt(enr));
154
+ await Promise.all(preferredPeersEnrs.map(enr => enr.peerId()))
155
+ .then(peerIds => peerIds.forEach(peerId => this.preferredPeers.add(peerId.toString())))
156
+ .catch(e => this.logger.error('Error initializing preferred peers', e));
157
+ }
158
+ }
73
159
 
74
160
  get tracer() {
75
161
  return this.metrics.tracer;
76
162
  }
77
163
 
78
- @trackSpan('PeerManager.heartbeat')
79
- public heartbeat() {
164
+ public async heartbeat() {
80
165
  this.heartbeatCounter++;
81
166
  this.peerScoring.decayAllScores();
82
-
83
167
  this.cleanupExpiredTimeouts();
84
168
 
169
+ await this.setupDirectPeersIfValidator();
170
+ await this.updateAuthenticatedPeers();
171
+ await this.processScheduledDisconnects();
172
+
85
173
  this.discover();
86
174
  }
87
175
 
176
+ /*
177
+ * If this node is connecting to preferred peers, make sure it is registered validator */
178
+ async setupDirectPeersIfValidator() {
179
+ if (!this.config.preferredPeers) {
180
+ return;
181
+ }
182
+
183
+ // Already initialized preferred peers, don't wastefully repeat the same work
184
+ if (this.initializedPreferredPeers) {
185
+ return;
186
+ }
187
+
188
+ const registeredValidators = await this.epochCache.getRegisteredValidators();
189
+ const validatorSet = new Set(registeredValidators.map(v => v.toString()));
190
+ const isThisNodePartOfValidatorSet = this.validatorAddresses.some(v => validatorSet.has(v.toString()));
191
+
192
+ if (!isThisNodePartOfValidatorSet) {
193
+ return;
194
+ }
195
+
196
+ const preferredPeersEnrs: ENR[] = this.config.preferredPeers.map(enr => ENR.decodeTxt(enr));
197
+ await Promise.all(preferredPeersEnrs.map(enr => enr.peerId()))
198
+ .then(peerIds => peerIds.forEach(peerId => this.preferredPeers.add(peerId.toString())))
199
+ .catch(e => this.logger.error('Error initializing preferred peers', e));
200
+
201
+ const directPeers = (
202
+ await Promise.all(
203
+ 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()}`);
208
+ }
209
+ return {
210
+ id: peerId,
211
+ addrs: [address],
212
+ };
213
+ }),
214
+ )
215
+ ).filter(peer => peer !== undefined);
216
+
217
+ await Promise.all(
218
+ directPeers.map(peer => {
219
+ this.libP2PNode.services.pubsub.direct.add(peer.id.toString());
220
+
221
+ return this.libP2PNode.peerStore.merge(peer.id, { multiaddrs: peer.addrs });
222
+ }),
223
+ );
224
+
225
+ this.initializedPreferredPeers = true;
226
+ }
227
+
88
228
  /**
89
- * Cleans up expired timeouts.
229
+ * Cleans up expired timeouts and stale failed-auth-handshake entries.
90
230
  *
91
231
  * When peers fail to dial after a number of retries, they are temporarily timed out.
92
232
  * This function removes any peers that have been in the timed out state for too long.
93
233
  * To give them a chance to reconnect.
234
+ *
235
+ * Also evicts entries from the failed-auth-handshake map whose expiry window has passed.
236
+ * Without this, peers that probe once and never reconnect would leave their entries in the
237
+ * map forever, causing an unbounded memory leak.
94
238
  */
95
239
  private cleanupExpiredTimeouts() {
96
- // Clean up expired timeouts
97
- const now = Date.now();
240
+ const now = this.dateProvider.now();
241
+
98
242
  for (const [peerId, timedOutPeer] of this.timedOutPeers.entries()) {
99
243
  if (now >= timedOutPeer.timeoutUntilMs) {
100
244
  this.timedOutPeers.delete(peerId);
101
245
  }
102
246
  }
247
+
248
+ for (const [id, entry] of this.failedAuthHandshakes.entries()) {
249
+ if (now - entry.lastFailureTimestamp > FAILED_AUTH_HANDSHAKE_EXPIRY_MS) {
250
+ this.failedAuthHandshakes.delete(id);
251
+ }
252
+ }
253
+ }
254
+
255
+ /**
256
+ * Processes scheduled disconnects during heartbeat.
257
+ *
258
+ * This batch processes all peers that have been marked for disconnect.
259
+ * preventing immediate disconnects that could cause libp2p state corruption.
260
+ */
261
+ private async processScheduledDisconnects() {
262
+ if (this.peersToBeDisconnected.size === 0) {
263
+ return;
264
+ }
265
+
266
+ const peersToDisconnect = Array.from(this.peersToBeDisconnected);
267
+
268
+ this.logger.debug(`Processing ${peersToDisconnect.length} scheduled disconnects`);
269
+ try {
270
+ await Promise.all(
271
+ peersToDisconnect.map(async peerIdStr => {
272
+ if (await this.disconnectPeer(peerIdFromString(peerIdStr))) {
273
+ this.peersToBeDisconnected.delete(peerIdStr);
274
+ }
275
+ }),
276
+ );
277
+ this.logger.verbose(`Disconnected ${peersToDisconnect.length} peers`, { peersToDisconnect });
278
+ } catch (error) {
279
+ this.logger.error('Error when disconnecting from peers', error);
280
+ }
103
281
  }
104
282
 
105
283
  /**
106
- * Simply logs the type of connected peer.
284
+ * Performs Status Handshake with a connected peer.
107
285
  * @param e - The connected peer event.
108
286
  */
109
287
  private handleConnectedPeerEvent(e: CustomEvent<PeerId>) {
110
288
  const peerId = e.detail;
111
- if (this.peerDiscoveryService.isBootstrapPeer(peerId)) {
112
- this.logger.verbose(`Connected to bootstrap peer ${peerId.toString()}`);
113
- } else {
114
- this.logger.verbose(`Connected to transaction peer ${peerId.toString()}`);
289
+ this.logger.verbose(`Connected to peer ${peerId.toString()}`);
290
+ this.metrics.peerConnected(peerId);
291
+ if (this.config.p2pDisableStatusHandshake) {
292
+ return;
293
+ }
294
+ // If we are not configured to only allow validators then perform a status handshake
295
+ if (!this.config.p2pAllowOnlyValidators) {
296
+ void this.exchangeStatusHandshake(peerId);
297
+ return;
298
+ }
299
+
300
+ // We are configured to only allow validators, but this doesn't apply to trusted, private peers or preferred peers
301
+ if (this.isProtectedPeer(peerId)) {
302
+ void this.exchangeStatusHandshake(peerId);
303
+ return;
115
304
  }
305
+
306
+ // Initiate auth handshake
307
+ void this.exchangeAuthHandshake(peerId);
116
308
  }
117
309
 
118
310
  /**
@@ -121,11 +313,107 @@ export class PeerManager {
121
313
  */
122
314
  private handleDisconnectedPeerEvent(e: CustomEvent<PeerId>) {
123
315
  const peerId = e.detail;
124
- if (this.peerDiscoveryService.isBootstrapPeer(peerId)) {
125
- this.logger.verbose(`Disconnected from bootstrap peer ${peerId.toString()}`);
126
- } else {
127
- this.logger.verbose(`Disconnected from transaction peer ${peerId.toString()}`);
316
+ const peerIdStr = peerId.toString();
317
+ this.metrics.peerDisconnected(peerId);
318
+ this.logger.verbose(`Disconnected from peer ${peerIdStr}`);
319
+ const validatorAddress = this.authenticatedPeerIdToValidatorAddress.get(peerIdStr);
320
+ if (validatorAddress !== undefined) {
321
+ this.logger.info(
322
+ `Removing authentication for validator ${validatorAddress} at peer id ${peerIdStr} due to disconnection`,
323
+ );
324
+ this.authenticatedValidatorAddressToPeerId.delete(validatorAddress.toString());
325
+ this.authenticatedPeerIdToValidatorAddress.delete(peerIdStr);
326
+ }
327
+
328
+ if (this.peerScoring.getScoreState(peerIdStr) === PeerScoreState.Healthy) {
329
+ this.peerScoring.removePeer(peerIdStr);
330
+ }
331
+ }
332
+
333
+ public registerThisValidatorAddresses(address: EthAddress[]): void {
334
+ this.validatorAddresses = [...address];
335
+ }
336
+
337
+ /**
338
+ * Checks if a peer is trusted.
339
+ * @param peerId - The peer ID.
340
+ * @returns True if the peer is trusted, false otherwise.
341
+ * Note: This function will return false and log a warning if the trusted peers are not initialized.
342
+ */
343
+ private isTrustedPeer(peerId: PeerId): boolean {
344
+ if (!this.trustedPeersInitialized) {
345
+ this.logger.warn('Trusted peers not initialized, returning false');
346
+ return false;
347
+ }
348
+ return this.trustedPeers.has(peerId.toString());
349
+ }
350
+
351
+ /**
352
+ * Adds a peer to the trusted peers set.
353
+ * @param peerId - The peer ID to add to trusted peers.
354
+ */
355
+ public addTrustedPeer(peerId: PeerId): void {
356
+ const peerIdStr = peerId.toString();
357
+
358
+ this.trustedPeers.add(peerIdStr);
359
+ this.trustedPeersInitialized = true;
360
+ this.logger.verbose(`Added trusted peer ${peerIdStr}`);
361
+ }
362
+
363
+ /**
364
+ * Adds a peer to the private peers set.
365
+ * @param peerId - The peer ID to add to private peers.
366
+ */
367
+ public addPrivatePeer(peerId: PeerId): void {
368
+ const peerIdStr = peerId.toString();
369
+
370
+ this.trustedPeers.add(peerIdStr);
371
+ this.privatePeers.add(peerIdStr);
372
+ this.trustedPeersInitialized = true;
373
+ this.privatePeersInitialized = true;
374
+ this.logger.verbose(`Added private peer ${peerIdStr}`);
375
+ }
376
+
377
+ /**
378
+ * Checks if a peer is private.
379
+ * @param peerId - The peer ID.
380
+ * @returns True if the peer is private, false otherwise.
381
+ */
382
+ private isPrivatePeer(peerId: PeerId): boolean {
383
+ if (!this.privatePeersInitialized) {
384
+ this.logger.warn('Private peers not initialized, returning false');
385
+ return false;
128
386
  }
387
+ return this.privatePeers.has(peerId.toString());
388
+ }
389
+
390
+ /**
391
+ * Adds a peer to the preferred peers set.
392
+ * @param peerId - The peer ID to add to preferred peers.
393
+ */
394
+ public addPreferredPeer(peerId: PeerId): void {
395
+ const peerIdStr = peerId.toString();
396
+
397
+ this.preferredPeers.add(peerIdStr);
398
+ this.logger.verbose(`Added preferred peer ${peerIdStr}`);
399
+ }
400
+
401
+ /**
402
+ * Checks if a peer is preferred.
403
+ * @param peerId - The peer ID.
404
+ * @returns True if the peer is preferred, false otherwise.
405
+ */
406
+ private isPreferredPeer(peerId: PeerId): boolean {
407
+ return this.preferredPeers.has(peerId.toString());
408
+ }
409
+
410
+ /**
411
+ * Checks if a peer is protected (either trusted or private).
412
+ * @param peerId - The peer ID.
413
+ * @returns True if the peer is protected, false otherwise.
414
+ */
415
+ private isProtectedPeer(peerId: PeerId): boolean {
416
+ return this.isTrustedPeer(peerId) || this.isPrivatePeer(peerId) || this.isPreferredPeer(peerId);
129
417
  }
130
418
 
131
419
  /**
@@ -140,7 +428,7 @@ export class PeerManager {
140
428
 
141
429
  this.metrics.recordGoodbyeReceived(reason);
142
430
 
143
- void this.disconnectPeer(peerId);
431
+ this.markPeerForDisconnect(peerId);
144
432
  }
145
433
 
146
434
  public penalizePeer(peerId: PeerId, penalty: PeerErrorSeverity) {
@@ -151,6 +439,11 @@ export class PeerManager {
151
439
  return this.peerScoring.getScore(peerId);
152
440
  }
153
441
 
442
+ public shouldDisableP2PGossip(peerId: string): boolean {
443
+ const isAuthenticated = this.isAuthenticatedPeer(peerIdFromString(peerId));
444
+ return (this.config.p2pAllowOnlyValidators ?? false) && !isAuthenticated;
445
+ }
446
+
154
447
  public getPeers(includePending = false): PeerInfo[] {
155
448
  const connected = this.libP2PNode
156
449
  .getPeers()
@@ -184,25 +477,63 @@ export class PeerManager {
184
477
  return [...connected, ...dialQueue, ...cachedPeers];
185
478
  }
186
479
 
480
+ public isAuthenticatedPeer(peerId: PeerId): boolean {
481
+ const peerIdAsString = peerId.toString();
482
+ return (
483
+ this.privatePeers.has(peerIdAsString) ||
484
+ this.trustedPeers.has(peerIdAsString) ||
485
+ this.preferredPeers.has(peerIdAsString) ||
486
+ this.authenticatedPeerIdToValidatorAddress.has(peerIdAsString)
487
+ );
488
+ }
489
+
490
+ /*
491
+ * Checks whether peer is allowed to connect
492
+ *
493
+ * @param id: Address of the node or it's peerId
494
+ *
495
+ * @returns: True if node is allowed to connect, otherwise false
496
+ * */
497
+ public isNodeAllowedToConnect(id: string | PeerId): boolean {
498
+ const entry = this.failedAuthHandshakes.get(id.toString());
499
+ if (!entry) {
500
+ return true;
501
+ }
502
+
503
+ // In case entry is too old, remove it and allow connection
504
+ if (this.dateProvider.now() - entry.lastFailureTimestamp > FAILED_AUTH_HANDSHAKE_EXPIRY_MS) {
505
+ this.failedAuthHandshakes.delete(id.toString());
506
+ return true;
507
+ }
508
+
509
+ return entry.count <= this.config.p2pMaxFailedAuthAttemptsAllowed;
510
+ }
511
+
187
512
  /**
188
513
  * Discovers peers.
189
514
  */
190
515
  private discover() {
191
516
  const connections = this.libP2PNode.getConnections();
192
517
 
193
- const healthyConnections = this.prioritizePeers(this.pruneUnhealthyPeers(this.pruneDuplicatePeers(connections)));
518
+ const healthyConnections = this.prioritizePeers(this.pruneUnhealthyPeers(this.getNonProtectedPeers(connections)));
194
519
 
195
520
  // Calculate how many connections we're looking to make
196
- const peersToConnect = this.config.maxPeerCount - healthyConnections.length;
521
+ const protectedPeerCount = this.getProtectedPeerCount();
522
+ const peersToConnect = this.config.maxPeerCount - healthyConnections.length - protectedPeerCount;
197
523
 
198
524
  const logLevel = this.heartbeatCounter % this.displayPeerCountsPeerHeartbeat === 0 ? 'info' : 'debug';
199
- this.logger[logLevel](`Connected to ${healthyConnections.length} peers`, {
200
- connections: healthyConnections.length,
525
+ this.logger[logLevel](`Connected to ${healthyConnections.length + this.trustedPeers.size} peers`, {
526
+ discoveredConnections: healthyConnections.length,
527
+ protectedConnections: protectedPeerCount,
201
528
  maxPeerCount: this.config.maxPeerCount,
202
529
  cachedPeers: this.cachedPeers.size,
530
+ discv5KadPeers: this.peerDiscoveryService.getKadValues().length,
203
531
  ...this.peerScoring.getStats(),
204
532
  });
205
533
 
534
+ this.metrics.recordPeerCount(connections.length);
535
+ this.metrics.recordHealthyPeerCount(healthyConnections.length);
536
+
206
537
  // Exit if no peers to connect
207
538
  if (peersToConnect <= 0) {
208
539
  return;
@@ -217,13 +548,14 @@ export class PeerManager {
217
548
  .filter(Boolean) as string[],
218
549
  );
219
550
 
551
+ const now = this.dateProvider.now();
220
552
  for (const [id, peerData] of this.cachedPeers.entries()) {
221
553
  // if already dialling or connected to, remove from cache
222
554
  if (
223
555
  pendingDials.has(id) ||
224
556
  healthyConnections.some(conn => conn.remotePeer.equals(peerData.peerId)) ||
225
557
  // if peer has been in cache for the max cache age, remove from cache
226
- Date.now() - peerData.addedUnixMs > MAX_CACHED_PEER_AGE_MS
558
+ now - peerData.addedUnixMs > MAX_CACHED_PEER_AGE_MS
227
559
  ) {
228
560
  this.cachedPeers.delete(id);
229
561
  } else {
@@ -248,6 +580,14 @@ export class PeerManager {
248
580
  }
249
581
  }
250
582
 
583
+ private getNonProtectedPeers(connections: Connection[]): Connection[] {
584
+ return connections.filter(conn => !this.isProtectedPeer(conn.remotePeer));
585
+ }
586
+
587
+ private getProtectedPeerCount(): number {
588
+ return this.trustedPeers.size + this.privatePeers.size + this.preferredPeers.size;
589
+ }
590
+
251
591
  private pruneUnhealthyPeers(connections: Connection[]): Connection[] {
252
592
  const connectedHealthyPeers: Connection[] = [];
253
593
 
@@ -255,9 +595,11 @@ export class PeerManager {
255
595
  const score = this.peerScoring.getScoreState(peer.remotePeer.toString());
256
596
  switch (score) {
257
597
  case PeerScoreState.Banned:
598
+ this.metrics.recordLowScoreDisconnect('Banned');
258
599
  void this.goodbyeAndDisconnectPeer(peer.remotePeer, GoodByeReason.BANNED);
259
600
  break;
260
601
  case PeerScoreState.Disconnect:
602
+ this.metrics.recordLowScoreDisconnect('Disconnect');
261
603
  void this.goodbyeAndDisconnectPeer(peer.remotePeer, GoodByeReason.LOW_SCORE);
262
604
  break;
263
605
  case PeerScoreState.Healthy:
@@ -275,75 +617,85 @@ export class PeerManager {
275
617
  * @returns The pruned list of connections.
276
618
  */
277
619
  private prioritizePeers(connections: Connection[]): Connection[] {
278
- if (connections.length > this.config.maxPeerCount) {
279
- // Sort the peer scores from lowest to highest
620
+ const protectedPeerCount = this.getProtectedPeerCount();
621
+ if (connections.length > this.config.maxPeerCount - protectedPeerCount) {
622
+ // Sort the regular peer scores from highest to lowest
280
623
  const prioritizedConnections = connections.sort((connectionA, connectionB) => {
281
624
  const connectionScoreA = this.peerScoring.getScore(connectionA.remotePeer.toString());
282
625
  const connectionScoreB = this.peerScoring.getScore(connectionB.remotePeer.toString());
283
626
  return connectionScoreB - connectionScoreA;
284
627
  });
285
628
 
286
- // Disconnect from the lowest scoring connections.
287
- for (const conn of prioritizedConnections.slice(this.config.maxPeerCount)) {
629
+ // Calculate how many regular peers we can keep
630
+ const peersToKeep = Math.max(0, this.config.maxPeerCount - protectedPeerCount);
631
+
632
+ // Disconnect from the lowest scoring regular connections that exceed our limit
633
+ for (const conn of prioritizedConnections.slice(peersToKeep)) {
288
634
  void this.goodbyeAndDisconnectPeer(conn.remotePeer, GoodByeReason.MAX_PEERS);
289
635
  }
290
- return prioritizedConnections.slice(0, this.config.maxPeerCount);
636
+
637
+ // Return trusted connections plus the highest scoring regular connections up to the max peer count
638
+ return prioritizedConnections.slice(0, peersToKeep);
291
639
  } else {
292
640
  return connections;
293
641
  }
294
642
  }
295
643
 
296
- /**
297
- * If multiple connections to the same peer are found, the oldest connection is kept and the duplicates are pruned.
298
- *
299
- * This is necessary to resolve a race condition where multiple connections to the same peer are established if
300
- * they are discovered at the same time.
301
- *
302
- * @param connections - The list of connections to prune duplicate peers from.
303
- * @returns The pruned list of connections.
304
- */
305
- private pruneDuplicatePeers(connections: Connection[]): Connection[] {
306
- const peerConnections = new Map<string, Connection>();
307
-
308
- for (const conn of connections) {
309
- const peerId = conn.remotePeer.toString();
310
- const existingConnection = peerConnections.get(peerId);
311
- if (!existingConnection) {
312
- peerConnections.set(peerId, conn);
313
- } else {
314
- // Keep the oldest connection for each peer
315
- this.logger.debug(`Found duplicate connection to peer ${peerId}, keeping oldest connection`);
316
- if (conn.timeline.open < existingConnection.timeline.open) {
317
- peerConnections.set(peerId, conn);
318
- void existingConnection.close();
319
- } else {
320
- void conn.close();
321
- }
322
- }
323
- }
324
-
325
- return [...peerConnections.values()];
326
- }
327
-
328
644
  private async goodbyeAndDisconnectPeer(peer: PeerId, reason: GoodByeReason) {
329
645
  this.logger.debug(`Disconnecting peer ${peer.toString()} with reason ${prettyGoodbyeReason(reason)}`);
330
646
 
331
647
  this.metrics.recordGoodbyeSent(reason);
332
648
 
333
649
  try {
334
- await this.reqresp.sendRequestToPeer(peer, ReqRespSubProtocol.GOODBYE, Buffer.from([reason]));
650
+ const resp = await this.reqresp.sendRequestToPeer(
651
+ peer,
652
+ ReqRespSubProtocol.GOODBYE,
653
+ Buffer.from([reason]),
654
+ GOODBYE_DIAL_TIMEOUT_MS,
655
+ );
656
+
657
+ if (resp.status === ReqRespStatus.FAILURE) {
658
+ this.logger.debug(`Failed to send goodbye to peer ${peer.toString()}`);
659
+ } else if (resp.status === ReqRespStatus.SUCCESS) {
660
+ this.logger.verbose(`Sent goodbye to peer ${peer.toString()}`);
661
+ } else {
662
+ this.logger.debug(
663
+ `Unexpected status sending goodbye to peer ${peer.toString()}: ${ReqRespStatus[resp.status]}`,
664
+ );
665
+ }
335
666
  } catch (error) {
336
667
  this.logger.debug(`Failed to send goodbye to peer ${peer.toString()}: ${error}`);
337
668
  } finally {
338
- await this.disconnectPeer(peer);
669
+ this.markPeerForDisconnect(peer);
339
670
  }
340
671
  }
341
672
 
342
- private async disconnectPeer(peer: PeerId) {
673
+ /*
674
+ * Marks peer to be disconnected on the next heartbeat
675
+ * */
676
+ private markPeerForDisconnect(peer: PeerId) {
677
+ const peerIdStr = peer.toString();
678
+ this.logger.debug(`Scheduling peer ${peerIdStr} for disconnection`);
679
+ this.peersToBeDisconnected.add(peerIdStr);
680
+ }
681
+
682
+ /**
683
+ * Performs the actual disconnection of a peer.
684
+ * This is called during heartbeat processing to avoid immediate disconnections.
685
+ *
686
+ * @returns True if peer was disconnect, otherwise false
687
+ */
688
+ private async disconnectPeer(peer: PeerId): Promise<boolean> {
689
+ const peerIdStr = peer.toString();
690
+
343
691
  try {
344
692
  await this.libP2PNode.hangUp(peer);
693
+
694
+ this.logger.debug(`Successfully disconnected peer ${peerIdStr}`);
695
+ return true;
345
696
  } catch (error) {
346
- this.logger.debug(`Failed to disconnect peer ${peer.toString()}`, { error: inspect(error) });
697
+ this.logger.warn(`Failed to disconnect peer ${peerIdStr}`, { error });
698
+ return false;
347
699
  }
348
700
  }
349
701
 
@@ -356,10 +708,16 @@ export class PeerManager {
356
708
  const peerId = await enr.peerId();
357
709
  const peerIdString = peerId.toString();
358
710
 
711
+ // Don't attempt to connect to peers scheduled for disconnection
712
+ if (this.peersToBeDisconnected.has(peerIdString)) {
713
+ this.logger.trace(`Skipping peer scheduled for disconnection ${peerId}`);
714
+ return;
715
+ }
716
+
359
717
  // Check if peer is temporarily timed out
360
718
  const timedOutPeer = this.timedOutPeers.get(peerIdString);
361
719
  if (timedOutPeer) {
362
- if (Date.now() < timedOutPeer.timeoutUntilMs) {
720
+ if (this.dateProvider.now() < timedOutPeer.timeoutUntilMs) {
363
721
  this.logger.trace(`Skipping timed out peer ${peerId}`);
364
722
  return;
365
723
  }
@@ -371,6 +729,12 @@ export class PeerManager {
371
729
  return;
372
730
  }
373
731
 
732
+ // Don't dial peers that have exceeded the auth failure threshold
733
+ if (!this.isNodeAllowedToConnect(peerId)) {
734
+ this.logger.trace(`Skipping peer ${peerId} due to failed auth handshake attempts`);
735
+ return;
736
+ }
737
+
374
738
  const [multiaddrTcp] = await Promise.all([enr.getFullMultiaddr('tcp')]);
375
739
 
376
740
  this.logger.trace(`Handling discovered peer ${peerId} at ${multiaddrTcp?.toString() ?? 'undefined address'}`);
@@ -399,7 +763,7 @@ export class PeerManager {
399
763
  enr,
400
764
  multiaddrTcp,
401
765
  dialAttempts: 0,
402
- addedUnixMs: Date.now(),
766
+ addedUnixMs: this.dateProvider.now(),
403
767
  };
404
768
 
405
769
  // Determine if we should dial immediately or not
@@ -434,7 +798,8 @@ export class PeerManager {
434
798
  // Add to timed out peers
435
799
  this.timedOutPeers.set(id, {
436
800
  peerId: id,
437
- timeoutUntilMs: Date.now() + FAILED_PEER_BAN_TIME_MS,
801
+ timeoutUntilMs:
802
+ this.dateProvider.now() + (this.config.peerFailedBanTimeMs ?? DEFAULT_FAILED_PEER_BAN_TIME_MS),
438
803
  });
439
804
  }
440
805
  }
@@ -458,7 +823,12 @@ export class PeerManager {
458
823
  }
459
824
 
460
825
  // Remove the oldest peers
461
- for (const key of this.cachedPeers.keys()) {
826
+ for (const [key, value] of this.cachedPeers.entries()) {
827
+ if (this.isProtectedPeer(value.peerId)) {
828
+ this.logger.debug(`Not pruning trusted peer ${key}`);
829
+ continue;
830
+ }
831
+
462
832
  this.cachedPeers.delete(key);
463
833
  this.logger.trace(`Pruning peer ${key} from cache`);
464
834
  peersToDelete--;
@@ -468,21 +838,263 @@ export class PeerManager {
468
838
  }
469
839
  }
470
840
 
841
+ private async createStatusMessage() {
842
+ const syncSummary = (await this.worldStateSynchronizer.status()).syncSummary;
843
+ return StatusMessage.fromWorldStateSyncStatus(this.protocolVersion, syncSummary);
844
+ }
845
+
846
+ /**
847
+ * Performs status Handshake with the Peer
848
+ * The way the protocol is designed is that each peer will call this method on newly established p2p connection.
849
+ * Both peers request Status message and both peers perform validation of the received Status message.
850
+ * If this validation fails on any end that peer will initiate disconnect.
851
+ * Note: It's important for both peers to request and perform Status validation,
852
+ * Because one of the peers can be _bad peer_ and this peer can simply skip the check.
853
+ * If we don't implement validation on both ends the _bad peer_ remains connected.
854
+ * @param: peerId The Id of the peer to request the Status from.
855
+ * */
856
+ private async exchangeStatusHandshake(peerId: PeerId) {
857
+ try {
858
+ const ourStatus = await this.createStatusMessage();
859
+ //Note: Technically we don't have to send out status to peer as well, but we do.
860
+ //It will be easier to update protocol in the future this way if need be.
861
+ this.logger.trace(`Initiating status handshake with peer ${peerId}`);
862
+ const response = await this.reqresp.sendRequestToPeer(peerId, ReqRespSubProtocol.STATUS, ourStatus.toBuffer());
863
+ const { status } = response;
864
+ if (status !== ReqRespStatus.SUCCESS) {
865
+ //TODO: maybe hard ban these peers in the future.
866
+ //We could allow this to happen up to N times, and then hard ban?
867
+ //Hard ban: Disallow connection via e.g. libp2p's Gater
868
+ this.logger.debug(`Disconnecting peer ${peerId} who failed to respond status handshake`, {
869
+ peerId,
870
+ status: ReqRespStatus[status],
871
+ });
872
+ this.markPeerForDisconnect(peerId);
873
+ return;
874
+ }
875
+
876
+ const { data } = response;
877
+ const logData = { peerId, status: ReqRespStatus[status], data: data ? bufferToHex(data) : undefined };
878
+ const peerStatusMessage = StatusMessage.fromBuffer(data);
879
+ if (!ourStatus.validate(peerStatusMessage)) {
880
+ this.logger.debug(`Disconnecting peer ${peerId} due to failed status handshake.`, logData);
881
+ this.markPeerForDisconnect(peerId);
882
+ return;
883
+ }
884
+ this.logger.debug(`Successfully completed status handshake with peer ${peerId}`, logData);
885
+ } catch (err: any) {
886
+ //TODO: maybe hard ban these peers in the future
887
+ this.logger.debug(`Disconnecting peer ${peerId} due to error during status handshake: ${err.message ?? err}`, {
888
+ peerId,
889
+ });
890
+ this.markPeerForDisconnect(peerId);
891
+ }
892
+ }
893
+
894
+ /**
895
+ * Performs auth Handshake with the Peer
896
+ * A superset of the status handshake. Also includes a challenge that needs to be signed by the peer's validator key.
897
+ * @param: peerId The Id of the peer to request the Status from.
898
+ * */
899
+ private async exchangeAuthHandshake(peerId: PeerId) {
900
+ const peerIdString = peerId.toString();
901
+
902
+ try {
903
+ const ourStatus = await this.createStatusMessage();
904
+ const authRequest = new AuthRequest(ourStatus, Fr.random());
905
+
906
+ // Note: Technically we don't have to send our status to peer as well, but we do.
907
+ // It will be easier to update protocol in the future this way if need be.
908
+ // We also need to send the challenge at least, so that the peer can sign it.
909
+ this.logger.debug(`Initiating auth handshake with peer ${peerId}`);
910
+ const response = await this.reqresp.sendRequestToPeer(peerId, ReqRespSubProtocol.AUTH, authRequest.toBuffer());
911
+ const { status } = response;
912
+ if (status !== ReqRespStatus.SUCCESS) {
913
+ this.logger.verbose(`Disconnecting peer ${peerId} who failed to respond auth handshake`, {
914
+ peerId,
915
+ status: ReqRespStatus[status],
916
+ });
917
+ this.markAuthHandshakeFailed(peerId);
918
+ this.markPeerForDisconnect(peerId);
919
+ return;
920
+ }
921
+
922
+ const { data } = response;
923
+ const logData = { peerId, status: ReqRespStatus[status], data: data ? bufferToHex(data) : undefined };
924
+
925
+ const peerAuthResponse = AuthResponse.fromBuffer(data);
926
+
927
+ const peerStatusMessage = peerAuthResponse.status;
928
+ if (!ourStatus.validate(peerStatusMessage)) {
929
+ this.logger.verbose(`Disconnecting peer ${peerId} due to failed status handshake as part of auth.`, logData);
930
+ this.markAuthHandshakeFailed(peerId);
931
+ this.markPeerForDisconnect(peerId);
932
+ return;
933
+ }
934
+
935
+ const hashToRecover = authRequest.getPayloadToSign();
936
+ const ethSignedHash = makeEthSignDigest(hashToRecover);
937
+ const sender = tryRecoverAddress(ethSignedHash, peerAuthResponse.signature);
938
+ if (!sender) {
939
+ this.logger.verbose(`Disconnecting peer ${peerId} due to failed auth handshake, invalid signature.`, logData);
940
+ this.markAuthHandshakeFailed(peerId);
941
+ this.markPeerForDisconnect(peerId);
942
+ return;
943
+ }
944
+
945
+ const registeredValidators = await this.epochCache.getRegisteredValidators();
946
+ const found = registeredValidators.find(v => v.toString() === sender.toString()) !== undefined;
947
+ if (!found) {
948
+ this.logger.verbose(
949
+ `Disconnecting peer ${peerId} due to failed auth handshake, peer is not a registered validator.`,
950
+ { ...logData, address: sender.toString() },
951
+ );
952
+ this.markAuthHandshakeFailed(peerId);
953
+ this.markPeerForDisconnect(peerId);
954
+ return;
955
+ }
956
+
957
+ // Check to see that this validator address isn't already allocated to a different peer
958
+ const peerForAddress = this.authenticatedValidatorAddressToPeerId.get(sender.toString());
959
+ if (peerForAddress !== undefined && peerForAddress.toString() !== peerIdString) {
960
+ this.logger.verbose(
961
+ `Received auth for validator ${sender.toString()} from peer ${peerIdString}, but this validator is already authenticated to peer ${peerForAddress.toString()}`,
962
+ { ...logData, address: sender.toString() },
963
+ );
964
+ this.markAuthHandshakeFailed(peerId);
965
+ this.markPeerForDisconnect(peerId);
966
+ return;
967
+ }
968
+
969
+ this.markAuthHandshakeSuccess(peerId);
970
+ this.authenticatedPeerIdToValidatorAddress.set(peerIdString, sender);
971
+ this.authenticatedValidatorAddressToPeerId.set(sender.toString(), peerId);
972
+ this.logger.info(
973
+ `Successfully completed auth handshake with peer ${peerId}, validator address ${sender.toString()}`,
974
+ { ...logData, address: sender.toString() },
975
+ );
976
+ } catch (err: any) {
977
+ //TODO: maybe hard ban these peers in the future
978
+ this.logger.verbose(`Disconnecting peer ${peerId} due to error during auth handshake: ${err.message}`, {
979
+ peerId,
980
+ err,
981
+ });
982
+ this.markAuthHandshakeFailed(peerId);
983
+ this.markPeerForDisconnect(peerId);
984
+ }
985
+ }
986
+
987
+ /*
988
+ * Marks when peer fails auth handshake
989
+ * */
990
+ private markAuthHandshakeFailed(peerId: PeerId) {
991
+ const now = this.dateProvider.now();
992
+ const peerIdStr = peerId.toString();
993
+
994
+ const existingEntry = this.failedAuthHandshakes.get(peerIdStr);
995
+ const failureCount = (existingEntry?.count || 0) + 1;
996
+ this.failedAuthHandshakes.set(peerIdStr, {
997
+ count: failureCount,
998
+ lastFailureTimestamp: now,
999
+ });
1000
+
1001
+ const connections = this.libP2PNode.getConnections(peerId);
1002
+ connections.forEach(conn => {
1003
+ const address = conn.remoteAddr.nodeAddress().address;
1004
+ const existingAddressEntry = this.failedAuthHandshakes.get(address);
1005
+ this.failedAuthHandshakes.set(address, {
1006
+ count: (existingAddressEntry?.count || 0) + 1,
1007
+ lastFailureTimestamp: now,
1008
+ });
1009
+ });
1010
+
1011
+ // Ban the peer from being re-dialed for a cooldown period (exponential backoff)
1012
+ const banTimeMs = this.config.peerFailedBanTimeMs ?? DEFAULT_FAILED_PEER_BAN_TIME_MS;
1013
+ const backoffMs = banTimeMs * Math.pow(2, Math.min(failureCount - 1, 5));
1014
+ this.timedOutPeers.set(peerIdStr, {
1015
+ peerId: peerIdStr,
1016
+ timeoutUntilMs: now + backoffMs,
1017
+ });
1018
+ this.cachedPeers.delete(peerIdStr);
1019
+ }
1020
+
1021
+ /*
1022
+ * Marks when peer exchanges auth handshake
1023
+ * Removes any failed previous attempts
1024
+ * */
1025
+ private markAuthHandshakeSuccess(peerId: PeerId) {
1026
+ this.failedAuthHandshakes.delete(peerId.toString());
1027
+
1028
+ const connections = this.libP2PNode.getConnections(peerId);
1029
+ connections.forEach(conn => {
1030
+ const address = conn.remoteAddr.nodeAddress().address;
1031
+ this.failedAuthHandshakes.delete(address);
1032
+ });
1033
+ }
1034
+
471
1035
  /**
472
1036
  * Stops the peer manager.
473
1037
  * Removing all event listeners.
474
1038
  */
475
1039
  public async stop() {
476
1040
  // eslint-disable-next-line @typescript-eslint/no-misused-promises
477
- this.peerDiscoveryService.off(PeerEvent.DISCOVERED, this.discoveredPeerHandler);
1041
+ this.peerDiscoveryService.off(PeerEvent.DISCOVERED, this.handlers.handleDiscoveredPeer);
478
1042
 
479
1043
  // Send goodbyes to all peers
480
1044
  await Promise.all(
481
1045
  this.libP2PNode.getPeers().map(peer => this.goodbyeAndDisconnectPeer(peer, GoodByeReason.SHUTDOWN)),
482
1046
  );
483
1047
 
484
- this.libP2PNode.removeEventListener(PeerEvent.CONNECTED, this.handleConnectedPeerEvent);
485
- this.libP2PNode.removeEventListener(PeerEvent.DISCONNECTED, this.handleDisconnectedPeerEvent);
1048
+ this.libP2PNode.removeEventListener(PeerEvent.CONNECTED, this.handlers.handleConnectedPeerEvent);
1049
+ this.libP2PNode.removeEventListener(PeerEvent.DISCONNECTED, this.handlers.handleDisconnectedPeerEvent);
1050
+ }
1051
+
1052
+ private shouldTrustWithIdentity(peerId: PeerId): boolean {
1053
+ return this.isProtectedPeer(peerId);
1054
+ }
1055
+
1056
+ /**
1057
+ * Performs auth request verification from peer. An auth request is valid if requested by an authorized peer (a peer we trust).
1058
+ *
1059
+ * @param: _authRequest - Auth request (unused)
1060
+ * @param: peerId - The ID of the peer that requested the auth handshake
1061
+ *
1062
+ * @returns: StatusMessage if peer is trusted
1063
+ *
1064
+ * @throws: If peer is unauthorized
1065
+ * */
1066
+ public async handleAuthRequestFromPeer(_authRequest: AuthRequest, peerId: PeerId): Promise<StatusMessage> {
1067
+ if (!this.shouldTrustWithIdentity(peerId)) {
1068
+ this.logger.warn(`Received auth request from untrusted peer ${peerId.toString()}`);
1069
+ throw new Error('Unauthorised');
1070
+ }
1071
+ this.logger.debug(`Received auth request from trusted peer ${peerId.toString()}`);
1072
+ return await this.createStatusMessage();
1073
+ }
1074
+
1075
+ private async updateAuthenticatedPeers(): Promise<void> {
1076
+ const registeredValidators = await this.epochCache.getRegisteredValidators();
1077
+ const validatorSet = new Set(registeredValidators.map(v => v.toString()));
1078
+
1079
+ const peersToDelete: Set<string> = new Set();
1080
+ const addressesToDelete: Set<string> = new Set();
1081
+ for (const [peer, address] of this.authenticatedPeerIdToValidatorAddress.entries()) {
1082
+ const addressString = address.toString();
1083
+ if (!validatorSet.has(addressString)) {
1084
+ peersToDelete.add(peer);
1085
+ addressesToDelete.add(addressString);
1086
+ this.logger.info(
1087
+ `Removing authentication for peer ${peer.toString()} at address ${addressString} due to no longer being a registered validator`,
1088
+ );
1089
+ }
1090
+ }
1091
+
1092
+ for (const peer of peersToDelete) {
1093
+ this.authenticatedPeerIdToValidatorAddress.delete(peer);
1094
+ }
1095
+ for (const address of addressesToDelete) {
1096
+ this.authenticatedValidatorAddressToPeerId.delete(address);
1097
+ }
486
1098
  }
487
1099
  }
488
1100