@aztec/p2p 0.0.1-commit.87a0206 → 0.0.1-commit.88e6f9396

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 (381) hide show
  1. package/README.md +129 -3
  2. package/dest/client/factory.d.ts +9 -9
  3. package/dest/client/factory.d.ts.map +1 -1
  4. package/dest/client/factory.js +50 -13
  5. package/dest/client/interface.d.ts +39 -33
  6. package/dest/client/interface.d.ts.map +1 -1
  7. package/dest/client/p2p_client.d.ts +37 -50
  8. package/dest/client/p2p_client.d.ts.map +1 -1
  9. package/dest/client/p2p_client.js +150 -223
  10. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +8 -8
  11. package/dest/config.d.ts +54 -17
  12. package/dest/config.d.ts.map +1 -1
  13. package/dest/config.js +102 -38
  14. package/dest/errors/tx-pool.error.d.ts +8 -0
  15. package/dest/errors/tx-pool.error.d.ts.map +1 -0
  16. package/dest/errors/tx-pool.error.js +9 -0
  17. package/dest/index.d.ts +2 -1
  18. package/dest/index.d.ts.map +1 -1
  19. package/dest/index.js +1 -0
  20. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +21 -12
  21. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  22. package/dest/mem_pools/attestation_pool/attestation_pool.js +72 -38
  23. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +1 -1
  24. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
  25. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +57 -57
  26. package/dest/mem_pools/attestation_pool/index.d.ts +2 -2
  27. package/dest/mem_pools/attestation_pool/index.d.ts.map +1 -1
  28. package/dest/mem_pools/attestation_pool/index.js +1 -1
  29. package/dest/mem_pools/attestation_pool/mocks.d.ts +2 -2
  30. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  31. package/dest/mem_pools/attestation_pool/mocks.js +2 -2
  32. package/dest/mem_pools/index.d.ts +2 -1
  33. package/dest/mem_pools/index.d.ts.map +1 -1
  34. package/dest/mem_pools/instrumentation.d.ts +4 -2
  35. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  36. package/dest/mem_pools/instrumentation.js +16 -14
  37. package/dest/mem_pools/interface.d.ts +3 -3
  38. package/dest/mem_pools/interface.d.ts.map +1 -1
  39. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +1 -1
  40. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -1
  41. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +2 -1
  42. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +3 -3
  43. package/dest/mem_pools/tx_pool/priority.d.ts +2 -2
  44. package/dest/mem_pools/tx_pool/priority.d.ts.map +1 -1
  45. package/dest/mem_pools/tx_pool/priority.js +4 -4
  46. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +1 -1
  47. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +1 -1
  48. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +3 -1
  49. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +104 -0
  50. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -0
  51. package/dest/mem_pools/tx_pool_v2/deleted_pool.js +251 -0
  52. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts +3 -3
  53. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts.map +1 -1
  54. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.js +18 -9
  55. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +1 -1
  56. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -1
  57. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +7 -3
  58. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +3 -3
  59. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -1
  60. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +12 -4
  61. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +2 -2
  62. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -1
  63. package/dest/mem_pools/tx_pool_v2/eviction/index.js +1 -1
  64. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +54 -5
  65. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -1
  66. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.js +8 -0
  67. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +7 -5
  68. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +7 -5
  69. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +2 -2
  70. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -1
  71. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +14 -6
  72. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +4 -4
  73. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -1
  74. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +16 -4
  75. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +3 -3
  76. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -1
  77. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +3 -3
  78. package/dest/mem_pools/tx_pool_v2/index.d.ts +3 -2
  79. package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -1
  80. package/dest/mem_pools/tx_pool_v2/index.js +2 -1
  81. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts +15 -0
  82. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts.map +1 -0
  83. package/dest/mem_pools/tx_pool_v2/instrumentation.js +43 -0
  84. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +30 -12
  85. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
  86. package/dest/mem_pools/tx_pool_v2/interfaces.js +5 -1
  87. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +78 -15
  88. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
  89. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +139 -18
  90. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +12 -3
  91. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -1
  92. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +50 -45
  93. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +12 -5
  94. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -1
  95. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +17 -6
  96. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +14 -5
  97. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -1
  98. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +364 -189
  99. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +1 -1
  100. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  101. package/dest/msg_validators/attestation_validator/attestation_validator.js +5 -4
  102. package/dest/msg_validators/clock_tolerance.d.ts +1 -1
  103. package/dest/msg_validators/clock_tolerance.d.ts.map +1 -1
  104. package/dest/msg_validators/clock_tolerance.js +4 -3
  105. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +6 -4
  106. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
  107. package/dest/msg_validators/proposal_validator/block_proposal_validator.js +10 -2
  108. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +6 -4
  109. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
  110. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +16 -2
  111. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +13 -8
  112. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
  113. package/dest/msg_validators/proposal_validator/proposal_validator.js +53 -41
  114. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +4 -4
  115. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  116. package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +3 -3
  117. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +2 -1
  118. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -1
  119. package/dest/msg_validators/tx_validator/allowed_public_setup.js +24 -20
  120. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts +17 -0
  121. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts.map +1 -0
  122. package/dest/msg_validators/tx_validator/allowed_setup_helpers.js +24 -0
  123. package/dest/msg_validators/tx_validator/block_header_validator.d.ts +16 -3
  124. package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
  125. package/dest/msg_validators/tx_validator/block_header_validator.js +1 -1
  126. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +13 -3
  127. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
  128. package/dest/msg_validators/tx_validator/double_spend_validator.js +4 -4
  129. package/dest/msg_validators/tx_validator/factory.d.ts +133 -6
  130. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  131. package/dest/msg_validators/tx_validator/factory.js +240 -59
  132. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +1 -1
  133. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -1
  134. package/dest/msg_validators/tx_validator/fee_payer_balance.js +6 -2
  135. package/dest/msg_validators/tx_validator/gas_validator.d.ts +67 -3
  136. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  137. package/dest/msg_validators/tx_validator/gas_validator.js +104 -37
  138. package/dest/msg_validators/tx_validator/index.d.ts +3 -1
  139. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  140. package/dest/msg_validators/tx_validator/index.js +2 -0
  141. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +1 -1
  142. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  143. package/dest/msg_validators/tx_validator/metadata_validator.js +4 -4
  144. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts +14 -0
  145. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts.map +1 -0
  146. package/dest/msg_validators/tx_validator/nullifier_cache.js +24 -0
  147. package/dest/msg_validators/tx_validator/phases_validator.d.ts +22 -2
  148. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
  149. package/dest/msg_validators/tx_validator/phases_validator.js +71 -23
  150. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +20 -4
  151. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
  152. package/dest/msg_validators/tx_validator/timestamp_validator.js +6 -6
  153. package/dest/services/dummy_service.d.ts +9 -5
  154. package/dest/services/dummy_service.d.ts.map +1 -1
  155. package/dest/services/dummy_service.js +7 -4
  156. package/dest/services/encoding.d.ts +7 -3
  157. package/dest/services/encoding.d.ts.map +1 -1
  158. package/dest/services/encoding.js +18 -11
  159. package/dest/services/gossipsub/index.d.ts +3 -0
  160. package/dest/services/gossipsub/index.d.ts.map +1 -0
  161. package/dest/services/gossipsub/index.js +2 -0
  162. package/dest/services/gossipsub/scoring.d.ts +21 -3
  163. package/dest/services/gossipsub/scoring.d.ts.map +1 -1
  164. package/dest/services/gossipsub/scoring.js +24 -7
  165. package/dest/services/gossipsub/topic_score_params.d.ts +173 -0
  166. package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -0
  167. package/dest/services/gossipsub/topic_score_params.js +346 -0
  168. package/dest/services/libp2p/libp2p_service.d.ts +25 -21
  169. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  170. package/dest/services/libp2p/libp2p_service.js +199 -174
  171. package/dest/services/peer-manager/metrics.d.ts +3 -1
  172. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  173. package/dest/services/peer-manager/metrics.js +6 -0
  174. package/dest/services/peer-manager/peer_manager.d.ts +1 -1
  175. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  176. package/dest/services/peer-manager/peer_manager.js +6 -3
  177. package/dest/services/peer-manager/peer_scoring.d.ts +1 -1
  178. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  179. package/dest/services/peer-manager/peer_scoring.js +25 -2
  180. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +12 -8
  181. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -1
  182. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +80 -106
  183. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +4 -7
  184. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
  185. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +11 -13
  186. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -1
  187. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +31 -46
  188. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +19 -11
  189. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -1
  190. package/dest/services/reqresp/batch-tx-requester/peer_collection.js +52 -15
  191. package/dest/services/reqresp/batch-tx-requester/tx_validator.js +2 -2
  192. package/dest/services/reqresp/interface.d.ts +10 -1
  193. package/dest/services/reqresp/interface.d.ts.map +1 -1
  194. package/dest/services/reqresp/interface.js +15 -1
  195. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +3 -3
  196. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
  197. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +7 -1
  198. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
  199. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +15 -0
  200. package/dest/services/reqresp/protocols/tx.d.ts +7 -1
  201. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  202. package/dest/services/reqresp/protocols/tx.js +20 -0
  203. package/dest/services/reqresp/reqresp.d.ts +1 -1
  204. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  205. package/dest/services/reqresp/reqresp.js +30 -14
  206. package/dest/services/service.d.ts +22 -3
  207. package/dest/services/service.d.ts.map +1 -1
  208. package/dest/services/tx_collection/config.d.ts +19 -1
  209. package/dest/services/tx_collection/config.d.ts.map +1 -1
  210. package/dest/services/tx_collection/config.js +46 -0
  211. package/dest/services/tx_collection/fast_tx_collection.d.ts +3 -4
  212. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
  213. package/dest/services/tx_collection/fast_tx_collection.js +80 -76
  214. package/dest/services/tx_collection/file_store_tx_collection.d.ts +53 -0
  215. package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -0
  216. package/dest/services/tx_collection/file_store_tx_collection.js +167 -0
  217. package/dest/services/tx_collection/file_store_tx_source.d.ts +37 -0
  218. package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -0
  219. package/dest/services/tx_collection/file_store_tx_source.js +90 -0
  220. package/dest/services/tx_collection/index.d.ts +2 -1
  221. package/dest/services/tx_collection/index.d.ts.map +1 -1
  222. package/dest/services/tx_collection/index.js +1 -0
  223. package/dest/services/tx_collection/instrumentation.d.ts +1 -1
  224. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
  225. package/dest/services/tx_collection/instrumentation.js +2 -1
  226. package/dest/services/tx_collection/proposal_tx_collector.d.ts +7 -7
  227. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -1
  228. package/dest/services/tx_collection/proposal_tx_collector.js +5 -4
  229. package/dest/services/tx_collection/request_tracker.d.ts +53 -0
  230. package/dest/services/tx_collection/request_tracker.d.ts.map +1 -0
  231. package/dest/services/tx_collection/request_tracker.js +84 -0
  232. package/dest/services/tx_collection/slow_tx_collection.d.ts +7 -3
  233. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -1
  234. package/dest/services/tx_collection/slow_tx_collection.js +60 -26
  235. package/dest/services/tx_collection/tx_collection.d.ts +23 -13
  236. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  237. package/dest/services/tx_collection/tx_collection.js +75 -3
  238. package/dest/services/tx_collection/tx_collection_sink.d.ts +18 -8
  239. package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -1
  240. package/dest/services/tx_collection/tx_collection_sink.js +26 -29
  241. package/dest/services/tx_collection/tx_source.d.ts +8 -3
  242. package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
  243. package/dest/services/tx_collection/tx_source.js +19 -2
  244. package/dest/services/tx_file_store/config.d.ts +1 -3
  245. package/dest/services/tx_file_store/config.d.ts.map +1 -1
  246. package/dest/services/tx_file_store/config.js +0 -4
  247. package/dest/services/tx_file_store/tx_file_store.d.ts +4 -3
  248. package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -1
  249. package/dest/services/tx_file_store/tx_file_store.js +9 -6
  250. package/dest/services/tx_provider.d.ts +4 -4
  251. package/dest/services/tx_provider.d.ts.map +1 -1
  252. package/dest/services/tx_provider.js +9 -8
  253. package/dest/test-helpers/make-test-p2p-clients.d.ts +7 -8
  254. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  255. package/dest/test-helpers/make-test-p2p-clients.js +1 -2
  256. package/dest/test-helpers/mock-pubsub.d.ts +30 -4
  257. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  258. package/dest/test-helpers/mock-pubsub.js +105 -4
  259. package/dest/test-helpers/reqresp-nodes.d.ts +2 -3
  260. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  261. package/dest/test-helpers/reqresp-nodes.js +4 -3
  262. package/dest/test-helpers/testbench-utils.d.ts +35 -24
  263. package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
  264. package/dest/test-helpers/testbench-utils.js +124 -38
  265. package/dest/testbench/p2p_client_testbench_worker.d.ts +2 -2
  266. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  267. package/dest/testbench/p2p_client_testbench_worker.js +18 -16
  268. package/dest/testbench/worker_client_manager.d.ts +3 -1
  269. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  270. package/dest/testbench/worker_client_manager.js +6 -2
  271. package/dest/util.d.ts +3 -3
  272. package/dest/util.d.ts.map +1 -1
  273. package/package.json +14 -14
  274. package/src/client/factory.ts +96 -24
  275. package/src/client/interface.ts +43 -33
  276. package/src/client/p2p_client.ts +174 -265
  277. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +21 -13
  278. package/src/config.ts +158 -44
  279. package/src/errors/tx-pool.error.ts +12 -0
  280. package/src/index.ts +1 -0
  281. package/src/mem_pools/attestation_pool/attestation_pool.ts +100 -48
  282. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +61 -57
  283. package/src/mem_pools/attestation_pool/index.ts +3 -3
  284. package/src/mem_pools/attestation_pool/mocks.ts +2 -1
  285. package/src/mem_pools/index.ts +3 -0
  286. package/src/mem_pools/instrumentation.ts +17 -13
  287. package/src/mem_pools/interface.ts +2 -2
  288. package/src/mem_pools/tx_pool/README.md +1 -1
  289. package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +2 -1
  290. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +3 -3
  291. package/src/mem_pools/tx_pool/priority.ts +4 -4
  292. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +3 -1
  293. package/src/mem_pools/tx_pool_v2/README.md +85 -11
  294. package/src/mem_pools/tx_pool_v2/deleted_pool.ts +321 -0
  295. package/src/mem_pools/tx_pool_v2/eviction/eviction_manager.ts +21 -8
  296. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +7 -3
  297. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +18 -4
  298. package/src/mem_pools/tx_pool_v2/eviction/index.ts +4 -0
  299. package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +59 -4
  300. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +5 -5
  301. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +5 -5
  302. package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +14 -9
  303. package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +33 -6
  304. package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +4 -3
  305. package/src/mem_pools/tx_pool_v2/index.ts +2 -1
  306. package/src/mem_pools/tx_pool_v2/instrumentation.ts +69 -0
  307. package/src/mem_pools/tx_pool_v2/interfaces.ts +32 -12
  308. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +202 -26
  309. package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +58 -45
  310. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +34 -8
  311. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +410 -187
  312. package/src/msg_validators/attestation_validator/README.md +49 -0
  313. package/src/msg_validators/attestation_validator/attestation_validator.ts +5 -4
  314. package/src/msg_validators/clock_tolerance.ts +4 -3
  315. package/src/msg_validators/proposal_validator/README.md +123 -0
  316. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +14 -4
  317. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +20 -7
  318. package/src/msg_validators/proposal_validator/proposal_validator.ts +69 -45
  319. package/src/msg_validators/tx_validator/README.md +119 -0
  320. package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +5 -5
  321. package/src/msg_validators/tx_validator/allowed_public_setup.ts +22 -27
  322. package/src/msg_validators/tx_validator/allowed_setup_helpers.ts +31 -0
  323. package/src/msg_validators/tx_validator/block_header_validator.ts +15 -3
  324. package/src/msg_validators/tx_validator/double_spend_validator.ts +11 -6
  325. package/src/msg_validators/tx_validator/factory.ts +387 -78
  326. package/src/msg_validators/tx_validator/fee_payer_balance.ts +6 -2
  327. package/src/msg_validators/tx_validator/gas_validator.ts +123 -27
  328. package/src/msg_validators/tx_validator/index.ts +2 -0
  329. package/src/msg_validators/tx_validator/metadata_validator.ts +12 -4
  330. package/src/msg_validators/tx_validator/nullifier_cache.ts +30 -0
  331. package/src/msg_validators/tx_validator/phases_validator.ts +81 -26
  332. package/src/msg_validators/tx_validator/timestamp_validator.ts +23 -18
  333. package/src/services/dummy_service.ts +12 -6
  334. package/src/services/encoding.ts +18 -10
  335. package/src/services/gossipsub/README.md +641 -0
  336. package/src/services/gossipsub/index.ts +2 -0
  337. package/src/services/gossipsub/scoring.ts +29 -5
  338. package/src/services/gossipsub/topic_score_params.ts +487 -0
  339. package/src/services/libp2p/libp2p_service.ts +211 -190
  340. package/src/services/peer-manager/metrics.ts +7 -0
  341. package/src/services/peer-manager/peer_manager.ts +7 -3
  342. package/src/services/peer-manager/peer_scoring.ts +25 -0
  343. package/src/services/reqresp/README.md +229 -0
  344. package/src/services/reqresp/batch-tx-requester/README.md +46 -7
  345. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +76 -112
  346. package/src/services/reqresp/batch-tx-requester/interface.ts +3 -6
  347. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +30 -71
  348. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +68 -24
  349. package/src/services/reqresp/batch-tx-requester/tx_validator.ts +2 -2
  350. package/src/services/reqresp/interface.ts +26 -1
  351. package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +2 -2
  352. package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +17 -0
  353. package/src/services/reqresp/protocols/tx.ts +22 -0
  354. package/src/services/reqresp/reqresp.ts +35 -15
  355. package/src/services/service.ts +31 -2
  356. package/src/services/tx_collection/config.ts +68 -0
  357. package/src/services/tx_collection/fast_tx_collection.ts +83 -76
  358. package/src/services/tx_collection/file_store_tx_collection.ts +202 -0
  359. package/src/services/tx_collection/file_store_tx_source.ts +117 -0
  360. package/src/services/tx_collection/index.ts +1 -0
  361. package/src/services/tx_collection/instrumentation.ts +7 -1
  362. package/src/services/tx_collection/proposal_tx_collector.ts +9 -13
  363. package/src/services/tx_collection/request_tracker.ts +127 -0
  364. package/src/services/tx_collection/slow_tx_collection.ts +66 -33
  365. package/src/services/tx_collection/tx_collection.ts +114 -19
  366. package/src/services/tx_collection/tx_collection_sink.ts +30 -34
  367. package/src/services/tx_collection/tx_source.ts +22 -3
  368. package/src/services/tx_file_store/config.ts +0 -6
  369. package/src/services/tx_file_store/tx_file_store.ts +10 -8
  370. package/src/services/tx_provider.ts +10 -9
  371. package/src/test-helpers/make-test-p2p-clients.ts +4 -6
  372. package/src/test-helpers/mock-pubsub.ts +146 -9
  373. package/src/test-helpers/reqresp-nodes.ts +5 -7
  374. package/src/test-helpers/testbench-utils.ts +146 -43
  375. package/src/testbench/p2p_client_testbench_worker.ts +26 -24
  376. package/src/testbench/worker_client_manager.ts +13 -5
  377. package/src/util.ts +8 -2
  378. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +0 -23
  379. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +0 -1
  380. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +0 -212
  381. package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +0 -230
@@ -370,21 +370,21 @@ function applyDecs2203RFactory() {
370
370
  function _apply_decs_2203_r(targetClass, memberDecs, classDecs, parentClass) {
371
371
  return (_apply_decs_2203_r = applyDecs2203RFactory())(targetClass, memberDecs, classDecs, parentClass);
372
372
  }
373
- var _dec, _dec1, _dec2, _dec3, _dec4, _dec5, _dec6, _dec7, _dec8, _dec9, _initProto;
373
+ var _dec, _dec1, _dec2, _dec3, _dec4, _dec5, _dec6, _dec7, _initProto;
374
374
  import { BlockNumber } from '@aztec/foundation/branded-types';
375
- import { randomInt } from '@aztec/foundation/crypto/random';
375
+ import { maxBy } from '@aztec/foundation/collection';
376
376
  import { createLibp2pComponentLogger, createLogger } from '@aztec/foundation/log';
377
377
  import { RunningPromise } from '@aztec/foundation/running-promise';
378
378
  import { Timer } from '@aztec/foundation/timer';
379
379
  import { protocolContractsHash } from '@aztec/protocol-contracts';
380
380
  import { GasFees } from '@aztec/stdlib/gas';
381
- import { BlockProposal, CheckpointAttestation, CheckpointProposal, P2PClientType, P2PMessage, PeerErrorSeverity, TopicType, createTopicString, getTopicsForClientAndConfig, metricsTopicStrToLabels } from '@aztec/stdlib/p2p';
381
+ import { BlockProposal, CheckpointAttestation, CheckpointProposal, P2PMessage, PeerErrorSeverity, PeerErrorSeverityByHarshness, TopicType, createTopicString, getTopicsForConfig, metricsTopicStrToLabels } from '@aztec/stdlib/p2p';
382
382
  import { MerkleTreeId } from '@aztec/stdlib/trees';
383
383
  import { Tx } from '@aztec/stdlib/tx';
384
384
  import { compressComponentVersions } from '@aztec/stdlib/versioning';
385
385
  import { Attributes, OtelMetricsAdapter, SpanStatusCode, WithTracer, trackSpan } from '@aztec/telemetry-client';
386
386
  import { gossipsub } from '@chainsafe/libp2p-gossipsub';
387
- import { createPeerScoreParams, createTopicScoreParams } from '@chainsafe/libp2p-gossipsub/score';
387
+ import { createPeerScoreParams } from '@chainsafe/libp2p-gossipsub/score';
388
388
  import { SignaturePolicy } from '@chainsafe/libp2p-gossipsub/types';
389
389
  import { noise } from '@chainsafe/libp2p-noise';
390
390
  import { yamux } from '@chainsafe/libp2p-yamux';
@@ -397,18 +397,18 @@ import { ENR } from '@nethermindeth/enr';
397
397
  import { createLibp2p } from 'libp2p';
398
398
  import { BlockProposalValidator, CheckpointAttestationValidator, CheckpointProposalValidator, DoubleSpendTxValidator, FishermanAttestationValidator, getDefaultAllowedSetupFunctions } from '../../msg_validators/index.js';
399
399
  import { MessageSeenValidator } from '../../msg_validators/msg_seen_validator/msg_seen_validator.js';
400
- import { createTxMessageValidators, createTxReqRespValidator } from '../../msg_validators/tx_validator/factory.js';
400
+ import { createFirstStageTxValidationsForGossipedTransactions, createSecondStageTxValidationsForGossipedTransactions, createTxValidatorForBlockProposalReceivedTxs, createTxValidatorForReqResponseReceivedTxs } from '../../msg_validators/tx_validator/factory.js';
401
401
  import { GossipSubEvent } from '../../types/index.js';
402
402
  import { convertToMultiaddr } from '../../util.js';
403
403
  import { getVersions } from '../../versioning.js';
404
404
  import { AztecDatastore } from '../data_store.js';
405
405
  import { DiscV5Service } from '../discv5/discV5_service.js';
406
406
  import { SnappyTransform, fastMsgIdFn, getMsgIdFn, msgIdToStrFn } from '../encoding.js';
407
- import { gossipScoreThresholds } from '../gossipsub/scoring.js';
407
+ import { APP_SPECIFIC_WEIGHT, gossipScoreThresholds } from '../gossipsub/scoring.js';
408
+ import { createAllTopicScoreParams } from '../gossipsub/topic_score_params.js';
408
409
  import { PeerManager } from '../peer-manager/peer_manager.js';
409
410
  import { PeerScoring } from '../peer-manager/peer_scoring.js';
410
- import { DEFAULT_SUB_PROTOCOL_VALIDATORS, ReqRespSubProtocol, ValidationError } from '../reqresp/index.js';
411
- import { pingHandler, reqGoodbyeHandler, reqRespBlockHandler, reqRespBlockTxsHandler, reqRespStatusHandler, reqRespTxHandler } from '../reqresp/index.js';
411
+ import { DEFAULT_SUB_PROTOCOL_VALIDATORS, ReqRespSubProtocol, ValidationError, pingHandler, reqGoodbyeHandler, reqRespBlockHandler, reqRespBlockTxsHandler, reqRespStatusHandler, reqRespTxHandler } from '../reqresp/index.js';
412
412
  import { ReqResp } from '../reqresp/reqresp.js';
413
413
  import { P2PInstrumentation } from './instrumentation.js';
414
414
  _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId, attestation)=>({
@@ -432,17 +432,10 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
432
432
  [Attributes.TX_HASH]: requestedTxHash.toString()
433
433
  })), _dec7 = trackSpan('Libp2pService.validateRequestedBlock', (requestedBlockNumber, _responseBlock)=>({
434
434
  [Attributes.BLOCK_NUMBER]: requestedBlockNumber.toString()
435
- })), _dec8 = trackSpan('Libp2pService.validatePropagatedTx', (tx)=>({
436
- [Attributes.TX_HASH]: tx.getTxHash().toString()
437
- })), _dec9 = trackSpan('Libp2pService.validateCheckpointAttestation', async (_, attestation)=>({
438
- [Attributes.SLOT_NUMBER]: attestation.payload.header.slotNumber,
439
- [Attributes.BLOCK_ARCHIVE]: attestation.archive.toString(),
440
- [Attributes.P2P_ID]: await attestation.p2pMessageLoggingIdentifier().then((i)=>i.toString())
441
435
  }));
442
436
  /**
443
437
  * Lib P2P implementation of the P2PService interface.
444
438
  */ export class LibP2PService extends WithTracer {
445
- clientType;
446
439
  config;
447
440
  node;
448
441
  peerDiscoveryService;
@@ -494,16 +487,6 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
494
487
  _dec7,
495
488
  2,
496
489
  "validateRequestedBlock"
497
- ],
498
- [
499
- _dec8,
500
- 2,
501
- "validatePropagatedTx"
502
- ],
503
- [
504
- _dec9,
505
- 2,
506
- "validateCheckpointAttestation"
507
490
  ]
508
491
  ], []));
509
492
  }
@@ -517,6 +500,7 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
517
500
  topicStrings;
518
501
  feesCache;
519
502
  /** Callback invoked when a duplicate proposal is detected (triggers slashing). */ duplicateProposalCallback;
503
+ /** Callback invoked when a duplicate attestation is detected (triggers slashing). */ duplicateAttestationCallback;
520
504
  /**
521
505
  * Callback for when a block is received from a peer.
522
506
  * @param block - The block received from the peer.
@@ -531,8 +515,8 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
531
515
  instrumentation;
532
516
  telemetry;
533
517
  logger;
534
- constructor(clientType, config, node, peerDiscoveryService, reqresp, peerManager, mempools, archiver, epochCache, proofVerifier, worldStateSynchronizer, telemetry, logger = createLogger('p2p:libp2p_service')){
535
- super(telemetry, 'LibP2PService'), this.clientType = clientType, this.config = config, this.node = node, this.peerDiscoveryService = peerDiscoveryService, this.reqresp = reqresp, this.peerManager = peerManager, this.mempools = mempools, this.archiver = archiver, this.epochCache = epochCache, this.proofVerifier = proofVerifier, this.worldStateSynchronizer = worldStateSynchronizer, this.msgIdSeenValidators = (_initProto(this), {}), this.protocolVersion = '', this.topicStrings = {};
518
+ constructor(config, node, peerDiscoveryService, reqresp, peerManager, mempools, archiver, epochCache, proofVerifier, worldStateSynchronizer, telemetry, logger = createLogger('p2p:libp2p_service')){
519
+ super(telemetry, 'LibP2PService'), this.config = config, this.node = node, this.peerDiscoveryService = peerDiscoveryService, this.reqresp = reqresp, this.peerManager = peerManager, this.mempools = mempools, this.archiver = archiver, this.epochCache = epochCache, this.proofVerifier = proofVerifier, this.worldStateSynchronizer = worldStateSynchronizer, this.msgIdSeenValidators = (_initProto(this), {}), this.protocolVersion = '', this.topicStrings = {};
536
520
  this.telemetry = telemetry;
537
521
  // Create child logger with fisherman prefix if in fisherman mode
538
522
  this.logger = config.fishermanMode ? logger.createChild('[FISHERMAN]') : logger;
@@ -548,19 +532,19 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
548
532
  this.topicStrings[TopicType.block_proposal] = createTopicString(TopicType.block_proposal, this.protocolVersion);
549
533
  this.topicStrings[TopicType.checkpoint_proposal] = createTopicString(TopicType.checkpoint_proposal, this.protocolVersion);
550
534
  this.topicStrings[TopicType.checkpoint_attestation] = createTopicString(TopicType.checkpoint_attestation, this.protocolVersion);
551
- this.blockProposalValidator = new BlockProposalValidator(epochCache, {
552
- txsPermitted: !config.disableTransactions
553
- });
554
- this.checkpointProposalValidator = new CheckpointProposalValidator(epochCache, {
555
- txsPermitted: !config.disableTransactions
556
- });
535
+ const proposalValidatorOpts = {
536
+ txsPermitted: !config.disableTransactions,
537
+ maxTxsPerBlock: config.validateMaxTxsPerBlock ?? config.validateMaxTxsPerCheckpoint
538
+ };
539
+ this.blockProposalValidator = new BlockProposalValidator(epochCache, proposalValidatorOpts);
540
+ this.checkpointProposalValidator = new CheckpointProposalValidator(epochCache, proposalValidatorOpts);
557
541
  this.checkpointAttestationValidator = config.fishermanMode ? new FishermanAttestationValidator(epochCache, mempools.attestationPool, telemetry) : new CheckpointAttestationValidator(epochCache);
558
542
  this.gossipSubEventHandler = this.handleGossipSubEvent.bind(this);
559
543
  this.blockReceivedCallback = async (block)=>{
560
- this.logger.debug(`Handler not yet registered: Block received callback not set. Received block for slot ${block.slotNumber} from peer.`, {
544
+ this.logger.warn(`Handler for block received not yet registered on P2P service. Received block ${block.blockNumber} for slot ${block.slotNumber} from peer.`, {
561
545
  p2pMessageIdentifier: await block.p2pMessageLoggingIdentifier()
562
546
  });
563
- return false;
547
+ return true;
564
548
  };
565
549
  this.checkpointReceivedCallback = (checkpoint)=>{
566
550
  this.logger.debug(`Handler not yet registered: Checkpoint received callback not set. Received checkpoint for slot ${checkpoint.slotNumber} from peer.`);
@@ -575,7 +559,7 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
575
559
  * @param config - The configuration to use when creating the service.
576
560
  * @param txPool - The transaction pool to be accessed by the service.
577
561
  * @returns The new service.
578
- */ static async new(clientType, config, peerId, deps) {
562
+ */ static async new(config, peerId, deps) {
579
563
  const { worldStateSynchronizer, epochCache, l2BlockSource, mempools, proofVerifier, peerStore, telemetry, logger, packageVersion } = deps;
580
564
  const { p2pPort, maxPeerCount, listenAddress } = config;
581
565
  const bindAddrTcp = convertToMultiaddr(listenAddress, p2pPort, 'tcp');
@@ -595,10 +579,6 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
595
579
  }
596
580
  const versions = getVersions(config);
597
581
  const protocolVersion = compressComponentVersions(versions);
598
- const txTopic = createTopicString(TopicType.tx, protocolVersion);
599
- const blockProposalTopic = createTopicString(TopicType.block_proposal, protocolVersion);
600
- const checkpointProposalTopic = createTopicString(TopicType.checkpoint_proposal, protocolVersion);
601
- const checkpointAttestationTopic = createTopicString(TopicType.checkpoint_attestation, protocolVersion);
602
582
  const preferredPeersEnrs = config.preferredPeers.map((enr)=>ENR.decodeTxt(enr));
603
583
  const directPeers = (await Promise.all(preferredPeersEnrs.map(async (enr)=>{
604
584
  const peerId = await enr.peerId();
@@ -616,6 +596,15 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
616
596
  const announceTcpMultiaddr = config.p2pIp ? [
617
597
  convertToMultiaddr(config.p2pIp, p2pPort, 'tcp')
618
598
  ] : [];
599
+ // Create dynamic topic score params based on network configuration
600
+ const l1Constants = epochCache.getL1Constants();
601
+ const topicScoreParams = createAllTopicScoreParams(protocolVersion, {
602
+ slotDurationMs: l1Constants.slotDuration * 1000,
603
+ heartbeatIntervalMs: config.gossipsubInterval,
604
+ targetCommitteeSize: l1Constants.targetCommitteeSize,
605
+ blockDurationMs: config.blockDurationMs,
606
+ expectedBlockProposalsPerSlot: config.expectedBlockProposalsPerSlot
607
+ });
619
608
  const node = await createLibp2p({
620
609
  start: false,
621
610
  peerId,
@@ -716,28 +705,7 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
716
705
  scoreParams: createPeerScoreParams({
717
706
  // IPColocation factor can be disabled for local testing - default to -5
718
707
  IPColocationFactorWeight: config.debugDisableColocationPenalty ? 0 : -5.0,
719
- topics: {
720
- [txTopic]: createTopicScoreParams({
721
- topicWeight: 1,
722
- invalidMessageDeliveriesWeight: -20,
723
- invalidMessageDeliveriesDecay: 0.5
724
- }),
725
- [blockProposalTopic]: createTopicScoreParams({
726
- topicWeight: 1,
727
- invalidMessageDeliveriesWeight: -20,
728
- invalidMessageDeliveriesDecay: 0.5
729
- }),
730
- [checkpointProposalTopic]: createTopicScoreParams({
731
- topicWeight: 1,
732
- invalidMessageDeliveriesWeight: -20,
733
- invalidMessageDeliveriesDecay: 0.5
734
- }),
735
- [checkpointAttestationTopic]: createTopicScoreParams({
736
- topicWeight: 1,
737
- invalidMessageDeliveriesWeight: -20,
738
- invalidMessageDeliveriesDecay: 0.5
739
- })
740
- }
708
+ topics: topicScoreParams
741
709
  })
742
710
  }),
743
711
  components: (components)=>({
@@ -749,10 +717,14 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
749
717
  const peerScoring = new PeerScoring(config, telemetry);
750
718
  const reqresp = new ReqResp(config, node, peerScoring, createLogger(`${logger.module}:reqresp`));
751
719
  const peerManager = new PeerManager(node, peerDiscoveryService, config, telemetry, createLogger(`${logger.module}:peer_manager`), peerScoring, reqresp, worldStateSynchronizer, protocolVersion, epochCache);
752
- // Update gossipsub score params
753
- node.services.pubsub.score.params.appSpecificWeight = 10;
720
+ // Configure application-specific scoring for gossipsub.
721
+ // The weight scales app score to align with gossipsub thresholds:
722
+ // - Disconnect (-50) × 10 = -500 = gossipThreshold (stops receiving gossip)
723
+ // - Ban (-100) × 10 = -1000 = publishThreshold (cannot publish)
724
+ // Note: positive topic scores can offset penalties, so alignment is best-effort.
725
+ node.services.pubsub.score.params.appSpecificWeight = APP_SPECIFIC_WEIGHT;
754
726
  node.services.pubsub.score.params.appSpecificScore = (peerId)=>peerManager.shouldDisableP2PGossip(peerId) ? -Infinity : peerManager.getPeerScore(peerId);
755
- return new LibP2PService(clientType, config, node, peerDiscoveryService, reqresp, peerManager, mempools, l2BlockSource, epochCache, proofVerifier, worldStateSynchronizer, telemetry, logger);
727
+ return new LibP2PService(config, node, peerDiscoveryService, reqresp, peerManager, mempools, l2BlockSource, epochCache, proofVerifier, worldStateSynchronizer, telemetry, logger);
756
728
  }
757
729
  /**
758
730
  * Starts the LibP2P service.
@@ -797,7 +769,7 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
797
769
  await this.reqresp.start(requestResponseHandlers, reqrespSubProtocolValidators);
798
770
  await this.node.start();
799
771
  // Subscribe to standard GossipSub topics by default
800
- for (const topic of getTopicsForClientAndConfig(this.clientType, this.config.disableTransactions)){
772
+ for (const topic of getTopicsForConfig(this.config.disableTransactions)){
801
773
  this.subscribeToTopic(this.topicStrings[topic]);
802
774
  }
803
775
  // add GossipSub listener
@@ -845,6 +817,9 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
845
817
  getPeers(includePending) {
846
818
  return this.peerManager.getPeers(includePending);
847
819
  }
820
+ getGossipMeshPeerCount(topicType) {
821
+ return this.node.services.pubsub.getMeshPeers(this.topicStrings[topicType]).length;
822
+ }
848
823
  handleGossipSubEvent(e) {
849
824
  this.logger.trace(`Received PUBSUB message.`);
850
825
  const safeJob = async ()=>{
@@ -886,6 +861,13 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
886
861
  this.duplicateProposalCallback = callback;
887
862
  }
888
863
  /**
864
+ * Registers a callback to be invoked when a duplicate attestation is detected.
865
+ * A validator signing attestations for different proposals at the same slot.
866
+ * This callback is triggered on the first duplicate (when count goes from 1 to 2).
867
+ */ registerDuplicateAttestationCallback(callback) {
868
+ this.duplicateAttestationCallback = callback;
869
+ }
870
+ /**
889
871
  * Subscribes to a topic.
890
872
  * @param topic - The topic to subscribe to.
891
873
  */ subscribeToTopic(topic) {
@@ -936,6 +918,12 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
936
918
  if (!validator || !validator.addMessage(msgId)) {
937
919
  this.instrumentation.incMessagePrevalidationStatus(false, topicType);
938
920
  this.node.services.pubsub.reportMessageValidationResult(msgId, source.toString(), TopicValidatorResult.Ignore);
921
+ if (topicType === TopicType.tx) {
922
+ this.logger.verbose(`Ignoring already-seen tx gossip message`, {
923
+ msgId,
924
+ source: source.toString()
925
+ });
926
+ }
939
927
  return {
940
928
  result: false,
941
929
  topicType
@@ -996,9 +984,7 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
996
984
  if (msg.topic === this.topicStrings[TopicType.tx]) {
997
985
  await this.handleGossipedTx(p2pMessage.payload, msgId, source);
998
986
  } else if (msg.topic === this.topicStrings[TopicType.checkpoint_attestation]) {
999
- if (this.clientType === P2PClientType.Full) {
1000
- await this.processCheckpointAttestationFromPeer(p2pMessage.payload, msgId, source);
1001
- }
987
+ await this.processCheckpointAttestationFromPeer(p2pMessage.payload, msgId, source);
1002
988
  } else if (msg.topic === this.topicStrings[TopicType.block_proposal]) {
1003
989
  await this.processBlockFromPeer(p2pMessage.payload, msgId, source);
1004
990
  } else if (msg.topic === this.topicStrings[TopicType.checkpoint_proposal]) {
@@ -1066,47 +1052,104 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
1066
1052
  async handleGossipedTx(payloadData, msgId, source) {
1067
1053
  const validationFunc = async ()=>{
1068
1054
  const tx = Tx.fromBuffer(payloadData);
1069
- const isValid = await this.validatePropagatedTx(tx, source);
1070
- const exists = isValid && await this.mempools.txPool.hasTx(tx.getTxHash());
1071
- this.logger.trace(`Validate propagated tx`, {
1072
- isValid,
1073
- exists,
1074
- [Attributes.P2P_ID]: source.toString()
1075
- });
1076
- if (!isValid) {
1055
+ const currentBlockNumber = await this.archiver.getBlockNumber();
1056
+ const { ts: nextSlotTimestamp } = this.epochCache.getEpochAndSlotInNextL1Slot();
1057
+ // Stage 1: fast validators (metadata, data, timestamps, double-spend, gas, phases, block header)
1058
+ const firstStageValidators = await this.createFirstStageMessageValidators(currentBlockNumber, nextSlotTimestamp);
1059
+ const firstStageOutcome = await this.runValidations(tx, firstStageValidators);
1060
+ if (!firstStageOutcome.allPassed) {
1061
+ const { name } = firstStageOutcome.failure;
1062
+ let { severity } = firstStageOutcome.failure;
1063
+ // Double spend validator has a special case handler. We perform more detailed examination
1064
+ // as to how recently the nullifier was entered into the tree and if the transaction should
1065
+ // have 'known' the nullifier existed. This determines the severity of the penalty applied to the peer.
1066
+ if (name === 'doubleSpendValidator') {
1067
+ const txBlockNumber = BlockNumber(currentBlockNumber + 1);
1068
+ severity = await this.handleDoubleSpendFailure(tx, txBlockNumber);
1069
+ }
1070
+ this.logger.verbose(`Rejecting gossiped tx ${tx.getTxHash().toString()}: stage 1 validation failed`, {
1071
+ validator: name,
1072
+ severity,
1073
+ source: source.toString()
1074
+ });
1075
+ this.peerManager.penalizePeer(source, severity);
1077
1076
  return {
1078
1077
  result: TopicValidatorResult.Reject
1079
1078
  };
1080
- } else if (exists) {
1079
+ }
1080
+ // Pool pre-check: see if the pool would accept this tx before doing expensive proof verification
1081
+ const canAdd = await this.mempools.txPool.canAddPendingTx(tx);
1082
+ if (canAdd === 'ignored') {
1083
+ this.logger.verbose(`Ignoring gossiped tx ${tx.getTxHash().toString()}: pool pre-check returned ignored`, {
1084
+ source: source.toString()
1085
+ });
1081
1086
  return {
1082
1087
  result: TopicValidatorResult.Ignore,
1083
1088
  obj: tx
1084
1089
  };
1085
- } else {
1090
+ }
1091
+ // Stage 2: expensive proof verification
1092
+ const secondStageValidators = this.createSecondStageMessageValidators();
1093
+ const secondStageOutcome = await this.runValidations(tx, secondStageValidators);
1094
+ if (!secondStageOutcome.allPassed) {
1095
+ const { severity, name } = secondStageOutcome.failure;
1096
+ this.logger.verbose(`Rejecting gossiped tx ${tx.getTxHash().toString()}: stage 2 validation failed`, {
1097
+ validator: name,
1098
+ severity,
1099
+ source: source.toString()
1100
+ });
1101
+ this.peerManager.penalizePeer(source, severity);
1102
+ return {
1103
+ result: TopicValidatorResult.Reject
1104
+ };
1105
+ }
1106
+ // Pool add: persist the tx
1107
+ const txHash = tx.getTxHash();
1108
+ const addResult = await this.mempools.txPool.addPendingTxs([
1109
+ tx
1110
+ ], {
1111
+ source: 'gossip'
1112
+ });
1113
+ const wasAccepted = addResult.accepted.some((h)=>h.equals(txHash));
1114
+ const wasIgnored = addResult.ignored.some((h)=>h.equals(txHash));
1115
+ this.logger.verbose(`Validate propagated tx ${txHash.toString()}`, {
1116
+ wasAccepted,
1117
+ wasIgnored,
1118
+ [Attributes.P2P_ID]: source.toString()
1119
+ });
1120
+ if (wasAccepted) {
1086
1121
  return {
1087
1122
  result: TopicValidatorResult.Accept,
1088
1123
  obj: tx
1089
1124
  };
1125
+ } else if (wasIgnored) {
1126
+ return {
1127
+ result: TopicValidatorResult.Ignore,
1128
+ obj: tx
1129
+ };
1130
+ } else {
1131
+ this.logger.warn(`Gossiped tx ${txHash.toString()} unexpectedly rejected by pool`, {
1132
+ source: source.toString(),
1133
+ txHash: txHash.toString()
1134
+ });
1135
+ this.peerManager.penalizePeer(source, PeerErrorSeverity.HighToleranceError);
1136
+ return {
1137
+ result: TopicValidatorResult.Reject
1138
+ };
1090
1139
  }
1091
1140
  };
1092
1141
  const { result, obj: tx } = await this.validateReceivedMessage(validationFunc, msgId, source, TopicType.tx);
1093
1142
  if (result !== TopicValidatorResult.Accept || !tx) {
1094
1143
  return;
1095
1144
  }
1145
+ // Tx was accepted into pool and will be propagated - just log and record metrics
1096
1146
  const txHash = tx.getTxHash();
1097
1147
  const txHashString = txHash.toString();
1098
1148
  this.logger.verbose(`Received tx ${txHashString} from external peer ${source.toString()} via gossip`, {
1099
1149
  source: source.toString(),
1100
1150
  txHash: txHashString
1101
1151
  });
1102
- if (this.config.dropTransactions && randomInt(1000) < this.config.dropTransactionsProbability * 1000) {
1103
- this.logger.warn(`Intentionally dropping tx ${txHashString} (probability rule)`);
1104
- return;
1105
- }
1106
1152
  this.instrumentation.incrementTxReceived(1);
1107
- await this.mempools.txPool.addTxs([
1108
- tx
1109
- ]);
1110
1153
  }
1111
1154
  /**
1112
1155
  * Process a checkpoint attestation from a peer.
@@ -1138,38 +1181,56 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
1138
1181
  obj: attestation
1139
1182
  };
1140
1183
  }
1141
- // Get committee size for the attestation's slot
1142
- const slot = attestation.payload.header.slotNumber;
1143
- const { committee } = await this.epochCache.getCommittee(slot);
1144
- const committeeSize = committee?.length ?? 0;
1145
1184
  // Try to add the attestation: this handles existence check, cap check, and adding in one call
1146
- const { added, alreadyExists } = await this.mempools.attestationPool.tryAddCheckpointAttestation(attestation, committeeSize);
1185
+ // count is the number of attestations by this signer for this slot (for duplicate detection)
1186
+ const slot = attestation.payload.header.slotNumber;
1187
+ const { added, alreadyExists, count } = await this.mempools.attestationPool.tryAddCheckpointAttestation(attestation);
1147
1188
  this.logger.trace(`Validate propagated checkpoint attestation`, {
1148
1189
  added,
1149
1190
  alreadyExists,
1191
+ count,
1150
1192
  [Attributes.SLOT_NUMBER]: slot.toString(),
1151
1193
  [Attributes.P2P_ID]: peerId.toString()
1152
1194
  });
1153
- // Duplicate attestation received, no need to re-broadcast
1195
+ // Exact same attestation received, no need to re-broadcast
1154
1196
  if (alreadyExists) {
1155
1197
  return {
1156
1198
  result: TopicValidatorResult.Ignore,
1157
1199
  obj: attestation
1158
1200
  };
1159
1201
  }
1160
- // Could not add (cap reached), no need to re-broadcast
1202
+ // Could not add (cap reached for signer), no need to re-broadcast
1161
1203
  if (!added) {
1162
- this.logger.warn(`Dropping checkpoint attestation due to per-(slot, proposalId) attestation cap`, {
1204
+ this.logger.warn(`Dropping checkpoint attestation due to cap`, {
1163
1205
  slot: slot.toString(),
1164
1206
  archive: attestation.archive.toString(),
1165
- source: peerId.toString()
1207
+ source: peerId.toString(),
1208
+ attester: attestation.getSender()?.toString(),
1209
+ count
1166
1210
  });
1167
1211
  return {
1168
1212
  result: TopicValidatorResult.Ignore,
1169
1213
  obj: attestation
1170
1214
  };
1171
1215
  }
1172
- // Attestation was added successfully
1216
+ // Check if this is a duplicate attestation (signer attested to a different proposal at the same slot)
1217
+ // count is the number of attestations by this signer for this slot
1218
+ if (count === 2) {
1219
+ const attester = attestation.getSender();
1220
+ if (attester) {
1221
+ this.logger.warn(`Detected duplicate attestation (equivocation) at slot ${slot}`, {
1222
+ slot: slot.toString(),
1223
+ archive: attestation.archive.toString(),
1224
+ source: peerId.toString(),
1225
+ attester: attester.toString()
1226
+ });
1227
+ this.duplicateAttestationCallback?.({
1228
+ slot,
1229
+ attester
1230
+ });
1231
+ }
1232
+ }
1233
+ // Attestation was added successfully - accept it so other nodes can also detect the equivocation
1173
1234
  return {
1174
1235
  result: TopicValidatorResult.Accept,
1175
1236
  obj: attestation
@@ -1199,8 +1260,8 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
1199
1260
  };
1200
1261
  }
1201
1262
  // Try to add the proposal: this handles existence check, cap check, and adding in one call
1202
- const { added, alreadyExists, totalForPosition } = await this.mempools.attestationPool.tryAddBlockProposal(block);
1203
- const isEquivocated = totalForPosition !== undefined && totalForPosition > 1;
1263
+ const { added, alreadyExists, count } = await this.mempools.attestationPool.tryAddBlockProposal(block);
1264
+ const isEquivocated = count !== undefined && count > 1;
1204
1265
  // Duplicate proposal received, no need to re-broadcast
1205
1266
  if (alreadyExists) {
1206
1267
  this.logger.debug(`Ignoring duplicate block proposal received`, {
@@ -1223,7 +1284,7 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
1223
1284
  this.logger.warn(`Penalizing peer for block proposal exceeding per-position cap`, {
1224
1285
  ...block.toBlockInfo(),
1225
1286
  indexWithinCheckpoint: block.indexWithinCheckpoint,
1226
- totalForPosition,
1287
+ count,
1227
1288
  proposer: block.getSender()?.toString(),
1228
1289
  source: peerId.toString()
1229
1290
  });
@@ -1244,7 +1305,7 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
1244
1305
  proposer: proposer?.toString()
1245
1306
  });
1246
1307
  // Invoke the duplicate callback on the first duplicate spotted only
1247
- if (proposer && totalForPosition === 2) {
1308
+ if (proposer && count === 2) {
1248
1309
  this.duplicateProposalCallback?.({
1249
1310
  slot: block.slotNumber,
1250
1311
  proposer,
@@ -1274,13 +1335,13 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
1274
1335
  source: sender.toString(),
1275
1336
  ...block.toBlockInfo()
1276
1337
  });
1277
- // Mark the txs in this proposal as non-evictable
1278
- await this.mempools.txPool.markTxsAsNonEvictable(block.txHashes);
1338
+ // Mark the txs in this proposal as protected
1339
+ await this.mempools.txPool.protectTxs(block.txHashes, block.blockHeader);
1279
1340
  // Call the block received callback to validate the proposal.
1280
1341
  // Note: Validators do NOT attest to individual blocks, only to checkpoint proposals.
1281
1342
  const isValid = await this.blockReceivedCallback(block, sender);
1282
1343
  if (!isValid) {
1283
- this.logger.warn(`Block proposal validation failed for block ${block.blockNumber}`, block.toBlockInfo());
1344
+ this.logger.info(`Block proposal validation failed for block ${block.blockNumber}`, block.toBlockInfo());
1284
1345
  }
1285
1346
  }
1286
1347
  /**
@@ -1342,8 +1403,8 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
1342
1403
  // Try to add the checkpoint proposal core: this handles existence check, cap check, and adding in one call
1343
1404
  const checkpointCore = checkpoint.toCore();
1344
1405
  const tryAddResult = await this.mempools.attestationPool.tryAddCheckpointProposal(checkpointCore);
1345
- const { added, alreadyExists, totalForPosition } = tryAddResult;
1346
- const isEquivocated = totalForPosition !== undefined && totalForPosition > 1;
1406
+ const { added, alreadyExists, count } = tryAddResult;
1407
+ const isEquivocated = count !== undefined && count > 1;
1347
1408
  // Duplicate proposal received, do not re-broadcast
1348
1409
  if (alreadyExists) {
1349
1410
  this.logger.debug(`Ignoring duplicate checkpoint proposal received`, {
@@ -1365,7 +1426,7 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
1365
1426
  this.peerManager.penalizePeer(peerId, PeerErrorSeverity.HighToleranceError);
1366
1427
  this.logger.warn(`Penalizing peer for checkpoint proposal exceeding per-slot cap`, {
1367
1428
  ...checkpoint.toCheckpointInfo(),
1368
- totalForPosition,
1429
+ count,
1369
1430
  source: peerId.toString()
1370
1431
  });
1371
1432
  return {
@@ -1387,7 +1448,7 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
1387
1448
  proposer: proposer?.toString()
1388
1449
  });
1389
1450
  // Invoke the duplicate callback on the first duplicate spotted only
1390
- if (proposer && totalForPosition === 2) {
1451
+ if (proposer && count === 2) {
1391
1452
  this.duplicateProposalCallback?.({
1392
1453
  slot: checkpoint.slotNumber,
1393
1454
  proposer,
@@ -1598,33 +1659,11 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
1598
1659
  }
1599
1660
  }
1600
1661
  createRequestedTxValidator() {
1601
- return createTxReqRespValidator(this.proofVerifier, {
1662
+ return createTxValidatorForReqResponseReceivedTxs(this.proofVerifier, {
1602
1663
  l1ChainId: this.config.l1ChainId,
1603
1664
  rollupVersion: this.config.rollupVersion
1604
1665
  });
1605
1666
  }
1606
- async validatePropagatedTx(tx, peerId) {
1607
- const currentBlockNumber = await this.archiver.getBlockNumber();
1608
- // We accept transactions if they are not expired by the next slot (checked based on the IncludeByTimestamp field)
1609
- const { ts: nextSlotTimestamp } = this.epochCache.getEpochAndSlotInNextL1Slot();
1610
- const messageValidators = await this.createMessageValidators(currentBlockNumber, nextSlotTimestamp);
1611
- for (const validator of messageValidators){
1612
- const outcome = await this.runValidations(tx, validator);
1613
- if (outcome.allPassed) {
1614
- continue;
1615
- }
1616
- const { name } = outcome.failure;
1617
- let { severity } = outcome.failure;
1618
- // Double spend validator has a special case handler
1619
- if (name === 'doubleSpendValidator') {
1620
- const txBlockNumber = BlockNumber(currentBlockNumber + 1); // tx is expected to be in the next block
1621
- severity = await this.handleDoubleSpendFailure(tx, txBlockNumber);
1622
- }
1623
- this.peerManager.penalizePeer(peerId, severity);
1624
- return false;
1625
- }
1626
- return true;
1627
- }
1628
1667
  async getGasFees(blockNumber) {
1629
1668
  if (blockNumber === this.feesCache?.blockNumber) {
1630
1669
  return this.feesCache.gasFees;
@@ -1651,38 +1690,35 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
1651
1690
  peerScoring: this.peerManager
1652
1691
  };
1653
1692
  }
1654
- async validate(txs) {
1655
- const currentBlockNumber = await this.archiver.getBlockNumber();
1656
- // We accept transactions if they are not expired by the next slot (checked based on the IncludeByTimestamp field)
1657
- const { ts: nextSlotTimestamp } = this.epochCache.getEpochAndSlotInNextL1Slot();
1658
- const messageValidators = await this.createMessageValidators(currentBlockNumber, nextSlotTimestamp);
1659
- await Promise.all(txs.map(async (tx)=>{
1660
- for (const validator of messageValidators){
1661
- const outcome = await this.runValidations(tx, validator);
1662
- if (!outcome.allPassed) {
1663
- throw new Error('Invalid tx detected', {
1664
- cause: {
1665
- outcome
1666
- }
1667
- });
1668
- }
1669
- }
1693
+ async validateTxsReceivedInBlockProposal(txs) {
1694
+ const validator = createTxValidatorForBlockProposalReceivedTxs(this.proofVerifier, {
1695
+ l1ChainId: this.config.l1ChainId,
1696
+ rollupVersion: this.config.rollupVersion
1697
+ }, this.logger.getBindings());
1698
+ const results = await Promise.all(txs.map(async (tx)=>{
1699
+ const result = await validator.validateTx(tx);
1700
+ return result.result !== 'invalid';
1670
1701
  }));
1702
+ if (results.some((value)=>value === false)) {
1703
+ throw new Error('Invalid tx detected');
1704
+ }
1671
1705
  }
1672
- /**
1673
- * Create message validators for the given block number and timestamp.
1674
- *
1675
- * Each validator is a pair of a validator and a severity.
1676
- * If a validator fails, the peer is penalized with the severity of the validator.
1677
- *
1678
- * @param currentBlockNumber - The current synced block number.
1679
- * @param nextSlotTimestamp - The timestamp of the next slot (used to validate txs are not expired).
1680
- * @returns The message validators.
1681
- */ async createMessageValidators(currentBlockNumber, nextSlotTimestamp) {
1706
+ /** Creates the first stage (fast) validators for gossiped transactions. */ async createFirstStageMessageValidators(currentBlockNumber, nextSlotTimestamp) {
1682
1707
  const gasFees = await this.getGasFees(currentBlockNumber);
1683
- const allowedInSetup = this.config.txPublicSetupAllowList ?? await getDefaultAllowedSetupFunctions();
1684
- const blockNumberInWhichTheTxIsConsideredToBeIncluded = BlockNumber(currentBlockNumber + 1);
1685
- return createTxMessageValidators(nextSlotTimestamp, blockNumberInWhichTheTxIsConsideredToBeIncluded, this.worldStateSynchronizer, gasFees, this.config.l1ChainId, this.config.rollupVersion, protocolContractsHash, this.archiver, this.proofVerifier, !this.config.disableTransactions, allowedInSetup, this.logger.getBindings());
1708
+ const allowedInSetup = [
1709
+ ...await getDefaultAllowedSetupFunctions(),
1710
+ ...this.config.txPublicSetupAllowListExtend ?? []
1711
+ ];
1712
+ const blockNumber = BlockNumber(currentBlockNumber + 1);
1713
+ const l1Constants = await this.archiver.getL1Constants();
1714
+ return createFirstStageTxValidationsForGossipedTransactions(nextSlotTimestamp, blockNumber, this.worldStateSynchronizer, gasFees, this.config.l1ChainId, this.config.rollupVersion, protocolContractsHash, this.archiver, !this.config.disableTransactions, allowedInSetup, this.logger.getBindings(), {
1715
+ rollupManaLimit: l1Constants.rollupManaLimit,
1716
+ maxBlockL2Gas: this.config.validateMaxL2BlockGas,
1717
+ maxBlockDAGas: this.config.validateMaxDABlockGas
1718
+ });
1719
+ }
1720
+ /** Creates the second stage (expensive proof verification) validators for gossiped transactions. */ createSecondStageMessageValidators() {
1721
+ return createSecondStageTxValidationsForGossipedTransactions(this.proofVerifier, this.logger.getBindings());
1686
1722
  }
1687
1723
  /**
1688
1724
  * Run validations on a tx.
@@ -1700,8 +1736,10 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
1700
1736
  });
1701
1737
  // A promise that resolves when all validations have been run
1702
1738
  const allValidations = await Promise.all(validationPromises);
1703
- const failed = allValidations.find((x)=>!x.isValid);
1704
- if (failed) {
1739
+ const failures = allValidations.filter((x)=>!x.isValid);
1740
+ if (failures.length > 0) {
1741
+ // Pick the most severe failure (lowest tolerance = harshest penalty)
1742
+ const failed = maxBy(failures, (f)=>PeerErrorSeverityByHarshness.indexOf(f.severity));
1705
1743
  return {
1706
1744
  allPassed: false,
1707
1745
  failure: {
@@ -1748,19 +1786,6 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
1748
1786
  }
1749
1787
  return PeerErrorSeverity.HighToleranceError;
1750
1788
  }
1751
- /**
1752
- * Validate a checkpoint attestation.
1753
- *
1754
- * @param attestation - The checkpoint attestation to validate.
1755
- * @returns True if the checkpoint attestation is valid, false otherwise.
1756
- */ async validateCheckpointAttestation(peerId, attestation) {
1757
- const result = await this.checkpointAttestationValidator.validate(attestation);
1758
- if (result.result === 'reject') {
1759
- this.logger.warn(`Penalizing peer ${peerId} for checkpoint attestation validation failure`);
1760
- this.peerManager.penalizePeer(peerId, result.severity);
1761
- }
1762
- return result;
1763
- }
1764
1789
  getPeerScore(peerId) {
1765
1790
  return this.node.services.pubsub.score.score(peerId.toString());
1766
1791
  }