@aztec/p2p 0.0.1-commit.e2b2873ed → 0.0.1-commit.e304674f1

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 (407) hide show
  1. package/README.md +129 -3
  2. package/dest/client/factory.d.ts +7 -7
  3. package/dest/client/factory.d.ts.map +1 -1
  4. package/dest/client/factory.js +37 -30
  5. package/dest/client/interface.d.ts +22 -20
  6. package/dest/client/interface.d.ts.map +1 -1
  7. package/dest/client/p2p_client.d.ts +11 -19
  8. package/dest/client/p2p_client.d.ts.map +1 -1
  9. package/dest/client/p2p_client.js +83 -102
  10. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +20 -10
  11. package/dest/config.d.ts +43 -15
  12. package/dest/config.d.ts.map +1 -1
  13. package/dest/config.js +91 -37
  14. package/dest/errors/p2p-service.error.d.ts +9 -0
  15. package/dest/errors/p2p-service.error.d.ts.map +1 -0
  16. package/dest/errors/p2p-service.error.js +10 -0
  17. package/dest/errors/tx-pool.error.d.ts +8 -0
  18. package/dest/errors/tx-pool.error.d.ts.map +1 -0
  19. package/dest/errors/tx-pool.error.js +9 -0
  20. package/dest/index.d.ts +1 -2
  21. package/dest/index.d.ts.map +1 -1
  22. package/dest/index.js +0 -1
  23. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +7 -5
  24. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  25. package/dest/mem_pools/attestation_pool/attestation_pool.js +16 -6
  26. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +6 -6
  27. package/dest/mem_pools/attestation_pool/mocks.d.ts +2 -2
  28. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  29. package/dest/mem_pools/attestation_pool/mocks.js +2 -2
  30. package/dest/mem_pools/index.d.ts +1 -2
  31. package/dest/mem_pools/index.d.ts.map +1 -1
  32. package/dest/mem_pools/instrumentation.d.ts +4 -2
  33. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  34. package/dest/mem_pools/instrumentation.js +16 -14
  35. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +30 -13
  36. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -1
  37. package/dest/mem_pools/tx_pool_v2/deleted_pool.js +91 -20
  38. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts +3 -3
  39. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts.map +1 -1
  40. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.js +18 -9
  41. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +1 -1
  42. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -1
  43. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +7 -3
  44. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +3 -3
  45. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -1
  46. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +12 -4
  47. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +2 -2
  48. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -1
  49. package/dest/mem_pools/tx_pool_v2/eviction/index.js +1 -1
  50. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +54 -5
  51. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -1
  52. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.js +8 -0
  53. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +7 -5
  54. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +7 -5
  55. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +2 -2
  56. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -1
  57. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +14 -6
  58. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +4 -4
  59. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -1
  60. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +16 -4
  61. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +3 -3
  62. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -1
  63. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +3 -3
  64. package/dest/mem_pools/tx_pool_v2/index.d.ts +2 -2
  65. package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -1
  66. package/dest/mem_pools/tx_pool_v2/index.js +1 -1
  67. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts +15 -0
  68. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts.map +1 -0
  69. package/dest/mem_pools/tx_pool_v2/instrumentation.js +43 -0
  70. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +28 -10
  71. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
  72. package/dest/mem_pools/tx_pool_v2/interfaces.js +5 -1
  73. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +56 -15
  74. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
  75. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +112 -19
  76. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +12 -3
  77. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -1
  78. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +50 -45
  79. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +12 -5
  80. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -1
  81. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +17 -6
  82. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +14 -5
  83. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -1
  84. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +319 -147
  85. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +1 -1
  86. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  87. package/dest/msg_validators/attestation_validator/attestation_validator.js +5 -4
  88. package/dest/msg_validators/clock_tolerance.d.ts +1 -1
  89. package/dest/msg_validators/clock_tolerance.d.ts.map +1 -1
  90. package/dest/msg_validators/clock_tolerance.js +4 -3
  91. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +6 -4
  92. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
  93. package/dest/msg_validators/proposal_validator/block_proposal_validator.js +10 -2
  94. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +6 -4
  95. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
  96. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +16 -2
  97. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +13 -8
  98. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
  99. package/dest/msg_validators/proposal_validator/proposal_validator.js +53 -41
  100. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +2 -2
  101. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  102. package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +3 -3
  103. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +2 -1
  104. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -1
  105. package/dest/msg_validators/tx_validator/allowed_public_setup.js +24 -20
  106. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts +17 -0
  107. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts.map +1 -0
  108. package/dest/msg_validators/tx_validator/allowed_setup_helpers.js +24 -0
  109. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts +9 -0
  110. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts.map +1 -0
  111. package/dest/msg_validators/tx_validator/contract_instance_validator.js +48 -0
  112. package/dest/msg_validators/tx_validator/data_validator.d.ts +1 -1
  113. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  114. package/dest/msg_validators/tx_validator/data_validator.js +35 -2
  115. package/dest/msg_validators/tx_validator/factory.d.ts +133 -6
  116. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  117. package/dest/msg_validators/tx_validator/factory.js +247 -60
  118. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +1 -1
  119. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -1
  120. package/dest/msg_validators/tx_validator/fee_payer_balance.js +6 -2
  121. package/dest/msg_validators/tx_validator/gas_validator.d.ts +67 -3
  122. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  123. package/dest/msg_validators/tx_validator/gas_validator.js +112 -43
  124. package/dest/msg_validators/tx_validator/index.d.ts +3 -1
  125. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  126. package/dest/msg_validators/tx_validator/index.js +2 -0
  127. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +1 -1
  128. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  129. package/dest/msg_validators/tx_validator/metadata_validator.js +4 -4
  130. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts +14 -0
  131. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts.map +1 -0
  132. package/dest/msg_validators/tx_validator/nullifier_cache.js +24 -0
  133. package/dest/msg_validators/tx_validator/phases_validator.d.ts +22 -2
  134. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
  135. package/dest/msg_validators/tx_validator/phases_validator.js +72 -24
  136. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +2 -2
  137. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
  138. package/dest/msg_validators/tx_validator/timestamp_validator.js +6 -6
  139. package/dest/services/dummy_service.d.ts +7 -5
  140. package/dest/services/dummy_service.d.ts.map +1 -1
  141. package/dest/services/dummy_service.js +9 -5
  142. package/dest/services/encoding.d.ts +6 -2
  143. package/dest/services/encoding.d.ts.map +1 -1
  144. package/dest/services/encoding.js +16 -9
  145. package/dest/services/gossipsub/topic_score_params.d.ts +18 -6
  146. package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -1
  147. package/dest/services/gossipsub/topic_score_params.js +32 -10
  148. package/dest/services/libp2p/libp2p_service.d.ts +29 -36
  149. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  150. package/dest/services/libp2p/libp2p_service.js +213 -197
  151. package/dest/services/peer-manager/metrics.d.ts +3 -1
  152. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  153. package/dest/services/peer-manager/metrics.js +6 -0
  154. package/dest/services/peer-manager/peer_manager.d.ts +6 -2
  155. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  156. package/dest/services/peer-manager/peer_manager.js +24 -9
  157. package/dest/services/peer-manager/peer_scoring.d.ts +7 -2
  158. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  159. package/dest/services/peer-manager/peer_scoring.js +32 -10
  160. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +12 -8
  161. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -1
  162. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +83 -106
  163. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +4 -7
  164. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
  165. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +11 -13
  166. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -1
  167. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +31 -46
  168. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +19 -11
  169. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -1
  170. package/dest/services/reqresp/batch-tx-requester/peer_collection.js +52 -15
  171. package/dest/services/reqresp/batch-tx-requester/tx_validator.js +2 -2
  172. package/dest/services/reqresp/interface.d.ts +1 -9
  173. package/dest/services/reqresp/interface.d.ts.map +1 -1
  174. package/dest/services/reqresp/interface.js +0 -11
  175. package/dest/services/reqresp/metrics.d.ts +1 -1
  176. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  177. package/dest/services/reqresp/metrics.js +0 -1
  178. package/dest/services/reqresp/protocols/index.d.ts +1 -2
  179. package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
  180. package/dest/services/reqresp/protocols/index.js +0 -1
  181. package/dest/services/reqresp/protocols/tx.d.ts +1 -1
  182. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  183. package/dest/services/reqresp/protocols/tx.js +1 -3
  184. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +5 -4
  185. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
  186. package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -8
  187. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
  188. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
  189. package/dest/services/reqresp/rate-limiter/rate_limits.js +0 -10
  190. package/dest/services/reqresp/reqresp.d.ts +1 -1
  191. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  192. package/dest/services/reqresp/reqresp.js +20 -11
  193. package/dest/services/service.d.ts +9 -4
  194. package/dest/services/service.d.ts.map +1 -1
  195. package/dest/services/tx_collection/config.d.ts +13 -1
  196. package/dest/services/tx_collection/config.d.ts.map +1 -1
  197. package/dest/services/tx_collection/config.js +30 -0
  198. package/dest/services/tx_collection/fast_tx_collection.d.ts +1 -4
  199. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
  200. package/dest/services/tx_collection/fast_tx_collection.js +65 -75
  201. package/dest/services/tx_collection/file_store_tx_collection.d.ts +38 -29
  202. package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -1
  203. package/dest/services/tx_collection/file_store_tx_collection.js +126 -77
  204. package/dest/services/tx_collection/file_store_tx_source.d.ts +17 -6
  205. package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -1
  206. package/dest/services/tx_collection/file_store_tx_source.js +53 -10
  207. package/dest/services/tx_collection/instrumentation.d.ts +1 -1
  208. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
  209. package/dest/services/tx_collection/instrumentation.js +2 -1
  210. package/dest/services/tx_collection/proposal_tx_collector.d.ts +7 -7
  211. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -1
  212. package/dest/services/tx_collection/proposal_tx_collector.js +5 -4
  213. package/dest/services/tx_collection/request_tracker.d.ts +53 -0
  214. package/dest/services/tx_collection/request_tracker.d.ts.map +1 -0
  215. package/dest/services/tx_collection/request_tracker.js +84 -0
  216. package/dest/services/tx_collection/slow_tx_collection.d.ts +5 -3
  217. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -1
  218. package/dest/services/tx_collection/slow_tx_collection.js +17 -12
  219. package/dest/services/tx_collection/tx_collection.d.ts +9 -9
  220. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  221. package/dest/services/tx_collection/tx_collection.js +26 -10
  222. package/dest/services/tx_collection/tx_collection_sink.d.ts +6 -5
  223. package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -1
  224. package/dest/services/tx_collection/tx_collection_sink.js +13 -22
  225. package/dest/services/tx_collection/tx_source.d.ts +13 -7
  226. package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
  227. package/dest/services/tx_collection/tx_source.js +26 -7
  228. package/dest/services/tx_file_store/tx_file_store.d.ts +3 -2
  229. package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -1
  230. package/dest/services/tx_file_store/tx_file_store.js +9 -6
  231. package/dest/services/tx_provider.d.ts +3 -3
  232. package/dest/services/tx_provider.d.ts.map +1 -1
  233. package/dest/services/tx_provider.js +4 -4
  234. package/dest/test-helpers/make-test-p2p-clients.d.ts +5 -6
  235. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  236. package/dest/test-helpers/make-test-p2p-clients.js +1 -2
  237. package/dest/test-helpers/mock-pubsub.d.ts +4 -4
  238. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  239. package/dest/test-helpers/mock-pubsub.js +8 -2
  240. package/dest/test-helpers/reqresp-nodes.d.ts +2 -3
  241. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  242. package/dest/test-helpers/reqresp-nodes.js +2 -4
  243. package/dest/test-helpers/testbench-utils.d.ts +8 -3
  244. package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
  245. package/dest/test-helpers/testbench-utils.js +30 -4
  246. package/dest/testbench/p2p_client_testbench_worker.d.ts +2 -2
  247. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  248. package/dest/testbench/p2p_client_testbench_worker.js +78 -26
  249. package/dest/testbench/worker_client_manager.d.ts +10 -1
  250. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  251. package/dest/testbench/worker_client_manager.js +55 -3
  252. package/dest/util.d.ts +3 -3
  253. package/dest/util.d.ts.map +1 -1
  254. package/package.json +14 -14
  255. package/src/client/factory.ts +68 -48
  256. package/src/client/interface.ts +26 -21
  257. package/src/client/p2p_client.ts +91 -132
  258. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +33 -14
  259. package/src/config.ts +133 -43
  260. package/src/errors/p2p-service.error.ts +11 -0
  261. package/src/errors/tx-pool.error.ts +12 -0
  262. package/src/index.ts +0 -1
  263. package/src/mem_pools/attestation_pool/attestation_pool.ts +20 -9
  264. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +6 -6
  265. package/src/mem_pools/attestation_pool/mocks.ts +2 -1
  266. package/src/mem_pools/index.ts +0 -3
  267. package/src/mem_pools/instrumentation.ts +17 -13
  268. package/src/mem_pools/tx_pool_v2/README.md +52 -28
  269. package/src/mem_pools/tx_pool_v2/deleted_pool.ts +109 -22
  270. package/src/mem_pools/tx_pool_v2/eviction/eviction_manager.ts +21 -8
  271. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +7 -3
  272. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +18 -4
  273. package/src/mem_pools/tx_pool_v2/eviction/index.ts +4 -0
  274. package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +59 -4
  275. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +5 -5
  276. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +5 -5
  277. package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +14 -9
  278. package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +33 -6
  279. package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +4 -3
  280. package/src/mem_pools/tx_pool_v2/index.ts +1 -1
  281. package/src/mem_pools/tx_pool_v2/instrumentation.ts +69 -0
  282. package/src/mem_pools/tx_pool_v2/interfaces.ts +30 -10
  283. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +163 -27
  284. package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +58 -45
  285. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +34 -8
  286. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +353 -143
  287. package/src/msg_validators/attestation_validator/README.md +49 -0
  288. package/src/msg_validators/attestation_validator/attestation_validator.ts +5 -4
  289. package/src/msg_validators/clock_tolerance.ts +4 -3
  290. package/src/msg_validators/proposal_validator/README.md +123 -0
  291. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +14 -4
  292. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +20 -7
  293. package/src/msg_validators/proposal_validator/proposal_validator.ts +69 -45
  294. package/src/msg_validators/tx_validator/README.md +119 -0
  295. package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +3 -3
  296. package/src/msg_validators/tx_validator/allowed_public_setup.ts +22 -27
  297. package/src/msg_validators/tx_validator/allowed_setup_helpers.ts +31 -0
  298. package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
  299. package/src/msg_validators/tx_validator/data_validator.ts +42 -1
  300. package/src/msg_validators/tx_validator/factory.ts +394 -78
  301. package/src/msg_validators/tx_validator/fee_payer_balance.ts +6 -2
  302. package/src/msg_validators/tx_validator/gas_validator.ts +145 -33
  303. package/src/msg_validators/tx_validator/index.ts +2 -0
  304. package/src/msg_validators/tx_validator/metadata_validator.ts +12 -4
  305. package/src/msg_validators/tx_validator/nullifier_cache.ts +30 -0
  306. package/src/msg_validators/tx_validator/phases_validator.ts +82 -27
  307. package/src/msg_validators/tx_validator/timestamp_validator.ts +7 -7
  308. package/src/services/dummy_service.ts +12 -7
  309. package/src/services/encoding.ts +16 -8
  310. package/src/services/gossipsub/README.md +29 -14
  311. package/src/services/gossipsub/topic_score_params.ts +49 -13
  312. package/src/services/libp2p/libp2p_service.ts +228 -223
  313. package/src/services/peer-manager/metrics.ts +7 -0
  314. package/src/services/peer-manager/peer_manager.ts +28 -9
  315. package/src/services/peer-manager/peer_scoring.ts +27 -5
  316. package/src/services/reqresp/README.md +229 -0
  317. package/src/services/reqresp/batch-tx-requester/README.md +46 -7
  318. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +79 -112
  319. package/src/services/reqresp/batch-tx-requester/interface.ts +3 -6
  320. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +30 -71
  321. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +68 -24
  322. package/src/services/reqresp/batch-tx-requester/tx_validator.ts +2 -2
  323. package/src/services/reqresp/interface.ts +0 -11
  324. package/src/services/reqresp/metrics.ts +0 -1
  325. package/src/services/reqresp/protocols/index.ts +0 -1
  326. package/src/services/reqresp/protocols/tx.ts +1 -3
  327. package/src/services/reqresp/rate-limiter/rate_limiter.ts +13 -9
  328. package/src/services/reqresp/rate-limiter/rate_limits.ts +0 -10
  329. package/src/services/reqresp/reqresp.ts +23 -13
  330. package/src/services/service.ts +17 -3
  331. package/src/services/tx_collection/config.ts +42 -0
  332. package/src/services/tx_collection/fast_tx_collection.ts +71 -76
  333. package/src/services/tx_collection/file_store_tx_collection.ts +143 -93
  334. package/src/services/tx_collection/file_store_tx_source.ts +69 -10
  335. package/src/services/tx_collection/instrumentation.ts +7 -1
  336. package/src/services/tx_collection/proposal_tx_collector.ts +9 -13
  337. package/src/services/tx_collection/request_tracker.ts +127 -0
  338. package/src/services/tx_collection/slow_tx_collection.ts +17 -13
  339. package/src/services/tx_collection/tx_collection.ts +46 -17
  340. package/src/services/tx_collection/tx_collection_sink.ts +15 -29
  341. package/src/services/tx_collection/tx_source.ts +28 -8
  342. package/src/services/tx_file_store/tx_file_store.ts +6 -4
  343. package/src/services/tx_provider.ts +2 -2
  344. package/src/test-helpers/make-test-p2p-clients.ts +1 -3
  345. package/src/test-helpers/mock-pubsub.ts +13 -6
  346. package/src/test-helpers/reqresp-nodes.ts +3 -8
  347. package/src/test-helpers/testbench-utils.ts +41 -6
  348. package/src/testbench/p2p_client_testbench_worker.ts +89 -29
  349. package/src/testbench/worker_client_manager.ts +68 -6
  350. package/src/util.ts +8 -2
  351. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +0 -125
  352. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +0 -1
  353. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +0 -596
  354. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +0 -32
  355. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +0 -1
  356. package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +0 -112
  357. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +0 -157
  358. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +0 -1
  359. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +0 -52
  360. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +0 -16
  361. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +0 -1
  362. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +0 -122
  363. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +0 -17
  364. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +0 -1
  365. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +0 -84
  366. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +0 -19
  367. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +0 -1
  368. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +0 -78
  369. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +0 -26
  370. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +0 -1
  371. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +0 -84
  372. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +0 -25
  373. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +0 -1
  374. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +0 -57
  375. package/dest/mem_pools/tx_pool/index.d.ts +0 -3
  376. package/dest/mem_pools/tx_pool/index.d.ts.map +0 -1
  377. package/dest/mem_pools/tx_pool/index.js +0 -2
  378. package/dest/mem_pools/tx_pool/priority.d.ts +0 -12
  379. package/dest/mem_pools/tx_pool/priority.d.ts.map +0 -1
  380. package/dest/mem_pools/tx_pool/priority.js +0 -15
  381. package/dest/mem_pools/tx_pool/tx_pool.d.ts +0 -127
  382. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +0 -1
  383. package/dest/mem_pools/tx_pool/tx_pool.js +0 -3
  384. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +0 -7
  385. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +0 -1
  386. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +0 -400
  387. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +0 -23
  388. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +0 -1
  389. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +0 -212
  390. package/dest/services/reqresp/protocols/block.d.ts +0 -9
  391. package/dest/services/reqresp/protocols/block.d.ts.map +0 -1
  392. package/dest/services/reqresp/protocols/block.js +0 -32
  393. package/src/mem_pools/tx_pool/README.md +0 -270
  394. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -746
  395. package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +0 -132
  396. package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +0 -208
  397. package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +0 -162
  398. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +0 -104
  399. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +0 -93
  400. package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +0 -106
  401. package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +0 -75
  402. package/src/mem_pools/tx_pool/index.ts +0 -2
  403. package/src/mem_pools/tx_pool/priority.ts +0 -20
  404. package/src/mem_pools/tx_pool/tx_pool.ts +0 -141
  405. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +0 -319
  406. package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +0 -230
  407. package/src/services/reqresp/protocols/block.ts +0 -37
@@ -1,12 +1,12 @@
1
1
  import type { EpochCacheInterface } from '@aztec/epoch-cache';
2
2
  import { BlockNumber, type SlotNumber } from '@aztec/foundation/branded-types';
3
- import { Fr } from '@aztec/foundation/curves/bn254';
3
+ import { maxBy } from '@aztec/foundation/collection';
4
4
  import { type Logger, createLibp2pComponentLogger, createLogger } from '@aztec/foundation/log';
5
5
  import { RunningPromise } from '@aztec/foundation/running-promise';
6
6
  import { Timer } from '@aztec/foundation/timer';
7
7
  import type { AztecAsyncKVStore } from '@aztec/kv-store';
8
8
  import { protocolContractsHash } from '@aztec/protocol-contracts';
9
- import type { EthAddress, L2Block, L2BlockSource } from '@aztec/stdlib/block';
9
+ import type { EthAddress, L2BlockSource } from '@aztec/stdlib/block';
10
10
  import type { ContractDataSource } from '@aztec/stdlib/contract';
11
11
  import { GasFees } from '@aztec/stdlib/gas';
12
12
  import type { ClientProtocolCircuitVerifier, PeerInfo, WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
@@ -16,13 +16,12 @@ import {
16
16
  CheckpointProposal,
17
17
  type CheckpointProposalCore,
18
18
  type Gossipable,
19
- P2PClientType,
20
19
  P2PMessage,
21
- type ValidationResult as P2PValidationResult,
22
20
  PeerErrorSeverity,
21
+ PeerErrorSeverityByHarshness,
23
22
  TopicType,
24
23
  createTopicString,
25
- getTopicsForClientAndConfig,
24
+ getTopicsForConfig,
26
25
  metricsTopicStrToLabels,
27
26
  } from '@aztec/stdlib/p2p';
28
27
  import { MerkleTreeId } from '@aztec/stdlib/trees';
@@ -58,6 +57,7 @@ import { ENR } from '@nethermindeth/enr';
58
57
  import { createLibp2p } from 'libp2p';
59
58
 
60
59
  import type { P2PConfig } from '../../config.js';
60
+ import { CheckpointProposalReceivedCallbackNotRegisteredError } from '../../errors/p2p-service.error.js';
61
61
  import type { MemPools } from '../../mem_pools/interface.js';
62
62
  import {
63
63
  BlockProposalValidator,
@@ -69,9 +69,11 @@ import {
69
69
  } from '../../msg_validators/index.js';
70
70
  import { MessageSeenValidator } from '../../msg_validators/msg_seen_validator/msg_seen_validator.js';
71
71
  import {
72
- type MessageValidator,
73
- createTxMessageValidators,
74
- createTxReqRespValidator,
72
+ type TransactionValidator,
73
+ createFirstStageTxValidationsForGossipedTransactions,
74
+ createSecondStageTxValidationsForGossipedTransactions,
75
+ createTxValidatorForBlockProposalReceivedTxs,
76
+ createTxValidatorForReqResponseReceivedTxs,
75
77
  } from '../../msg_validators/tx_validator/factory.js';
76
78
  import { GossipSubEvent } from '../../types/index.js';
77
79
  import { type PubSubLibp2p, convertToMultiaddr } from '../../util.js';
@@ -87,6 +89,9 @@ import { PeerScoring } from '../peer-manager/peer_scoring.js';
87
89
  import type { BatchTxRequesterLibP2PService } from '../reqresp/batch-tx-requester/interface.js';
88
90
  import type { P2PReqRespConfig } from '../reqresp/config.js';
89
91
  import {
92
+ AuthRequest,
93
+ BlockTxsRequest,
94
+ BlockTxsResponse,
90
95
  DEFAULT_SUB_PROTOCOL_VALIDATORS,
91
96
  type ReqRespInterface,
92
97
  type ReqRespResponse,
@@ -94,17 +99,11 @@ import {
94
99
  type ReqRespSubProtocolHandler,
95
100
  type ReqRespSubProtocolHandlers,
96
101
  type ReqRespSubProtocolValidators,
102
+ StatusMessage,
97
103
  type SubProtocolMap,
98
104
  ValidationError,
99
- } from '../reqresp/index.js';
100
- import {
101
- AuthRequest,
102
- BlockTxsRequest,
103
- BlockTxsResponse,
104
- StatusMessage,
105
105
  pingHandler,
106
106
  reqGoodbyeHandler,
107
- reqRespBlockHandler,
108
107
  reqRespBlockTxsHandler,
109
108
  reqRespStatusHandler,
110
109
  reqRespTxHandler,
@@ -130,12 +129,12 @@ type ValidationOutcome = { allPassed: true } | { allPassed: false; failure: Vali
130
129
  // REFACTOR: Unify with the type above
131
130
  type ReceivedMessageValidationResult<T, M = undefined> =
132
131
  | { obj: T; result: Exclude<TopicValidatorResult, TopicValidatorResult.Reject>; metadata?: M }
133
- | { obj?: T; result: TopicValidatorResult.Reject; metadata?: M };
132
+ | { obj?: T; result: TopicValidatorResult.Reject; metadata?: M; severity: PeerErrorSeverity };
134
133
 
135
134
  /**
136
135
  * Lib P2P implementation of the P2PService interface.
137
136
  */
138
- export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends WithTracer implements P2PService {
137
+ export class LibP2PService extends WithTracer implements P2PService {
139
138
  private discoveryRunningPromise?: RunningPromise;
140
139
  private msgIdSeenValidators: Record<TopicType, MessageSeenValidator> = {} as Record<TopicType, MessageSeenValidator>;
141
140
 
@@ -171,7 +170,13 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
171
170
  * @param checkpoint - The checkpoint proposal received from the peer.
172
171
  * @returns The attestations for the checkpoint, if any.
173
172
  */
174
- 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;
175
180
 
176
181
  private gossipSubEventHandler: (e: CustomEvent<GossipsubMessage>) => void;
177
182
 
@@ -182,7 +187,6 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
182
187
  protected logger: Logger;
183
188
 
184
189
  constructor(
185
- private clientType: T,
186
190
  private config: P2PConfig,
187
191
  protected node: PubSubLibp2p,
188
192
  private peerDiscoveryService: PeerDiscoveryService,
@@ -224,10 +228,12 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
224
228
  this.protocolVersion,
225
229
  );
226
230
 
227
- this.blockProposalValidator = new BlockProposalValidator(epochCache, { txsPermitted: !config.disableTransactions });
228
- this.checkpointProposalValidator = new CheckpointProposalValidator(epochCache, {
231
+ const proposalValidatorOpts = {
229
232
  txsPermitted: !config.disableTransactions,
230
- });
233
+ maxTxsPerBlock: config.validateMaxTxsPerBlock ?? config.validateMaxTxsPerCheckpoint,
234
+ };
235
+ this.blockProposalValidator = new BlockProposalValidator(epochCache, proposalValidatorOpts);
236
+ this.checkpointProposalValidator = new CheckpointProposalValidator(epochCache, proposalValidatorOpts);
231
237
  this.checkpointAttestationValidator = config.fishermanMode
232
238
  ? new FishermanAttestationValidator(epochCache, mempools.attestationPool, telemetry)
233
239
  : new CheckpointAttestationValidator(epochCache);
@@ -235,19 +241,22 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
235
241
  this.gossipSubEventHandler = this.handleGossipSubEvent.bind(this);
236
242
 
237
243
  this.blockReceivedCallback = async (block: BlockProposal): Promise<boolean> => {
238
- this.logger.debug(
239
- `Handler not yet registered: Block received callback not set. Received block for slot ${block.slotNumber} from peer.`,
244
+ this.logger.warn(
245
+ `Handler for block received not yet registered on P2P service. Received block ${block.blockNumber} for slot ${block.slotNumber} from peer.`,
240
246
  { p2pMessageIdentifier: await block.p2pMessageLoggingIdentifier() },
241
247
  );
242
- return false;
248
+ return true;
243
249
  };
244
250
 
245
- this.checkpointReceivedCallback = (
246
- checkpoint: CheckpointProposalCore,
251
+ this.allNodesCheckpointReceivedCallback = (
252
+ _checkpoint: CheckpointProposalCore,
253
+ ): Promise<CheckpointAttestation[] | undefined> => {
254
+ throw new CheckpointProposalReceivedCallbackNotRegisteredError();
255
+ };
256
+
257
+ this.validatorCheckpointReceivedCallback = (
258
+ _checkpoint: CheckpointProposalCore,
247
259
  ): Promise<CheckpointAttestation[] | undefined> => {
248
- this.logger.debug(
249
- `Handler not yet registered: Checkpoint received callback not set. Received checkpoint for slot ${checkpoint.slotNumber} from peer.`,
250
- );
251
260
  return Promise.resolve(undefined);
252
261
  };
253
262
  }
@@ -262,8 +271,7 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
262
271
  * @param txPool - The transaction pool to be accessed by the service.
263
272
  * @returns The new service.
264
273
  */
265
- public static async new<T extends P2PClientType>(
266
- clientType: T,
274
+ public static async new(
267
275
  config: P2PConfig,
268
276
  peerId: PeerId,
269
277
  deps: {
@@ -341,6 +349,7 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
341
349
  heartbeatIntervalMs: config.gossipsubInterval,
342
350
  targetCommitteeSize: l1Constants.targetCommitteeSize,
343
351
  blockDurationMs: config.blockDurationMs,
352
+ expectedBlockProposalsPerSlot: config.expectedBlockProposalsPerSlot,
344
353
  });
345
354
 
346
355
  const node = await createLibp2p({
@@ -474,7 +483,6 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
474
483
  peerManager.shouldDisableP2PGossip(peerId) ? -Infinity : peerManager.getPeerScore(peerId);
475
484
 
476
485
  return new LibP2PService(
477
- clientType,
478
486
  config,
479
487
  node,
480
488
  peerDiscoveryService,
@@ -510,14 +518,12 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
510
518
  // Create request response protocol handlers
511
519
  const txHandler = reqRespTxHandler(this.mempools);
512
520
  const goodbyeHandler = reqGoodbyeHandler(this.peerManager);
513
- const blockHandler = reqRespBlockHandler(this.archiver);
514
521
  const statusHandler = reqRespStatusHandler(this.protocolVersion, this.worldStateSynchronizer, this.logger);
515
522
 
516
523
  const requestResponseHandlers: Partial<ReqRespSubProtocolHandlers> = {
517
524
  [ReqRespSubProtocol.PING]: pingHandler,
518
525
  [ReqRespSubProtocol.STATUS]: statusHandler.bind(this),
519
526
  [ReqRespSubProtocol.GOODBYE]: goodbyeHandler.bind(this),
520
- [ReqRespSubProtocol.BLOCK]: blockHandler.bind(this),
521
527
  };
522
528
 
523
529
  if (!this.config.disableTransactions) {
@@ -538,7 +544,6 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
538
544
  ...DEFAULT_SUB_PROTOCOL_VALIDATORS,
539
545
  [ReqRespSubProtocol.TX]: this.validateRequestedTxs.bind(this),
540
546
  [ReqRespSubProtocol.BLOCK_TXS]: this.validateRequestedBlockTxs.bind(this),
541
- [ReqRespSubProtocol.BLOCK]: this.validateRequestedBlock.bind(this),
542
547
  };
543
548
 
544
549
  await this.peerManager.initializePeers();
@@ -548,7 +553,7 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
548
553
  await this.node.start();
549
554
 
550
555
  // Subscribe to standard GossipSub topics by default
551
- for (const topic of getTopicsForClientAndConfig(this.clientType, this.config.disableTransactions)) {
556
+ for (const topic of getTopicsForConfig(this.config.disableTransactions)) {
552
557
  this.subscribeToTopic(this.topicStrings[topic]);
553
558
  }
554
559
 
@@ -614,6 +619,10 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
614
619
  return this.peerManager.getPeers(includePending);
615
620
  }
616
621
 
622
+ public getGossipMeshPeerCount(topicType: TopicType): number {
623
+ return this.node.services.pubsub.getMeshPeers(this.topicStrings[topicType]).length;
624
+ }
625
+
617
626
  private handleGossipSubEvent(e: CustomEvent<GossipsubMessage>) {
618
627
  this.logger.trace(`Received PUBSUB message.`);
619
628
 
@@ -662,8 +671,16 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
662
671
  this.blockReceivedCallback = callback;
663
672
  }
664
673
 
665
- public registerCheckpointReceivedCallback(callback: P2PCheckpointReceivedCallback) {
666
- this.checkpointReceivedCallback = callback;
674
+ public registerValidatorCheckpointReceivedCallback(callback: P2PCheckpointReceivedCallback) {
675
+ this.validatorCheckpointReceivedCallback = callback;
676
+ }
677
+
678
+ public registerAllNodesCheckpointReceivedCallback(callback: P2PCheckpointReceivedCallback) {
679
+ this.allNodesCheckpointReceivedCallback = callback;
680
+ }
681
+
682
+ public async notifyOwnCheckpointProposal(checkpoint: CheckpointProposalCore): Promise<void> {
683
+ await this.allNodesCheckpointReceivedCallback(checkpoint, this.node.peerId);
667
684
  }
668
685
 
669
686
  /**
@@ -749,6 +766,9 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
749
766
  if (!validator || !validator.addMessage(msgId)) {
750
767
  this.instrumentation.incMessagePrevalidationStatus(false, topicType);
751
768
  this.node.services.pubsub.reportMessageValidationResult(msgId, source.toString(), TopicValidatorResult.Ignore);
769
+ if (topicType === TopicType.tx) {
770
+ this.logger.verbose(`Ignoring already-seen tx gossip message`, { msgId, source: source.toString() });
771
+ }
752
772
  return { result: false, topicType };
753
773
  }
754
774
 
@@ -813,9 +833,7 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
813
833
  if (msg.topic === this.topicStrings[TopicType.tx]) {
814
834
  await this.handleGossipedTx(p2pMessage.payload, msgId, source);
815
835
  } else if (msg.topic === this.topicStrings[TopicType.checkpoint_attestation]) {
816
- if (this.clientType === P2PClientType.Full) {
817
- await this.processCheckpointAttestationFromPeer(p2pMessage.payload, msgId, source);
818
- }
836
+ await this.processCheckpointAttestationFromPeer(p2pMessage.payload, msgId, source);
819
837
  } else if (msg.topic === this.topicStrings[TopicType.block_proposal]) {
820
838
  await this.processBlockFromPeer(p2pMessage.payload, msgId, source);
821
839
  } else if (msg.topic === this.topicStrings[TopicType.checkpoint_proposal]) {
@@ -877,47 +895,113 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
877
895
  source: PeerId,
878
896
  topicType: TopicType,
879
897
  ): Promise<ReceivedMessageValidationResult<T, M>> {
880
- let resultAndObj: ReceivedMessageValidationResult<T, M> = { result: TopicValidatorResult.Reject };
898
+ // Default to reject result with a penalty if validation function throws an error
899
+ let resultAndObj: ReceivedMessageValidationResult<T, M> = {
900
+ result: TopicValidatorResult.Reject,
901
+ severity: PeerErrorSeverity.MidToleranceError,
902
+ };
881
903
  const timer = new Timer();
882
904
  try {
883
905
  resultAndObj = await validationFunc();
884
906
  } catch (err) {
885
- this.peerManager.penalizePeer(source, PeerErrorSeverity.LowToleranceError);
886
- this.logger.error(`Error deserializing and validating gossipsub message`, err, {
887
- msgId,
888
- source: source.toString(),
889
- topicType,
890
- });
907
+ this.logger.error(`Error validating gossipsub message`, err, { msgId, source: source.toString(), topicType });
891
908
  }
892
909
 
893
910
  if (resultAndObj.result === TopicValidatorResult.Accept) {
911
+ this.logger.debug(`Message ${topicType} accepted by validator`, { msgId, source: source.toString(), topicType });
894
912
  this.instrumentation.recordMessageValidation(topicType, timer);
913
+ } else if (resultAndObj.result === TopicValidatorResult.Reject) {
914
+ this.logger.warn(`Message ${topicType} rejected by validator with severity ${resultAndObj.severity}`, {
915
+ msgId,
916
+ source: source.toString(),
917
+ topicType,
918
+ severity: resultAndObj.severity,
919
+ });
920
+ this.peerManager.penalizePeer(source, resultAndObj.severity);
921
+ } else {
922
+ this.logger.trace(`Message ${topicType} ignored by validator`, { msgId, source: source.toString(), topicType });
895
923
  }
896
924
 
897
925
  this.node.services.pubsub.reportMessageValidationResult(msgId, source.toString(), resultAndObj.result);
898
926
  return resultAndObj;
899
927
  }
900
928
 
929
+ private tryDeserialize<T>(deserializeFunc: () => T, msgId: string, source: PeerId): T | undefined {
930
+ try {
931
+ return deserializeFunc();
932
+ } catch (err) {
933
+ this.logger.warn(`Failed to deserialize gossipsub message from buffer`, {
934
+ err,
935
+ msgId,
936
+ source: source.toString(),
937
+ });
938
+ return undefined;
939
+ }
940
+ }
941
+
901
942
  protected async handleGossipedTx(payloadData: Buffer, msgId: string, source: PeerId) {
902
943
  const validationFunc: () => Promise<ReceivedMessageValidationResult<Tx>> = async () => {
903
- const tx = Tx.fromBuffer(payloadData);
904
- const isValid = await this.validatePropagatedTx(tx, source);
905
- if (!isValid) {
906
- this.logger.trace(`Rejecting invalid propagated tx`, {
907
- [Attributes.P2P_ID]: source.toString(),
944
+ const tx = this.tryDeserialize(() => Tx.fromBuffer(payloadData), msgId, source);
945
+ if (!tx) {
946
+ return { result: TopicValidatorResult.Reject, severity: PeerErrorSeverity.LowToleranceError };
947
+ }
948
+
949
+ const currentBlockNumber = await this.archiver.getBlockNumber();
950
+ const { ts: nextSlotTimestamp } = this.epochCache.getEpochAndSlotInNextL1Slot();
951
+
952
+ // Stage 1: fast validators (metadata, data, timestamps, double-spend, gas, phases, block header)
953
+ const firstStageValidators = await this.createFirstStageMessageValidators(currentBlockNumber, nextSlotTimestamp);
954
+ const firstStageOutcome = await this.runValidations(tx, firstStageValidators);
955
+ if (!firstStageOutcome.allPassed) {
956
+ const { name } = firstStageOutcome.failure;
957
+ let { severity } = firstStageOutcome.failure;
958
+
959
+ // Double spend validator has a special case handler. We perform more detailed examination
960
+ // as to how recently the nullifier was entered into the tree and if the transaction should
961
+ // have 'known' the nullifier existed. This determines the severity of the penalty applied to the peer.
962
+ if (name === 'doubleSpendValidator') {
963
+ const txBlockNumber = BlockNumber(currentBlockNumber + 1);
964
+ severity = await this.handleDoubleSpendFailure(tx, txBlockNumber);
965
+ }
966
+
967
+ this.logger.verbose(`Rejecting gossiped tx ${tx.getTxHash().toString()}: stage 1 validation failed`, {
968
+ validator: name,
969
+ severity,
970
+ source: source.toString(),
908
971
  });
909
- return { result: TopicValidatorResult.Reject };
972
+ return { result: TopicValidatorResult.Reject, severity };
910
973
  }
911
974
 
912
- // Propagate only on pool acceptance
975
+ // Pool pre-check: see if the pool would accept this tx before doing expensive proof verification
976
+ const canAdd = await this.mempools.txPool.canAddPendingTx(tx);
977
+ if (canAdd === 'ignored') {
978
+ this.logger.verbose(`Ignoring gossiped tx ${tx.getTxHash().toString()}: pool pre-check returned ignored`, {
979
+ source: source.toString(),
980
+ });
981
+ return { result: TopicValidatorResult.Ignore, obj: tx };
982
+ }
983
+
984
+ // Stage 2: expensive proof verification
985
+ const secondStageValidators = this.createSecondStageMessageValidators();
986
+ const secondStageOutcome = await this.runValidations(tx, secondStageValidators);
987
+ if (!secondStageOutcome.allPassed) {
988
+ const { severity, name } = secondStageOutcome.failure;
989
+ this.logger.verbose(`Rejecting gossiped tx ${tx.getTxHash().toString()}: stage 2 validation failed`, {
990
+ validator: name,
991
+ severity,
992
+ source: source.toString(),
993
+ });
994
+ return { result: TopicValidatorResult.Reject, severity };
995
+ }
996
+
997
+ // Pool add: persist the tx
913
998
  const txHash = tx.getTxHash();
914
999
  const addResult = await this.mempools.txPool.addPendingTxs([tx], { source: 'gossip' });
915
1000
 
916
1001
  const wasAccepted = addResult.accepted.some(h => h.equals(txHash));
917
1002
  const wasIgnored = addResult.ignored.some(h => h.equals(txHash));
918
1003
 
919
- this.logger.trace(`Validate propagated tx`, {
920
- isValid,
1004
+ this.logger.verbose(`Validate propagated tx ${txHash.toString()}`, {
921
1005
  wasAccepted,
922
1006
  wasIgnored,
923
1007
  [Attributes.P2P_ID]: source.toString(),
@@ -928,7 +1012,11 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
928
1012
  } else if (wasIgnored) {
929
1013
  return { result: TopicValidatorResult.Ignore, obj: tx };
930
1014
  } else {
931
- return { result: TopicValidatorResult.Reject };
1015
+ this.logger.warn(`Gossiped tx ${txHash.toString()} unexpectedly rejected by pool`, {
1016
+ source: source.toString(),
1017
+ txHash: txHash.toString(),
1018
+ });
1019
+ return { result: TopicValidatorResult.Reject, severity: PeerErrorSeverity.HighToleranceError };
932
1020
  }
933
1021
  };
934
1022
 
@@ -958,7 +1046,16 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
958
1046
  source: PeerId,
959
1047
  ): Promise<void> {
960
1048
  const { result, obj: attestation } = await this.validateReceivedMessage<CheckpointAttestation>(
961
- () => this.validateAndStoreCheckpointAttestation(source, CheckpointAttestation.fromBuffer(payloadData)),
1049
+ () => {
1050
+ const attestation = this.tryDeserialize(() => CheckpointAttestation.fromBuffer(payloadData), msgId, source);
1051
+ if (!attestation) {
1052
+ return Promise.resolve({
1053
+ result: TopicValidatorResult.Reject,
1054
+ severity: PeerErrorSeverity.LowToleranceError,
1055
+ });
1056
+ }
1057
+ return this.validateAndStoreCheckpointAttestation(source, attestation);
1058
+ },
962
1059
  msgId,
963
1060
  source,
964
1061
  TopicType.checkpoint_attestation,
@@ -991,8 +1088,7 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
991
1088
 
992
1089
  if (validationResult.result === 'reject') {
993
1090
  this.logger.warn(`Penalizing peer ${peerId} for checkpoint attestation validation failure`);
994
- this.peerManager.penalizePeer(peerId, validationResult.severity);
995
- return { result: TopicValidatorResult.Reject };
1091
+ return { result: TopicValidatorResult.Reject, severity: validationResult.severity };
996
1092
  }
997
1093
 
998
1094
  if (validationResult.result === 'ignore') {
@@ -1018,16 +1114,16 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
1018
1114
  return { result: TopicValidatorResult.Ignore, obj: attestation };
1019
1115
  }
1020
1116
 
1021
- // Could not add (cap reached for signer), no need to re-broadcast
1117
+ // Could not add (cap reached for signer), penalize and do not re-broadcast
1022
1118
  if (!added) {
1023
- this.logger.warn(`Dropping checkpoint attestation due to cap`, {
1119
+ this.logger.warn(`Rejecting checkpoint attestation due to cap`, {
1024
1120
  slot: slot.toString(),
1025
1121
  archive: attestation.archive.toString(),
1026
1122
  source: peerId.toString(),
1027
1123
  attester: attestation.getSender()?.toString(),
1028
1124
  count,
1029
1125
  });
1030
- return { result: TopicValidatorResult.Ignore, obj: attestation };
1126
+ return { result: TopicValidatorResult.Reject, severity: PeerErrorSeverity.HighToleranceError };
1031
1127
  }
1032
1128
 
1033
1129
  // Check if this is a duplicate attestation (signer attested to a different proposal at the same slot)
@@ -1082,8 +1178,7 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
1082
1178
 
1083
1179
  if (validationResult.result === 'reject') {
1084
1180
  this.logger.warn(`Penalizing peer ${peerId} for block proposal validation failure`);
1085
- this.peerManager.penalizePeer(peerId, validationResult.severity);
1086
- return { result: TopicValidatorResult.Reject };
1181
+ return { result: TopicValidatorResult.Reject, severity: validationResult.severity };
1087
1182
  }
1088
1183
 
1089
1184
  if (validationResult.result === 'ignore') {
@@ -1107,7 +1202,6 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
1107
1202
 
1108
1203
  // Too many blocks received for this slot and index, penalize peer and do not re-broadcast
1109
1204
  if (!added) {
1110
- this.peerManager.penalizePeer(peerId, PeerErrorSeverity.HighToleranceError);
1111
1205
  this.logger.warn(`Penalizing peer for block proposal exceeding per-position cap`, {
1112
1206
  ...block.toBlockInfo(),
1113
1207
  indexWithinCheckpoint: block.indexWithinCheckpoint,
@@ -1115,7 +1209,11 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
1115
1209
  proposer: block.getSender()?.toString(),
1116
1210
  source: peerId.toString(),
1117
1211
  });
1118
- return { result: TopicValidatorResult.Reject, metadata: { isEquivocated } };
1212
+ return {
1213
+ result: TopicValidatorResult.Reject,
1214
+ metadata: { isEquivocated },
1215
+ severity: PeerErrorSeverity.HighToleranceError,
1216
+ };
1119
1217
  }
1120
1218
 
1121
1219
  // If this was a duplicate proposal, do not process it, but do invoke the duplicate callback,
@@ -1160,7 +1258,7 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
1160
1258
  // Note: Validators do NOT attest to individual blocks, only to checkpoint proposals.
1161
1259
  const isValid = await this.blockReceivedCallback(block, sender);
1162
1260
  if (!isValid) {
1163
- this.logger.warn(`Block proposal validation failed for block ${block.blockNumber}`, block.toBlockInfo());
1261
+ this.logger.info(`Block proposal validation failed for block ${block.blockNumber}`, block.toBlockInfo());
1164
1262
  }
1165
1263
  }
1166
1264
 
@@ -1208,8 +1306,7 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
1208
1306
 
1209
1307
  if (validationResult.result === 'reject') {
1210
1308
  this.logger.warn(`Penalizing peer ${peerId} for checkpoint proposal validation failure`);
1211
- this.peerManager.penalizePeer(peerId, validationResult.severity);
1212
- return { result: TopicValidatorResult.Reject };
1309
+ return { result: TopicValidatorResult.Reject, severity: validationResult.severity };
1213
1310
  }
1214
1311
 
1215
1312
  if (validationResult.result === 'ignore') {
@@ -1224,20 +1321,21 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
1224
1321
  [Attributes.SLOT_NUMBER]: checkpoint.slotNumber.toString(),
1225
1322
  [Attributes.P2P_ID]: peerId.toString(),
1226
1323
  });
1227
- const {
1228
- result,
1229
- obj,
1230
- metadata: { isEquivocated } = {},
1231
- } = await this.validateAndStoreBlockProposal(peerId, blockProposal);
1232
- if (result === TopicValidatorResult.Reject || !obj || isEquivocated) {
1324
+ const blockProposalResult = await this.validateAndStoreBlockProposal(peerId, blockProposal);
1325
+ const { obj, metadata: { isEquivocated } = {} } = blockProposalResult;
1326
+ if (blockProposalResult.result === TopicValidatorResult.Reject || !obj || isEquivocated) {
1233
1327
  this.logger.debug(`Rejecting checkpoint due to invalid last block proposal`, {
1234
1328
  [Attributes.SLOT_NUMBER]: checkpoint.slotNumber.toString(),
1235
1329
  [Attributes.P2P_ID]: peerId.toString(),
1236
1330
  isEquivocated,
1237
- result,
1331
+ result: blockProposalResult.result,
1238
1332
  });
1239
- return { result: TopicValidatorResult.Reject };
1240
- } else if (result === TopicValidatorResult.Accept && obj && !isEquivocated) {
1333
+ return {
1334
+ result: TopicValidatorResult.Reject,
1335
+ severity:
1336
+ 'severity' in blockProposalResult ? blockProposalResult.severity : PeerErrorSeverity.MidToleranceError,
1337
+ };
1338
+ } else if (blockProposalResult.result === TopicValidatorResult.Accept && obj && !isEquivocated) {
1241
1339
  processBlock = true;
1242
1340
  }
1243
1341
  }
@@ -1264,13 +1362,17 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
1264
1362
  // Too many checkpoint proposals received for this slot, penalize peer and do not re-broadcast
1265
1363
  // Note: We still return the checkpoint obj so the lastBlock can be processed if valid
1266
1364
  if (!added) {
1267
- this.peerManager.penalizePeer(peerId, PeerErrorSeverity.HighToleranceError);
1268
1365
  this.logger.warn(`Penalizing peer for checkpoint proposal exceeding per-slot cap`, {
1269
1366
  ...checkpoint.toCheckpointInfo(),
1270
1367
  count,
1271
1368
  source: peerId.toString(),
1272
1369
  });
1273
- return { result: TopicValidatorResult.Reject, obj: checkpoint, metadata: { isEquivocated, processBlock } };
1370
+ return {
1371
+ result: TopicValidatorResult.Reject,
1372
+ obj: checkpoint,
1373
+ metadata: { isEquivocated, processBlock },
1374
+ severity: PeerErrorSeverity.HighToleranceError,
1375
+ };
1274
1376
  }
1275
1377
 
1276
1378
  // If this was a duplicate proposal, do not process it, but do invoke the duplicate callback,
@@ -1315,9 +1417,11 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
1315
1417
  source: sender.toString(),
1316
1418
  });
1317
1419
 
1420
+ await this.allNodesCheckpointReceivedCallback(checkpoint, sender);
1421
+
1318
1422
  // Call the checkpoint received callback with the core version (without lastBlock)
1319
1423
  // to validate and potentially generate attestations
1320
- const attestations = await this.checkpointReceivedCallback(checkpoint, sender);
1424
+ const attestations = await this.validatorCheckpointReceivedCallback(checkpoint, sender);
1321
1425
  if (attestations && attestations.length > 0) {
1322
1426
  // If the callback returned attestations, add them to the pool and propagate them
1323
1427
  await this.mempools.attestationPool.addOwnCheckpointAttestations(attestations);
@@ -1465,53 +1569,6 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
1465
1569
  }
1466
1570
  }
1467
1571
 
1468
- /**
1469
- * Validates a BLOCK response.
1470
- *
1471
- * If a local copy exists, enforces hash equality. If missing, rejects (no penalty) since the hash cannot be verified.
1472
- * Penalizes on block number mismatch or hash mismatch.
1473
- *
1474
- * @param requestedBlockNumber - The requested block number.
1475
- * @param responseBlock - The block returned by the peer.
1476
- * @param peerId - The peer that returned the block.
1477
- * @returns True if the response is valid, false otherwise.
1478
- */
1479
- @trackSpan('Libp2pService.validateRequestedBlock', (requestedBlockNumber, _responseBlock) => ({
1480
- [Attributes.BLOCK_NUMBER]: requestedBlockNumber.toString(),
1481
- }))
1482
- protected async validateRequestedBlock(
1483
- requestedBlockNumber: Fr,
1484
- responseBlock: L2Block,
1485
- peerId: PeerId,
1486
- ): Promise<boolean> {
1487
- try {
1488
- const reqNum = Number(requestedBlockNumber.toString());
1489
- if (responseBlock.number !== reqNum) {
1490
- this.peerManager.penalizePeer(peerId, PeerErrorSeverity.LowToleranceError);
1491
- return false;
1492
- }
1493
-
1494
- const local = await this.archiver.getBlock(BlockNumber(reqNum));
1495
- if (!local) {
1496
- // We are missing the local block; we cannot verify the hash yet. Reject without penalizing.
1497
- // TODO: Consider extending this validator to accept an expected hash or
1498
- // performing quorum-based checks when using P2P syncing prior to L1 sync.
1499
- this.logger.warn(`Local block ${reqNum} not found; rejecting BLOCK response without hash verification`);
1500
- return false;
1501
- }
1502
- const [localHash, respHash] = await Promise.all([local.hash(), responseBlock.hash()]);
1503
- if (!localHash.equals(respHash)) {
1504
- this.peerManager.penalizePeer(peerId, PeerErrorSeverity.MidToleranceError);
1505
- return false;
1506
- }
1507
-
1508
- return true;
1509
- } catch (e) {
1510
- this.logger.warn(`Error validating requested block`, e);
1511
- return false;
1512
- }
1513
- }
1514
-
1515
1572
  protected async validateRequestedTx(
1516
1573
  tx: Tx,
1517
1574
  peerId: PeerId,
@@ -1532,43 +1589,12 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
1532
1589
  }
1533
1590
 
1534
1591
  protected createRequestedTxValidator(): TxValidator {
1535
- return createTxReqRespValidator(this.proofVerifier, {
1592
+ return createTxValidatorForReqResponseReceivedTxs(this.proofVerifier, {
1536
1593
  l1ChainId: this.config.l1ChainId,
1537
1594
  rollupVersion: this.config.rollupVersion,
1538
1595
  });
1539
1596
  }
1540
1597
 
1541
- @trackSpan('Libp2pService.validatePropagatedTx', tx => ({
1542
- [Attributes.TX_HASH]: tx.getTxHash().toString(),
1543
- }))
1544
- protected async validatePropagatedTx(tx: Tx, peerId: PeerId): Promise<boolean> {
1545
- const currentBlockNumber = await this.archiver.getBlockNumber();
1546
-
1547
- // We accept transactions if they are not expired by the next slot (checked based on the IncludeByTimestamp field)
1548
- const { ts: nextSlotTimestamp } = this.epochCache.getEpochAndSlotInNextL1Slot();
1549
- const messageValidators = await this.createMessageValidators(currentBlockNumber, nextSlotTimestamp);
1550
-
1551
- for (const validator of messageValidators) {
1552
- const outcome = await this.runValidations(tx, validator);
1553
-
1554
- if (outcome.allPassed) {
1555
- continue;
1556
- }
1557
- const { name } = outcome.failure;
1558
- let { severity } = outcome.failure;
1559
-
1560
- // Double spend validator has a special case handler
1561
- if (name === 'doubleSpendValidator') {
1562
- const txBlockNumber = BlockNumber(currentBlockNumber + 1); // tx is expected to be in the next block
1563
- severity = await this.handleDoubleSpendFailure(tx, txBlockNumber);
1564
- }
1565
-
1566
- this.peerManager.penalizePeer(peerId, severity);
1567
- return false;
1568
- }
1569
- return true;
1570
- }
1571
-
1572
1598
  private async getGasFees(blockNumber: BlockNumber): Promise<GasFees> {
1573
1599
  if (blockNumber === this.feesCache?.blockNumber) {
1574
1600
  return this.feesCache.gasFees;
@@ -1596,60 +1622,62 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
1596
1622
  };
1597
1623
  }
1598
1624
 
1599
- public async validate(txs: Tx[]): Promise<void> {
1600
- const currentBlockNumber = await this.archiver.getBlockNumber();
1601
-
1602
- // We accept transactions if they are not expired by the next slot (checked based on the IncludeByTimestamp field)
1603
- const { ts: nextSlotTimestamp } = this.epochCache.getEpochAndSlotInNextL1Slot();
1604
- const messageValidators = await this.createMessageValidators(currentBlockNumber, nextSlotTimestamp);
1625
+ public async validateTxsReceivedInBlockProposal(txs: Tx[]): Promise<void> {
1626
+ const validator = createTxValidatorForBlockProposalReceivedTxs(
1627
+ this.proofVerifier,
1628
+ { l1ChainId: this.config.l1ChainId, rollupVersion: this.config.rollupVersion },
1629
+ this.logger.getBindings(),
1630
+ );
1605
1631
 
1606
- await Promise.all(
1632
+ const results = await Promise.all(
1607
1633
  txs.map(async tx => {
1608
- for (const validator of messageValidators) {
1609
- const outcome = await this.runValidations(tx, validator);
1610
- if (!outcome.allPassed) {
1611
- throw new Error('Invalid tx detected', { cause: { outcome } });
1612
- }
1613
- }
1634
+ const result = await validator.validateTx(tx);
1635
+ return result.result !== 'invalid';
1614
1636
  }),
1615
1637
  );
1638
+ if (results.some(value => value === false)) {
1639
+ throw new Error('Invalid tx detected');
1640
+ }
1616
1641
  }
1617
1642
 
1618
- /**
1619
- * Create message validators for the given block number and timestamp.
1620
- *
1621
- * Each validator is a pair of a validator and a severity.
1622
- * If a validator fails, the peer is penalized with the severity of the validator.
1623
- *
1624
- * @param currentBlockNumber - The current synced block number.
1625
- * @param nextSlotTimestamp - The timestamp of the next slot (used to validate txs are not expired).
1626
- * @returns The message validators.
1627
- */
1628
- private async createMessageValidators(
1643
+ /** Creates the first stage (fast) validators for gossiped transactions. */
1644
+ protected async createFirstStageMessageValidators(
1629
1645
  currentBlockNumber: BlockNumber,
1630
1646
  nextSlotTimestamp: UInt64,
1631
- ): Promise<Record<string, MessageValidator>[]> {
1647
+ ): Promise<Record<string, TransactionValidator>> {
1632
1648
  const gasFees = await this.getGasFees(currentBlockNumber);
1633
- const allowedInSetup = this.config.txPublicSetupAllowList ?? (await getDefaultAllowedSetupFunctions());
1634
-
1635
- const blockNumberInWhichTheTxIsConsideredToBeIncluded = BlockNumber(currentBlockNumber + 1);
1636
-
1637
- return createTxMessageValidators(
1649
+ const allowedInSetup = [
1650
+ ...(await getDefaultAllowedSetupFunctions()),
1651
+ ...(this.config.txPublicSetupAllowListExtend ?? []),
1652
+ ];
1653
+ const blockNumber = BlockNumber(currentBlockNumber + 1);
1654
+ const l1Constants = await this.archiver.getL1Constants();
1655
+
1656
+ return createFirstStageTxValidationsForGossipedTransactions(
1638
1657
  nextSlotTimestamp,
1639
- blockNumberInWhichTheTxIsConsideredToBeIncluded,
1658
+ blockNumber,
1640
1659
  this.worldStateSynchronizer,
1641
1660
  gasFees,
1642
1661
  this.config.l1ChainId,
1643
1662
  this.config.rollupVersion,
1644
1663
  protocolContractsHash,
1645
1664
  this.archiver,
1646
- this.proofVerifier,
1647
1665
  !this.config.disableTransactions,
1648
1666
  allowedInSetup,
1649
1667
  this.logger.getBindings(),
1668
+ {
1669
+ rollupManaLimit: l1Constants.rollupManaLimit,
1670
+ maxBlockL2Gas: this.config.validateMaxL2BlockGas,
1671
+ maxBlockDAGas: this.config.validateMaxDABlockGas,
1672
+ },
1650
1673
  );
1651
1674
  }
1652
1675
 
1676
+ /** Creates the second stage (expensive proof verification) validators for gossiped transactions. */
1677
+ protected createSecondStageMessageValidators(): Record<string, TransactionValidator> {
1678
+ return createSecondStageTxValidationsForGossipedTransactions(this.proofVerifier, this.logger.getBindings());
1679
+ }
1680
+
1653
1681
  /**
1654
1682
  * Run validations on a tx.
1655
1683
  * @param tx - The tx to validate.
@@ -1658,7 +1686,7 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
1658
1686
  */
1659
1687
  private async runValidations(
1660
1688
  tx: Tx,
1661
- messageValidators: Record<string, MessageValidator>,
1689
+ messageValidators: Record<string, TransactionValidator>,
1662
1690
  ): Promise<ValidationOutcome> {
1663
1691
  const validationPromises = Object.entries(messageValidators).map(async ([name, { validator, severity }]) => {
1664
1692
  const { result } = await validator.validateTx(tx);
@@ -1667,8 +1695,10 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
1667
1695
 
1668
1696
  // A promise that resolves when all validations have been run
1669
1697
  const allValidations = await Promise.all(validationPromises);
1670
- const failed = allValidations.find(x => !x.isValid);
1671
- if (failed) {
1698
+ const failures = allValidations.filter(x => !x.isValid);
1699
+ if (failures.length > 0) {
1700
+ // Pick the most severe failure (lowest tolerance = harshest penalty)
1701
+ const failed = maxBy(failures, f => PeerErrorSeverityByHarshness.indexOf(f.severity))!;
1672
1702
  return {
1673
1703
  allPassed: false,
1674
1704
  failure: {
@@ -1721,31 +1751,6 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
1721
1751
  return PeerErrorSeverity.HighToleranceError;
1722
1752
  }
1723
1753
 
1724
- /**
1725
- * Validate a checkpoint attestation.
1726
- *
1727
- * @param attestation - The checkpoint attestation to validate.
1728
- * @returns True if the checkpoint attestation is valid, false otherwise.
1729
- */
1730
- @trackSpan('Libp2pService.validateCheckpointAttestation', async (_, attestation) => ({
1731
- [Attributes.SLOT_NUMBER]: attestation.payload.header.slotNumber,
1732
- [Attributes.BLOCK_ARCHIVE]: attestation.archive.toString(),
1733
- [Attributes.P2P_ID]: await attestation.p2pMessageLoggingIdentifier().then(i => i.toString()),
1734
- }))
1735
- public async validateCheckpointAttestation(
1736
- peerId: PeerId,
1737
- attestation: CheckpointAttestation,
1738
- ): Promise<P2PValidationResult> {
1739
- const result = await this.checkpointAttestationValidator.validate(attestation);
1740
-
1741
- if (result.result === 'reject') {
1742
- this.logger.warn(`Penalizing peer ${peerId} for checkpoint attestation validation failure`);
1743
- this.peerManager.penalizePeer(peerId, result.severity);
1744
- }
1745
-
1746
- return result;
1747
- }
1748
-
1749
1754
  public getPeerScore(peerId: PeerId): number {
1750
1755
  return this.node.services.pubsub.score.score(peerId.toString());
1751
1756
  }