@aztec/p2p 0.0.1-commit.f504929 → 0.0.1-commit.f5d02921e

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 (283) hide show
  1. package/README.md +129 -3
  2. package/dest/client/factory.d.ts +2 -2
  3. package/dest/client/factory.d.ts.map +1 -1
  4. package/dest/client/factory.js +25 -11
  5. package/dest/client/interface.d.ts +9 -2
  6. package/dest/client/interface.d.ts.map +1 -1
  7. package/dest/client/p2p_client.d.ts +3 -2
  8. package/dest/client/p2p_client.d.ts.map +1 -1
  9. package/dest/client/p2p_client.js +37 -36
  10. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +17 -6
  11. package/dest/config.d.ts +24 -2
  12. package/dest/config.d.ts.map +1 -1
  13. package/dest/config.js +66 -7
  14. package/dest/errors/p2p-service.error.d.ts +9 -0
  15. package/dest/errors/p2p-service.error.d.ts.map +1 -0
  16. package/dest/errors/p2p-service.error.js +10 -0
  17. package/dest/index.d.ts +1 -2
  18. package/dest/index.d.ts.map +1 -1
  19. package/dest/index.js +0 -1
  20. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +4 -4
  21. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  22. package/dest/mem_pools/attestation_pool/attestation_pool.js +6 -5
  23. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +6 -6
  24. package/dest/mem_pools/index.d.ts +1 -2
  25. package/dest/mem_pools/index.d.ts.map +1 -1
  26. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +1 -1
  27. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -1
  28. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +2 -1
  29. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +7 -1
  30. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -1
  31. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +1 -1
  32. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -1
  33. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +8 -6
  34. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +2 -2
  35. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -1
  36. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +2 -2
  37. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +9 -5
  38. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
  39. package/dest/mem_pools/tx_pool_v2/interfaces.js +2 -1
  40. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +25 -10
  41. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
  42. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +38 -11
  43. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +1 -1
  44. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -1
  45. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +26 -43
  46. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +4 -2
  47. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -1
  48. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +3 -0
  49. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +1 -1
  50. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -1
  51. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +21 -6
  52. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +1 -1
  53. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  54. package/dest/msg_validators/attestation_validator/attestation_validator.js +5 -4
  55. package/dest/msg_validators/clock_tolerance.d.ts +1 -1
  56. package/dest/msg_validators/clock_tolerance.d.ts.map +1 -1
  57. package/dest/msg_validators/clock_tolerance.js +4 -3
  58. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +5 -4
  59. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
  60. package/dest/msg_validators/proposal_validator/block_proposal_validator.js +10 -2
  61. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +5 -4
  62. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
  63. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +16 -2
  64. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +12 -9
  65. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
  66. package/dest/msg_validators/proposal_validator/proposal_validator.js +51 -49
  67. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +1 -1
  68. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -1
  69. package/dest/msg_validators/tx_validator/allowed_public_setup.js +21 -32
  70. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts +17 -0
  71. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts.map +1 -0
  72. package/dest/msg_validators/tx_validator/allowed_setup_helpers.js +24 -0
  73. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts +9 -0
  74. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts.map +1 -0
  75. package/dest/msg_validators/tx_validator/contract_instance_validator.js +48 -0
  76. package/dest/msg_validators/tx_validator/data_validator.d.ts +1 -1
  77. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  78. package/dest/msg_validators/tx_validator/data_validator.js +35 -2
  79. package/dest/msg_validators/tx_validator/factory.d.ts +23 -4
  80. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  81. package/dest/msg_validators/tx_validator/factory.js +36 -10
  82. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +1 -1
  83. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -1
  84. package/dest/msg_validators/tx_validator/fee_payer_balance.js +6 -2
  85. package/dest/msg_validators/tx_validator/gas_validator.d.ts +13 -4
  86. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  87. package/dest/msg_validators/tx_validator/gas_validator.js +39 -9
  88. package/dest/msg_validators/tx_validator/index.d.ts +2 -1
  89. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  90. package/dest/msg_validators/tx_validator/index.js +1 -0
  91. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +1 -1
  92. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  93. package/dest/msg_validators/tx_validator/metadata_validator.js +4 -4
  94. package/dest/msg_validators/tx_validator/phases_validator.d.ts +21 -1
  95. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
  96. package/dest/msg_validators/tx_validator/phases_validator.js +49 -2
  97. package/dest/services/dummy_service.d.ts +5 -3
  98. package/dest/services/dummy_service.d.ts.map +1 -1
  99. package/dest/services/dummy_service.js +5 -1
  100. package/dest/services/encoding.d.ts +5 -1
  101. package/dest/services/encoding.d.ts.map +1 -1
  102. package/dest/services/encoding.js +7 -1
  103. package/dest/services/libp2p/libp2p_service.d.ts +14 -11
  104. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  105. package/dest/services/libp2p/libp2p_service.js +146 -74
  106. package/dest/services/peer-manager/peer_manager.d.ts +6 -2
  107. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  108. package/dest/services/peer-manager/peer_manager.js +22 -8
  109. package/dest/services/peer-manager/peer_scoring.d.ts +5 -2
  110. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  111. package/dest/services/peer-manager/peer_scoring.js +28 -10
  112. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +11 -8
  113. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -1
  114. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +69 -65
  115. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +3 -2
  116. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
  117. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +5 -4
  118. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -1
  119. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +13 -7
  120. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +3 -1
  121. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -1
  122. package/dest/services/reqresp/batch-tx-requester/peer_collection.js +3 -0
  123. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +5 -4
  124. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
  125. package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -8
  126. package/dest/services/reqresp/reqresp.d.ts +1 -1
  127. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  128. package/dest/services/reqresp/reqresp.js +17 -9
  129. package/dest/services/service.d.ts +5 -2
  130. package/dest/services/service.d.ts.map +1 -1
  131. package/dest/services/tx_collection/fast_tx_collection.d.ts +1 -4
  132. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
  133. package/dest/services/tx_collection/fast_tx_collection.js +57 -73
  134. package/dest/services/tx_collection/file_store_tx_source.d.ts +5 -4
  135. package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -1
  136. package/dest/services/tx_collection/file_store_tx_source.js +39 -29
  137. package/dest/services/tx_collection/proposal_tx_collector.d.ts +6 -7
  138. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -1
  139. package/dest/services/tx_collection/proposal_tx_collector.js +4 -4
  140. package/dest/services/tx_collection/request_tracker.d.ts +53 -0
  141. package/dest/services/tx_collection/request_tracker.d.ts.map +1 -0
  142. package/dest/services/tx_collection/request_tracker.js +84 -0
  143. package/dest/services/tx_collection/slow_tx_collection.js +1 -1
  144. package/dest/services/tx_collection/tx_collection.d.ts +3 -6
  145. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  146. package/dest/services/tx_collection/tx_source.d.ts +6 -5
  147. package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
  148. package/dest/services/tx_collection/tx_source.js +9 -7
  149. package/dest/test-helpers/make-test-p2p-clients.d.ts +1 -1
  150. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  151. package/dest/test-helpers/reqresp-nodes.d.ts +1 -1
  152. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  153. package/dest/test-helpers/testbench-utils.d.ts +1 -1
  154. package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
  155. package/dest/test-helpers/testbench-utils.js +22 -3
  156. package/dest/testbench/p2p_client_testbench_worker.js +46 -16
  157. package/dest/testbench/worker_client_manager.d.ts +3 -1
  158. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  159. package/dest/testbench/worker_client_manager.js +6 -3
  160. package/dest/util.d.ts +1 -1
  161. package/package.json +14 -14
  162. package/src/client/factory.ts +43 -14
  163. package/src/client/interface.ts +9 -1
  164. package/src/client/p2p_client.ts +39 -36
  165. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +19 -9
  166. package/src/config.ts +92 -4
  167. package/src/errors/p2p-service.error.ts +11 -0
  168. package/src/index.ts +0 -1
  169. package/src/mem_pools/attestation_pool/attestation_pool.ts +7 -5
  170. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +6 -6
  171. package/src/mem_pools/index.ts +0 -3
  172. package/src/mem_pools/tx_pool_v2/README.md +9 -1
  173. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +2 -1
  174. package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +11 -1
  175. package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +15 -6
  176. package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +2 -1
  177. package/src/mem_pools/tx_pool_v2/interfaces.ts +9 -4
  178. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +59 -13
  179. package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +29 -43
  180. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +13 -1
  181. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +23 -6
  182. package/src/msg_validators/attestation_validator/README.md +49 -0
  183. package/src/msg_validators/attestation_validator/attestation_validator.ts +5 -4
  184. package/src/msg_validators/clock_tolerance.ts +4 -3
  185. package/src/msg_validators/proposal_validator/README.md +123 -0
  186. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +13 -3
  187. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +19 -6
  188. package/src/msg_validators/proposal_validator/proposal_validator.ts +63 -53
  189. package/src/msg_validators/tx_validator/README.md +5 -1
  190. package/src/msg_validators/tx_validator/allowed_public_setup.ts +16 -35
  191. package/src/msg_validators/tx_validator/allowed_setup_helpers.ts +31 -0
  192. package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
  193. package/src/msg_validators/tx_validator/data_validator.ts +42 -1
  194. package/src/msg_validators/tx_validator/factory.ts +43 -3
  195. package/src/msg_validators/tx_validator/fee_payer_balance.ts +6 -2
  196. package/src/msg_validators/tx_validator/gas_validator.ts +41 -8
  197. package/src/msg_validators/tx_validator/index.ts +1 -0
  198. package/src/msg_validators/tx_validator/metadata_validator.ts +12 -4
  199. package/src/msg_validators/tx_validator/phases_validator.ts +60 -1
  200. package/src/services/dummy_service.ts +7 -2
  201. package/src/services/encoding.ts +9 -1
  202. package/src/services/libp2p/libp2p_service.ts +147 -87
  203. package/src/services/peer-manager/peer_manager.ts +26 -8
  204. package/src/services/peer-manager/peer_scoring.ts +21 -5
  205. package/src/services/reqresp/README.md +229 -0
  206. package/src/services/reqresp/batch-tx-requester/README.md +46 -7
  207. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +64 -69
  208. package/src/services/reqresp/batch-tx-requester/interface.ts +2 -1
  209. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +13 -6
  210. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +5 -0
  211. package/src/services/reqresp/rate-limiter/rate_limiter.ts +13 -9
  212. package/src/services/reqresp/reqresp.ts +19 -11
  213. package/src/services/service.ts +6 -1
  214. package/src/services/tx_collection/fast_tx_collection.ts +57 -83
  215. package/src/services/tx_collection/file_store_tx_source.ts +43 -31
  216. package/src/services/tx_collection/proposal_tx_collector.ts +8 -13
  217. package/src/services/tx_collection/request_tracker.ts +127 -0
  218. package/src/services/tx_collection/slow_tx_collection.ts +1 -1
  219. package/src/services/tx_collection/tx_collection.ts +3 -5
  220. package/src/services/tx_collection/tx_source.ts +8 -7
  221. package/src/test-helpers/make-test-p2p-clients.ts +1 -1
  222. package/src/test-helpers/reqresp-nodes.ts +1 -1
  223. package/src/test-helpers/testbench-utils.ts +29 -3
  224. package/src/testbench/p2p_client_testbench_worker.ts +45 -15
  225. package/src/testbench/worker_client_manager.ts +13 -6
  226. package/src/util.ts +1 -1
  227. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +0 -125
  228. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +0 -1
  229. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +0 -596
  230. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +0 -32
  231. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +0 -1
  232. package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +0 -112
  233. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +0 -157
  234. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +0 -1
  235. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +0 -52
  236. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +0 -16
  237. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +0 -1
  238. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +0 -122
  239. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +0 -17
  240. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +0 -1
  241. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +0 -84
  242. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +0 -19
  243. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +0 -1
  244. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +0 -78
  245. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +0 -26
  246. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +0 -1
  247. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +0 -84
  248. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +0 -25
  249. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +0 -1
  250. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +0 -57
  251. package/dest/mem_pools/tx_pool/index.d.ts +0 -3
  252. package/dest/mem_pools/tx_pool/index.d.ts.map +0 -1
  253. package/dest/mem_pools/tx_pool/index.js +0 -2
  254. package/dest/mem_pools/tx_pool/priority.d.ts +0 -12
  255. package/dest/mem_pools/tx_pool/priority.d.ts.map +0 -1
  256. package/dest/mem_pools/tx_pool/priority.js +0 -15
  257. package/dest/mem_pools/tx_pool/tx_pool.d.ts +0 -127
  258. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +0 -1
  259. package/dest/mem_pools/tx_pool/tx_pool.js +0 -3
  260. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +0 -7
  261. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +0 -1
  262. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +0 -400
  263. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +0 -24
  264. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +0 -1
  265. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +0 -378
  266. package/dest/services/tx_collection/missing_txs_tracker.d.ts +0 -32
  267. package/dest/services/tx_collection/missing_txs_tracker.d.ts.map +0 -1
  268. package/dest/services/tx_collection/missing_txs_tracker.js +0 -27
  269. package/src/mem_pools/tx_pool/README.md +0 -270
  270. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -746
  271. package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +0 -132
  272. package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +0 -208
  273. package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +0 -162
  274. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +0 -104
  275. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +0 -93
  276. package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +0 -106
  277. package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +0 -75
  278. package/src/mem_pools/tx_pool/index.ts +0 -2
  279. package/src/mem_pools/tx_pool/priority.ts +0 -20
  280. package/src/mem_pools/tx_pool/tx_pool.ts +0 -141
  281. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +0 -319
  282. package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +0 -373
  283. package/src/services/tx_collection/missing_txs_tracker.ts +0 -52
@@ -1,5 +1,6 @@
1
1
  import type { EpochCacheInterface } from '@aztec/epoch-cache';
2
2
  import { BlockNumber, type SlotNumber } from '@aztec/foundation/branded-types';
3
+ import { maxBy } from '@aztec/foundation/collection';
3
4
  import { Fr } from '@aztec/foundation/curves/bn254';
4
5
  import { type Logger, createLibp2pComponentLogger, createLogger } from '@aztec/foundation/log';
5
6
  import { RunningPromise } from '@aztec/foundation/running-promise';
@@ -17,8 +18,8 @@ import {
17
18
  type CheckpointProposalCore,
18
19
  type Gossipable,
19
20
  P2PMessage,
20
- type ValidationResult as P2PValidationResult,
21
21
  PeerErrorSeverity,
22
+ PeerErrorSeverityByHarshness,
22
23
  TopicType,
23
24
  createTopicString,
24
25
  getTopicsForConfig,
@@ -57,6 +58,7 @@ import { ENR } from '@nethermindeth/enr';
57
58
  import { createLibp2p } from 'libp2p';
58
59
 
59
60
  import type { P2PConfig } from '../../config.js';
61
+ import { CheckpointProposalReceivedCallbackNotRegisteredError } from '../../errors/p2p-service.error.js';
60
62
  import type { MemPools } from '../../mem_pools/interface.js';
61
63
  import {
62
64
  BlockProposalValidator,
@@ -129,7 +131,7 @@ type ValidationOutcome = { allPassed: true } | { allPassed: false; failure: Vali
129
131
  // REFACTOR: Unify with the type above
130
132
  type ReceivedMessageValidationResult<T, M = undefined> =
131
133
  | { obj: T; result: Exclude<TopicValidatorResult, TopicValidatorResult.Reject>; metadata?: M }
132
- | { obj?: T; result: TopicValidatorResult.Reject; metadata?: M };
134
+ | { obj?: T; result: TopicValidatorResult.Reject; metadata?: M; severity: PeerErrorSeverity };
133
135
 
134
136
  /**
135
137
  * Lib P2P implementation of the P2PService interface.
@@ -170,7 +172,13 @@ export class LibP2PService extends WithTracer implements P2PService {
170
172
  * @param checkpoint - The checkpoint proposal received from the peer.
171
173
  * @returns The attestations for the checkpoint, if any.
172
174
  */
173
- private checkpointReceivedCallback: P2PCheckpointReceivedCallback;
175
+ private allNodesCheckpointReceivedCallback: P2PCheckpointReceivedCallback;
176
+ /**
177
+ * Callback for when a checkpoint proposal is received - specifically for validators - from a peer.
178
+ * @param checkpoint - The checkpoint proposal received from the peer.
179
+ * @returns The attestations for the checkpoint, if any.
180
+ */
181
+ private validatorCheckpointReceivedCallback: P2PCheckpointReceivedCallback;
174
182
 
175
183
  private gossipSubEventHandler: (e: CustomEvent<GossipsubMessage>) => void;
176
184
 
@@ -222,14 +230,12 @@ export class LibP2PService extends WithTracer implements P2PService {
222
230
  this.protocolVersion,
223
231
  );
224
232
 
225
- this.blockProposalValidator = new BlockProposalValidator(epochCache, {
233
+ const proposalValidatorOpts = {
226
234
  txsPermitted: !config.disableTransactions,
227
- maxTxsPerBlock: config.maxTxsPerBlock,
228
- });
229
- this.checkpointProposalValidator = new CheckpointProposalValidator(epochCache, {
230
- txsPermitted: !config.disableTransactions,
231
- maxTxsPerBlock: config.maxTxsPerBlock,
232
- });
235
+ maxTxsPerBlock: config.validateMaxTxsPerBlock ?? config.validateMaxTxsPerCheckpoint,
236
+ };
237
+ this.blockProposalValidator = new BlockProposalValidator(epochCache, proposalValidatorOpts);
238
+ this.checkpointProposalValidator = new CheckpointProposalValidator(epochCache, proposalValidatorOpts);
233
239
  this.checkpointAttestationValidator = config.fishermanMode
234
240
  ? new FishermanAttestationValidator(epochCache, mempools.attestationPool, telemetry)
235
241
  : new CheckpointAttestationValidator(epochCache);
@@ -237,19 +243,22 @@ export class LibP2PService extends WithTracer implements P2PService {
237
243
  this.gossipSubEventHandler = this.handleGossipSubEvent.bind(this);
238
244
 
239
245
  this.blockReceivedCallback = async (block: BlockProposal): Promise<boolean> => {
240
- this.logger.debug(
241
- `Handler not yet registered: Block received callback not set. Received block for slot ${block.slotNumber} from peer.`,
246
+ this.logger.warn(
247
+ `Handler for block received not yet registered on P2P service. Received block ${block.blockNumber} for slot ${block.slotNumber} from peer.`,
242
248
  { p2pMessageIdentifier: await block.p2pMessageLoggingIdentifier() },
243
249
  );
244
- return false;
250
+ return true;
245
251
  };
246
252
 
247
- this.checkpointReceivedCallback = (
248
- checkpoint: CheckpointProposalCore,
253
+ this.allNodesCheckpointReceivedCallback = (
254
+ _checkpoint: CheckpointProposalCore,
255
+ ): Promise<CheckpointAttestation[] | undefined> => {
256
+ throw new CheckpointProposalReceivedCallbackNotRegisteredError();
257
+ };
258
+
259
+ this.validatorCheckpointReceivedCallback = (
260
+ _checkpoint: CheckpointProposalCore,
249
261
  ): Promise<CheckpointAttestation[] | undefined> => {
250
- this.logger.debug(
251
- `Handler not yet registered: Checkpoint received callback not set. Received checkpoint for slot ${checkpoint.slotNumber} from peer.`,
252
- );
253
262
  return Promise.resolve(undefined);
254
263
  };
255
264
  }
@@ -667,8 +676,16 @@ export class LibP2PService extends WithTracer implements P2PService {
667
676
  this.blockReceivedCallback = callback;
668
677
  }
669
678
 
670
- public registerCheckpointReceivedCallback(callback: P2PCheckpointReceivedCallback) {
671
- this.checkpointReceivedCallback = callback;
679
+ public registerValidatorCheckpointReceivedCallback(callback: P2PCheckpointReceivedCallback) {
680
+ this.validatorCheckpointReceivedCallback = callback;
681
+ }
682
+
683
+ public registerAllNodesCheckpointReceivedCallback(callback: P2PCheckpointReceivedCallback) {
684
+ this.allNodesCheckpointReceivedCallback = callback;
685
+ }
686
+
687
+ public async notifyOwnCheckpointProposal(checkpoint: CheckpointProposalCore): Promise<void> {
688
+ await this.allNodesCheckpointReceivedCallback(checkpoint, this.node.peerId);
672
689
  }
673
690
 
674
691
  /**
@@ -754,6 +771,9 @@ export class LibP2PService extends WithTracer implements P2PService {
754
771
  if (!validator || !validator.addMessage(msgId)) {
755
772
  this.instrumentation.incMessagePrevalidationStatus(false, topicType);
756
773
  this.node.services.pubsub.reportMessageValidationResult(msgId, source.toString(), TopicValidatorResult.Ignore);
774
+ if (topicType === TopicType.tx) {
775
+ this.logger.verbose(`Ignoring already-seen tx gossip message`, { msgId, source: source.toString() });
776
+ }
757
777
  return { result: false, topicType };
758
778
  }
759
779
 
@@ -880,30 +900,56 @@ export class LibP2PService extends WithTracer implements P2PService {
880
900
  source: PeerId,
881
901
  topicType: TopicType,
882
902
  ): Promise<ReceivedMessageValidationResult<T, M>> {
883
- let resultAndObj: ReceivedMessageValidationResult<T, M> = { result: TopicValidatorResult.Reject };
903
+ // Default to reject result with a penalty if validation function throws an error
904
+ let resultAndObj: ReceivedMessageValidationResult<T, M> = {
905
+ result: TopicValidatorResult.Reject,
906
+ severity: PeerErrorSeverity.MidToleranceError,
907
+ };
884
908
  const timer = new Timer();
885
909
  try {
886
910
  resultAndObj = await validationFunc();
887
911
  } catch (err) {
888
- this.peerManager.penalizePeer(source, PeerErrorSeverity.LowToleranceError);
889
- this.logger.error(`Error deserializing and validating gossipsub message`, err, {
890
- msgId,
891
- source: source.toString(),
892
- topicType,
893
- });
912
+ this.logger.error(`Error validating gossipsub message`, err, { msgId, source: source.toString(), topicType });
894
913
  }
895
914
 
896
915
  if (resultAndObj.result === TopicValidatorResult.Accept) {
916
+ this.logger.debug(`Message ${topicType} accepted by validator`, { msgId, source: source.toString(), topicType });
897
917
  this.instrumentation.recordMessageValidation(topicType, timer);
918
+ } else if (resultAndObj.result === TopicValidatorResult.Reject) {
919
+ this.logger.warn(`Message ${topicType} rejected by validator with severity ${resultAndObj.severity}`, {
920
+ msgId,
921
+ source: source.toString(),
922
+ topicType,
923
+ severity: resultAndObj.severity,
924
+ });
925
+ this.peerManager.penalizePeer(source, resultAndObj.severity);
926
+ } else {
927
+ this.logger.trace(`Message ${topicType} ignored by validator`, { msgId, source: source.toString(), topicType });
898
928
  }
899
929
 
900
930
  this.node.services.pubsub.reportMessageValidationResult(msgId, source.toString(), resultAndObj.result);
901
931
  return resultAndObj;
902
932
  }
903
933
 
934
+ private tryDeserialize<T>(deserializeFunc: () => T, msgId: string, source: PeerId): T | undefined {
935
+ try {
936
+ return deserializeFunc();
937
+ } catch (err) {
938
+ this.logger.warn(`Failed to deserialize gossipsub message from buffer`, {
939
+ err,
940
+ msgId,
941
+ source: source.toString(),
942
+ });
943
+ return undefined;
944
+ }
945
+ }
946
+
904
947
  protected async handleGossipedTx(payloadData: Buffer, msgId: string, source: PeerId) {
905
948
  const validationFunc: () => Promise<ReceivedMessageValidationResult<Tx>> = async () => {
906
- const tx = Tx.fromBuffer(payloadData);
949
+ const tx = this.tryDeserialize(() => Tx.fromBuffer(payloadData), msgId, source);
950
+ if (!tx) {
951
+ return { result: TopicValidatorResult.Reject, severity: PeerErrorSeverity.LowToleranceError };
952
+ }
907
953
 
908
954
  const currentBlockNumber = await this.archiver.getBlockNumber();
909
955
  const { ts: nextSlotTimestamp } = this.epochCache.getEpochAndSlotInNextL1Slot();
@@ -923,13 +969,20 @@ export class LibP2PService extends WithTracer implements P2PService {
923
969
  severity = await this.handleDoubleSpendFailure(tx, txBlockNumber);
924
970
  }
925
971
 
926
- this.peerManager.penalizePeer(source, severity);
927
- return { result: TopicValidatorResult.Reject };
972
+ this.logger.verbose(`Rejecting gossiped tx ${tx.getTxHash().toString()}: stage 1 validation failed`, {
973
+ validator: name,
974
+ severity,
975
+ source: source.toString(),
976
+ });
977
+ return { result: TopicValidatorResult.Reject, severity };
928
978
  }
929
979
 
930
980
  // Pool pre-check: see if the pool would accept this tx before doing expensive proof verification
931
981
  const canAdd = await this.mempools.txPool.canAddPendingTx(tx);
932
982
  if (canAdd === 'ignored') {
983
+ this.logger.verbose(`Ignoring gossiped tx ${tx.getTxHash().toString()}: pool pre-check returned ignored`, {
984
+ source: source.toString(),
985
+ });
933
986
  return { result: TopicValidatorResult.Ignore, obj: tx };
934
987
  }
935
988
 
@@ -937,9 +990,13 @@ export class LibP2PService extends WithTracer implements P2PService {
937
990
  const secondStageValidators = this.createSecondStageMessageValidators();
938
991
  const secondStageOutcome = await this.runValidations(tx, secondStageValidators);
939
992
  if (!secondStageOutcome.allPassed) {
940
- const { severity } = secondStageOutcome.failure;
941
- this.peerManager.penalizePeer(source, severity);
942
- return { result: TopicValidatorResult.Reject };
993
+ const { severity, name } = secondStageOutcome.failure;
994
+ this.logger.verbose(`Rejecting gossiped tx ${tx.getTxHash().toString()}: stage 2 validation failed`, {
995
+ validator: name,
996
+ severity,
997
+ source: source.toString(),
998
+ });
999
+ return { result: TopicValidatorResult.Reject, severity };
943
1000
  }
944
1001
 
945
1002
  // Pool add: persist the tx
@@ -949,7 +1006,7 @@ export class LibP2PService extends WithTracer implements P2PService {
949
1006
  const wasAccepted = addResult.accepted.some(h => h.equals(txHash));
950
1007
  const wasIgnored = addResult.ignored.some(h => h.equals(txHash));
951
1008
 
952
- this.logger.trace(`Validate propagated tx`, {
1009
+ this.logger.verbose(`Validate propagated tx ${txHash.toString()}`, {
953
1010
  wasAccepted,
954
1011
  wasIgnored,
955
1012
  [Attributes.P2P_ID]: source.toString(),
@@ -960,7 +1017,11 @@ export class LibP2PService extends WithTracer implements P2PService {
960
1017
  } else if (wasIgnored) {
961
1018
  return { result: TopicValidatorResult.Ignore, obj: tx };
962
1019
  } else {
963
- return { result: TopicValidatorResult.Reject };
1020
+ this.logger.warn(`Gossiped tx ${txHash.toString()} unexpectedly rejected by pool`, {
1021
+ source: source.toString(),
1022
+ txHash: txHash.toString(),
1023
+ });
1024
+ return { result: TopicValidatorResult.Reject, severity: PeerErrorSeverity.HighToleranceError };
964
1025
  }
965
1026
  };
966
1027
 
@@ -990,7 +1051,16 @@ export class LibP2PService extends WithTracer implements P2PService {
990
1051
  source: PeerId,
991
1052
  ): Promise<void> {
992
1053
  const { result, obj: attestation } = await this.validateReceivedMessage<CheckpointAttestation>(
993
- () => this.validateAndStoreCheckpointAttestation(source, CheckpointAttestation.fromBuffer(payloadData)),
1054
+ () => {
1055
+ const attestation = this.tryDeserialize(() => CheckpointAttestation.fromBuffer(payloadData), msgId, source);
1056
+ if (!attestation) {
1057
+ return Promise.resolve({
1058
+ result: TopicValidatorResult.Reject,
1059
+ severity: PeerErrorSeverity.LowToleranceError,
1060
+ });
1061
+ }
1062
+ return this.validateAndStoreCheckpointAttestation(source, attestation);
1063
+ },
994
1064
  msgId,
995
1065
  source,
996
1066
  TopicType.checkpoint_attestation,
@@ -1023,8 +1093,7 @@ export class LibP2PService extends WithTracer implements P2PService {
1023
1093
 
1024
1094
  if (validationResult.result === 'reject') {
1025
1095
  this.logger.warn(`Penalizing peer ${peerId} for checkpoint attestation validation failure`);
1026
- this.peerManager.penalizePeer(peerId, validationResult.severity);
1027
- return { result: TopicValidatorResult.Reject };
1096
+ return { result: TopicValidatorResult.Reject, severity: validationResult.severity };
1028
1097
  }
1029
1098
 
1030
1099
  if (validationResult.result === 'ignore') {
@@ -1050,16 +1119,16 @@ export class LibP2PService extends WithTracer implements P2PService {
1050
1119
  return { result: TopicValidatorResult.Ignore, obj: attestation };
1051
1120
  }
1052
1121
 
1053
- // Could not add (cap reached for signer), no need to re-broadcast
1122
+ // Could not add (cap reached for signer), penalize and do not re-broadcast
1054
1123
  if (!added) {
1055
- this.logger.warn(`Dropping checkpoint attestation due to cap`, {
1124
+ this.logger.warn(`Rejecting checkpoint attestation due to cap`, {
1056
1125
  slot: slot.toString(),
1057
1126
  archive: attestation.archive.toString(),
1058
1127
  source: peerId.toString(),
1059
1128
  attester: attestation.getSender()?.toString(),
1060
1129
  count,
1061
1130
  });
1062
- return { result: TopicValidatorResult.Ignore, obj: attestation };
1131
+ return { result: TopicValidatorResult.Reject, severity: PeerErrorSeverity.HighToleranceError };
1063
1132
  }
1064
1133
 
1065
1134
  // Check if this is a duplicate attestation (signer attested to a different proposal at the same slot)
@@ -1114,8 +1183,7 @@ export class LibP2PService extends WithTracer implements P2PService {
1114
1183
 
1115
1184
  if (validationResult.result === 'reject') {
1116
1185
  this.logger.warn(`Penalizing peer ${peerId} for block proposal validation failure`);
1117
- this.peerManager.penalizePeer(peerId, validationResult.severity);
1118
- return { result: TopicValidatorResult.Reject };
1186
+ return { result: TopicValidatorResult.Reject, severity: validationResult.severity };
1119
1187
  }
1120
1188
 
1121
1189
  if (validationResult.result === 'ignore') {
@@ -1139,7 +1207,6 @@ export class LibP2PService extends WithTracer implements P2PService {
1139
1207
 
1140
1208
  // Too many blocks received for this slot and index, penalize peer and do not re-broadcast
1141
1209
  if (!added) {
1142
- this.peerManager.penalizePeer(peerId, PeerErrorSeverity.HighToleranceError);
1143
1210
  this.logger.warn(`Penalizing peer for block proposal exceeding per-position cap`, {
1144
1211
  ...block.toBlockInfo(),
1145
1212
  indexWithinCheckpoint: block.indexWithinCheckpoint,
@@ -1147,7 +1214,11 @@ export class LibP2PService extends WithTracer implements P2PService {
1147
1214
  proposer: block.getSender()?.toString(),
1148
1215
  source: peerId.toString(),
1149
1216
  });
1150
- return { result: TopicValidatorResult.Reject, metadata: { isEquivocated } };
1217
+ return {
1218
+ result: TopicValidatorResult.Reject,
1219
+ metadata: { isEquivocated },
1220
+ severity: PeerErrorSeverity.HighToleranceError,
1221
+ };
1151
1222
  }
1152
1223
 
1153
1224
  // If this was a duplicate proposal, do not process it, but do invoke the duplicate callback,
@@ -1192,7 +1263,7 @@ export class LibP2PService extends WithTracer implements P2PService {
1192
1263
  // Note: Validators do NOT attest to individual blocks, only to checkpoint proposals.
1193
1264
  const isValid = await this.blockReceivedCallback(block, sender);
1194
1265
  if (!isValid) {
1195
- this.logger.warn(`Block proposal validation failed for block ${block.blockNumber}`, block.toBlockInfo());
1266
+ this.logger.info(`Block proposal validation failed for block ${block.blockNumber}`, block.toBlockInfo());
1196
1267
  }
1197
1268
  }
1198
1269
 
@@ -1240,8 +1311,7 @@ export class LibP2PService extends WithTracer implements P2PService {
1240
1311
 
1241
1312
  if (validationResult.result === 'reject') {
1242
1313
  this.logger.warn(`Penalizing peer ${peerId} for checkpoint proposal validation failure`);
1243
- this.peerManager.penalizePeer(peerId, validationResult.severity);
1244
- return { result: TopicValidatorResult.Reject };
1314
+ return { result: TopicValidatorResult.Reject, severity: validationResult.severity };
1245
1315
  }
1246
1316
 
1247
1317
  if (validationResult.result === 'ignore') {
@@ -1256,20 +1326,21 @@ export class LibP2PService extends WithTracer implements P2PService {
1256
1326
  [Attributes.SLOT_NUMBER]: checkpoint.slotNumber.toString(),
1257
1327
  [Attributes.P2P_ID]: peerId.toString(),
1258
1328
  });
1259
- const {
1260
- result,
1261
- obj,
1262
- metadata: { isEquivocated } = {},
1263
- } = await this.validateAndStoreBlockProposal(peerId, blockProposal);
1264
- if (result === TopicValidatorResult.Reject || !obj || isEquivocated) {
1329
+ const blockProposalResult = await this.validateAndStoreBlockProposal(peerId, blockProposal);
1330
+ const { obj, metadata: { isEquivocated } = {} } = blockProposalResult;
1331
+ if (blockProposalResult.result === TopicValidatorResult.Reject || !obj || isEquivocated) {
1265
1332
  this.logger.debug(`Rejecting checkpoint due to invalid last block proposal`, {
1266
1333
  [Attributes.SLOT_NUMBER]: checkpoint.slotNumber.toString(),
1267
1334
  [Attributes.P2P_ID]: peerId.toString(),
1268
1335
  isEquivocated,
1269
- result,
1336
+ result: blockProposalResult.result,
1270
1337
  });
1271
- return { result: TopicValidatorResult.Reject };
1272
- } else if (result === TopicValidatorResult.Accept && obj && !isEquivocated) {
1338
+ return {
1339
+ result: TopicValidatorResult.Reject,
1340
+ severity:
1341
+ 'severity' in blockProposalResult ? blockProposalResult.severity : PeerErrorSeverity.MidToleranceError,
1342
+ };
1343
+ } else if (blockProposalResult.result === TopicValidatorResult.Accept && obj && !isEquivocated) {
1273
1344
  processBlock = true;
1274
1345
  }
1275
1346
  }
@@ -1296,13 +1367,17 @@ export class LibP2PService extends WithTracer implements P2PService {
1296
1367
  // Too many checkpoint proposals received for this slot, penalize peer and do not re-broadcast
1297
1368
  // Note: We still return the checkpoint obj so the lastBlock can be processed if valid
1298
1369
  if (!added) {
1299
- this.peerManager.penalizePeer(peerId, PeerErrorSeverity.HighToleranceError);
1300
1370
  this.logger.warn(`Penalizing peer for checkpoint proposal exceeding per-slot cap`, {
1301
1371
  ...checkpoint.toCheckpointInfo(),
1302
1372
  count,
1303
1373
  source: peerId.toString(),
1304
1374
  });
1305
- return { result: TopicValidatorResult.Reject, obj: checkpoint, metadata: { isEquivocated, processBlock } };
1375
+ return {
1376
+ result: TopicValidatorResult.Reject,
1377
+ obj: checkpoint,
1378
+ metadata: { isEquivocated, processBlock },
1379
+ severity: PeerErrorSeverity.HighToleranceError,
1380
+ };
1306
1381
  }
1307
1382
 
1308
1383
  // If this was a duplicate proposal, do not process it, but do invoke the duplicate callback,
@@ -1347,9 +1422,11 @@ export class LibP2PService extends WithTracer implements P2PService {
1347
1422
  source: sender.toString(),
1348
1423
  });
1349
1424
 
1425
+ await this.allNodesCheckpointReceivedCallback(checkpoint, sender);
1426
+
1350
1427
  // Call the checkpoint received callback with the core version (without lastBlock)
1351
1428
  // to validate and potentially generate attestations
1352
- const attestations = await this.checkpointReceivedCallback(checkpoint, sender);
1429
+ const attestations = await this.validatorCheckpointReceivedCallback(checkpoint, sender);
1353
1430
  if (attestations && attestations.length > 0) {
1354
1431
  // If the callback returned attestations, add them to the pool and propagate them
1355
1432
  await this.mempools.attestationPool.addOwnCheckpointAttestations(attestations);
@@ -1626,6 +1703,7 @@ export class LibP2PService extends WithTracer implements P2PService {
1626
1703
  ...(this.config.txPublicSetupAllowListExtend ?? []),
1627
1704
  ];
1628
1705
  const blockNumber = BlockNumber(currentBlockNumber + 1);
1706
+ const l1Constants = await this.archiver.getL1Constants();
1629
1707
 
1630
1708
  return createFirstStageTxValidationsForGossipedTransactions(
1631
1709
  nextSlotTimestamp,
@@ -1639,6 +1717,11 @@ export class LibP2PService extends WithTracer implements P2PService {
1639
1717
  !this.config.disableTransactions,
1640
1718
  allowedInSetup,
1641
1719
  this.logger.getBindings(),
1720
+ {
1721
+ rollupManaLimit: l1Constants.rollupManaLimit,
1722
+ maxBlockL2Gas: this.config.validateMaxL2BlockGas,
1723
+ maxBlockDAGas: this.config.validateMaxDABlockGas,
1724
+ },
1642
1725
  );
1643
1726
  }
1644
1727
 
@@ -1664,8 +1747,10 @@ export class LibP2PService extends WithTracer implements P2PService {
1664
1747
 
1665
1748
  // A promise that resolves when all validations have been run
1666
1749
  const allValidations = await Promise.all(validationPromises);
1667
- const failed = allValidations.find(x => !x.isValid);
1668
- if (failed) {
1750
+ const failures = allValidations.filter(x => !x.isValid);
1751
+ if (failures.length > 0) {
1752
+ // Pick the most severe failure (lowest tolerance = harshest penalty)
1753
+ const failed = maxBy(failures, f => PeerErrorSeverityByHarshness.indexOf(f.severity))!;
1669
1754
  return {
1670
1755
  allPassed: false,
1671
1756
  failure: {
@@ -1718,31 +1803,6 @@ export class LibP2PService extends WithTracer implements P2PService {
1718
1803
  return PeerErrorSeverity.HighToleranceError;
1719
1804
  }
1720
1805
 
1721
- /**
1722
- * Validate a checkpoint attestation.
1723
- *
1724
- * @param attestation - The checkpoint attestation to validate.
1725
- * @returns True if the checkpoint attestation is valid, false otherwise.
1726
- */
1727
- @trackSpan('Libp2pService.validateCheckpointAttestation', async (_, attestation) => ({
1728
- [Attributes.SLOT_NUMBER]: attestation.payload.header.slotNumber,
1729
- [Attributes.BLOCK_ARCHIVE]: attestation.archive.toString(),
1730
- [Attributes.P2P_ID]: await attestation.p2pMessageLoggingIdentifier().then(i => i.toString()),
1731
- }))
1732
- public async validateCheckpointAttestation(
1733
- peerId: PeerId,
1734
- attestation: CheckpointAttestation,
1735
- ): Promise<P2PValidationResult> {
1736
- const result = await this.checkpointAttestationValidator.validate(attestation);
1737
-
1738
- if (result.result === 'reject') {
1739
- this.logger.warn(`Penalizing peer ${peerId} for checkpoint attestation validation failure`);
1740
- this.peerManager.penalizePeer(peerId, result.severity);
1741
- }
1742
-
1743
- return result;
1744
- }
1745
-
1746
1806
  public getPeerScore(peerId: PeerId): number {
1747
1807
  return this.node.services.pubsub.score.score(peerId.toString());
1748
1808
  }
@@ -32,7 +32,7 @@ import { PeerScoreState, type PeerScoring } from './peer_scoring.js';
32
32
  const MAX_DIAL_ATTEMPTS = 3;
33
33
  const MAX_CACHED_PEERS = 100;
34
34
  const MAX_CACHED_PEER_AGE_MS = 5 * 60 * 1000; // 5 minutes
35
- const FAILED_PEER_BAN_TIME_MS = 5 * 60 * 1000; // 5 minutes timeout after failing MAX_DIAL_ATTEMPTS
35
+ const DEFAULT_FAILED_PEER_BAN_TIME_MS = 5 * 60 * 1000; // 5 minutes timeout after failing MAX_DIAL_ATTEMPTS
36
36
  const GOODBYE_DIAL_TIMEOUT_MS = 1000;
37
37
  const FAILED_AUTH_HANDSHAKE_EXPIRY_MS = 60 * 60 * 1000; // 1 hour
38
38
 
@@ -226,20 +226,30 @@ export class PeerManager implements PeerManagerInterface {
226
226
  }
227
227
 
228
228
  /**
229
- * Cleans up expired timeouts.
229
+ * Cleans up expired timeouts and stale failed-auth-handshake entries.
230
230
  *
231
231
  * When peers fail to dial after a number of retries, they are temporarily timed out.
232
232
  * This function removes any peers that have been in the timed out state for too long.
233
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.
234
238
  */
235
239
  private cleanupExpiredTimeouts() {
236
- // Clean up expired timeouts
237
240
  const now = this.dateProvider.now();
241
+
238
242
  for (const [peerId, timedOutPeer] of this.timedOutPeers.entries()) {
239
243
  if (now >= timedOutPeer.timeoutUntilMs) {
240
244
  this.timedOutPeers.delete(peerId);
241
245
  }
242
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
+ }
243
253
  }
244
254
 
245
255
  /**
@@ -303,15 +313,20 @@ export class PeerManager implements PeerManagerInterface {
303
313
  */
304
314
  private handleDisconnectedPeerEvent(e: CustomEvent<PeerId>) {
305
315
  const peerId = e.detail;
316
+ const peerIdStr = peerId.toString();
306
317
  this.metrics.peerDisconnected(peerId);
307
- this.logger.verbose(`Disconnected from peer ${peerId.toString()}`);
308
- const validatorAddress = this.authenticatedPeerIdToValidatorAddress.get(peerId.toString());
318
+ this.logger.verbose(`Disconnected from peer ${peerIdStr}`);
319
+ const validatorAddress = this.authenticatedPeerIdToValidatorAddress.get(peerIdStr);
309
320
  if (validatorAddress !== undefined) {
310
321
  this.logger.info(
311
- `Removing authentication for validator ${validatorAddress} at peer id ${peerId.toString()} due to disconnection`,
322
+ `Removing authentication for validator ${validatorAddress} at peer id ${peerIdStr} due to disconnection`,
312
323
  );
313
324
  this.authenticatedValidatorAddressToPeerId.delete(validatorAddress.toString());
314
- this.authenticatedPeerIdToValidatorAddress.delete(peerId.toString());
325
+ this.authenticatedPeerIdToValidatorAddress.delete(peerIdStr);
326
+ }
327
+
328
+ if (this.peerScoring.getScoreState(peerIdStr) === PeerScoreState.Healthy) {
329
+ this.peerScoring.removePeer(peerIdStr);
315
330
  }
316
331
  }
317
332
 
@@ -776,7 +791,8 @@ export class PeerManager implements PeerManagerInterface {
776
791
  // Add to timed out peers
777
792
  this.timedOutPeers.set(id, {
778
793
  peerId: id,
779
- timeoutUntilMs: this.dateProvider.now() + FAILED_PEER_BAN_TIME_MS,
794
+ timeoutUntilMs:
795
+ this.dateProvider.now() + (this.config.peerFailedBanTimeMs ?? DEFAULT_FAILED_PEER_BAN_TIME_MS),
780
796
  });
781
797
  }
782
798
  }
@@ -938,6 +954,8 @@ export class PeerManager implements PeerManagerInterface {
938
954
  `Received auth for validator ${sender.toString()} from peer ${peerIdString}, but this validator is already authenticated to peer ${peerForAddress.toString()}`,
939
955
  { ...logData, address: sender.toString() },
940
956
  );
957
+ this.markAuthHandshakeFailed(peerId);
958
+ this.markPeerForDisconnect(peerId);
941
959
  return;
942
960
  }
943
961
 
@@ -1,5 +1,6 @@
1
1
  import { median } from '@aztec/foundation/collection';
2
2
  import { createLogger } from '@aztec/foundation/log';
3
+ import { DateProvider } from '@aztec/foundation/timer';
3
4
  import { PeerErrorSeverity } from '@aztec/stdlib/p2p';
4
5
  import {
5
6
  Attributes,
@@ -54,6 +55,7 @@ export enum PeerScoreState {
54
55
  // TODO: move into config / constants
55
56
  const MIN_SCORE_BEFORE_BAN = -100;
56
57
  const MIN_SCORE_BEFORE_DISCONNECT = -50;
58
+ const SCORE_CLEANUP_THRESHOLD = 0.1;
57
59
 
58
60
  export class PeerScoring {
59
61
  private logger = createLogger('p2p:peer-scoring');
@@ -65,7 +67,11 @@ export class PeerScoring {
65
67
 
66
68
  private peerStateCounter: UpDownCounter;
67
69
 
68
- constructor(config: P2PConfig, telemetry: TelemetryClient = getTelemetryClient()) {
70
+ constructor(
71
+ config: P2PConfig,
72
+ telemetry: TelemetryClient = getTelemetryClient(),
73
+ private readonly dateProvider: DateProvider = new DateProvider(),
74
+ ) {
69
75
  const orderedValues = config.peerPenaltyValues?.sort((a, b) => a - b);
70
76
  this.peerPenalties = {
71
77
  [PeerErrorSeverity.HighToleranceError]:
@@ -92,7 +98,7 @@ export class PeerScoring {
92
98
  }
93
99
 
94
100
  updateScore(peerId: string, scoreDelta: number): number {
95
- const currentTime = Date.now();
101
+ const currentTime = this.dateProvider.now();
96
102
  const lastUpdate = this.lastUpdateTime.get(peerId) || currentTime;
97
103
  const timePassed = currentTime - lastUpdate;
98
104
  const decayPeriods = Math.floor(timePassed / this.decayInterval);
@@ -111,19 +117,29 @@ export class PeerScoring {
111
117
  }
112
118
 
113
119
  decayAllScores(): void {
114
- const currentTime = Date.now();
120
+ const currentTime = this.dateProvider.now();
115
121
  for (const [peerId, lastUpdate] of this.lastUpdateTime.entries()) {
116
122
  const timePassed = currentTime - lastUpdate;
117
123
  const decayPeriods = Math.floor(timePassed / this.decayInterval);
118
124
  if (decayPeriods > 0) {
119
125
  let score = this.scores.get(peerId) || 0;
120
126
  score *= Math.pow(this.decayFactor, decayPeriods);
121
- this.scores.set(peerId, score);
122
- this.lastUpdateTime.set(peerId, currentTime);
127
+ if (Math.abs(score) < SCORE_CLEANUP_THRESHOLD) {
128
+ this.scores.delete(peerId);
129
+ this.lastUpdateTime.delete(peerId);
130
+ } else {
131
+ this.scores.set(peerId, score);
132
+ this.lastUpdateTime.set(peerId, currentTime);
133
+ }
123
134
  }
124
135
  }
125
136
  }
126
137
 
138
+ removePeer(peerId: string): void {
139
+ this.scores.delete(peerId);
140
+ this.lastUpdateTime.delete(peerId);
141
+ }
142
+
127
143
  getScore(peerId: string): number {
128
144
  return this.scores.get(peerId) || 0;
129
145
  }