@aztec/p2p 0.0.1-commit.3d8f95d → 0.0.1-commit.3fd054f6

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 (330) 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 +35 -29
  5. package/dest/client/interface.d.ts +14 -19
  6. package/dest/client/interface.d.ts.map +1 -1
  7. package/dest/client/p2p_client.d.ts +9 -18
  8. package/dest/client/p2p_client.d.ts.map +1 -1
  9. package/dest/client/p2p_client.js +68 -100
  10. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +6 -7
  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/tx-pool.error.d.ts +8 -0
  15. package/dest/errors/tx-pool.error.d.ts.map +1 -0
  16. package/dest/errors/tx-pool.error.js +9 -0
  17. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +7 -5
  18. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  19. package/dest/mem_pools/attestation_pool/attestation_pool.js +13 -4
  20. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +6 -6
  21. package/dest/mem_pools/attestation_pool/mocks.d.ts +2 -2
  22. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  23. package/dest/mem_pools/attestation_pool/mocks.js +2 -2
  24. package/dest/mem_pools/instrumentation.d.ts +4 -2
  25. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  26. package/dest/mem_pools/instrumentation.js +16 -14
  27. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +1 -1
  28. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -1
  29. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +2 -1
  30. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +3 -3
  31. package/dest/mem_pools/tx_pool/priority.d.ts +2 -2
  32. package/dest/mem_pools/tx_pool/priority.d.ts.map +1 -1
  33. package/dest/mem_pools/tx_pool/priority.js +4 -4
  34. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +1 -1
  35. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +1 -1
  36. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +3 -1
  37. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +30 -13
  38. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -1
  39. package/dest/mem_pools/tx_pool_v2/deleted_pool.js +91 -20
  40. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts +3 -3
  41. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts.map +1 -1
  42. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.js +18 -9
  43. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +1 -1
  44. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -1
  45. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +7 -3
  46. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +3 -3
  47. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -1
  48. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +12 -4
  49. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +2 -2
  50. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -1
  51. package/dest/mem_pools/tx_pool_v2/eviction/index.js +1 -1
  52. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +54 -5
  53. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -1
  54. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.js +8 -0
  55. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +7 -5
  56. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +7 -5
  57. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +2 -2
  58. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -1
  59. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +14 -6
  60. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +4 -4
  61. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -1
  62. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +16 -4
  63. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +3 -3
  64. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -1
  65. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +3 -3
  66. package/dest/mem_pools/tx_pool_v2/index.d.ts +2 -2
  67. package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -1
  68. package/dest/mem_pools/tx_pool_v2/index.js +1 -1
  69. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts +15 -0
  70. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts.map +1 -0
  71. package/dest/mem_pools/tx_pool_v2/instrumentation.js +43 -0
  72. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +28 -10
  73. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
  74. package/dest/mem_pools/tx_pool_v2/interfaces.js +5 -1
  75. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +56 -15
  76. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
  77. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +107 -18
  78. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +12 -3
  79. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -1
  80. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +50 -45
  81. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +12 -5
  82. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -1
  83. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +17 -6
  84. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +14 -5
  85. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -1
  86. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +319 -147
  87. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +1 -1
  88. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  89. package/dest/msg_validators/attestation_validator/attestation_validator.js +5 -4
  90. package/dest/msg_validators/clock_tolerance.d.ts +1 -1
  91. package/dest/msg_validators/clock_tolerance.d.ts.map +1 -1
  92. package/dest/msg_validators/clock_tolerance.js +4 -3
  93. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +6 -4
  94. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
  95. package/dest/msg_validators/proposal_validator/block_proposal_validator.js +10 -2
  96. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +6 -4
  97. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
  98. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +16 -2
  99. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +13 -8
  100. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
  101. package/dest/msg_validators/proposal_validator/proposal_validator.js +53 -41
  102. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +2 -2
  103. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  104. package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +3 -3
  105. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +2 -1
  106. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -1
  107. package/dest/msg_validators/tx_validator/allowed_public_setup.js +24 -20
  108. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts +17 -0
  109. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts.map +1 -0
  110. package/dest/msg_validators/tx_validator/allowed_setup_helpers.js +24 -0
  111. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts +9 -0
  112. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts.map +1 -0
  113. package/dest/msg_validators/tx_validator/contract_instance_validator.js +48 -0
  114. package/dest/msg_validators/tx_validator/data_validator.d.ts +1 -1
  115. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  116. package/dest/msg_validators/tx_validator/data_validator.js +35 -2
  117. package/dest/msg_validators/tx_validator/factory.d.ts +133 -6
  118. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  119. package/dest/msg_validators/tx_validator/factory.js +247 -60
  120. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +1 -1
  121. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -1
  122. package/dest/msg_validators/tx_validator/fee_payer_balance.js +6 -2
  123. package/dest/msg_validators/tx_validator/gas_validator.d.ts +67 -3
  124. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  125. package/dest/msg_validators/tx_validator/gas_validator.js +104 -37
  126. package/dest/msg_validators/tx_validator/index.d.ts +3 -1
  127. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  128. package/dest/msg_validators/tx_validator/index.js +2 -0
  129. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +1 -1
  130. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  131. package/dest/msg_validators/tx_validator/metadata_validator.js +4 -4
  132. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts +14 -0
  133. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts.map +1 -0
  134. package/dest/msg_validators/tx_validator/nullifier_cache.js +24 -0
  135. package/dest/msg_validators/tx_validator/phases_validator.d.ts +22 -2
  136. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
  137. package/dest/msg_validators/tx_validator/phases_validator.js +72 -24
  138. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +2 -2
  139. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
  140. package/dest/msg_validators/tx_validator/timestamp_validator.js +6 -6
  141. package/dest/services/dummy_service.d.ts +4 -4
  142. package/dest/services/dummy_service.d.ts.map +1 -1
  143. package/dest/services/dummy_service.js +4 -4
  144. package/dest/services/encoding.d.ts +6 -2
  145. package/dest/services/encoding.d.ts.map +1 -1
  146. package/dest/services/encoding.js +16 -9
  147. package/dest/services/gossipsub/topic_score_params.d.ts +18 -6
  148. package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -1
  149. package/dest/services/gossipsub/topic_score_params.js +32 -10
  150. package/dest/services/libp2p/libp2p_service.d.ts +18 -20
  151. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  152. package/dest/services/libp2p/libp2p_service.js +190 -140
  153. package/dest/services/peer-manager/metrics.d.ts +3 -1
  154. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  155. package/dest/services/peer-manager/metrics.js +6 -0
  156. package/dest/services/peer-manager/peer_manager.d.ts +1 -1
  157. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  158. package/dest/services/peer-manager/peer_manager.js +6 -3
  159. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +12 -8
  160. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -1
  161. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +83 -106
  162. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +4 -7
  163. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
  164. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +11 -13
  165. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -1
  166. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +31 -46
  167. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +19 -11
  168. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -1
  169. package/dest/services/reqresp/batch-tx-requester/peer_collection.js +52 -15
  170. package/dest/services/reqresp/batch-tx-requester/tx_validator.js +2 -2
  171. package/dest/services/reqresp/reqresp.d.ts +1 -1
  172. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  173. package/dest/services/reqresp/reqresp.js +19 -10
  174. package/dest/services/service.d.ts +5 -3
  175. package/dest/services/service.d.ts.map +1 -1
  176. package/dest/services/tx_collection/config.d.ts +13 -1
  177. package/dest/services/tx_collection/config.d.ts.map +1 -1
  178. package/dest/services/tx_collection/config.js +30 -0
  179. package/dest/services/tx_collection/fast_tx_collection.d.ts +1 -4
  180. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
  181. package/dest/services/tx_collection/fast_tx_collection.js +65 -75
  182. package/dest/services/tx_collection/file_store_tx_collection.d.ts +38 -29
  183. package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -1
  184. package/dest/services/tx_collection/file_store_tx_collection.js +126 -77
  185. package/dest/services/tx_collection/file_store_tx_source.d.ts +16 -6
  186. package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -1
  187. package/dest/services/tx_collection/file_store_tx_source.js +49 -16
  188. package/dest/services/tx_collection/instrumentation.d.ts +1 -1
  189. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
  190. package/dest/services/tx_collection/instrumentation.js +2 -1
  191. package/dest/services/tx_collection/proposal_tx_collector.d.ts +7 -7
  192. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -1
  193. package/dest/services/tx_collection/proposal_tx_collector.js +5 -4
  194. package/dest/services/tx_collection/request_tracker.d.ts +53 -0
  195. package/dest/services/tx_collection/request_tracker.d.ts.map +1 -0
  196. package/dest/services/tx_collection/request_tracker.js +84 -0
  197. package/dest/services/tx_collection/slow_tx_collection.d.ts +5 -3
  198. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -1
  199. package/dest/services/tx_collection/slow_tx_collection.js +17 -12
  200. package/dest/services/tx_collection/tx_collection.d.ts +9 -9
  201. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  202. package/dest/services/tx_collection/tx_collection.js +26 -10
  203. package/dest/services/tx_collection/tx_collection_sink.d.ts +6 -5
  204. package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -1
  205. package/dest/services/tx_collection/tx_collection_sink.js +13 -22
  206. package/dest/services/tx_collection/tx_source.d.ts +8 -3
  207. package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
  208. package/dest/services/tx_collection/tx_source.js +19 -2
  209. package/dest/services/tx_file_store/tx_file_store.d.ts +3 -2
  210. package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -1
  211. package/dest/services/tx_file_store/tx_file_store.js +9 -6
  212. package/dest/services/tx_provider.d.ts +3 -3
  213. package/dest/services/tx_provider.d.ts.map +1 -1
  214. package/dest/services/tx_provider.js +4 -4
  215. package/dest/test-helpers/make-test-p2p-clients.d.ts +5 -6
  216. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  217. package/dest/test-helpers/make-test-p2p-clients.js +1 -2
  218. package/dest/test-helpers/mock-pubsub.d.ts +4 -4
  219. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  220. package/dest/test-helpers/mock-pubsub.js +8 -2
  221. package/dest/test-helpers/reqresp-nodes.d.ts +2 -3
  222. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  223. package/dest/test-helpers/reqresp-nodes.js +2 -2
  224. package/dest/test-helpers/testbench-utils.d.ts +8 -3
  225. package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
  226. package/dest/test-helpers/testbench-utils.js +29 -4
  227. package/dest/testbench/p2p_client_testbench_worker.d.ts +2 -2
  228. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  229. package/dest/testbench/p2p_client_testbench_worker.js +15 -14
  230. package/dest/testbench/worker_client_manager.d.ts +3 -1
  231. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  232. package/dest/testbench/worker_client_manager.js +6 -2
  233. package/dest/util.d.ts +3 -3
  234. package/dest/util.d.ts.map +1 -1
  235. package/package.json +14 -14
  236. package/src/client/factory.ts +62 -47
  237. package/src/client/interface.ts +17 -20
  238. package/src/client/p2p_client.ts +74 -130
  239. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +18 -11
  240. package/src/config.ts +133 -43
  241. package/src/errors/tx-pool.error.ts +12 -0
  242. package/src/mem_pools/attestation_pool/attestation_pool.ts +16 -7
  243. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +6 -6
  244. package/src/mem_pools/attestation_pool/mocks.ts +2 -1
  245. package/src/mem_pools/instrumentation.ts +17 -13
  246. package/src/mem_pools/tx_pool/README.md +1 -1
  247. package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +2 -1
  248. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +3 -3
  249. package/src/mem_pools/tx_pool/priority.ts +4 -4
  250. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +3 -1
  251. package/src/mem_pools/tx_pool_v2/README.md +52 -28
  252. package/src/mem_pools/tx_pool_v2/deleted_pool.ts +109 -22
  253. package/src/mem_pools/tx_pool_v2/eviction/eviction_manager.ts +21 -8
  254. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +7 -3
  255. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +18 -4
  256. package/src/mem_pools/tx_pool_v2/eviction/index.ts +4 -0
  257. package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +59 -4
  258. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +5 -5
  259. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +5 -5
  260. package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +14 -9
  261. package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +33 -6
  262. package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +4 -3
  263. package/src/mem_pools/tx_pool_v2/index.ts +1 -1
  264. package/src/mem_pools/tx_pool_v2/instrumentation.ts +69 -0
  265. package/src/mem_pools/tx_pool_v2/interfaces.ts +30 -10
  266. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +156 -26
  267. package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +58 -45
  268. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +34 -8
  269. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +353 -143
  270. package/src/msg_validators/attestation_validator/README.md +49 -0
  271. package/src/msg_validators/attestation_validator/attestation_validator.ts +5 -4
  272. package/src/msg_validators/clock_tolerance.ts +4 -3
  273. package/src/msg_validators/proposal_validator/README.md +123 -0
  274. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +14 -4
  275. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +20 -7
  276. package/src/msg_validators/proposal_validator/proposal_validator.ts +69 -45
  277. package/src/msg_validators/tx_validator/README.md +119 -0
  278. package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +3 -3
  279. package/src/msg_validators/tx_validator/allowed_public_setup.ts +22 -27
  280. package/src/msg_validators/tx_validator/allowed_setup_helpers.ts +31 -0
  281. package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
  282. package/src/msg_validators/tx_validator/data_validator.ts +42 -1
  283. package/src/msg_validators/tx_validator/factory.ts +394 -78
  284. package/src/msg_validators/tx_validator/fee_payer_balance.ts +6 -2
  285. package/src/msg_validators/tx_validator/gas_validator.ts +123 -27
  286. package/src/msg_validators/tx_validator/index.ts +2 -0
  287. package/src/msg_validators/tx_validator/metadata_validator.ts +12 -4
  288. package/src/msg_validators/tx_validator/nullifier_cache.ts +30 -0
  289. package/src/msg_validators/tx_validator/phases_validator.ts +82 -27
  290. package/src/msg_validators/tx_validator/timestamp_validator.ts +7 -7
  291. package/src/services/dummy_service.ts +6 -6
  292. package/src/services/encoding.ts +16 -8
  293. package/src/services/gossipsub/README.md +29 -14
  294. package/src/services/gossipsub/topic_score_params.ts +49 -13
  295. package/src/services/libp2p/libp2p_service.ts +198 -161
  296. package/src/services/peer-manager/metrics.ts +7 -0
  297. package/src/services/peer-manager/peer_manager.ts +7 -3
  298. package/src/services/reqresp/README.md +229 -0
  299. package/src/services/reqresp/batch-tx-requester/README.md +46 -7
  300. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +79 -112
  301. package/src/services/reqresp/batch-tx-requester/interface.ts +3 -6
  302. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +30 -71
  303. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +68 -24
  304. package/src/services/reqresp/batch-tx-requester/tx_validator.ts +2 -2
  305. package/src/services/reqresp/reqresp.ts +22 -12
  306. package/src/services/service.ts +11 -2
  307. package/src/services/tx_collection/config.ts +42 -0
  308. package/src/services/tx_collection/fast_tx_collection.ts +71 -76
  309. package/src/services/tx_collection/file_store_tx_collection.ts +143 -93
  310. package/src/services/tx_collection/file_store_tx_source.ts +64 -17
  311. package/src/services/tx_collection/instrumentation.ts +7 -1
  312. package/src/services/tx_collection/proposal_tx_collector.ts +9 -13
  313. package/src/services/tx_collection/request_tracker.ts +127 -0
  314. package/src/services/tx_collection/slow_tx_collection.ts +17 -13
  315. package/src/services/tx_collection/tx_collection.ts +46 -17
  316. package/src/services/tx_collection/tx_collection_sink.ts +15 -29
  317. package/src/services/tx_collection/tx_source.ts +22 -3
  318. package/src/services/tx_file_store/tx_file_store.ts +6 -4
  319. package/src/services/tx_provider.ts +2 -2
  320. package/src/test-helpers/make-test-p2p-clients.ts +1 -3
  321. package/src/test-helpers/mock-pubsub.ts +13 -6
  322. package/src/test-helpers/reqresp-nodes.ts +3 -6
  323. package/src/test-helpers/testbench-utils.ts +40 -6
  324. package/src/testbench/p2p_client_testbench_worker.ts +22 -20
  325. package/src/testbench/worker_client_manager.ts +13 -5
  326. package/src/util.ts +8 -2
  327. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +0 -23
  328. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +0 -1
  329. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +0 -212
  330. package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +0 -230
@@ -1,5 +1,6 @@
1
1
  import type { EpochCacheInterface } from '@aztec/epoch-cache';
2
2
  import { BlockNumber, type SlotNumber } from '@aztec/foundation/branded-types';
3
+ import { maxBy } from '@aztec/foundation/collection';
3
4
  import { Fr } from '@aztec/foundation/curves/bn254';
4
5
  import { type Logger, createLibp2pComponentLogger, createLogger } from '@aztec/foundation/log';
5
6
  import { RunningPromise } from '@aztec/foundation/running-promise';
@@ -16,13 +17,12 @@ import {
16
17
  CheckpointProposal,
17
18
  type CheckpointProposalCore,
18
19
  type Gossipable,
19
- P2PClientType,
20
20
  P2PMessage,
21
- type ValidationResult as P2PValidationResult,
22
21
  PeerErrorSeverity,
22
+ PeerErrorSeverityByHarshness,
23
23
  TopicType,
24
24
  createTopicString,
25
- getTopicsForClientAndConfig,
25
+ getTopicsForConfig,
26
26
  metricsTopicStrToLabels,
27
27
  } from '@aztec/stdlib/p2p';
28
28
  import { MerkleTreeId } from '@aztec/stdlib/trees';
@@ -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,14 +99,9 @@ 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
107
  reqRespBlockHandler,
@@ -130,12 +130,12 @@ type ValidationOutcome = { allPassed: true } | { allPassed: false; failure: Vali
130
130
  // REFACTOR: Unify with the type above
131
131
  type ReceivedMessageValidationResult<T, M = undefined> =
132
132
  | { obj: T; result: Exclude<TopicValidatorResult, TopicValidatorResult.Reject>; metadata?: M }
133
- | { obj?: T; result: TopicValidatorResult.Reject; metadata?: M };
133
+ | { obj?: T; result: TopicValidatorResult.Reject; metadata?: M; severity: PeerErrorSeverity };
134
134
 
135
135
  /**
136
136
  * Lib P2P implementation of the P2PService interface.
137
137
  */
138
- export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends WithTracer implements P2PService {
138
+ export class LibP2PService extends WithTracer implements P2PService {
139
139
  private discoveryRunningPromise?: RunningPromise;
140
140
  private msgIdSeenValidators: Record<TopicType, MessageSeenValidator> = {} as Record<TopicType, MessageSeenValidator>;
141
141
 
@@ -182,7 +182,6 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
182
182
  protected logger: Logger;
183
183
 
184
184
  constructor(
185
- private clientType: T,
186
185
  private config: P2PConfig,
187
186
  protected node: PubSubLibp2p,
188
187
  private peerDiscoveryService: PeerDiscoveryService,
@@ -224,10 +223,12 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
224
223
  this.protocolVersion,
225
224
  );
226
225
 
227
- this.blockProposalValidator = new BlockProposalValidator(epochCache, { txsPermitted: !config.disableTransactions });
228
- this.checkpointProposalValidator = new CheckpointProposalValidator(epochCache, {
226
+ const proposalValidatorOpts = {
229
227
  txsPermitted: !config.disableTransactions,
230
- });
228
+ maxTxsPerBlock: config.validateMaxTxsPerBlock ?? config.validateMaxTxsPerCheckpoint,
229
+ };
230
+ this.blockProposalValidator = new BlockProposalValidator(epochCache, proposalValidatorOpts);
231
+ this.checkpointProposalValidator = new CheckpointProposalValidator(epochCache, proposalValidatorOpts);
231
232
  this.checkpointAttestationValidator = config.fishermanMode
232
233
  ? new FishermanAttestationValidator(epochCache, mempools.attestationPool, telemetry)
233
234
  : new CheckpointAttestationValidator(epochCache);
@@ -235,11 +236,11 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
235
236
  this.gossipSubEventHandler = this.handleGossipSubEvent.bind(this);
236
237
 
237
238
  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.`,
239
+ this.logger.warn(
240
+ `Handler for block received not yet registered on P2P service. Received block ${block.blockNumber} for slot ${block.slotNumber} from peer.`,
240
241
  { p2pMessageIdentifier: await block.p2pMessageLoggingIdentifier() },
241
242
  );
242
- return false;
243
+ return true;
243
244
  };
244
245
 
245
246
  this.checkpointReceivedCallback = (
@@ -262,8 +263,7 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
262
263
  * @param txPool - The transaction pool to be accessed by the service.
263
264
  * @returns The new service.
264
265
  */
265
- public static async new<T extends P2PClientType>(
266
- clientType: T,
266
+ public static async new(
267
267
  config: P2PConfig,
268
268
  peerId: PeerId,
269
269
  deps: {
@@ -341,6 +341,7 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
341
341
  heartbeatIntervalMs: config.gossipsubInterval,
342
342
  targetCommitteeSize: l1Constants.targetCommitteeSize,
343
343
  blockDurationMs: config.blockDurationMs,
344
+ expectedBlockProposalsPerSlot: config.expectedBlockProposalsPerSlot,
344
345
  });
345
346
 
346
347
  const node = await createLibp2p({
@@ -474,7 +475,6 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
474
475
  peerManager.shouldDisableP2PGossip(peerId) ? -Infinity : peerManager.getPeerScore(peerId);
475
476
 
476
477
  return new LibP2PService(
477
- clientType,
478
478
  config,
479
479
  node,
480
480
  peerDiscoveryService,
@@ -548,7 +548,7 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
548
548
  await this.node.start();
549
549
 
550
550
  // Subscribe to standard GossipSub topics by default
551
- for (const topic of getTopicsForClientAndConfig(this.clientType, this.config.disableTransactions)) {
551
+ for (const topic of getTopicsForConfig(this.config.disableTransactions)) {
552
552
  this.subscribeToTopic(this.topicStrings[topic]);
553
553
  }
554
554
 
@@ -614,6 +614,10 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
614
614
  return this.peerManager.getPeers(includePending);
615
615
  }
616
616
 
617
+ public getGossipMeshPeerCount(topicType: TopicType): number {
618
+ return this.node.services.pubsub.getMeshPeers(this.topicStrings[topicType]).length;
619
+ }
620
+
617
621
  private handleGossipSubEvent(e: CustomEvent<GossipsubMessage>) {
618
622
  this.logger.trace(`Received PUBSUB message.`);
619
623
 
@@ -749,6 +753,9 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
749
753
  if (!validator || !validator.addMessage(msgId)) {
750
754
  this.instrumentation.incMessagePrevalidationStatus(false, topicType);
751
755
  this.node.services.pubsub.reportMessageValidationResult(msgId, source.toString(), TopicValidatorResult.Ignore);
756
+ if (topicType === TopicType.tx) {
757
+ this.logger.verbose(`Ignoring already-seen tx gossip message`, { msgId, source: source.toString() });
758
+ }
752
759
  return { result: false, topicType };
753
760
  }
754
761
 
@@ -813,9 +820,7 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
813
820
  if (msg.topic === this.topicStrings[TopicType.tx]) {
814
821
  await this.handleGossipedTx(p2pMessage.payload, msgId, source);
815
822
  } else if (msg.topic === this.topicStrings[TopicType.checkpoint_attestation]) {
816
- if (this.clientType === P2PClientType.Full) {
817
- await this.processCheckpointAttestationFromPeer(p2pMessage.payload, msgId, source);
818
- }
823
+ await this.processCheckpointAttestationFromPeer(p2pMessage.payload, msgId, source);
819
824
  } else if (msg.topic === this.topicStrings[TopicType.block_proposal]) {
820
825
  await this.processBlockFromPeer(p2pMessage.payload, msgId, source);
821
826
  } else if (msg.topic === this.topicStrings[TopicType.checkpoint_proposal]) {
@@ -877,47 +882,113 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
877
882
  source: PeerId,
878
883
  topicType: TopicType,
879
884
  ): Promise<ReceivedMessageValidationResult<T, M>> {
880
- let resultAndObj: ReceivedMessageValidationResult<T, M> = { result: TopicValidatorResult.Reject };
885
+ // Default to reject result with a penalty if validation function throws an error
886
+ let resultAndObj: ReceivedMessageValidationResult<T, M> = {
887
+ result: TopicValidatorResult.Reject,
888
+ severity: PeerErrorSeverity.MidToleranceError,
889
+ };
881
890
  const timer = new Timer();
882
891
  try {
883
892
  resultAndObj = await validationFunc();
884
893
  } 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
- });
894
+ this.logger.error(`Error validating gossipsub message`, err, { msgId, source: source.toString(), topicType });
891
895
  }
892
896
 
893
897
  if (resultAndObj.result === TopicValidatorResult.Accept) {
898
+ this.logger.debug(`Message ${topicType} accepted by validator`, { msgId, source: source.toString(), topicType });
894
899
  this.instrumentation.recordMessageValidation(topicType, timer);
900
+ } else if (resultAndObj.result === TopicValidatorResult.Reject) {
901
+ this.logger.warn(`Message ${topicType} rejected by validator with severity ${resultAndObj.severity}`, {
902
+ msgId,
903
+ source: source.toString(),
904
+ topicType,
905
+ severity: resultAndObj.severity,
906
+ });
907
+ this.peerManager.penalizePeer(source, resultAndObj.severity);
908
+ } else {
909
+ this.logger.trace(`Message ${topicType} ignored by validator`, { msgId, source: source.toString(), topicType });
895
910
  }
896
911
 
897
912
  this.node.services.pubsub.reportMessageValidationResult(msgId, source.toString(), resultAndObj.result);
898
913
  return resultAndObj;
899
914
  }
900
915
 
916
+ private tryDeserialize<T>(deserializeFunc: () => T, msgId: string, source: PeerId): T | undefined {
917
+ try {
918
+ return deserializeFunc();
919
+ } catch (err) {
920
+ this.logger.warn(`Failed to deserialize gossipsub message from buffer`, {
921
+ err,
922
+ msgId,
923
+ source: source.toString(),
924
+ });
925
+ return undefined;
926
+ }
927
+ }
928
+
901
929
  protected async handleGossipedTx(payloadData: Buffer, msgId: string, source: PeerId) {
902
930
  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(),
931
+ const tx = this.tryDeserialize(() => Tx.fromBuffer(payloadData), msgId, source);
932
+ if (!tx) {
933
+ return { result: TopicValidatorResult.Reject, severity: PeerErrorSeverity.LowToleranceError };
934
+ }
935
+
936
+ const currentBlockNumber = await this.archiver.getBlockNumber();
937
+ const { ts: nextSlotTimestamp } = this.epochCache.getEpochAndSlotInNextL1Slot();
938
+
939
+ // Stage 1: fast validators (metadata, data, timestamps, double-spend, gas, phases, block header)
940
+ const firstStageValidators = await this.createFirstStageMessageValidators(currentBlockNumber, nextSlotTimestamp);
941
+ const firstStageOutcome = await this.runValidations(tx, firstStageValidators);
942
+ if (!firstStageOutcome.allPassed) {
943
+ const { name } = firstStageOutcome.failure;
944
+ let { severity } = firstStageOutcome.failure;
945
+
946
+ // Double spend validator has a special case handler. We perform more detailed examination
947
+ // as to how recently the nullifier was entered into the tree and if the transaction should
948
+ // have 'known' the nullifier existed. This determines the severity of the penalty applied to the peer.
949
+ if (name === 'doubleSpendValidator') {
950
+ const txBlockNumber = BlockNumber(currentBlockNumber + 1);
951
+ severity = await this.handleDoubleSpendFailure(tx, txBlockNumber);
952
+ }
953
+
954
+ this.logger.verbose(`Rejecting gossiped tx ${tx.getTxHash().toString()}: stage 1 validation failed`, {
955
+ validator: name,
956
+ severity,
957
+ source: source.toString(),
958
+ });
959
+ return { result: TopicValidatorResult.Reject, severity };
960
+ }
961
+
962
+ // Pool pre-check: see if the pool would accept this tx before doing expensive proof verification
963
+ const canAdd = await this.mempools.txPool.canAddPendingTx(tx);
964
+ if (canAdd === 'ignored') {
965
+ this.logger.verbose(`Ignoring gossiped tx ${tx.getTxHash().toString()}: pool pre-check returned ignored`, {
966
+ source: source.toString(),
967
+ });
968
+ return { result: TopicValidatorResult.Ignore, obj: tx };
969
+ }
970
+
971
+ // Stage 2: expensive proof verification
972
+ const secondStageValidators = this.createSecondStageMessageValidators();
973
+ const secondStageOutcome = await this.runValidations(tx, secondStageValidators);
974
+ if (!secondStageOutcome.allPassed) {
975
+ const { severity, name } = secondStageOutcome.failure;
976
+ this.logger.verbose(`Rejecting gossiped tx ${tx.getTxHash().toString()}: stage 2 validation failed`, {
977
+ validator: name,
978
+ severity,
979
+ source: source.toString(),
908
980
  });
909
- return { result: TopicValidatorResult.Reject };
981
+ return { result: TopicValidatorResult.Reject, severity };
910
982
  }
911
983
 
912
- // Propagate only on pool acceptance
984
+ // Pool add: persist the tx
913
985
  const txHash = tx.getTxHash();
914
986
  const addResult = await this.mempools.txPool.addPendingTxs([tx], { source: 'gossip' });
915
987
 
916
988
  const wasAccepted = addResult.accepted.some(h => h.equals(txHash));
917
989
  const wasIgnored = addResult.ignored.some(h => h.equals(txHash));
918
990
 
919
- this.logger.trace(`Validate propagated tx`, {
920
- isValid,
991
+ this.logger.verbose(`Validate propagated tx ${txHash.toString()}`, {
921
992
  wasAccepted,
922
993
  wasIgnored,
923
994
  [Attributes.P2P_ID]: source.toString(),
@@ -928,7 +999,11 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
928
999
  } else if (wasIgnored) {
929
1000
  return { result: TopicValidatorResult.Ignore, obj: tx };
930
1001
  } else {
931
- return { result: TopicValidatorResult.Reject };
1002
+ this.logger.warn(`Gossiped tx ${txHash.toString()} unexpectedly rejected by pool`, {
1003
+ source: source.toString(),
1004
+ txHash: txHash.toString(),
1005
+ });
1006
+ return { result: TopicValidatorResult.Reject, severity: PeerErrorSeverity.HighToleranceError };
932
1007
  }
933
1008
  };
934
1009
 
@@ -958,7 +1033,16 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
958
1033
  source: PeerId,
959
1034
  ): Promise<void> {
960
1035
  const { result, obj: attestation } = await this.validateReceivedMessage<CheckpointAttestation>(
961
- () => this.validateAndStoreCheckpointAttestation(source, CheckpointAttestation.fromBuffer(payloadData)),
1036
+ () => {
1037
+ const attestation = this.tryDeserialize(() => CheckpointAttestation.fromBuffer(payloadData), msgId, source);
1038
+ if (!attestation) {
1039
+ return Promise.resolve({
1040
+ result: TopicValidatorResult.Reject,
1041
+ severity: PeerErrorSeverity.LowToleranceError,
1042
+ });
1043
+ }
1044
+ return this.validateAndStoreCheckpointAttestation(source, attestation);
1045
+ },
962
1046
  msgId,
963
1047
  source,
964
1048
  TopicType.checkpoint_attestation,
@@ -991,8 +1075,7 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
991
1075
 
992
1076
  if (validationResult.result === 'reject') {
993
1077
  this.logger.warn(`Penalizing peer ${peerId} for checkpoint attestation validation failure`);
994
- this.peerManager.penalizePeer(peerId, validationResult.severity);
995
- return { result: TopicValidatorResult.Reject };
1078
+ return { result: TopicValidatorResult.Reject, severity: validationResult.severity };
996
1079
  }
997
1080
 
998
1081
  if (validationResult.result === 'ignore') {
@@ -1018,16 +1101,16 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
1018
1101
  return { result: TopicValidatorResult.Ignore, obj: attestation };
1019
1102
  }
1020
1103
 
1021
- // Could not add (cap reached for signer), no need to re-broadcast
1104
+ // Could not add (cap reached for signer), penalize and do not re-broadcast
1022
1105
  if (!added) {
1023
- this.logger.warn(`Dropping checkpoint attestation due to cap`, {
1106
+ this.logger.warn(`Rejecting checkpoint attestation due to cap`, {
1024
1107
  slot: slot.toString(),
1025
1108
  archive: attestation.archive.toString(),
1026
1109
  source: peerId.toString(),
1027
1110
  attester: attestation.getSender()?.toString(),
1028
1111
  count,
1029
1112
  });
1030
- return { result: TopicValidatorResult.Ignore, obj: attestation };
1113
+ return { result: TopicValidatorResult.Reject, severity: PeerErrorSeverity.HighToleranceError };
1031
1114
  }
1032
1115
 
1033
1116
  // Check if this is a duplicate attestation (signer attested to a different proposal at the same slot)
@@ -1082,8 +1165,7 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
1082
1165
 
1083
1166
  if (validationResult.result === 'reject') {
1084
1167
  this.logger.warn(`Penalizing peer ${peerId} for block proposal validation failure`);
1085
- this.peerManager.penalizePeer(peerId, validationResult.severity);
1086
- return { result: TopicValidatorResult.Reject };
1168
+ return { result: TopicValidatorResult.Reject, severity: validationResult.severity };
1087
1169
  }
1088
1170
 
1089
1171
  if (validationResult.result === 'ignore') {
@@ -1107,7 +1189,6 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
1107
1189
 
1108
1190
  // Too many blocks received for this slot and index, penalize peer and do not re-broadcast
1109
1191
  if (!added) {
1110
- this.peerManager.penalizePeer(peerId, PeerErrorSeverity.HighToleranceError);
1111
1192
  this.logger.warn(`Penalizing peer for block proposal exceeding per-position cap`, {
1112
1193
  ...block.toBlockInfo(),
1113
1194
  indexWithinCheckpoint: block.indexWithinCheckpoint,
@@ -1115,7 +1196,11 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
1115
1196
  proposer: block.getSender()?.toString(),
1116
1197
  source: peerId.toString(),
1117
1198
  });
1118
- return { result: TopicValidatorResult.Reject, metadata: { isEquivocated } };
1199
+ return {
1200
+ result: TopicValidatorResult.Reject,
1201
+ metadata: { isEquivocated },
1202
+ severity: PeerErrorSeverity.HighToleranceError,
1203
+ };
1119
1204
  }
1120
1205
 
1121
1206
  // If this was a duplicate proposal, do not process it, but do invoke the duplicate callback,
@@ -1160,7 +1245,7 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
1160
1245
  // Note: Validators do NOT attest to individual blocks, only to checkpoint proposals.
1161
1246
  const isValid = await this.blockReceivedCallback(block, sender);
1162
1247
  if (!isValid) {
1163
- this.logger.warn(`Block proposal validation failed for block ${block.blockNumber}`, block.toBlockInfo());
1248
+ this.logger.info(`Block proposal validation failed for block ${block.blockNumber}`, block.toBlockInfo());
1164
1249
  }
1165
1250
  }
1166
1251
 
@@ -1208,8 +1293,7 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
1208
1293
 
1209
1294
  if (validationResult.result === 'reject') {
1210
1295
  this.logger.warn(`Penalizing peer ${peerId} for checkpoint proposal validation failure`);
1211
- this.peerManager.penalizePeer(peerId, validationResult.severity);
1212
- return { result: TopicValidatorResult.Reject };
1296
+ return { result: TopicValidatorResult.Reject, severity: validationResult.severity };
1213
1297
  }
1214
1298
 
1215
1299
  if (validationResult.result === 'ignore') {
@@ -1224,20 +1308,21 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
1224
1308
  [Attributes.SLOT_NUMBER]: checkpoint.slotNumber.toString(),
1225
1309
  [Attributes.P2P_ID]: peerId.toString(),
1226
1310
  });
1227
- const {
1228
- result,
1229
- obj,
1230
- metadata: { isEquivocated } = {},
1231
- } = await this.validateAndStoreBlockProposal(peerId, blockProposal);
1232
- if (result === TopicValidatorResult.Reject || !obj || isEquivocated) {
1311
+ const blockProposalResult = await this.validateAndStoreBlockProposal(peerId, blockProposal);
1312
+ const { obj, metadata: { isEquivocated } = {} } = blockProposalResult;
1313
+ if (blockProposalResult.result === TopicValidatorResult.Reject || !obj || isEquivocated) {
1233
1314
  this.logger.debug(`Rejecting checkpoint due to invalid last block proposal`, {
1234
1315
  [Attributes.SLOT_NUMBER]: checkpoint.slotNumber.toString(),
1235
1316
  [Attributes.P2P_ID]: peerId.toString(),
1236
1317
  isEquivocated,
1237
- result,
1318
+ result: blockProposalResult.result,
1238
1319
  });
1239
- return { result: TopicValidatorResult.Reject };
1240
- } else if (result === TopicValidatorResult.Accept && obj && !isEquivocated) {
1320
+ return {
1321
+ result: TopicValidatorResult.Reject,
1322
+ severity:
1323
+ 'severity' in blockProposalResult ? blockProposalResult.severity : PeerErrorSeverity.MidToleranceError,
1324
+ };
1325
+ } else if (blockProposalResult.result === TopicValidatorResult.Accept && obj && !isEquivocated) {
1241
1326
  processBlock = true;
1242
1327
  }
1243
1328
  }
@@ -1264,13 +1349,17 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
1264
1349
  // Too many checkpoint proposals received for this slot, penalize peer and do not re-broadcast
1265
1350
  // Note: We still return the checkpoint obj so the lastBlock can be processed if valid
1266
1351
  if (!added) {
1267
- this.peerManager.penalizePeer(peerId, PeerErrorSeverity.HighToleranceError);
1268
1352
  this.logger.warn(`Penalizing peer for checkpoint proposal exceeding per-slot cap`, {
1269
1353
  ...checkpoint.toCheckpointInfo(),
1270
1354
  count,
1271
1355
  source: peerId.toString(),
1272
1356
  });
1273
- return { result: TopicValidatorResult.Reject, obj: checkpoint, metadata: { isEquivocated, processBlock } };
1357
+ return {
1358
+ result: TopicValidatorResult.Reject,
1359
+ obj: checkpoint,
1360
+ metadata: { isEquivocated, processBlock },
1361
+ severity: PeerErrorSeverity.HighToleranceError,
1362
+ };
1274
1363
  }
1275
1364
 
1276
1365
  // If this was a duplicate proposal, do not process it, but do invoke the duplicate callback,
@@ -1532,43 +1621,12 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
1532
1621
  }
1533
1622
 
1534
1623
  protected createRequestedTxValidator(): TxValidator {
1535
- return createTxReqRespValidator(this.proofVerifier, {
1624
+ return createTxValidatorForReqResponseReceivedTxs(this.proofVerifier, {
1536
1625
  l1ChainId: this.config.l1ChainId,
1537
1626
  rollupVersion: this.config.rollupVersion,
1538
1627
  });
1539
1628
  }
1540
1629
 
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
1630
  private async getGasFees(blockNumber: BlockNumber): Promise<GasFees> {
1573
1631
  if (blockNumber === this.feesCache?.blockNumber) {
1574
1632
  return this.feesCache.gasFees;
@@ -1596,60 +1654,62 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
1596
1654
  };
1597
1655
  }
1598
1656
 
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);
1657
+ public async validateTxsReceivedInBlockProposal(txs: Tx[]): Promise<void> {
1658
+ const validator = createTxValidatorForBlockProposalReceivedTxs(
1659
+ this.proofVerifier,
1660
+ { l1ChainId: this.config.l1ChainId, rollupVersion: this.config.rollupVersion },
1661
+ this.logger.getBindings(),
1662
+ );
1605
1663
 
1606
- await Promise.all(
1664
+ const results = await Promise.all(
1607
1665
  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
- }
1666
+ const result = await validator.validateTx(tx);
1667
+ return result.result !== 'invalid';
1614
1668
  }),
1615
1669
  );
1670
+ if (results.some(value => value === false)) {
1671
+ throw new Error('Invalid tx detected');
1672
+ }
1616
1673
  }
1617
1674
 
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(
1675
+ /** Creates the first stage (fast) validators for gossiped transactions. */
1676
+ protected async createFirstStageMessageValidators(
1629
1677
  currentBlockNumber: BlockNumber,
1630
1678
  nextSlotTimestamp: UInt64,
1631
- ): Promise<Record<string, MessageValidator>[]> {
1679
+ ): Promise<Record<string, TransactionValidator>> {
1632
1680
  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(
1681
+ const allowedInSetup = [
1682
+ ...(await getDefaultAllowedSetupFunctions()),
1683
+ ...(this.config.txPublicSetupAllowListExtend ?? []),
1684
+ ];
1685
+ const blockNumber = BlockNumber(currentBlockNumber + 1);
1686
+ const l1Constants = await this.archiver.getL1Constants();
1687
+
1688
+ return createFirstStageTxValidationsForGossipedTransactions(
1638
1689
  nextSlotTimestamp,
1639
- blockNumberInWhichTheTxIsConsideredToBeIncluded,
1690
+ blockNumber,
1640
1691
  this.worldStateSynchronizer,
1641
1692
  gasFees,
1642
1693
  this.config.l1ChainId,
1643
1694
  this.config.rollupVersion,
1644
1695
  protocolContractsHash,
1645
1696
  this.archiver,
1646
- this.proofVerifier,
1647
1697
  !this.config.disableTransactions,
1648
1698
  allowedInSetup,
1649
1699
  this.logger.getBindings(),
1700
+ {
1701
+ rollupManaLimit: l1Constants.rollupManaLimit,
1702
+ maxBlockL2Gas: this.config.validateMaxL2BlockGas,
1703
+ maxBlockDAGas: this.config.validateMaxDABlockGas,
1704
+ },
1650
1705
  );
1651
1706
  }
1652
1707
 
1708
+ /** Creates the second stage (expensive proof verification) validators for gossiped transactions. */
1709
+ protected createSecondStageMessageValidators(): Record<string, TransactionValidator> {
1710
+ return createSecondStageTxValidationsForGossipedTransactions(this.proofVerifier, this.logger.getBindings());
1711
+ }
1712
+
1653
1713
  /**
1654
1714
  * Run validations on a tx.
1655
1715
  * @param tx - The tx to validate.
@@ -1658,7 +1718,7 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
1658
1718
  */
1659
1719
  private async runValidations(
1660
1720
  tx: Tx,
1661
- messageValidators: Record<string, MessageValidator>,
1721
+ messageValidators: Record<string, TransactionValidator>,
1662
1722
  ): Promise<ValidationOutcome> {
1663
1723
  const validationPromises = Object.entries(messageValidators).map(async ([name, { validator, severity }]) => {
1664
1724
  const { result } = await validator.validateTx(tx);
@@ -1667,8 +1727,10 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
1667
1727
 
1668
1728
  // A promise that resolves when all validations have been run
1669
1729
  const allValidations = await Promise.all(validationPromises);
1670
- const failed = allValidations.find(x => !x.isValid);
1671
- if (failed) {
1730
+ const failures = allValidations.filter(x => !x.isValid);
1731
+ if (failures.length > 0) {
1732
+ // Pick the most severe failure (lowest tolerance = harshest penalty)
1733
+ const failed = maxBy(failures, f => PeerErrorSeverityByHarshness.indexOf(f.severity))!;
1672
1734
  return {
1673
1735
  allPassed: false,
1674
1736
  failure: {
@@ -1721,31 +1783,6 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
1721
1783
  return PeerErrorSeverity.HighToleranceError;
1722
1784
  }
1723
1785
 
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
1786
  public getPeerScore(peerId: PeerId): number {
1750
1787
  return this.node.services.pubsub.score.score(peerId.toString());
1751
1788
  }