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

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 (308) 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 +49 -17
  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 +15 -25
  104. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  105. package/dest/services/libp2p/libp2p_service.js +149 -126
  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 +7 -2
  110. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  111. package/dest/services/peer-manager/peer_scoring.js +32 -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/interface.d.ts +1 -9
  124. package/dest/services/reqresp/interface.d.ts.map +1 -1
  125. package/dest/services/reqresp/interface.js +0 -11
  126. package/dest/services/reqresp/metrics.d.ts +1 -1
  127. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  128. package/dest/services/reqresp/metrics.js +0 -1
  129. package/dest/services/reqresp/protocols/index.d.ts +1 -2
  130. package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
  131. package/dest/services/reqresp/protocols/index.js +0 -1
  132. package/dest/services/reqresp/protocols/tx.d.ts +1 -1
  133. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  134. package/dest/services/reqresp/protocols/tx.js +1 -3
  135. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +5 -4
  136. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
  137. package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -8
  138. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
  139. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
  140. package/dest/services/reqresp/rate-limiter/rate_limits.js +0 -10
  141. package/dest/services/reqresp/reqresp.d.ts +1 -1
  142. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  143. package/dest/services/reqresp/reqresp.js +18 -10
  144. package/dest/services/service.d.ts +5 -2
  145. package/dest/services/service.d.ts.map +1 -1
  146. package/dest/services/tx_collection/fast_tx_collection.d.ts +1 -4
  147. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
  148. package/dest/services/tx_collection/fast_tx_collection.js +57 -73
  149. package/dest/services/tx_collection/file_store_tx_source.d.ts +5 -4
  150. package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -1
  151. package/dest/services/tx_collection/file_store_tx_source.js +39 -29
  152. package/dest/services/tx_collection/proposal_tx_collector.d.ts +6 -7
  153. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -1
  154. package/dest/services/tx_collection/proposal_tx_collector.js +4 -4
  155. package/dest/services/tx_collection/request_tracker.d.ts +53 -0
  156. package/dest/services/tx_collection/request_tracker.d.ts.map +1 -0
  157. package/dest/services/tx_collection/request_tracker.js +84 -0
  158. package/dest/services/tx_collection/slow_tx_collection.js +1 -1
  159. package/dest/services/tx_collection/tx_collection.d.ts +3 -6
  160. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  161. package/dest/services/tx_collection/tx_source.d.ts +6 -5
  162. package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
  163. package/dest/services/tx_collection/tx_source.js +9 -7
  164. package/dest/test-helpers/make-test-p2p-clients.d.ts +1 -1
  165. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  166. package/dest/test-helpers/reqresp-nodes.d.ts +1 -1
  167. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  168. package/dest/test-helpers/reqresp-nodes.js +0 -2
  169. package/dest/test-helpers/testbench-utils.d.ts +1 -1
  170. package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
  171. package/dest/test-helpers/testbench-utils.js +23 -3
  172. package/dest/testbench/p2p_client_testbench_worker.js +68 -16
  173. package/dest/testbench/worker_client_manager.d.ts +10 -1
  174. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  175. package/dest/testbench/worker_client_manager.js +55 -3
  176. package/dest/util.d.ts +1 -1
  177. package/package.json +14 -14
  178. package/src/client/factory.ts +43 -14
  179. package/src/client/interface.ts +9 -1
  180. package/src/client/p2p_client.ts +39 -36
  181. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +19 -9
  182. package/src/config.ts +92 -4
  183. package/src/errors/p2p-service.error.ts +11 -0
  184. package/src/index.ts +0 -1
  185. package/src/mem_pools/attestation_pool/attestation_pool.ts +7 -5
  186. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +6 -6
  187. package/src/mem_pools/index.ts +0 -3
  188. package/src/mem_pools/tx_pool_v2/README.md +9 -1
  189. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +2 -1
  190. package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +11 -1
  191. package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +15 -6
  192. package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +2 -1
  193. package/src/mem_pools/tx_pool_v2/interfaces.ts +9 -4
  194. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +59 -13
  195. package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +29 -43
  196. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +13 -1
  197. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +23 -6
  198. package/src/msg_validators/attestation_validator/README.md +49 -0
  199. package/src/msg_validators/attestation_validator/attestation_validator.ts +5 -4
  200. package/src/msg_validators/clock_tolerance.ts +4 -3
  201. package/src/msg_validators/proposal_validator/README.md +123 -0
  202. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +13 -3
  203. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +19 -6
  204. package/src/msg_validators/proposal_validator/proposal_validator.ts +63 -53
  205. package/src/msg_validators/tx_validator/README.md +5 -1
  206. package/src/msg_validators/tx_validator/allowed_public_setup.ts +16 -35
  207. package/src/msg_validators/tx_validator/allowed_setup_helpers.ts +31 -0
  208. package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
  209. package/src/msg_validators/tx_validator/data_validator.ts +42 -1
  210. package/src/msg_validators/tx_validator/factory.ts +43 -3
  211. package/src/msg_validators/tx_validator/fee_payer_balance.ts +6 -2
  212. package/src/msg_validators/tx_validator/gas_validator.ts +65 -16
  213. package/src/msg_validators/tx_validator/index.ts +1 -0
  214. package/src/msg_validators/tx_validator/metadata_validator.ts +12 -4
  215. package/src/msg_validators/tx_validator/phases_validator.ts +60 -1
  216. package/src/services/dummy_service.ts +7 -2
  217. package/src/services/encoding.ts +9 -1
  218. package/src/services/libp2p/libp2p_service.ts +148 -140
  219. package/src/services/peer-manager/peer_manager.ts +26 -8
  220. package/src/services/peer-manager/peer_scoring.ts +27 -5
  221. package/src/services/reqresp/README.md +229 -0
  222. package/src/services/reqresp/batch-tx-requester/README.md +46 -7
  223. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +64 -69
  224. package/src/services/reqresp/batch-tx-requester/interface.ts +2 -1
  225. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +13 -6
  226. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +5 -0
  227. package/src/services/reqresp/interface.ts +0 -11
  228. package/src/services/reqresp/metrics.ts +0 -1
  229. package/src/services/reqresp/protocols/index.ts +0 -1
  230. package/src/services/reqresp/protocols/tx.ts +1 -3
  231. package/src/services/reqresp/rate-limiter/rate_limiter.ts +13 -9
  232. package/src/services/reqresp/rate-limiter/rate_limits.ts +0 -10
  233. package/src/services/reqresp/reqresp.ts +20 -12
  234. package/src/services/service.ts +6 -1
  235. package/src/services/tx_collection/fast_tx_collection.ts +57 -83
  236. package/src/services/tx_collection/file_store_tx_source.ts +43 -31
  237. package/src/services/tx_collection/proposal_tx_collector.ts +8 -13
  238. package/src/services/tx_collection/request_tracker.ts +127 -0
  239. package/src/services/tx_collection/slow_tx_collection.ts +1 -1
  240. package/src/services/tx_collection/tx_collection.ts +3 -5
  241. package/src/services/tx_collection/tx_source.ts +8 -7
  242. package/src/test-helpers/make-test-p2p-clients.ts +1 -1
  243. package/src/test-helpers/reqresp-nodes.ts +1 -3
  244. package/src/test-helpers/testbench-utils.ts +30 -3
  245. package/src/testbench/p2p_client_testbench_worker.ts +72 -15
  246. package/src/testbench/worker_client_manager.ts +68 -6
  247. package/src/util.ts +1 -1
  248. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +0 -125
  249. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +0 -1
  250. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +0 -596
  251. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +0 -32
  252. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +0 -1
  253. package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +0 -112
  254. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +0 -157
  255. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +0 -1
  256. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +0 -52
  257. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +0 -16
  258. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +0 -1
  259. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +0 -122
  260. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +0 -17
  261. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +0 -1
  262. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +0 -84
  263. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +0 -19
  264. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +0 -1
  265. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +0 -78
  266. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +0 -26
  267. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +0 -1
  268. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +0 -84
  269. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +0 -25
  270. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +0 -1
  271. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +0 -57
  272. package/dest/mem_pools/tx_pool/index.d.ts +0 -3
  273. package/dest/mem_pools/tx_pool/index.d.ts.map +0 -1
  274. package/dest/mem_pools/tx_pool/index.js +0 -2
  275. package/dest/mem_pools/tx_pool/priority.d.ts +0 -12
  276. package/dest/mem_pools/tx_pool/priority.d.ts.map +0 -1
  277. package/dest/mem_pools/tx_pool/priority.js +0 -15
  278. package/dest/mem_pools/tx_pool/tx_pool.d.ts +0 -127
  279. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +0 -1
  280. package/dest/mem_pools/tx_pool/tx_pool.js +0 -3
  281. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +0 -7
  282. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +0 -1
  283. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +0 -400
  284. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +0 -24
  285. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +0 -1
  286. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +0 -378
  287. package/dest/services/reqresp/protocols/block.d.ts +0 -9
  288. package/dest/services/reqresp/protocols/block.d.ts.map +0 -1
  289. package/dest/services/reqresp/protocols/block.js +0 -32
  290. package/dest/services/tx_collection/missing_txs_tracker.d.ts +0 -32
  291. package/dest/services/tx_collection/missing_txs_tracker.d.ts.map +0 -1
  292. package/dest/services/tx_collection/missing_txs_tracker.js +0 -27
  293. package/src/mem_pools/tx_pool/README.md +0 -270
  294. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -746
  295. package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +0 -132
  296. package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +0 -208
  297. package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +0 -162
  298. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +0 -104
  299. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +0 -93
  300. package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +0 -106
  301. package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +0 -75
  302. package/src/mem_pools/tx_pool/index.ts +0 -2
  303. package/src/mem_pools/tx_pool/priority.ts +0 -20
  304. package/src/mem_pools/tx_pool/tx_pool.ts +0 -141
  305. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +0 -319
  306. package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +0 -373
  307. package/src/services/reqresp/protocols/block.ts +0 -37
  308. package/src/services/tx_collection/missing_txs_tracker.ts +0 -52
@@ -1,12 +1,12 @@
1
1
  import type { EpochCacheInterface } from '@aztec/epoch-cache';
2
2
  import { BlockNumber, type SlotNumber } from '@aztec/foundation/branded-types';
3
- import { Fr } from '@aztec/foundation/curves/bn254';
3
+ import { maxBy } from '@aztec/foundation/collection';
4
4
  import { type Logger, createLibp2pComponentLogger, createLogger } from '@aztec/foundation/log';
5
5
  import { RunningPromise } from '@aztec/foundation/running-promise';
6
6
  import { Timer } from '@aztec/foundation/timer';
7
7
  import type { AztecAsyncKVStore } from '@aztec/kv-store';
8
8
  import { protocolContractsHash } from '@aztec/protocol-contracts';
9
- import type { EthAddress, L2Block, L2BlockSource } from '@aztec/stdlib/block';
9
+ import type { EthAddress, L2BlockSource } from '@aztec/stdlib/block';
10
10
  import type { ContractDataSource } from '@aztec/stdlib/contract';
11
11
  import { GasFees } from '@aztec/stdlib/gas';
12
12
  import type { ClientProtocolCircuitVerifier, PeerInfo, WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
@@ -17,8 +17,8 @@ import {
17
17
  type CheckpointProposalCore,
18
18
  type Gossipable,
19
19
  P2PMessage,
20
- type ValidationResult as P2PValidationResult,
21
20
  PeerErrorSeverity,
21
+ PeerErrorSeverityByHarshness,
22
22
  TopicType,
23
23
  createTopicString,
24
24
  getTopicsForConfig,
@@ -57,6 +57,7 @@ import { ENR } from '@nethermindeth/enr';
57
57
  import { createLibp2p } from 'libp2p';
58
58
 
59
59
  import type { P2PConfig } from '../../config.js';
60
+ import { CheckpointProposalReceivedCallbackNotRegisteredError } from '../../errors/p2p-service.error.js';
60
61
  import type { MemPools } from '../../mem_pools/interface.js';
61
62
  import {
62
63
  BlockProposalValidator,
@@ -103,7 +104,6 @@ import {
103
104
  ValidationError,
104
105
  pingHandler,
105
106
  reqGoodbyeHandler,
106
- reqRespBlockHandler,
107
107
  reqRespBlockTxsHandler,
108
108
  reqRespStatusHandler,
109
109
  reqRespTxHandler,
@@ -129,7 +129,7 @@ type ValidationOutcome = { allPassed: true } | { allPassed: false; failure: Vali
129
129
  // REFACTOR: Unify with the type above
130
130
  type ReceivedMessageValidationResult<T, M = undefined> =
131
131
  | { obj: T; result: Exclude<TopicValidatorResult, TopicValidatorResult.Reject>; metadata?: M }
132
- | { obj?: T; result: TopicValidatorResult.Reject; metadata?: M };
132
+ | { obj?: T; result: TopicValidatorResult.Reject; metadata?: M; severity: PeerErrorSeverity };
133
133
 
134
134
  /**
135
135
  * Lib P2P implementation of the P2PService interface.
@@ -170,7 +170,13 @@ export class LibP2PService extends WithTracer implements P2PService {
170
170
  * @param checkpoint - The checkpoint proposal received from the peer.
171
171
  * @returns The attestations for the checkpoint, if any.
172
172
  */
173
- private checkpointReceivedCallback: P2PCheckpointReceivedCallback;
173
+ private allNodesCheckpointReceivedCallback: P2PCheckpointReceivedCallback;
174
+ /**
175
+ * Callback for when a checkpoint proposal is received - specifically for validators - from a peer.
176
+ * @param checkpoint - The checkpoint proposal received from the peer.
177
+ * @returns The attestations for the checkpoint, if any.
178
+ */
179
+ private validatorCheckpointReceivedCallback: P2PCheckpointReceivedCallback;
174
180
 
175
181
  private gossipSubEventHandler: (e: CustomEvent<GossipsubMessage>) => void;
176
182
 
@@ -222,14 +228,12 @@ export class LibP2PService extends WithTracer implements P2PService {
222
228
  this.protocolVersion,
223
229
  );
224
230
 
225
- this.blockProposalValidator = new BlockProposalValidator(epochCache, {
226
- txsPermitted: !config.disableTransactions,
227
- maxTxsPerBlock: config.maxTxsPerBlock,
228
- });
229
- this.checkpointProposalValidator = new CheckpointProposalValidator(epochCache, {
231
+ const proposalValidatorOpts = {
230
232
  txsPermitted: !config.disableTransactions,
231
- maxTxsPerBlock: config.maxTxsPerBlock,
232
- });
233
+ maxTxsPerBlock: config.validateMaxTxsPerBlock ?? config.validateMaxTxsPerCheckpoint,
234
+ };
235
+ this.blockProposalValidator = new BlockProposalValidator(epochCache, proposalValidatorOpts);
236
+ this.checkpointProposalValidator = new CheckpointProposalValidator(epochCache, proposalValidatorOpts);
233
237
  this.checkpointAttestationValidator = config.fishermanMode
234
238
  ? new FishermanAttestationValidator(epochCache, mempools.attestationPool, telemetry)
235
239
  : new CheckpointAttestationValidator(epochCache);
@@ -237,19 +241,22 @@ export class LibP2PService extends WithTracer implements P2PService {
237
241
  this.gossipSubEventHandler = this.handleGossipSubEvent.bind(this);
238
242
 
239
243
  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.`,
244
+ this.logger.warn(
245
+ `Handler for block received not yet registered on P2P service. Received block ${block.blockNumber} for slot ${block.slotNumber} from peer.`,
242
246
  { p2pMessageIdentifier: await block.p2pMessageLoggingIdentifier() },
243
247
  );
244
- return false;
248
+ return true;
245
249
  };
246
250
 
247
- this.checkpointReceivedCallback = (
248
- checkpoint: CheckpointProposalCore,
251
+ this.allNodesCheckpointReceivedCallback = (
252
+ _checkpoint: CheckpointProposalCore,
253
+ ): Promise<CheckpointAttestation[] | undefined> => {
254
+ throw new CheckpointProposalReceivedCallbackNotRegisteredError();
255
+ };
256
+
257
+ this.validatorCheckpointReceivedCallback = (
258
+ _checkpoint: CheckpointProposalCore,
249
259
  ): 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
260
  return Promise.resolve(undefined);
254
261
  };
255
262
  }
@@ -511,14 +518,12 @@ export class LibP2PService extends WithTracer implements P2PService {
511
518
  // Create request response protocol handlers
512
519
  const txHandler = reqRespTxHandler(this.mempools);
513
520
  const goodbyeHandler = reqGoodbyeHandler(this.peerManager);
514
- const blockHandler = reqRespBlockHandler(this.archiver);
515
521
  const statusHandler = reqRespStatusHandler(this.protocolVersion, this.worldStateSynchronizer, this.logger);
516
522
 
517
523
  const requestResponseHandlers: Partial<ReqRespSubProtocolHandlers> = {
518
524
  [ReqRespSubProtocol.PING]: pingHandler,
519
525
  [ReqRespSubProtocol.STATUS]: statusHandler.bind(this),
520
526
  [ReqRespSubProtocol.GOODBYE]: goodbyeHandler.bind(this),
521
- [ReqRespSubProtocol.BLOCK]: blockHandler.bind(this),
522
527
  };
523
528
 
524
529
  if (!this.config.disableTransactions) {
@@ -539,7 +544,6 @@ export class LibP2PService extends WithTracer implements P2PService {
539
544
  ...DEFAULT_SUB_PROTOCOL_VALIDATORS,
540
545
  [ReqRespSubProtocol.TX]: this.validateRequestedTxs.bind(this),
541
546
  [ReqRespSubProtocol.BLOCK_TXS]: this.validateRequestedBlockTxs.bind(this),
542
- [ReqRespSubProtocol.BLOCK]: this.validateRequestedBlock.bind(this),
543
547
  };
544
548
 
545
549
  await this.peerManager.initializePeers();
@@ -667,8 +671,16 @@ export class LibP2PService extends WithTracer implements P2PService {
667
671
  this.blockReceivedCallback = callback;
668
672
  }
669
673
 
670
- public registerCheckpointReceivedCallback(callback: P2PCheckpointReceivedCallback) {
671
- this.checkpointReceivedCallback = callback;
674
+ public registerValidatorCheckpointReceivedCallback(callback: P2PCheckpointReceivedCallback) {
675
+ this.validatorCheckpointReceivedCallback = callback;
676
+ }
677
+
678
+ public registerAllNodesCheckpointReceivedCallback(callback: P2PCheckpointReceivedCallback) {
679
+ this.allNodesCheckpointReceivedCallback = callback;
680
+ }
681
+
682
+ public async notifyOwnCheckpointProposal(checkpoint: CheckpointProposalCore): Promise<void> {
683
+ await this.allNodesCheckpointReceivedCallback(checkpoint, this.node.peerId);
672
684
  }
673
685
 
674
686
  /**
@@ -754,6 +766,9 @@ export class LibP2PService extends WithTracer implements P2PService {
754
766
  if (!validator || !validator.addMessage(msgId)) {
755
767
  this.instrumentation.incMessagePrevalidationStatus(false, topicType);
756
768
  this.node.services.pubsub.reportMessageValidationResult(msgId, source.toString(), TopicValidatorResult.Ignore);
769
+ if (topicType === TopicType.tx) {
770
+ this.logger.verbose(`Ignoring already-seen tx gossip message`, { msgId, source: source.toString() });
771
+ }
757
772
  return { result: false, topicType };
758
773
  }
759
774
 
@@ -880,30 +895,56 @@ export class LibP2PService extends WithTracer implements P2PService {
880
895
  source: PeerId,
881
896
  topicType: TopicType,
882
897
  ): Promise<ReceivedMessageValidationResult<T, M>> {
883
- let resultAndObj: ReceivedMessageValidationResult<T, M> = { result: TopicValidatorResult.Reject };
898
+ // Default to reject result with a penalty if validation function throws an error
899
+ let resultAndObj: ReceivedMessageValidationResult<T, M> = {
900
+ result: TopicValidatorResult.Reject,
901
+ severity: PeerErrorSeverity.MidToleranceError,
902
+ };
884
903
  const timer = new Timer();
885
904
  try {
886
905
  resultAndObj = await validationFunc();
887
906
  } 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
- });
907
+ this.logger.error(`Error validating gossipsub message`, err, { msgId, source: source.toString(), topicType });
894
908
  }
895
909
 
896
910
  if (resultAndObj.result === TopicValidatorResult.Accept) {
911
+ this.logger.debug(`Message ${topicType} accepted by validator`, { msgId, source: source.toString(), topicType });
897
912
  this.instrumentation.recordMessageValidation(topicType, timer);
913
+ } else if (resultAndObj.result === TopicValidatorResult.Reject) {
914
+ this.logger.warn(`Message ${topicType} rejected by validator with severity ${resultAndObj.severity}`, {
915
+ msgId,
916
+ source: source.toString(),
917
+ topicType,
918
+ severity: resultAndObj.severity,
919
+ });
920
+ this.peerManager.penalizePeer(source, resultAndObj.severity);
921
+ } else {
922
+ this.logger.trace(`Message ${topicType} ignored by validator`, { msgId, source: source.toString(), topicType });
898
923
  }
899
924
 
900
925
  this.node.services.pubsub.reportMessageValidationResult(msgId, source.toString(), resultAndObj.result);
901
926
  return resultAndObj;
902
927
  }
903
928
 
929
+ private tryDeserialize<T>(deserializeFunc: () => T, msgId: string, source: PeerId): T | undefined {
930
+ try {
931
+ return deserializeFunc();
932
+ } catch (err) {
933
+ this.logger.warn(`Failed to deserialize gossipsub message from buffer`, {
934
+ err,
935
+ msgId,
936
+ source: source.toString(),
937
+ });
938
+ return undefined;
939
+ }
940
+ }
941
+
904
942
  protected async handleGossipedTx(payloadData: Buffer, msgId: string, source: PeerId) {
905
943
  const validationFunc: () => Promise<ReceivedMessageValidationResult<Tx>> = async () => {
906
- const tx = Tx.fromBuffer(payloadData);
944
+ const tx = this.tryDeserialize(() => Tx.fromBuffer(payloadData), msgId, source);
945
+ if (!tx) {
946
+ return { result: TopicValidatorResult.Reject, severity: PeerErrorSeverity.LowToleranceError };
947
+ }
907
948
 
908
949
  const currentBlockNumber = await this.archiver.getBlockNumber();
909
950
  const { ts: nextSlotTimestamp } = this.epochCache.getEpochAndSlotInNextL1Slot();
@@ -923,13 +964,20 @@ export class LibP2PService extends WithTracer implements P2PService {
923
964
  severity = await this.handleDoubleSpendFailure(tx, txBlockNumber);
924
965
  }
925
966
 
926
- this.peerManager.penalizePeer(source, severity);
927
- return { result: TopicValidatorResult.Reject };
967
+ this.logger.verbose(`Rejecting gossiped tx ${tx.getTxHash().toString()}: stage 1 validation failed`, {
968
+ validator: name,
969
+ severity,
970
+ source: source.toString(),
971
+ });
972
+ return { result: TopicValidatorResult.Reject, severity };
928
973
  }
929
974
 
930
975
  // Pool pre-check: see if the pool would accept this tx before doing expensive proof verification
931
976
  const canAdd = await this.mempools.txPool.canAddPendingTx(tx);
932
977
  if (canAdd === 'ignored') {
978
+ this.logger.verbose(`Ignoring gossiped tx ${tx.getTxHash().toString()}: pool pre-check returned ignored`, {
979
+ source: source.toString(),
980
+ });
933
981
  return { result: TopicValidatorResult.Ignore, obj: tx };
934
982
  }
935
983
 
@@ -937,9 +985,13 @@ export class LibP2PService extends WithTracer implements P2PService {
937
985
  const secondStageValidators = this.createSecondStageMessageValidators();
938
986
  const secondStageOutcome = await this.runValidations(tx, secondStageValidators);
939
987
  if (!secondStageOutcome.allPassed) {
940
- const { severity } = secondStageOutcome.failure;
941
- this.peerManager.penalizePeer(source, severity);
942
- return { result: TopicValidatorResult.Reject };
988
+ const { severity, name } = secondStageOutcome.failure;
989
+ this.logger.verbose(`Rejecting gossiped tx ${tx.getTxHash().toString()}: stage 2 validation failed`, {
990
+ validator: name,
991
+ severity,
992
+ source: source.toString(),
993
+ });
994
+ return { result: TopicValidatorResult.Reject, severity };
943
995
  }
944
996
 
945
997
  // Pool add: persist the tx
@@ -949,7 +1001,7 @@ export class LibP2PService extends WithTracer implements P2PService {
949
1001
  const wasAccepted = addResult.accepted.some(h => h.equals(txHash));
950
1002
  const wasIgnored = addResult.ignored.some(h => h.equals(txHash));
951
1003
 
952
- this.logger.trace(`Validate propagated tx`, {
1004
+ this.logger.verbose(`Validate propagated tx ${txHash.toString()}`, {
953
1005
  wasAccepted,
954
1006
  wasIgnored,
955
1007
  [Attributes.P2P_ID]: source.toString(),
@@ -960,7 +1012,11 @@ export class LibP2PService extends WithTracer implements P2PService {
960
1012
  } else if (wasIgnored) {
961
1013
  return { result: TopicValidatorResult.Ignore, obj: tx };
962
1014
  } else {
963
- return { result: TopicValidatorResult.Reject };
1015
+ this.logger.warn(`Gossiped tx ${txHash.toString()} unexpectedly rejected by pool`, {
1016
+ source: source.toString(),
1017
+ txHash: txHash.toString(),
1018
+ });
1019
+ return { result: TopicValidatorResult.Reject, severity: PeerErrorSeverity.HighToleranceError };
964
1020
  }
965
1021
  };
966
1022
 
@@ -990,7 +1046,16 @@ export class LibP2PService extends WithTracer implements P2PService {
990
1046
  source: PeerId,
991
1047
  ): Promise<void> {
992
1048
  const { result, obj: attestation } = await this.validateReceivedMessage<CheckpointAttestation>(
993
- () => this.validateAndStoreCheckpointAttestation(source, CheckpointAttestation.fromBuffer(payloadData)),
1049
+ () => {
1050
+ const attestation = this.tryDeserialize(() => CheckpointAttestation.fromBuffer(payloadData), msgId, source);
1051
+ if (!attestation) {
1052
+ return Promise.resolve({
1053
+ result: TopicValidatorResult.Reject,
1054
+ severity: PeerErrorSeverity.LowToleranceError,
1055
+ });
1056
+ }
1057
+ return this.validateAndStoreCheckpointAttestation(source, attestation);
1058
+ },
994
1059
  msgId,
995
1060
  source,
996
1061
  TopicType.checkpoint_attestation,
@@ -1023,8 +1088,7 @@ export class LibP2PService extends WithTracer implements P2PService {
1023
1088
 
1024
1089
  if (validationResult.result === 'reject') {
1025
1090
  this.logger.warn(`Penalizing peer ${peerId} for checkpoint attestation validation failure`);
1026
- this.peerManager.penalizePeer(peerId, validationResult.severity);
1027
- return { result: TopicValidatorResult.Reject };
1091
+ return { result: TopicValidatorResult.Reject, severity: validationResult.severity };
1028
1092
  }
1029
1093
 
1030
1094
  if (validationResult.result === 'ignore') {
@@ -1050,16 +1114,16 @@ export class LibP2PService extends WithTracer implements P2PService {
1050
1114
  return { result: TopicValidatorResult.Ignore, obj: attestation };
1051
1115
  }
1052
1116
 
1053
- // Could not add (cap reached for signer), no need to re-broadcast
1117
+ // Could not add (cap reached for signer), penalize and do not re-broadcast
1054
1118
  if (!added) {
1055
- this.logger.warn(`Dropping checkpoint attestation due to cap`, {
1119
+ this.logger.warn(`Rejecting checkpoint attestation due to cap`, {
1056
1120
  slot: slot.toString(),
1057
1121
  archive: attestation.archive.toString(),
1058
1122
  source: peerId.toString(),
1059
1123
  attester: attestation.getSender()?.toString(),
1060
1124
  count,
1061
1125
  });
1062
- return { result: TopicValidatorResult.Ignore, obj: attestation };
1126
+ return { result: TopicValidatorResult.Reject, severity: PeerErrorSeverity.HighToleranceError };
1063
1127
  }
1064
1128
 
1065
1129
  // Check if this is a duplicate attestation (signer attested to a different proposal at the same slot)
@@ -1114,8 +1178,7 @@ export class LibP2PService extends WithTracer implements P2PService {
1114
1178
 
1115
1179
  if (validationResult.result === 'reject') {
1116
1180
  this.logger.warn(`Penalizing peer ${peerId} for block proposal validation failure`);
1117
- this.peerManager.penalizePeer(peerId, validationResult.severity);
1118
- return { result: TopicValidatorResult.Reject };
1181
+ return { result: TopicValidatorResult.Reject, severity: validationResult.severity };
1119
1182
  }
1120
1183
 
1121
1184
  if (validationResult.result === 'ignore') {
@@ -1139,7 +1202,6 @@ export class LibP2PService extends WithTracer implements P2PService {
1139
1202
 
1140
1203
  // Too many blocks received for this slot and index, penalize peer and do not re-broadcast
1141
1204
  if (!added) {
1142
- this.peerManager.penalizePeer(peerId, PeerErrorSeverity.HighToleranceError);
1143
1205
  this.logger.warn(`Penalizing peer for block proposal exceeding per-position cap`, {
1144
1206
  ...block.toBlockInfo(),
1145
1207
  indexWithinCheckpoint: block.indexWithinCheckpoint,
@@ -1147,7 +1209,11 @@ export class LibP2PService extends WithTracer implements P2PService {
1147
1209
  proposer: block.getSender()?.toString(),
1148
1210
  source: peerId.toString(),
1149
1211
  });
1150
- return { result: TopicValidatorResult.Reject, metadata: { isEquivocated } };
1212
+ return {
1213
+ result: TopicValidatorResult.Reject,
1214
+ metadata: { isEquivocated },
1215
+ severity: PeerErrorSeverity.HighToleranceError,
1216
+ };
1151
1217
  }
1152
1218
 
1153
1219
  // If this was a duplicate proposal, do not process it, but do invoke the duplicate callback,
@@ -1192,7 +1258,7 @@ export class LibP2PService extends WithTracer implements P2PService {
1192
1258
  // Note: Validators do NOT attest to individual blocks, only to checkpoint proposals.
1193
1259
  const isValid = await this.blockReceivedCallback(block, sender);
1194
1260
  if (!isValid) {
1195
- this.logger.warn(`Block proposal validation failed for block ${block.blockNumber}`, block.toBlockInfo());
1261
+ this.logger.info(`Block proposal validation failed for block ${block.blockNumber}`, block.toBlockInfo());
1196
1262
  }
1197
1263
  }
1198
1264
 
@@ -1240,8 +1306,7 @@ export class LibP2PService extends WithTracer implements P2PService {
1240
1306
 
1241
1307
  if (validationResult.result === 'reject') {
1242
1308
  this.logger.warn(`Penalizing peer ${peerId} for checkpoint proposal validation failure`);
1243
- this.peerManager.penalizePeer(peerId, validationResult.severity);
1244
- return { result: TopicValidatorResult.Reject };
1309
+ return { result: TopicValidatorResult.Reject, severity: validationResult.severity };
1245
1310
  }
1246
1311
 
1247
1312
  if (validationResult.result === 'ignore') {
@@ -1256,20 +1321,21 @@ export class LibP2PService extends WithTracer implements P2PService {
1256
1321
  [Attributes.SLOT_NUMBER]: checkpoint.slotNumber.toString(),
1257
1322
  [Attributes.P2P_ID]: peerId.toString(),
1258
1323
  });
1259
- const {
1260
- result,
1261
- obj,
1262
- metadata: { isEquivocated } = {},
1263
- } = await this.validateAndStoreBlockProposal(peerId, blockProposal);
1264
- if (result === TopicValidatorResult.Reject || !obj || isEquivocated) {
1324
+ const blockProposalResult = await this.validateAndStoreBlockProposal(peerId, blockProposal);
1325
+ const { obj, metadata: { isEquivocated } = {} } = blockProposalResult;
1326
+ if (blockProposalResult.result === TopicValidatorResult.Reject || !obj || isEquivocated) {
1265
1327
  this.logger.debug(`Rejecting checkpoint due to invalid last block proposal`, {
1266
1328
  [Attributes.SLOT_NUMBER]: checkpoint.slotNumber.toString(),
1267
1329
  [Attributes.P2P_ID]: peerId.toString(),
1268
1330
  isEquivocated,
1269
- result,
1331
+ result: blockProposalResult.result,
1270
1332
  });
1271
- return { result: TopicValidatorResult.Reject };
1272
- } else if (result === TopicValidatorResult.Accept && obj && !isEquivocated) {
1333
+ return {
1334
+ result: TopicValidatorResult.Reject,
1335
+ severity:
1336
+ 'severity' in blockProposalResult ? blockProposalResult.severity : PeerErrorSeverity.MidToleranceError,
1337
+ };
1338
+ } else if (blockProposalResult.result === TopicValidatorResult.Accept && obj && !isEquivocated) {
1273
1339
  processBlock = true;
1274
1340
  }
1275
1341
  }
@@ -1296,13 +1362,17 @@ export class LibP2PService extends WithTracer implements P2PService {
1296
1362
  // Too many checkpoint proposals received for this slot, penalize peer and do not re-broadcast
1297
1363
  // Note: We still return the checkpoint obj so the lastBlock can be processed if valid
1298
1364
  if (!added) {
1299
- this.peerManager.penalizePeer(peerId, PeerErrorSeverity.HighToleranceError);
1300
1365
  this.logger.warn(`Penalizing peer for checkpoint proposal exceeding per-slot cap`, {
1301
1366
  ...checkpoint.toCheckpointInfo(),
1302
1367
  count,
1303
1368
  source: peerId.toString(),
1304
1369
  });
1305
- return { result: TopicValidatorResult.Reject, obj: checkpoint, metadata: { isEquivocated, processBlock } };
1370
+ return {
1371
+ result: TopicValidatorResult.Reject,
1372
+ obj: checkpoint,
1373
+ metadata: { isEquivocated, processBlock },
1374
+ severity: PeerErrorSeverity.HighToleranceError,
1375
+ };
1306
1376
  }
1307
1377
 
1308
1378
  // If this was a duplicate proposal, do not process it, but do invoke the duplicate callback,
@@ -1347,9 +1417,11 @@ export class LibP2PService extends WithTracer implements P2PService {
1347
1417
  source: sender.toString(),
1348
1418
  });
1349
1419
 
1420
+ await this.allNodesCheckpointReceivedCallback(checkpoint, sender);
1421
+
1350
1422
  // Call the checkpoint received callback with the core version (without lastBlock)
1351
1423
  // to validate and potentially generate attestations
1352
- const attestations = await this.checkpointReceivedCallback(checkpoint, sender);
1424
+ const attestations = await this.validatorCheckpointReceivedCallback(checkpoint, sender);
1353
1425
  if (attestations && attestations.length > 0) {
1354
1426
  // If the callback returned attestations, add them to the pool and propagate them
1355
1427
  await this.mempools.attestationPool.addOwnCheckpointAttestations(attestations);
@@ -1497,53 +1569,6 @@ export class LibP2PService extends WithTracer implements P2PService {
1497
1569
  }
1498
1570
  }
1499
1571
 
1500
- /**
1501
- * Validates a BLOCK response.
1502
- *
1503
- * If a local copy exists, enforces hash equality. If missing, rejects (no penalty) since the hash cannot be verified.
1504
- * Penalizes on block number mismatch or hash mismatch.
1505
- *
1506
- * @param requestedBlockNumber - The requested block number.
1507
- * @param responseBlock - The block returned by the peer.
1508
- * @param peerId - The peer that returned the block.
1509
- * @returns True if the response is valid, false otherwise.
1510
- */
1511
- @trackSpan('Libp2pService.validateRequestedBlock', (requestedBlockNumber, _responseBlock) => ({
1512
- [Attributes.BLOCK_NUMBER]: requestedBlockNumber.toString(),
1513
- }))
1514
- protected async validateRequestedBlock(
1515
- requestedBlockNumber: Fr,
1516
- responseBlock: L2Block,
1517
- peerId: PeerId,
1518
- ): Promise<boolean> {
1519
- try {
1520
- const reqNum = Number(requestedBlockNumber.toString());
1521
- if (responseBlock.number !== reqNum) {
1522
- this.peerManager.penalizePeer(peerId, PeerErrorSeverity.LowToleranceError);
1523
- return false;
1524
- }
1525
-
1526
- const local = await this.archiver.getBlock(BlockNumber(reqNum));
1527
- if (!local) {
1528
- // We are missing the local block; we cannot verify the hash yet. Reject without penalizing.
1529
- // TODO: Consider extending this validator to accept an expected hash or
1530
- // performing quorum-based checks when using P2P syncing prior to L1 sync.
1531
- this.logger.warn(`Local block ${reqNum} not found; rejecting BLOCK response without hash verification`);
1532
- return false;
1533
- }
1534
- const [localHash, respHash] = await Promise.all([local.hash(), responseBlock.hash()]);
1535
- if (!localHash.equals(respHash)) {
1536
- this.peerManager.penalizePeer(peerId, PeerErrorSeverity.MidToleranceError);
1537
- return false;
1538
- }
1539
-
1540
- return true;
1541
- } catch (e) {
1542
- this.logger.warn(`Error validating requested block`, e);
1543
- return false;
1544
- }
1545
- }
1546
-
1547
1572
  protected async validateRequestedTx(
1548
1573
  tx: Tx,
1549
1574
  peerId: PeerId,
@@ -1626,6 +1651,7 @@ export class LibP2PService extends WithTracer implements P2PService {
1626
1651
  ...(this.config.txPublicSetupAllowListExtend ?? []),
1627
1652
  ];
1628
1653
  const blockNumber = BlockNumber(currentBlockNumber + 1);
1654
+ const l1Constants = await this.archiver.getL1Constants();
1629
1655
 
1630
1656
  return createFirstStageTxValidationsForGossipedTransactions(
1631
1657
  nextSlotTimestamp,
@@ -1639,6 +1665,11 @@ export class LibP2PService extends WithTracer implements P2PService {
1639
1665
  !this.config.disableTransactions,
1640
1666
  allowedInSetup,
1641
1667
  this.logger.getBindings(),
1668
+ {
1669
+ rollupManaLimit: l1Constants.rollupManaLimit,
1670
+ maxBlockL2Gas: this.config.validateMaxL2BlockGas,
1671
+ maxBlockDAGas: this.config.validateMaxDABlockGas,
1672
+ },
1642
1673
  );
1643
1674
  }
1644
1675
 
@@ -1664,8 +1695,10 @@ export class LibP2PService extends WithTracer implements P2PService {
1664
1695
 
1665
1696
  // A promise that resolves when all validations have been run
1666
1697
  const allValidations = await Promise.all(validationPromises);
1667
- const failed = allValidations.find(x => !x.isValid);
1668
- if (failed) {
1698
+ const failures = allValidations.filter(x => !x.isValid);
1699
+ if (failures.length > 0) {
1700
+ // Pick the most severe failure (lowest tolerance = harshest penalty)
1701
+ const failed = maxBy(failures, f => PeerErrorSeverityByHarshness.indexOf(f.severity))!;
1669
1702
  return {
1670
1703
  allPassed: false,
1671
1704
  failure: {
@@ -1718,31 +1751,6 @@ export class LibP2PService extends WithTracer implements P2PService {
1718
1751
  return PeerErrorSeverity.HighToleranceError;
1719
1752
  }
1720
1753
 
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
1754
  public getPeerScore(peerId: PeerId): number {
1747
1755
  return this.node.services.pubsub.score.score(peerId.toString());
1748
1756
  }
@@ -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