@aztec/p2p 0.0.1-commit.85d7d01 → 0.0.1-commit.8655d4a

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 (447) hide show
  1. package/README.md +129 -3
  2. package/dest/bootstrap/bootstrap.d.ts +1 -1
  3. package/dest/bootstrap/bootstrap.d.ts.map +1 -1
  4. package/dest/bootstrap/bootstrap.js +9 -1
  5. package/dest/client/factory.d.ts +5 -4
  6. package/dest/client/factory.d.ts.map +1 -1
  7. package/dest/client/factory.js +33 -15
  8. package/dest/client/interface.d.ts +14 -5
  9. package/dest/client/interface.d.ts.map +1 -1
  10. package/dest/client/p2p_client.d.ts +13 -9
  11. package/dest/client/p2p_client.d.ts.map +1 -1
  12. package/dest/client/p2p_client.js +93 -49
  13. package/dest/config.d.ts +153 -102
  14. package/dest/config.d.ts.map +1 -1
  15. package/dest/config.js +134 -35
  16. package/dest/errors/p2p-service.error.d.ts +9 -0
  17. package/dest/errors/p2p-service.error.d.ts.map +1 -0
  18. package/dest/errors/p2p-service.error.js +10 -0
  19. package/dest/errors/reqresp.error.d.ts +1 -20
  20. package/dest/errors/reqresp.error.d.ts.map +1 -1
  21. package/dest/errors/reqresp.error.js +0 -21
  22. package/dest/index.d.ts +1 -2
  23. package/dest/index.d.ts.map +1 -1
  24. package/dest/index.js +0 -1
  25. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +99 -59
  26. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  27. package/dest/mem_pools/attestation_pool/attestation_pool.js +267 -197
  28. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +1 -1
  29. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
  30. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +181 -65
  31. package/dest/mem_pools/attestation_pool/mocks.d.ts +1 -1
  32. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  33. package/dest/mem_pools/attestation_pool/mocks.js +6 -4
  34. package/dest/mem_pools/index.d.ts +1 -2
  35. package/dest/mem_pools/index.d.ts.map +1 -1
  36. package/dest/mem_pools/instrumentation.d.ts +4 -2
  37. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  38. package/dest/mem_pools/instrumentation.js +33 -15
  39. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +1 -1
  40. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -1
  41. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +2 -1
  42. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +2 -1
  43. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -1
  44. package/dest/mem_pools/tx_pool_v2/eviction/index.js +1 -0
  45. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts +16 -0
  46. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts.map +1 -0
  47. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.js +62 -0
  48. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +7 -1
  49. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -1
  50. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +2 -2
  51. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +1 -1
  52. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -1
  53. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +8 -6
  54. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +2 -2
  55. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -1
  56. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +2 -2
  57. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +12 -5
  58. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
  59. package/dest/mem_pools/tx_pool_v2/interfaces.js +2 -1
  60. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +29 -11
  61. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
  62. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +46 -16
  63. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +1 -1
  64. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -1
  65. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +26 -43
  66. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +4 -2
  67. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -1
  68. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +6 -0
  69. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +2 -1
  70. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -1
  71. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +97 -88
  72. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +9 -3
  73. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  74. package/dest/msg_validators/attestation_validator/attestation_validator.js +37 -12
  75. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +7 -3
  76. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
  77. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +4 -5
  78. package/dest/msg_validators/clock_tolerance.d.ts +12 -1
  79. package/dest/msg_validators/clock_tolerance.d.ts.map +1 -1
  80. package/dest/msg_validators/clock_tolerance.js +61 -3
  81. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +10 -4
  82. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
  83. package/dest/msg_validators/proposal_validator/block_proposal_validator.js +10 -2
  84. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +10 -4
  85. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
  86. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +16 -2
  87. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +21 -8
  88. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
  89. package/dest/msg_validators/proposal_validator/proposal_validator.js +90 -44
  90. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +1 -1
  91. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  92. package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +8 -15
  93. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +2 -1
  94. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -1
  95. package/dest/msg_validators/tx_validator/allowed_public_setup.js +25 -21
  96. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts +17 -0
  97. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts.map +1 -0
  98. package/dest/msg_validators/tx_validator/allowed_setup_helpers.js +24 -0
  99. package/dest/msg_validators/tx_validator/archive_cache.js +1 -1
  100. package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts +15 -0
  101. package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts.map +1 -0
  102. package/dest/msg_validators/tx_validator/cached_tx_validator.js +19 -0
  103. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts +9 -0
  104. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts.map +1 -0
  105. package/dest/msg_validators/tx_validator/contract_instance_validator.js +48 -0
  106. package/dest/msg_validators/tx_validator/data_validator.d.ts +2 -1
  107. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  108. package/dest/msg_validators/tx_validator/data_validator.js +36 -2
  109. package/dest/msg_validators/tx_validator/factory.d.ts +27 -7
  110. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  111. package/dest/msg_validators/tx_validator/factory.js +47 -17
  112. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +1 -1
  113. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -1
  114. package/dest/msg_validators/tx_validator/fee_payer_balance.js +6 -2
  115. package/dest/msg_validators/tx_validator/gas_validator.d.ts +48 -7
  116. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  117. package/dest/msg_validators/tx_validator/gas_validator.js +88 -41
  118. package/dest/msg_validators/tx_validator/index.d.ts +4 -1
  119. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  120. package/dest/msg_validators/tx_validator/index.js +3 -0
  121. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +1 -1
  122. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  123. package/dest/msg_validators/tx_validator/metadata_validator.js +4 -4
  124. package/dest/msg_validators/tx_validator/phases_validator.d.ts +22 -2
  125. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
  126. package/dest/msg_validators/tx_validator/phases_validator.js +72 -24
  127. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +2 -1
  128. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
  129. package/dest/msg_validators/tx_validator/tx_proof_validator.js +2 -0
  130. package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts +48 -0
  131. package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts.map +1 -0
  132. package/dest/msg_validators/tx_validator/tx_validation_cache.js +69 -0
  133. package/dest/services/data_store.d.ts +1 -1
  134. package/dest/services/data_store.d.ts.map +1 -1
  135. package/dest/services/data_store.js +5 -5
  136. package/dest/services/discv5/discV5_service.d.ts +2 -1
  137. package/dest/services/discv5/discV5_service.d.ts.map +1 -1
  138. package/dest/services/discv5/discV5_service.js +35 -8
  139. package/dest/services/dummy_service.d.ts +11 -15
  140. package/dest/services/dummy_service.d.ts.map +1 -1
  141. package/dest/services/dummy_service.js +12 -16
  142. package/dest/services/encoding.d.ts +5 -1
  143. package/dest/services/encoding.d.ts.map +1 -1
  144. package/dest/services/encoding.js +7 -1
  145. package/dest/services/gossipsub/topic_score_params.d.ts +13 -2
  146. package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -1
  147. package/dest/services/gossipsub/topic_score_params.js +21 -4
  148. package/dest/services/libp2p/instrumentation.d.ts +3 -1
  149. package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
  150. package/dest/services/libp2p/instrumentation.js +14 -0
  151. package/dest/services/libp2p/libp2p_service.d.ts +36 -46
  152. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  153. package/dest/services/libp2p/libp2p_service.js +296 -244
  154. package/dest/services/peer-manager/metrics.d.ts +3 -1
  155. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  156. package/dest/services/peer-manager/metrics.js +6 -0
  157. package/dest/services/peer-manager/peer_manager.d.ts +6 -2
  158. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  159. package/dest/services/peer-manager/peer_manager.js +40 -11
  160. package/dest/services/peer-manager/peer_scoring.d.ts +7 -2
  161. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  162. package/dest/services/peer-manager/peer_scoring.js +32 -10
  163. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +11 -8
  164. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -1
  165. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +84 -71
  166. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +10 -6
  167. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
  168. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +5 -4
  169. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -1
  170. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +13 -7
  171. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +3 -1
  172. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -1
  173. package/dest/services/reqresp/batch-tx-requester/peer_collection.js +3 -0
  174. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +5 -14
  175. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -1
  176. package/dest/services/reqresp/batch-tx-requester/tx_validator.js +6 -20
  177. package/dest/services/reqresp/config.d.ts +3 -3
  178. package/dest/services/reqresp/config.d.ts.map +1 -1
  179. package/dest/services/reqresp/interface.d.ts +16 -18
  180. package/dest/services/reqresp/interface.d.ts.map +1 -1
  181. package/dest/services/reqresp/interface.js +10 -20
  182. package/dest/services/reqresp/metrics.d.ts +1 -1
  183. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  184. package/dest/services/reqresp/metrics.js +0 -1
  185. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +1 -1
  186. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
  187. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +4 -2
  188. package/dest/services/reqresp/protocols/index.d.ts +1 -2
  189. package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
  190. package/dest/services/reqresp/protocols/index.js +0 -1
  191. package/dest/services/reqresp/protocols/tx.d.ts +1 -1
  192. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  193. package/dest/services/reqresp/protocols/tx.js +1 -3
  194. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +5 -4
  195. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
  196. package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -8
  197. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
  198. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
  199. package/dest/services/reqresp/rate-limiter/rate_limits.js +0 -10
  200. package/dest/services/reqresp/reqresp.d.ts +7 -29
  201. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  202. package/dest/services/reqresp/reqresp.js +41 -214
  203. package/dest/services/service.d.ts +9 -12
  204. package/dest/services/service.d.ts.map +1 -1
  205. package/dest/services/tx_collection/config.d.ts +2 -23
  206. package/dest/services/tx_collection/config.d.ts.map +1 -1
  207. package/dest/services/tx_collection/config.js +2 -55
  208. package/dest/services/tx_collection/file_store_tx_collection.d.ts +12 -28
  209. package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -1
  210. package/dest/services/tx_collection/file_store_tx_collection.js +43 -83
  211. package/dest/services/tx_collection/file_store_tx_source.d.ts +5 -4
  212. package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -1
  213. package/dest/services/tx_collection/file_store_tx_source.js +39 -29
  214. package/dest/services/tx_collection/index.d.ts +2 -3
  215. package/dest/services/tx_collection/index.d.ts.map +1 -1
  216. package/dest/services/tx_collection/index.js +0 -1
  217. package/dest/services/tx_collection/instrumentation.d.ts +1 -1
  218. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
  219. package/dest/services/tx_collection/instrumentation.js +0 -2
  220. package/dest/services/tx_collection/request_tracker.d.ts +53 -0
  221. package/dest/services/tx_collection/request_tracker.d.ts.map +1 -0
  222. package/dest/services/tx_collection/request_tracker.js +84 -0
  223. package/dest/services/tx_collection/tx_collection.d.ts +36 -55
  224. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  225. package/dest/services/tx_collection/tx_collection.js +275 -119
  226. package/dest/services/tx_collection/tx_collection_sink.d.ts +1 -1
  227. package/dest/services/tx_collection/tx_collection_sink.js +2 -2
  228. package/dest/services/tx_collection/tx_source.d.ts +6 -5
  229. package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
  230. package/dest/services/tx_collection/tx_source.js +9 -7
  231. package/dest/services/tx_file_store/tx_file_store.d.ts +1 -3
  232. package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -1
  233. package/dest/services/tx_file_store/tx_file_store.js +4 -14
  234. package/dest/services/tx_provider.d.ts +3 -1
  235. package/dest/services/tx_provider.d.ts.map +1 -1
  236. package/dest/services/tx_provider.js +3 -0
  237. package/dest/test-helpers/make-test-p2p-clients.d.ts +1 -1
  238. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  239. package/dest/test-helpers/make-test-p2p-clients.js +5 -2
  240. package/dest/test-helpers/mock-pubsub.d.ts +23 -9
  241. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  242. package/dest/test-helpers/mock-pubsub.js +44 -44
  243. package/dest/test-helpers/reqresp-nodes.d.ts +4 -5
  244. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  245. package/dest/test-helpers/reqresp-nodes.js +16 -18
  246. package/dest/test-helpers/test_tx_provider.d.ts +3 -1
  247. package/dest/test-helpers/test_tx_provider.d.ts.map +1 -1
  248. package/dest/test-helpers/test_tx_provider.js +3 -0
  249. package/dest/test-helpers/testbench-utils.d.ts +12 -14
  250. package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
  251. package/dest/test-helpers/testbench-utils.js +42 -15
  252. package/dest/testbench/p2p_client_testbench_worker.d.ts +3 -5
  253. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  254. package/dest/testbench/p2p_client_testbench_worker.js +85 -39
  255. package/dest/testbench/worker_client_manager.d.ts +12 -6
  256. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  257. package/dest/testbench/worker_client_manager.js +57 -11
  258. package/dest/util.d.ts +12 -7
  259. package/dest/util.d.ts.map +1 -1
  260. package/dest/util.js +35 -14
  261. package/dest/versioning.d.ts +3 -6
  262. package/dest/versioning.d.ts.map +1 -1
  263. package/dest/versioning.js +3 -24
  264. package/package.json +15 -14
  265. package/src/bootstrap/bootstrap.ts +9 -1
  266. package/src/client/factory.ts +57 -8
  267. package/src/client/interface.ts +15 -11
  268. package/src/client/p2p_client.ts +106 -70
  269. package/src/client/test/{tx_proposal_collector/README.md → p2p_client.batch_tx_requester.bench.README.md} +23 -53
  270. package/src/config.ts +226 -36
  271. package/src/errors/p2p-service.error.ts +11 -0
  272. package/src/errors/reqresp.error.ts +0 -25
  273. package/src/index.ts +0 -1
  274. package/src/mem_pools/attestation_pool/attestation_pool.ts +318 -242
  275. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +204 -68
  276. package/src/mem_pools/attestation_pool/mocks.ts +13 -8
  277. package/src/mem_pools/index.ts +0 -3
  278. package/src/mem_pools/instrumentation.ts +22 -14
  279. package/src/mem_pools/tx_pool_v2/README.md +9 -1
  280. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +2 -1
  281. package/src/mem_pools/tx_pool_v2/eviction/index.ts +1 -0
  282. package/src/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.ts +65 -0
  283. package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +11 -1
  284. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +3 -3
  285. package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +15 -6
  286. package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +2 -1
  287. package/src/mem_pools/tx_pool_v2/interfaces.ts +12 -4
  288. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +72 -20
  289. package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +29 -43
  290. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +16 -1
  291. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +101 -94
  292. package/src/msg_validators/attestation_validator/README.md +49 -0
  293. package/src/msg_validators/attestation_validator/attestation_validator.ts +41 -9
  294. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +14 -7
  295. package/src/msg_validators/clock_tolerance.ts +79 -3
  296. package/src/msg_validators/proposal_validator/README.md +123 -0
  297. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +24 -4
  298. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +35 -7
  299. package/src/msg_validators/proposal_validator/proposal_validator.ts +114 -47
  300. package/src/msg_validators/tx_validator/README.md +15 -3
  301. package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +3 -12
  302. package/src/msg_validators/tx_validator/allowed_public_setup.ts +22 -27
  303. package/src/msg_validators/tx_validator/allowed_setup_helpers.ts +31 -0
  304. package/src/msg_validators/tx_validator/archive_cache.ts +1 -1
  305. package/src/msg_validators/tx_validator/cached_tx_validator.ts +31 -0
  306. package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
  307. package/src/msg_validators/tx_validator/data_validator.ts +44 -1
  308. package/src/msg_validators/tx_validator/factory.ts +61 -10
  309. package/src/msg_validators/tx_validator/fee_payer_balance.ts +6 -2
  310. package/src/msg_validators/tx_validator/gas_validator.ts +121 -39
  311. package/src/msg_validators/tx_validator/index.ts +3 -0
  312. package/src/msg_validators/tx_validator/metadata_validator.ts +12 -4
  313. package/src/msg_validators/tx_validator/phases_validator.ts +82 -27
  314. package/src/msg_validators/tx_validator/tx_proof_validator.ts +2 -0
  315. package/src/msg_validators/tx_validator/tx_validation_cache.ts +102 -0
  316. package/src/services/data_store.ts +5 -13
  317. package/src/services/discv5/discV5_service.ts +38 -5
  318. package/src/services/dummy_service.ts +14 -39
  319. package/src/services/encoding.ts +9 -1
  320. package/src/services/gossipsub/topic_score_params.ts +36 -4
  321. package/src/services/libp2p/instrumentation.ts +14 -0
  322. package/src/services/libp2p/libp2p_service.ts +321 -276
  323. package/src/services/peer-manager/metrics.ts +7 -0
  324. package/src/services/peer-manager/peer_manager.ts +46 -11
  325. package/src/services/peer-manager/peer_scoring.ts +27 -5
  326. package/src/services/reqresp/README.md +215 -0
  327. package/src/services/reqresp/batch-tx-requester/README.md +46 -7
  328. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +83 -77
  329. package/src/services/reqresp/batch-tx-requester/interface.ts +13 -5
  330. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +13 -6
  331. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +5 -0
  332. package/src/services/reqresp/batch-tx-requester/tx_validator.ts +12 -25
  333. package/src/services/reqresp/config.ts +2 -2
  334. package/src/services/reqresp/interface.ts +21 -47
  335. package/src/services/reqresp/metrics.ts +0 -1
  336. package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +4 -2
  337. package/src/services/reqresp/protocols/index.ts +0 -1
  338. package/src/services/reqresp/protocols/tx.ts +1 -3
  339. package/src/services/reqresp/rate-limiter/rate_limiter.ts +13 -9
  340. package/src/services/reqresp/rate-limiter/rate_limits.ts +0 -10
  341. package/src/services/reqresp/reqresp.ts +45 -260
  342. package/src/services/service.ts +12 -28
  343. package/src/services/tx_collection/config.ts +3 -80
  344. package/src/services/tx_collection/file_store_tx_collection.ts +54 -103
  345. package/src/services/tx_collection/file_store_tx_source.ts +43 -31
  346. package/src/services/tx_collection/index.ts +1 -6
  347. package/src/services/tx_collection/instrumentation.ts +1 -7
  348. package/src/services/tx_collection/request_tracker.ts +127 -0
  349. package/src/services/tx_collection/tx_collection.ts +331 -176
  350. package/src/services/tx_collection/tx_collection_sink.ts +2 -2
  351. package/src/services/tx_collection/tx_source.ts +8 -7
  352. package/src/services/tx_file_store/tx_file_store.ts +5 -17
  353. package/src/services/tx_provider.ts +5 -0
  354. package/src/test-helpers/make-test-p2p-clients.ts +4 -1
  355. package/src/test-helpers/mock-pubsub.ts +46 -60
  356. package/src/test-helpers/reqresp-nodes.ts +13 -23
  357. package/src/test-helpers/test_tx_provider.ts +5 -0
  358. package/src/test-helpers/testbench-utils.ts +53 -28
  359. package/src/testbench/p2p_client_testbench_worker.ts +89 -55
  360. package/src/testbench/worker_client_manager.ts +72 -25
  361. package/src/util.ts +33 -18
  362. package/src/versioning.ts +3 -33
  363. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts +0 -2
  364. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts.map +0 -1
  365. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +0 -304
  366. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts +0 -73
  367. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts.map +0 -1
  368. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.js +0 -8
  369. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +0 -125
  370. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +0 -1
  371. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +0 -596
  372. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +0 -32
  373. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +0 -1
  374. package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +0 -112
  375. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +0 -157
  376. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +0 -1
  377. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +0 -52
  378. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +0 -16
  379. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +0 -1
  380. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +0 -122
  381. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +0 -17
  382. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +0 -1
  383. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +0 -84
  384. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +0 -19
  385. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +0 -1
  386. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +0 -78
  387. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +0 -26
  388. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +0 -1
  389. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +0 -84
  390. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +0 -25
  391. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +0 -1
  392. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +0 -57
  393. package/dest/mem_pools/tx_pool/index.d.ts +0 -3
  394. package/dest/mem_pools/tx_pool/index.d.ts.map +0 -1
  395. package/dest/mem_pools/tx_pool/index.js +0 -2
  396. package/dest/mem_pools/tx_pool/priority.d.ts +0 -12
  397. package/dest/mem_pools/tx_pool/priority.d.ts.map +0 -1
  398. package/dest/mem_pools/tx_pool/priority.js +0 -15
  399. package/dest/mem_pools/tx_pool/tx_pool.d.ts +0 -127
  400. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +0 -1
  401. package/dest/mem_pools/tx_pool/tx_pool.js +0 -3
  402. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +0 -7
  403. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +0 -1
  404. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +0 -400
  405. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +0 -23
  406. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +0 -1
  407. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +0 -212
  408. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +0 -64
  409. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +0 -1
  410. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +0 -151
  411. package/dest/services/reqresp/protocols/block.d.ts +0 -9
  412. package/dest/services/reqresp/protocols/block.d.ts.map +0 -1
  413. package/dest/services/reqresp/protocols/block.js +0 -32
  414. package/dest/services/tx_collection/fast_tx_collection.d.ts +0 -54
  415. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +0 -1
  416. package/dest/services/tx_collection/fast_tx_collection.js +0 -327
  417. package/dest/services/tx_collection/missing_txs_tracker.d.ts +0 -32
  418. package/dest/services/tx_collection/missing_txs_tracker.d.ts.map +0 -1
  419. package/dest/services/tx_collection/missing_txs_tracker.js +0 -27
  420. package/dest/services/tx_collection/proposal_tx_collector.d.ts +0 -49
  421. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +0 -1
  422. package/dest/services/tx_collection/proposal_tx_collector.js +0 -50
  423. package/dest/services/tx_collection/slow_tx_collection.d.ts +0 -57
  424. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +0 -1
  425. package/dest/services/tx_collection/slow_tx_collection.js +0 -211
  426. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +0 -345
  427. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.ts +0 -43
  428. package/src/mem_pools/tx_pool/README.md +0 -270
  429. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -746
  430. package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +0 -132
  431. package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +0 -208
  432. package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +0 -162
  433. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +0 -104
  434. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +0 -93
  435. package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +0 -106
  436. package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +0 -75
  437. package/src/mem_pools/tx_pool/index.ts +0 -2
  438. package/src/mem_pools/tx_pool/priority.ts +0 -20
  439. package/src/mem_pools/tx_pool/tx_pool.ts +0 -141
  440. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +0 -319
  441. package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +0 -230
  442. package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +0 -161
  443. package/src/services/reqresp/protocols/block.ts +0 -37
  444. package/src/services/tx_collection/fast_tx_collection.ts +0 -387
  445. package/src/services/tx_collection/missing_txs_tracker.ts +0 -52
  446. package/src/services/tx_collection/proposal_tx_collector.ts +0 -113
  447. package/src/services/tx_collection/slow_tx_collection.ts +0 -266
@@ -1,14 +1,14 @@
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, merge } 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
- import { GasFees } from '@aztec/stdlib/gas';
11
+ import { type BlockMinFeesProvider, GasFees } from '@aztec/stdlib/gas';
12
12
  import type { ClientProtocolCircuitVerifier, PeerInfo, WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
13
13
  import {
14
14
  BlockProposal,
@@ -17,15 +17,15 @@ 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,
25
25
  metricsTopicStrToLabels,
26
26
  } from '@aztec/stdlib/p2p';
27
27
  import { MerkleTreeId } from '@aztec/stdlib/trees';
28
- import { Tx, type TxHash, type TxValidationResult, type TxValidator } from '@aztec/stdlib/tx';
28
+ import { Tx, type TxValidationResult } from '@aztec/stdlib/tx';
29
29
  import type { UInt64 } from '@aztec/stdlib/types';
30
30
  import { compressComponentVersions } from '@aztec/stdlib/versioning';
31
31
  import {
@@ -50,13 +50,15 @@ import { yamux } from '@chainsafe/libp2p-yamux';
50
50
  import { bootstrap } from '@libp2p/bootstrap';
51
51
  import { identify } from '@libp2p/identify';
52
52
  import { type Message, type MultiaddrConnection, type PeerId, TopicValidatorResult } from '@libp2p/interface';
53
- import type { ConnectionManager } from '@libp2p/interface-internal';
53
+ import type { AddressManager, ConnectionManager } from '@libp2p/interface-internal';
54
54
  import { mplex } from '@libp2p/mplex';
55
55
  import { tcp } from '@libp2p/tcp';
56
+ import { multiaddr } from '@multiformats/multiaddr';
56
57
  import { ENR } from '@nethermindeth/enr';
57
58
  import { createLibp2p } from 'libp2p';
58
59
 
59
60
  import type { P2PConfig } from '../../config.js';
61
+ import { CheckpointProposalReceivedCallbackNotRegisteredError } from '../../errors/p2p-service.error.js';
60
62
  import type { MemPools } from '../../mem_pools/interface.js';
61
63
  import {
62
64
  BlockProposalValidator,
@@ -72,8 +74,8 @@ import {
72
74
  createFirstStageTxValidationsForGossipedTransactions,
73
75
  createSecondStageTxValidationsForGossipedTransactions,
74
76
  createTxValidatorForBlockProposalReceivedTxs,
75
- createTxValidatorForReqResponseReceivedTxs,
76
77
  } from '../../msg_validators/tx_validator/factory.js';
78
+ import { TxValidationCache } from '../../msg_validators/tx_validator/tx_validation_cache.js';
77
79
  import { GossipSubEvent } from '../../types/index.js';
78
80
  import { type PubSubLibp2p, convertToMultiaddr } from '../../util.js';
79
81
  import { getVersions } from '../../versioning.js';
@@ -91,19 +93,15 @@ import {
91
93
  AuthRequest,
92
94
  BlockTxsRequest,
93
95
  BlockTxsResponse,
94
- DEFAULT_SUB_PROTOCOL_VALIDATORS,
95
96
  type ReqRespInterface,
96
97
  type ReqRespResponse,
97
98
  ReqRespSubProtocol,
98
99
  type ReqRespSubProtocolHandler,
99
100
  type ReqRespSubProtocolHandlers,
100
- type ReqRespSubProtocolValidators,
101
101
  StatusMessage,
102
- type SubProtocolMap,
103
102
  ValidationError,
104
103
  pingHandler,
105
104
  reqGoodbyeHandler,
106
- reqRespBlockHandler,
107
105
  reqRespBlockTxsHandler,
108
106
  reqRespStatusHandler,
109
107
  reqRespTxHandler,
@@ -111,6 +109,7 @@ import {
111
109
  import { ReqResp } from '../reqresp/reqresp.js';
112
110
  import type {
113
111
  P2PBlockReceivedCallback,
112
+ P2PCheckpointAttestationCallback,
114
113
  P2PCheckpointReceivedCallback,
115
114
  P2PDuplicateAttestationCallback,
116
115
  P2PService,
@@ -129,7 +128,7 @@ type ValidationOutcome = { allPassed: true } | { allPassed: false; failure: Vali
129
128
  // REFACTOR: Unify with the type above
130
129
  type ReceivedMessageValidationResult<T, M = undefined> =
131
130
  | { obj: T; result: Exclude<TopicValidatorResult, TopicValidatorResult.Reject>; metadata?: M }
132
- | { obj?: T; result: TopicValidatorResult.Reject; metadata?: M };
131
+ | { obj?: T; result: TopicValidatorResult.Reject; metadata?: M; severity: PeerErrorSeverity };
133
132
 
134
133
  /**
135
134
  * Lib P2P implementation of the P2PService interface.
@@ -146,8 +145,6 @@ export class LibP2PService extends WithTracer implements P2PService {
146
145
  private protocolVersion = '';
147
146
  private topicStrings: Record<TopicType, string> = {} as Record<TopicType, string>;
148
147
 
149
- private feesCache: { blockNumber: BlockNumber; gasFees: GasFees } | undefined;
150
-
151
148
  /** Callback invoked when a duplicate proposal is detected (triggers slashing). */
152
149
  private duplicateProposalCallback?: (info: {
153
150
  slot: SlotNumber;
@@ -158,6 +155,9 @@ export class LibP2PService extends WithTracer implements P2PService {
158
155
  /** Callback invoked when a duplicate attestation is detected (triggers slashing). */
159
156
  private duplicateAttestationCallback?: P2PDuplicateAttestationCallback;
160
157
 
158
+ /** Callback invoked when a valid checkpoint attestation is accepted into the pool. */
159
+ private checkpointAttestationCallback?: P2PCheckpointAttestationCallback;
160
+
161
161
  /**
162
162
  * Callback for when a block is received from a peer.
163
163
  * @param block - The block received from the peer.
@@ -170,10 +170,19 @@ 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
 
183
+ private ipChangedHandler?: (ip: string) => void;
184
+ private discoveredP2pIp?: string;
185
+
177
186
  private instrumentation: P2PInstrumentation;
178
187
 
179
188
  private telemetry: TelemetryClient;
@@ -191,8 +200,10 @@ export class LibP2PService extends WithTracer implements P2PService {
191
200
  private epochCache: EpochCacheInterface,
192
201
  private proofVerifier: ClientProtocolCircuitVerifier,
193
202
  private worldStateSynchronizer: WorldStateSynchronizer,
203
+ private blockMinFeesProvider: BlockMinFeesProvider,
194
204
  telemetry: TelemetryClient,
195
205
  logger: Logger = createLogger('p2p:libp2p_service'),
206
+ private txValidationCache?: TxValidationCache,
196
207
  ) {
197
208
  super(telemetry, 'LibP2PService');
198
209
  this.telemetry = telemetry;
@@ -222,36 +233,55 @@ export class LibP2PService extends WithTracer implements P2PService {
222
233
  this.protocolVersion,
223
234
  );
224
235
 
225
- this.blockProposalValidator = new BlockProposalValidator(epochCache, { txsPermitted: !config.disableTransactions });
226
- this.checkpointProposalValidator = new CheckpointProposalValidator(epochCache, {
236
+ const p2pPropagationTime = config.attestationPropagationTime;
237
+ const proposalValidatorOpts = {
227
238
  txsPermitted: !config.disableTransactions,
228
- });
239
+ maxTxsPerBlock: config.validateMaxTxsPerBlock ?? config.validateMaxTxsPerCheckpoint,
240
+ maxBlocksPerCheckpoint: config.maxBlocksPerCheckpoint,
241
+ p2pPropagationTime,
242
+ skipSlotValidation: config.skipProposalSlotValidation,
243
+ signatureContext: {
244
+ chainId: config.l1ChainId,
245
+ rollupAddress: config.rollupAddress,
246
+ },
247
+ };
248
+ this.blockProposalValidator = new BlockProposalValidator(epochCache, proposalValidatorOpts);
249
+ this.checkpointProposalValidator = new CheckpointProposalValidator(epochCache, proposalValidatorOpts);
250
+ const attestationValidatorOpts = {
251
+ l1PublishingTime: config.l1PublishingTime,
252
+ p2pPropagationTime,
253
+ signatureContext: proposalValidatorOpts.signatureContext,
254
+ };
229
255
  this.checkpointAttestationValidator = config.fishermanMode
230
- ? new FishermanAttestationValidator(epochCache, mempools.attestationPool, telemetry)
231
- : new CheckpointAttestationValidator(epochCache);
256
+ ? new FishermanAttestationValidator(epochCache, mempools.attestationPool, telemetry, attestationValidatorOpts)
257
+ : new CheckpointAttestationValidator(epochCache, attestationValidatorOpts);
232
258
 
233
259
  this.gossipSubEventHandler = this.handleGossipSubEvent.bind(this);
234
260
 
235
261
  this.blockReceivedCallback = async (block: BlockProposal): Promise<boolean> => {
236
- this.logger.debug(
237
- `Handler not yet registered: Block received callback not set. Received block for slot ${block.slotNumber} from peer.`,
262
+ this.logger.warn(
263
+ `Handler for block received not yet registered on P2P service. Received block ${block.blockNumber} for slot ${block.slotNumber} from peer.`,
238
264
  { p2pMessageIdentifier: await block.p2pMessageLoggingIdentifier() },
239
265
  );
240
- return false;
266
+ return true;
241
267
  };
242
268
 
243
- this.checkpointReceivedCallback = (
244
- checkpoint: CheckpointProposalCore,
269
+ this.allNodesCheckpointReceivedCallback = (
270
+ _checkpoint: CheckpointProposalCore,
271
+ ): Promise<CheckpointAttestation[] | undefined> => {
272
+ throw new CheckpointProposalReceivedCallbackNotRegisteredError();
273
+ };
274
+
275
+ this.validatorCheckpointReceivedCallback = (
276
+ _checkpoint: CheckpointProposalCore,
245
277
  ): Promise<CheckpointAttestation[] | undefined> => {
246
- this.logger.debug(
247
- `Handler not yet registered: Checkpoint received callback not set. Received checkpoint for slot ${checkpoint.slotNumber} from peer.`,
248
- );
249
278
  return Promise.resolve(undefined);
250
279
  };
251
280
  }
252
281
 
253
- public updateConfig(config: Partial<P2PReqRespConfig>) {
282
+ public updateConfig(config: Partial<P2PReqRespConfig & Pick<P2PConfig, 'skipIncomingProposals'>>) {
254
283
  this.reqresp.updateConfig(config);
284
+ this.config = merge(this.config, config);
255
285
  }
256
286
 
257
287
  /**
@@ -270,9 +300,11 @@ export class LibP2PService extends WithTracer implements P2PService {
270
300
  proofVerifier: ClientProtocolCircuitVerifier;
271
301
  worldStateSynchronizer: WorldStateSynchronizer;
272
302
  peerStore: AztecAsyncKVStore;
303
+ blockMinFeesProvider: BlockMinFeesProvider;
273
304
  telemetry: TelemetryClient;
274
305
  logger: Logger;
275
306
  packageVersion: string;
307
+ txValidationCache?: TxValidationCache;
276
308
  },
277
309
  ) {
278
310
  const {
@@ -282,9 +314,11 @@ export class LibP2PService extends WithTracer implements P2PService {
282
314
  mempools,
283
315
  proofVerifier,
284
316
  peerStore,
317
+ blockMinFeesProvider,
285
318
  telemetry,
286
319
  logger,
287
320
  packageVersion,
321
+ txValidationCache,
288
322
  } = deps;
289
323
  const { p2pPort, maxPeerCount, listenAddress } = config;
290
324
  const bindAddrTcp = convertToMultiaddr(listenAddress, p2pPort, 'tcp');
@@ -335,9 +369,12 @@ export class LibP2PService extends WithTracer implements P2PService {
335
369
  const l1Constants = epochCache.getL1Constants();
336
370
  const topicScoreParams = createAllTopicScoreParams(protocolVersion, {
337
371
  slotDurationMs: l1Constants.slotDuration * 1000,
372
+ ethereumSlotDuration: l1Constants.ethereumSlotDuration,
338
373
  heartbeatIntervalMs: config.gossipsubInterval,
339
374
  targetCommitteeSize: l1Constants.targetCommitteeSize,
340
375
  blockDurationMs: config.blockDurationMs,
376
+ l1PublishingTime: config.l1PublishingTime,
377
+ p2pPropagationTime: config.attestationPropagationTime,
341
378
  expectedBlockProposalsPerSlot: config.expectedBlockProposalsPerSlot,
342
379
  });
343
380
 
@@ -439,8 +476,9 @@ export class LibP2PService extends WithTracer implements P2PService {
439
476
  topics: topicScoreParams,
440
477
  }),
441
478
  }) as (components: GossipSubComponents) => GossipSub,
442
- components: (components: { connectionManager: ConnectionManager }) => ({
479
+ components: (components: { connectionManager: ConnectionManager; addressManager: AddressManager }) => ({
443
480
  connectionManager: components.connectionManager,
481
+ addressManager: components.addressManager,
444
482
  }),
445
483
  },
446
484
  logger: createLibp2pComponentLogger(logger.module, logger.getBindings()),
@@ -462,6 +500,9 @@ export class LibP2PService extends WithTracer implements P2PService {
462
500
  epochCache,
463
501
  );
464
502
 
503
+ // Gate req/resp data protocols for unauthenticated peers when p2pAllowOnlyValidators is enabled
504
+ reqresp.setShouldRejectPeer(peerId => peerManager.shouldDisableP2PGossip(peerId));
505
+
465
506
  // Configure application-specific scoring for gossipsub.
466
507
  // The weight scales app score to align with gossipsub thresholds:
467
508
  // - Disconnect (-50) × 10 = -500 = gossipThreshold (stops receiving gossip)
@@ -482,8 +523,10 @@ export class LibP2PService extends WithTracer implements P2PService {
482
523
  epochCache,
483
524
  proofVerifier,
484
525
  worldStateSynchronizer,
526
+ blockMinFeesProvider,
485
527
  telemetry,
486
528
  logger,
529
+ txValidationCache,
487
530
  );
488
531
  }
489
532
 
@@ -497,24 +540,21 @@ export class LibP2PService extends WithTracer implements P2PService {
497
540
  throw new Error('P2P service already started');
498
541
  }
499
542
 
500
- // Get listen & announce addresses for logging
501
543
  const { p2pIp, p2pPort } = this.config;
502
- if (!p2pIp) {
503
- throw new Error('Announce address not provided.');
544
+ if (!p2pIp && !this.config.queryForIp) {
545
+ throw new Error('Announce address not provided and queryForIp is not enabled.');
504
546
  }
505
- const announceTcpMultiaddr = convertToMultiaddr(p2pIp, p2pPort, 'tcp');
547
+ const announceTcpMultiaddr = p2pIp ? convertToMultiaddr(p2pIp, p2pPort, 'tcp') : undefined;
506
548
 
507
549
  // Create request response protocol handlers
508
550
  const txHandler = reqRespTxHandler(this.mempools);
509
551
  const goodbyeHandler = reqGoodbyeHandler(this.peerManager);
510
- const blockHandler = reqRespBlockHandler(this.archiver);
511
552
  const statusHandler = reqRespStatusHandler(this.protocolVersion, this.worldStateSynchronizer, this.logger);
512
553
 
513
554
  const requestResponseHandlers: Partial<ReqRespSubProtocolHandlers> = {
514
555
  [ReqRespSubProtocol.PING]: pingHandler,
515
556
  [ReqRespSubProtocol.STATUS]: statusHandler.bind(this),
516
557
  [ReqRespSubProtocol.GOODBYE]: goodbyeHandler.bind(this),
517
- [ReqRespSubProtocol.BLOCK]: blockHandler.bind(this),
518
558
  };
519
559
 
520
560
  if (!this.config.disableTransactions) {
@@ -530,17 +570,9 @@ export class LibP2PService extends WithTracer implements P2PService {
530
570
  requestResponseHandlers[ReqRespSubProtocol.TX] = txHandler.bind(this);
531
571
  }
532
572
 
533
- // Define the sub protocol validators - This is done within this start() method to gain a callback to the existing validateTx function
534
- const reqrespSubProtocolValidators = {
535
- ...DEFAULT_SUB_PROTOCOL_VALIDATORS,
536
- [ReqRespSubProtocol.TX]: this.validateRequestedTxs.bind(this),
537
- [ReqRespSubProtocol.BLOCK_TXS]: this.validateRequestedBlockTxs.bind(this),
538
- [ReqRespSubProtocol.BLOCK]: this.validateRequestedBlock.bind(this),
539
- };
540
-
541
573
  await this.peerManager.initializePeers();
542
574
 
543
- await this.reqresp.start(requestResponseHandlers, reqrespSubProtocolValidators);
575
+ await this.reqresp.start(requestResponseHandlers);
544
576
 
545
577
  await this.node.start();
546
578
 
@@ -556,6 +588,38 @@ export class LibP2PService extends WithTracer implements P2PService {
556
588
  if (!this.config.p2pDiscoveryDisabled) {
557
589
  await this.peerDiscoveryService.start();
558
590
  }
591
+
592
+ // Bridge discv5 IP changes to libp2p's AddressManager so peers see the updated address
593
+ if (this.config.queryForIp) {
594
+ this.discoveredP2pIp = this.config.p2pIp;
595
+ this.logger.info('IP change tracking enabled, bridging discv5 IP updates to libp2p AddressManager');
596
+ this.ipChangedHandler = (ip: string) => {
597
+ const addressManager = this.node.services.components.addressManager;
598
+ const newAddr = multiaddr(convertToMultiaddr(ip, this.config.p2pPort, 'tcp'));
599
+ const previousIp = this.discoveredP2pIp;
600
+
601
+ if (previousIp) {
602
+ const oldAddr = multiaddr(convertToMultiaddr(previousIp, this.config.p2pPort, 'tcp'));
603
+ addressManager.removeObservedAddr(oldAddr);
604
+ this.logger.info('Libp2p announce address updated due to IP change', {
605
+ previousIp,
606
+ newIp: ip,
607
+ newMultiaddr: newAddr.toString(),
608
+ });
609
+ } else {
610
+ this.logger.info('Libp2p announce address set from initial discv5 IP discovery', {
611
+ ip,
612
+ multiaddr: newAddr.toString(),
613
+ });
614
+ }
615
+
616
+ addressManager.addObservedAddr(newAddr);
617
+ addressManager.confirmObservedAddr(newAddr);
618
+ this.discoveredP2pIp = ip;
619
+ };
620
+ this.peerDiscoveryService.on('ip:changed', this.ipChangedHandler);
621
+ }
622
+
559
623
  this.discoveryRunningPromise = new RunningPromise(
560
624
  async () => {
561
625
  await this.peerManager.heartbeat();
@@ -581,6 +645,11 @@ export class LibP2PService extends WithTracer implements P2PService {
581
645
  // Remove gossip sub listener
582
646
  this.node.services.pubsub.removeEventListener(GossipSubEvent.MESSAGE, this.gossipSubEventHandler);
583
647
 
648
+ if (this.ipChangedHandler) {
649
+ this.peerDiscoveryService.removeListener('ip:changed', this.ipChangedHandler);
650
+ this.ipChangedHandler = undefined;
651
+ }
652
+
584
653
  // Stop peer manager
585
654
  this.logger.debug('Stopping peer manager...');
586
655
  await this.peerManager.stop();
@@ -595,12 +664,8 @@ export class LibP2PService extends WithTracer implements P2PService {
595
664
  this.logger.info('LibP2P service stopped');
596
665
  }
597
666
 
598
- addReqRespSubProtocol(
599
- subProtocol: ReqRespSubProtocol,
600
- handler: ReqRespSubProtocolHandler,
601
- validator?: ReqRespSubProtocolValidators[ReqRespSubProtocol],
602
- ): Promise<void> {
603
- return this.reqresp.addSubProtocol(subProtocol, handler, validator);
667
+ addReqRespSubProtocol(subProtocol: ReqRespSubProtocol, handler: ReqRespSubProtocolHandler): Promise<void> {
668
+ return this.reqresp.addSubProtocol(subProtocol, handler);
604
669
  }
605
670
 
606
671
  public registerThisValidatorAddresses(address: EthAddress[]): void {
@@ -628,20 +693,6 @@ export class LibP2PService extends WithTracer implements P2PService {
628
693
  setImmediate(() => void safeJob());
629
694
  }
630
695
 
631
- /**
632
- * Send a batch of requests to peers, and return the responses
633
- * @param protocol - The request response protocol to use
634
- * @param requests - The requests to send to the peers
635
- * @returns The responses to the requests
636
- */
637
- sendBatchRequest<SubProtocol extends ReqRespSubProtocol>(
638
- protocol: SubProtocol,
639
- requests: InstanceType<SubProtocolMap[SubProtocol]['request']>[],
640
- pinnedPeerId: PeerId | undefined,
641
- ): Promise<InstanceType<SubProtocolMap[SubProtocol]['response']>[]> {
642
- return this.reqresp.sendBatchRequest(protocol, requests, pinnedPeerId);
643
- }
644
-
645
696
  public sendRequestToPeer(
646
697
  peerId: PeerId,
647
698
  subProtocol: ReqRespSubProtocol,
@@ -663,8 +714,12 @@ export class LibP2PService extends WithTracer implements P2PService {
663
714
  this.blockReceivedCallback = callback;
664
715
  }
665
716
 
666
- public registerCheckpointReceivedCallback(callback: P2PCheckpointReceivedCallback) {
667
- this.checkpointReceivedCallback = callback;
717
+ public registerValidatorCheckpointReceivedCallback(callback: P2PCheckpointReceivedCallback) {
718
+ this.validatorCheckpointReceivedCallback = callback;
719
+ }
720
+
721
+ public registerAllNodesCheckpointReceivedCallback(callback: P2PCheckpointReceivedCallback) {
722
+ this.allNodesCheckpointReceivedCallback = callback;
668
723
  }
669
724
 
670
725
  /**
@@ -686,6 +741,10 @@ export class LibP2PService extends WithTracer implements P2PService {
686
741
  this.duplicateAttestationCallback = callback;
687
742
  }
688
743
 
744
+ public registerCheckpointAttestationCallback(callback: P2PCheckpointAttestationCallback): void {
745
+ this.checkpointAttestationCallback = callback;
746
+ }
747
+
689
748
  /**
690
749
  * Subscribes to a topic.
691
750
  * @param topic - The topic to subscribe to.
@@ -750,6 +809,9 @@ export class LibP2PService extends WithTracer implements P2PService {
750
809
  if (!validator || !validator.addMessage(msgId)) {
751
810
  this.instrumentation.incMessagePrevalidationStatus(false, topicType);
752
811
  this.node.services.pubsub.reportMessageValidationResult(msgId, source.toString(), TopicValidatorResult.Ignore);
812
+ if (topicType === TopicType.tx) {
813
+ this.logger.verbose(`Ignoring already-seen tx gossip message`, { msgId, source: source.toString() });
814
+ }
753
815
  return { result: false, topicType };
754
816
  }
755
817
 
@@ -811,6 +873,15 @@ export class LibP2PService extends WithTracer implements P2PService {
811
873
 
812
874
  // Process the message, optionally within a linked span for trace propagation
813
875
  const processMessage = async () => {
876
+ if (
877
+ this.config.skipIncomingProposals &&
878
+ (msg.topic === this.topicStrings[TopicType.block_proposal] ||
879
+ msg.topic === this.topicStrings[TopicType.checkpoint_proposal])
880
+ ) {
881
+ this.logger.warn(`Ignoring incoming proposal (skipIncomingProposals is set)`, { topic: msg.topic });
882
+ this.node.services.pubsub.reportMessageValidationResult(msgId, source.toString(), TopicValidatorResult.Ignore);
883
+ return;
884
+ }
814
885
  if (msg.topic === this.topicStrings[TopicType.tx]) {
815
886
  await this.handleGossipedTx(p2pMessage.payload, msgId, source);
816
887
  } else if (msg.topic === this.topicStrings[TopicType.checkpoint_attestation]) {
@@ -876,30 +947,67 @@ export class LibP2PService extends WithTracer implements P2PService {
876
947
  source: PeerId,
877
948
  topicType: TopicType,
878
949
  ): Promise<ReceivedMessageValidationResult<T, M>> {
879
- let resultAndObj: ReceivedMessageValidationResult<T, M> = { result: TopicValidatorResult.Reject };
950
+ // Default to reject result with a penalty if validation function throws an error
951
+ let resultAndObj: ReceivedMessageValidationResult<T, M> = {
952
+ result: TopicValidatorResult.Reject,
953
+ severity: PeerErrorSeverity.MidToleranceError,
954
+ };
880
955
  const timer = new Timer();
881
956
  try {
882
957
  resultAndObj = await validationFunc();
883
958
  } catch (err) {
884
- this.peerManager.penalizePeer(source, PeerErrorSeverity.LowToleranceError);
885
- this.logger.error(`Error deserializing and validating gossipsub message`, err, {
886
- msgId,
887
- source: source.toString(),
888
- topicType,
889
- });
959
+ this.logger.error(`Error validating gossipsub message`, err, { msgId, source: source.toString(), topicType });
960
+ }
961
+
962
+ const validationTimeMs = timer.ms();
963
+ const mcacheWindowMs = this.config.gossipsubMcacheLength * this.config.gossipsubInterval;
964
+ if (validationTimeMs > mcacheWindowMs * 0.75) {
965
+ this.instrumentation.incSlowValidation(topicType);
966
+ this.logger.warn(
967
+ `Gossip validation for ${topicType} took ${validationTimeMs}ms, approaching mcache eviction window of ${mcacheWindowMs}ms. ` +
968
+ `Message forwarding may be skipped if validation exceeds the window.`,
969
+ { msgId, source: source.toString(), topicType, validationTimeMs, mcacheWindowMs },
970
+ );
890
971
  }
891
972
 
892
973
  if (resultAndObj.result === TopicValidatorResult.Accept) {
974
+ this.logger.debug(`Message ${topicType} accepted by validator`, { msgId, source: source.toString(), topicType });
893
975
  this.instrumentation.recordMessageValidation(topicType, timer);
976
+ } else if (resultAndObj.result === TopicValidatorResult.Reject) {
977
+ this.logger.warn(`Message ${topicType} rejected by validator with severity ${resultAndObj.severity}`, {
978
+ msgId,
979
+ source: source.toString(),
980
+ topicType,
981
+ severity: resultAndObj.severity,
982
+ });
983
+ this.peerManager.penalizePeer(source, resultAndObj.severity);
984
+ } else {
985
+ this.logger.trace(`Message ${topicType} ignored by validator`, { msgId, source: source.toString(), topicType });
894
986
  }
895
987
 
896
988
  this.node.services.pubsub.reportMessageValidationResult(msgId, source.toString(), resultAndObj.result);
897
989
  return resultAndObj;
898
990
  }
899
991
 
992
+ private tryDeserialize<T>(deserializeFunc: () => T, msgId: string, source: PeerId): T | undefined {
993
+ try {
994
+ return deserializeFunc();
995
+ } catch (err) {
996
+ this.logger.warn(`Failed to deserialize gossipsub message from buffer`, {
997
+ err,
998
+ msgId,
999
+ source: source.toString(),
1000
+ });
1001
+ return undefined;
1002
+ }
1003
+ }
1004
+
900
1005
  protected async handleGossipedTx(payloadData: Buffer, msgId: string, source: PeerId) {
901
1006
  const validationFunc: () => Promise<ReceivedMessageValidationResult<Tx>> = async () => {
902
- const tx = Tx.fromBuffer(payloadData);
1007
+ const tx = this.tryDeserialize(() => Tx.fromBuffer(payloadData), msgId, source);
1008
+ if (!tx) {
1009
+ return { result: TopicValidatorResult.Reject, severity: PeerErrorSeverity.LowToleranceError };
1010
+ }
903
1011
 
904
1012
  const currentBlockNumber = await this.archiver.getBlockNumber();
905
1013
  const { ts: nextSlotTimestamp } = this.epochCache.getEpochAndSlotInNextL1Slot();
@@ -919,13 +1027,20 @@ export class LibP2PService extends WithTracer implements P2PService {
919
1027
  severity = await this.handleDoubleSpendFailure(tx, txBlockNumber);
920
1028
  }
921
1029
 
922
- this.peerManager.penalizePeer(source, severity);
923
- return { result: TopicValidatorResult.Reject };
1030
+ this.logger.verbose(`Rejecting gossiped tx ${tx.getTxHash().toString()}: stage 1 validation failed`, {
1031
+ validator: name,
1032
+ severity,
1033
+ source: source.toString(),
1034
+ });
1035
+ return { result: TopicValidatorResult.Reject, severity };
924
1036
  }
925
1037
 
926
1038
  // Pool pre-check: see if the pool would accept this tx before doing expensive proof verification
927
1039
  const canAdd = await this.mempools.txPool.canAddPendingTx(tx);
928
1040
  if (canAdd === 'ignored') {
1041
+ this.logger.verbose(`Ignoring gossiped tx ${tx.getTxHash().toString()}: pool pre-check returned ignored`, {
1042
+ source: source.toString(),
1043
+ });
929
1044
  return { result: TopicValidatorResult.Ignore, obj: tx };
930
1045
  }
931
1046
 
@@ -933,9 +1048,13 @@ export class LibP2PService extends WithTracer implements P2PService {
933
1048
  const secondStageValidators = this.createSecondStageMessageValidators();
934
1049
  const secondStageOutcome = await this.runValidations(tx, secondStageValidators);
935
1050
  if (!secondStageOutcome.allPassed) {
936
- const { severity } = secondStageOutcome.failure;
937
- this.peerManager.penalizePeer(source, severity);
938
- return { result: TopicValidatorResult.Reject };
1051
+ const { severity, name } = secondStageOutcome.failure;
1052
+ this.logger.verbose(`Rejecting gossiped tx ${tx.getTxHash().toString()}: stage 2 validation failed`, {
1053
+ validator: name,
1054
+ severity,
1055
+ source: source.toString(),
1056
+ });
1057
+ return { result: TopicValidatorResult.Reject, severity };
939
1058
  }
940
1059
 
941
1060
  // Pool add: persist the tx
@@ -945,7 +1064,7 @@ export class LibP2PService extends WithTracer implements P2PService {
945
1064
  const wasAccepted = addResult.accepted.some(h => h.equals(txHash));
946
1065
  const wasIgnored = addResult.ignored.some(h => h.equals(txHash));
947
1066
 
948
- this.logger.trace(`Validate propagated tx`, {
1067
+ this.logger.verbose(`Validate propagated tx ${txHash.toString()}`, {
949
1068
  wasAccepted,
950
1069
  wasIgnored,
951
1070
  [Attributes.P2P_ID]: source.toString(),
@@ -956,7 +1075,11 @@ export class LibP2PService extends WithTracer implements P2PService {
956
1075
  } else if (wasIgnored) {
957
1076
  return { result: TopicValidatorResult.Ignore, obj: tx };
958
1077
  } else {
959
- return { result: TopicValidatorResult.Reject };
1078
+ this.logger.warn(`Gossiped tx ${txHash.toString()} unexpectedly rejected by pool`, {
1079
+ source: source.toString(),
1080
+ txHash: txHash.toString(),
1081
+ });
1082
+ return { result: TopicValidatorResult.Reject, severity: PeerErrorSeverity.HighToleranceError };
960
1083
  }
961
1084
  };
962
1085
 
@@ -986,7 +1109,16 @@ export class LibP2PService extends WithTracer implements P2PService {
986
1109
  source: PeerId,
987
1110
  ): Promise<void> {
988
1111
  const { result, obj: attestation } = await this.validateReceivedMessage<CheckpointAttestation>(
989
- () => this.validateAndStoreCheckpointAttestation(source, CheckpointAttestation.fromBuffer(payloadData)),
1112
+ () => {
1113
+ const attestation = this.tryDeserialize(() => CheckpointAttestation.fromBuffer(payloadData), msgId, source);
1114
+ if (!attestation) {
1115
+ return Promise.resolve({
1116
+ result: TopicValidatorResult.Reject,
1117
+ severity: PeerErrorSeverity.LowToleranceError,
1118
+ });
1119
+ }
1120
+ return this.validateAndStoreCheckpointAttestation(source, attestation);
1121
+ },
990
1122
  msgId,
991
1123
  source,
992
1124
  TopicType.checkpoint_attestation,
@@ -1019,8 +1151,7 @@ export class LibP2PService extends WithTracer implements P2PService {
1019
1151
 
1020
1152
  if (validationResult.result === 'reject') {
1021
1153
  this.logger.warn(`Penalizing peer ${peerId} for checkpoint attestation validation failure`);
1022
- this.peerManager.penalizePeer(peerId, validationResult.severity);
1023
- return { result: TopicValidatorResult.Reject };
1154
+ return { result: TopicValidatorResult.Reject, severity: validationResult.severity };
1024
1155
  }
1025
1156
 
1026
1157
  if (validationResult.result === 'ignore') {
@@ -1046,16 +1177,16 @@ export class LibP2PService extends WithTracer implements P2PService {
1046
1177
  return { result: TopicValidatorResult.Ignore, obj: attestation };
1047
1178
  }
1048
1179
 
1049
- // Could not add (cap reached for signer), no need to re-broadcast
1180
+ // Could not add (cap reached for signer), penalize and do not re-broadcast
1050
1181
  if (!added) {
1051
- this.logger.warn(`Dropping checkpoint attestation due to cap`, {
1182
+ this.logger.warn(`Rejecting checkpoint attestation due to cap`, {
1052
1183
  slot: slot.toString(),
1053
1184
  archive: attestation.archive.toString(),
1054
1185
  source: peerId.toString(),
1055
1186
  attester: attestation.getSender()?.toString(),
1056
1187
  count,
1057
1188
  });
1058
- return { result: TopicValidatorResult.Ignore, obj: attestation };
1189
+ return { result: TopicValidatorResult.Reject, severity: PeerErrorSeverity.HighToleranceError };
1059
1190
  }
1060
1191
 
1061
1192
  // Check if this is a duplicate attestation (signer attested to a different proposal at the same slot)
@@ -1074,6 +1205,7 @@ export class LibP2PService extends WithTracer implements P2PService {
1074
1205
  }
1075
1206
 
1076
1207
  // Attestation was added successfully - accept it so other nodes can also detect the equivocation
1208
+ this.checkpointAttestationCallback?.(attestation);
1077
1209
  return { result: TopicValidatorResult.Accept, obj: attestation };
1078
1210
  }
1079
1211
 
@@ -1110,8 +1242,7 @@ export class LibP2PService extends WithTracer implements P2PService {
1110
1242
 
1111
1243
  if (validationResult.result === 'reject') {
1112
1244
  this.logger.warn(`Penalizing peer ${peerId} for block proposal validation failure`);
1113
- this.peerManager.penalizePeer(peerId, validationResult.severity);
1114
- return { result: TopicValidatorResult.Reject };
1245
+ return { result: TopicValidatorResult.Reject, severity: validationResult.severity };
1115
1246
  }
1116
1247
 
1117
1248
  if (validationResult.result === 'ignore') {
@@ -1135,7 +1266,6 @@ export class LibP2PService extends WithTracer implements P2PService {
1135
1266
 
1136
1267
  // Too many blocks received for this slot and index, penalize peer and do not re-broadcast
1137
1268
  if (!added) {
1138
- this.peerManager.penalizePeer(peerId, PeerErrorSeverity.HighToleranceError);
1139
1269
  this.logger.warn(`Penalizing peer for block proposal exceeding per-position cap`, {
1140
1270
  ...block.toBlockInfo(),
1141
1271
  indexWithinCheckpoint: block.indexWithinCheckpoint,
@@ -1143,7 +1273,11 @@ export class LibP2PService extends WithTracer implements P2PService {
1143
1273
  proposer: block.getSender()?.toString(),
1144
1274
  source: peerId.toString(),
1145
1275
  });
1146
- return { result: TopicValidatorResult.Reject, metadata: { isEquivocated } };
1276
+ return {
1277
+ result: TopicValidatorResult.Reject,
1278
+ metadata: { isEquivocated },
1279
+ severity: PeerErrorSeverity.HighToleranceError,
1280
+ };
1147
1281
  }
1148
1282
 
1149
1283
  // If this was a duplicate proposal, do not process it, but do invoke the duplicate callback,
@@ -1188,7 +1322,7 @@ export class LibP2PService extends WithTracer implements P2PService {
1188
1322
  // Note: Validators do NOT attest to individual blocks, only to checkpoint proposals.
1189
1323
  const isValid = await this.blockReceivedCallback(block, sender);
1190
1324
  if (!isValid) {
1191
- this.logger.warn(`Block proposal validation failed for block ${block.blockNumber}`, block.toBlockInfo());
1325
+ this.logger.info(`Block proposal validation failed for block ${block.blockNumber}`, block.toBlockInfo());
1192
1326
  }
1193
1327
  }
1194
1328
 
@@ -1208,17 +1342,33 @@ export class LibP2PService extends WithTracer implements P2PService {
1208
1342
  TopicType.checkpoint_proposal,
1209
1343
  );
1210
1344
 
1345
+ // Process checkpoint proposal if valid and not equivocated.
1346
+ const processCheckpointFn = () =>
1347
+ result === TopicValidatorResult.Accept && checkpoint && !isEquivocated
1348
+ ? this.processValidCheckpointProposal(checkpoint.toCore(), source)
1349
+ : Promise.resolve();
1350
+
1211
1351
  // If the checkpoint contained a valid last block, we process it even if the checkpoint itself is to be rejected
1212
1352
  // TODO(palla/mbps): Is this ok? Should we be considering a block from a checkpoint that was equivocated?
1213
- if (processBlock && checkpoint?.getBlockProposal()) {
1214
- await this.processValidBlockProposal(checkpoint.getBlockProposal()!, source);
1215
- }
1216
-
1217
- if (result !== TopicValidatorResult.Accept || !checkpoint || isEquivocated) {
1353
+ const processBlockFn = () =>
1354
+ processBlock && checkpoint && checkpoint.getBlockProposal()
1355
+ ? this.processValidBlockProposal(checkpoint.getBlockProposal()!, source)
1356
+ : Promise.resolve();
1357
+
1358
+ // A node that skips checkpoint validation attests without re-executing the embedded last block, so run
1359
+ // the checkpoint callback first: this creates and broadcasts the attestation before the block is
1360
+ // processed. Otherwise the block's re-execution — which can stall until the re-execution deadline
1361
+ // waiting for a parent that may never arrive — would delay the attestation past the slot's attestation
1362
+ // window, after which peers reject it as stale.
1363
+ if (this.config.skipCheckpointProposalValidation) {
1364
+ await processCheckpointFn();
1365
+ await processBlockFn();
1218
1366
  return;
1219
1367
  }
1220
1368
 
1221
- await this.processValidCheckpointProposal(checkpoint.toCore(), source);
1369
+ // Process the block first, since it's required for the checkpoint proposal validation.
1370
+ await processBlockFn();
1371
+ await processCheckpointFn();
1222
1372
  }
1223
1373
 
1224
1374
  /**
@@ -1236,8 +1386,7 @@ export class LibP2PService extends WithTracer implements P2PService {
1236
1386
 
1237
1387
  if (validationResult.result === 'reject') {
1238
1388
  this.logger.warn(`Penalizing peer ${peerId} for checkpoint proposal validation failure`);
1239
- this.peerManager.penalizePeer(peerId, validationResult.severity);
1240
- return { result: TopicValidatorResult.Reject };
1389
+ return { result: TopicValidatorResult.Reject, severity: validationResult.severity };
1241
1390
  }
1242
1391
 
1243
1392
  if (validationResult.result === 'ignore') {
@@ -1252,20 +1401,21 @@ export class LibP2PService extends WithTracer implements P2PService {
1252
1401
  [Attributes.SLOT_NUMBER]: checkpoint.slotNumber.toString(),
1253
1402
  [Attributes.P2P_ID]: peerId.toString(),
1254
1403
  });
1255
- const {
1256
- result,
1257
- obj,
1258
- metadata: { isEquivocated } = {},
1259
- } = await this.validateAndStoreBlockProposal(peerId, blockProposal);
1260
- if (result === TopicValidatorResult.Reject || !obj || isEquivocated) {
1404
+ const blockProposalResult = await this.validateAndStoreBlockProposal(peerId, blockProposal);
1405
+ const { obj, metadata: { isEquivocated } = {} } = blockProposalResult;
1406
+ if (blockProposalResult.result === TopicValidatorResult.Reject || !obj || isEquivocated) {
1261
1407
  this.logger.debug(`Rejecting checkpoint due to invalid last block proposal`, {
1262
1408
  [Attributes.SLOT_NUMBER]: checkpoint.slotNumber.toString(),
1263
1409
  [Attributes.P2P_ID]: peerId.toString(),
1264
1410
  isEquivocated,
1265
- result,
1411
+ result: blockProposalResult.result,
1266
1412
  });
1267
- return { result: TopicValidatorResult.Reject };
1268
- } else if (result === TopicValidatorResult.Accept && obj && !isEquivocated) {
1413
+ return {
1414
+ result: TopicValidatorResult.Reject,
1415
+ severity:
1416
+ 'severity' in blockProposalResult ? blockProposalResult.severity : PeerErrorSeverity.MidToleranceError,
1417
+ };
1418
+ } else if (blockProposalResult.result === TopicValidatorResult.Accept && obj && !isEquivocated) {
1269
1419
  processBlock = true;
1270
1420
  }
1271
1421
  }
@@ -1292,13 +1442,17 @@ export class LibP2PService extends WithTracer implements P2PService {
1292
1442
  // Too many checkpoint proposals received for this slot, penalize peer and do not re-broadcast
1293
1443
  // Note: We still return the checkpoint obj so the lastBlock can be processed if valid
1294
1444
  if (!added) {
1295
- this.peerManager.penalizePeer(peerId, PeerErrorSeverity.HighToleranceError);
1296
1445
  this.logger.warn(`Penalizing peer for checkpoint proposal exceeding per-slot cap`, {
1297
1446
  ...checkpoint.toCheckpointInfo(),
1298
1447
  count,
1299
1448
  source: peerId.toString(),
1300
1449
  });
1301
- return { result: TopicValidatorResult.Reject, obj: checkpoint, metadata: { isEquivocated, processBlock } };
1450
+ return {
1451
+ result: TopicValidatorResult.Reject,
1452
+ obj: checkpoint,
1453
+ metadata: { isEquivocated, processBlock },
1454
+ severity: PeerErrorSeverity.HighToleranceError,
1455
+ };
1302
1456
  }
1303
1457
 
1304
1458
  // If this was a duplicate proposal, do not process it, but do invoke the duplicate callback,
@@ -1343,9 +1497,11 @@ export class LibP2PService extends WithTracer implements P2PService {
1343
1497
  source: sender.toString(),
1344
1498
  });
1345
1499
 
1500
+ await this.allNodesCheckpointReceivedCallback(checkpoint, sender);
1501
+
1346
1502
  // Call the checkpoint received callback with the core version (without lastBlock)
1347
1503
  // to validate and potentially generate attestations
1348
- const attestations = await this.checkpointReceivedCallback(checkpoint, sender);
1504
+ const attestations = await this.validatorCheckpointReceivedCallback(checkpoint, sender);
1349
1505
  if (attestations && attestations.length > 0) {
1350
1506
  // If the callback returned attestations, add them to the pool and propagate them
1351
1507
  await this.mempools.attestationPool.addOwnCheckpointAttestations(attestations);
@@ -1368,23 +1524,32 @@ export class LibP2PService extends WithTracer implements P2PService {
1368
1524
  }
1369
1525
 
1370
1526
  /**
1371
- * Validate the requested block transactions. Allow partial returns.
1527
+ * Validate the requested block transactions request-response consistency.
1528
+ * It does NOT validate the transactions themselves.
1372
1529
  * @param request - The block transactions request.
1373
1530
  * @param response - The block transactions response.
1374
1531
  * @param peerId - The ID of the peer that made the request.
1375
- * @returns True if the requested block transactions are valid, false otherwise.
1532
+ * @returns True if the request-response is consistent, false otherwise.
1376
1533
  */
1377
- @trackSpan('Libp2pService.validateRequestedBlockTxs', request => ({
1534
+ @trackSpan('Libp2pService.validateRequestedBlockTxsConsistency', request => ({
1378
1535
  [Attributes.BLOCK_ARCHIVE]: request.archiveRoot.toString(),
1379
1536
  }))
1380
- protected async validateRequestedBlockTxs(
1537
+ protected async validateRequestedBlockTxsConsistency(
1381
1538
  request: BlockTxsRequest,
1382
1539
  response: BlockTxsResponse,
1383
1540
  peerId: PeerId,
1384
1541
  ): Promise<boolean> {
1385
- const requestedTxValidator = this.createRequestedTxValidator();
1386
-
1387
1542
  try {
1543
+ // A response with archiveRoot=Fr.zero is the documented "I don't have the block" signal from
1544
+ // reqRespBlockTxsHandler (block_txs_handler.ts:54-58): the peer lacked the block in its
1545
+ // attestation pool and archiver, but matched the requested hashes against its tx pool and
1546
+ // shipped what it found. This is legitimate behaviour, not misbehaviour — we just can't verify
1547
+ // membership/order without the block, so we drop the response without penalising the peer.
1548
+ if (response.archiveRoot.isZero()) {
1549
+ this.logger.debug(`Peer ${peerId.toString()} signalled missing block with Fr.zero archive root`);
1550
+ return false;
1551
+ }
1552
+
1388
1553
  if (!response.archiveRoot.equals(request.archiveRoot)) {
1389
1554
  this.peerManager.penalizePeer(peerId, PeerErrorSeverity.MidToleranceError);
1390
1555
  throw new ValidationError(
@@ -1417,18 +1582,26 @@ export class LibP2PService extends WithTracer implements P2PService {
1417
1582
  );
1418
1583
  }
1419
1584
 
1420
- // Given proposal (should have locally), ensure returned txs are valid subset and match request indices
1421
- const proposal = await this.mempools.attestationPool.getBlockProposal(request.archiveRoot.toString());
1422
- if (proposal) {
1585
+ // To verify membership/order of the returned txs we need the canonical tx hash list for the
1586
+ // block. Prefer the block proposal (held while a block is in flight), but fall back to the
1587
+ // archiver for blocks we only know as mined — e.g. a prover collecting txs to prove a block it
1588
+ // never received a proposal for. This mirrors the responder side (reqRespBlockTxsHandler),
1589
+ // which serves from proposal-or-archiver.
1590
+ const proposal = await this.mempools.attestationPool.getBlockProposalByArchive(request.archiveRoot.toString());
1591
+ const blockTxHashes =
1592
+ proposal?.txHashes ??
1593
+ (await this.archiver.getBlock({ archive: request.archiveRoot }))?.body.txEffects.map(e => e.txHash);
1594
+
1595
+ if (blockTxHashes) {
1423
1596
  // Build intersected indices
1424
1597
  const intersectIdx = request.txIndices.getTrueIndices().filter(i => response.txIndices.isSet(i));
1425
1598
 
1426
1599
  // Enforce subset membership and preserve increasing order by index.
1427
- const hashToIndexInProposal = new Map<string, number>(
1428
- proposal.txHashes.map((h, i) => [h.toString(), i] as [string, number]),
1600
+ const hashToIndexInBlock = new Map<string, number>(
1601
+ blockTxHashes.map((h, i) => [h.toString(), i] as [string, number]),
1429
1602
  );
1430
1603
  const allowedIndexSet = new Set(intersectIdx);
1431
- const indices = returnedHashes.map(h => hashToIndexInProposal.get(h));
1604
+ const indices = returnedHashes.map(h => hashToIndexInBlock.get(h));
1432
1605
  const allAllowed = indices.every(idx => idx !== undefined && allowedIndexSet.has(idx));
1433
1606
  const strictlyIncreasing = indices.every((idx, i) => (i === 0 ? idx !== undefined : idx! > indices[i - 1]!));
1434
1607
  if (!allAllowed || !strictlyIncreasing) {
@@ -1436,14 +1609,14 @@ export class LibP2PService extends WithTracer implements P2PService {
1436
1609
  throw new ValidationError('Returned txs do not match expected subset/order for requested indices');
1437
1610
  }
1438
1611
  } else {
1439
- // No local proposal, cannot check the membership/order of the returned txs
1612
+ // Neither a local proposal nor an archived block: we cannot verify membership/order of the
1613
+ // returned txs. This is a local-state gap, not a peer fault, so we do not penalize.
1440
1614
  this.logger.warn(
1441
- `Block proposal not found for archive root ${request.archiveRoot.toString()}; cannot validate membership/order of returned txs`,
1615
+ `Block ${request.archiveRoot.toString()} not found in attestation pool or archiver; cannot validate membership/order of returned txs`,
1442
1616
  );
1443
1617
  return false;
1444
1618
  }
1445
1619
 
1446
- await Promise.all(response.txs.map(tx => this.validateRequestedTx(tx, peerId, requestedTxValidator)));
1447
1620
  return true;
1448
1621
  } catch (e: any) {
1449
1622
  if (e instanceof ValidationError) {
@@ -1456,125 +1629,8 @@ export class LibP2PService extends WithTracer implements P2PService {
1456
1629
  }
1457
1630
  }
1458
1631
 
1459
- /**
1460
- * Validate a collection of txs that has been requested from a peer.
1461
- *
1462
- * The core component of this validator is that each tx hash MUST match the requested tx hash,
1463
- * In order to perform this check, the tx proof must be verified.
1464
- *
1465
- * Note: This function is called from within `ReqResp.sendRequest` as part of the
1466
- * ReqRespSubProtocol.TX subprotocol validation.
1467
- *
1468
- * @param requestedTxHash - The collection of the txs that was requested.
1469
- * @param responseTx - The collection of txs that was received as a response to the request.
1470
- * @param peerId - The peer ID of the peer that sent the tx.
1471
- * @returns True if the whole collection of txs is valid, false otherwise.
1472
- */
1473
- @trackSpan('Libp2pService.validateRequestedTx', (requestedTxHash, _responseTx) => ({
1474
- [Attributes.TX_HASH]: requestedTxHash.toString(),
1475
- }))
1476
- private async validateRequestedTxs(requestedTxHash: TxHash[], responseTx: Tx[], peerId: PeerId): Promise<boolean> {
1477
- const requested = new Set(requestedTxHash.map(h => h.toString()));
1478
- const requestedTxValidator = this.createRequestedTxValidator();
1479
-
1480
- //TODO: (mralj) - this is somewhat naive implementation, if single tx is invalid we consider the whole response invalid.
1481
- // I think we should still extract the valid txs and return them, so that we can still use the response.
1482
- try {
1483
- await Promise.all(responseTx.map(tx => this.validateRequestedTx(tx, peerId, requestedTxValidator, requested)));
1484
- return true;
1485
- } catch (e: any) {
1486
- if (e instanceof ValidationError) {
1487
- this.logger.warn(`Failed to validate requested txs from peer ${peerId.toString()}, reason ${e.message}`);
1488
- } else {
1489
- this.logger.error(`Error during validation of requested txs`, e);
1490
- }
1491
-
1492
- return false;
1493
- }
1494
- }
1495
-
1496
- /**
1497
- * Validates a BLOCK response.
1498
- *
1499
- * If a local copy exists, enforces hash equality. If missing, rejects (no penalty) since the hash cannot be verified.
1500
- * Penalizes on block number mismatch or hash mismatch.
1501
- *
1502
- * @param requestedBlockNumber - The requested block number.
1503
- * @param responseBlock - The block returned by the peer.
1504
- * @param peerId - The peer that returned the block.
1505
- * @returns True if the response is valid, false otherwise.
1506
- */
1507
- @trackSpan('Libp2pService.validateRequestedBlock', (requestedBlockNumber, _responseBlock) => ({
1508
- [Attributes.BLOCK_NUMBER]: requestedBlockNumber.toString(),
1509
- }))
1510
- protected async validateRequestedBlock(
1511
- requestedBlockNumber: Fr,
1512
- responseBlock: L2Block,
1513
- peerId: PeerId,
1514
- ): Promise<boolean> {
1515
- try {
1516
- const reqNum = Number(requestedBlockNumber.toString());
1517
- if (responseBlock.number !== reqNum) {
1518
- this.peerManager.penalizePeer(peerId, PeerErrorSeverity.LowToleranceError);
1519
- return false;
1520
- }
1521
-
1522
- const local = await this.archiver.getBlock(BlockNumber(reqNum));
1523
- if (!local) {
1524
- // We are missing the local block; we cannot verify the hash yet. Reject without penalizing.
1525
- // TODO: Consider extending this validator to accept an expected hash or
1526
- // performing quorum-based checks when using P2P syncing prior to L1 sync.
1527
- this.logger.warn(`Local block ${reqNum} not found; rejecting BLOCK response without hash verification`);
1528
- return false;
1529
- }
1530
- const [localHash, respHash] = await Promise.all([local.hash(), responseBlock.hash()]);
1531
- if (!localHash.equals(respHash)) {
1532
- this.peerManager.penalizePeer(peerId, PeerErrorSeverity.MidToleranceError);
1533
- return false;
1534
- }
1535
-
1536
- return true;
1537
- } catch (e) {
1538
- this.logger.warn(`Error validating requested block`, e);
1539
- return false;
1540
- }
1541
- }
1542
-
1543
- protected async validateRequestedTx(
1544
- tx: Tx,
1545
- peerId: PeerId,
1546
- txValidator: TxValidator,
1547
- requested?: Set<`0x${string}`>,
1548
- ) {
1549
- const penalize = (severity: PeerErrorSeverity) => this.peerManager.penalizePeer(peerId, severity);
1550
- if (requested && !requested.has(tx.getTxHash().toString())) {
1551
- penalize(PeerErrorSeverity.MidToleranceError);
1552
- throw new ValidationError(`Received tx with hash ${tx.getTxHash().toString()} that was not requested.`);
1553
- }
1554
-
1555
- const { result } = await txValidator.validateTx(tx);
1556
- if (result === 'invalid') {
1557
- penalize(PeerErrorSeverity.LowToleranceError);
1558
- throw new ValidationError(`Received tx with hash ${tx.getTxHash().toString()} that is invalid.`);
1559
- }
1560
- }
1561
-
1562
- protected createRequestedTxValidator(): TxValidator {
1563
- return createTxValidatorForReqResponseReceivedTxs(this.proofVerifier, {
1564
- l1ChainId: this.config.l1ChainId,
1565
- rollupVersion: this.config.rollupVersion,
1566
- });
1567
- }
1568
-
1569
- private async getGasFees(blockNumber: BlockNumber): Promise<GasFees> {
1570
- if (blockNumber === this.feesCache?.blockNumber) {
1571
- return this.feesCache.gasFees;
1572
- }
1573
-
1574
- const header = await this.archiver.getBlockHeader(blockNumber);
1575
- const gasFees = header?.globalVariables.gasFees ?? GasFees.empty();
1576
- this.feesCache = { blockNumber, gasFees };
1577
- return gasFees;
1632
+ private getGasFees(): Promise<GasFees> {
1633
+ return this.blockMinFeesProvider.getCurrentMinFees();
1578
1634
  }
1579
1635
 
1580
1636
  /**
@@ -1588,8 +1644,10 @@ export class LibP2PService extends WithTracer implements P2PService {
1588
1644
  l1ChainId: this.config.l1ChainId,
1589
1645
  rollupVersion: this.config.rollupVersion,
1590
1646
  proofVerifier: this.proofVerifier,
1647
+ txValidationCache: this.txValidationCache,
1591
1648
  },
1592
1649
  peerScoring: this.peerManager,
1650
+ validateRequestedBlockTxsConsistency: this.validateRequestedBlockTxsConsistency.bind(this),
1593
1651
  };
1594
1652
  }
1595
1653
 
@@ -1598,6 +1656,7 @@ export class LibP2PService extends WithTracer implements P2PService {
1598
1656
  this.proofVerifier,
1599
1657
  { l1ChainId: this.config.l1ChainId, rollupVersion: this.config.rollupVersion },
1600
1658
  this.logger.getBindings(),
1659
+ this.txValidationCache,
1601
1660
  );
1602
1661
 
1603
1662
  const results = await Promise.all(
@@ -1616,9 +1675,13 @@ export class LibP2PService extends WithTracer implements P2PService {
1616
1675
  currentBlockNumber: BlockNumber,
1617
1676
  nextSlotTimestamp: UInt64,
1618
1677
  ): Promise<Record<string, TransactionValidator>> {
1619
- const gasFees = await this.getGasFees(currentBlockNumber);
1620
- const allowedInSetup = this.config.txPublicSetupAllowList ?? (await getDefaultAllowedSetupFunctions());
1678
+ const gasFees = await this.getGasFees();
1679
+ const allowedInSetup = [
1680
+ ...(await getDefaultAllowedSetupFunctions()),
1681
+ ...(this.config.txPublicSetupAllowListExtend ?? []),
1682
+ ];
1621
1683
  const blockNumber = BlockNumber(currentBlockNumber + 1);
1684
+ const l1Constants = await this.archiver.getL1Constants();
1622
1685
 
1623
1686
  return createFirstStageTxValidationsForGossipedTransactions(
1624
1687
  nextSlotTimestamp,
@@ -1632,6 +1695,11 @@ export class LibP2PService extends WithTracer implements P2PService {
1632
1695
  !this.config.disableTransactions,
1633
1696
  allowedInSetup,
1634
1697
  this.logger.getBindings(),
1698
+ {
1699
+ rollupManaLimit: l1Constants.rollupManaLimit,
1700
+ maxBlockL2Gas: this.config.validateMaxL2BlockGas,
1701
+ maxBlockDAGas: this.config.validateMaxDABlockGas,
1702
+ },
1635
1703
  );
1636
1704
  }
1637
1705
 
@@ -1657,8 +1725,10 @@ export class LibP2PService extends WithTracer implements P2PService {
1657
1725
 
1658
1726
  // A promise that resolves when all validations have been run
1659
1727
  const allValidations = await Promise.all(validationPromises);
1660
- const failed = allValidations.find(x => !x.isValid);
1661
- if (failed) {
1728
+ const failures = allValidations.filter(x => !x.isValid);
1729
+ if (failures.length > 0) {
1730
+ // Pick the most severe failure (lowest tolerance = harshest penalty)
1731
+ const failed = maxBy(failures, f => PeerErrorSeverityByHarshness.indexOf(f.severity))!;
1662
1732
  return {
1663
1733
  allPassed: false,
1664
1734
  failure: {
@@ -1711,31 +1781,6 @@ export class LibP2PService extends WithTracer implements P2PService {
1711
1781
  return PeerErrorSeverity.HighToleranceError;
1712
1782
  }
1713
1783
 
1714
- /**
1715
- * Validate a checkpoint attestation.
1716
- *
1717
- * @param attestation - The checkpoint attestation to validate.
1718
- * @returns True if the checkpoint attestation is valid, false otherwise.
1719
- */
1720
- @trackSpan('Libp2pService.validateCheckpointAttestation', async (_, attestation) => ({
1721
- [Attributes.SLOT_NUMBER]: attestation.payload.header.slotNumber,
1722
- [Attributes.BLOCK_ARCHIVE]: attestation.archive.toString(),
1723
- [Attributes.P2P_ID]: await attestation.p2pMessageLoggingIdentifier().then(i => i.toString()),
1724
- }))
1725
- public async validateCheckpointAttestation(
1726
- peerId: PeerId,
1727
- attestation: CheckpointAttestation,
1728
- ): Promise<P2PValidationResult> {
1729
- const result = await this.checkpointAttestationValidator.validate(attestation);
1730
-
1731
- if (result.result === 'reject') {
1732
- this.logger.warn(`Penalizing peer ${peerId} for checkpoint attestation validation failure`);
1733
- this.peerManager.penalizePeer(peerId, result.severity);
1734
- }
1735
-
1736
- return result;
1737
- }
1738
-
1739
1784
  public getPeerScore(peerId: PeerId): number {
1740
1785
  return this.node.services.pubsub.score.score(peerId.toString());
1741
1786
  }