@aztec/p2p 5.0.0-private.20260319 → 5.0.0-rc.2

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 (411) hide show
  1. package/README.md +4 -1
  2. package/dest/bootstrap/bootstrap.d.ts +1 -1
  3. package/dest/bootstrap/bootstrap.d.ts.map +1 -1
  4. package/dest/bootstrap/bootstrap.js +22 -6
  5. package/dest/client/factory.d.ts +4 -3
  6. package/dest/client/factory.d.ts.map +1 -1
  7. package/dest/client/factory.js +33 -24
  8. package/dest/client/interface.d.ts +43 -11
  9. package/dest/client/interface.d.ts.map +1 -1
  10. package/dest/client/p2p_client.d.ts +33 -19
  11. package/dest/client/p2p_client.d.ts.map +1 -1
  12. package/dest/client/p2p_client.js +100 -44
  13. package/dest/config.d.ts +137 -107
  14. package/dest/config.d.ts.map +1 -1
  15. package/dest/config.js +64 -23
  16. package/dest/errors/p2p-service.error.d.ts +9 -0
  17. package/dest/errors/p2p-service.error.d.ts.map +1 -0
  18. package/dest/errors/p2p-service.error.js +10 -0
  19. package/dest/errors/reqresp.error.d.ts +1 -20
  20. package/dest/errors/reqresp.error.d.ts.map +1 -1
  21. package/dest/errors/reqresp.error.js +0 -21
  22. package/dest/index.d.ts +1 -2
  23. package/dest/index.d.ts.map +1 -1
  24. package/dest/index.js +0 -1
  25. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +98 -56
  26. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  27. package/dest/mem_pools/attestation_pool/attestation_pool.js +265 -196
  28. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +1 -1
  29. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
  30. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +175 -59
  31. package/dest/mem_pools/attestation_pool/mocks.d.ts +1 -1
  32. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  33. package/dest/mem_pools/attestation_pool/mocks.js +6 -4
  34. package/dest/mem_pools/index.d.ts +1 -2
  35. package/dest/mem_pools/index.d.ts.map +1 -1
  36. package/dest/mem_pools/instrumentation.d.ts +1 -1
  37. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  38. package/dest/mem_pools/instrumentation.js +17 -1
  39. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts +1 -5
  40. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts.map +1 -1
  41. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.js +1 -7
  42. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +3 -3
  43. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -1
  44. package/dest/mem_pools/tx_pool_v2/deleted_pool.js +6 -6
  45. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +1 -1
  46. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +2 -1
  47. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -1
  48. package/dest/mem_pools/tx_pool_v2/eviction/index.js +1 -0
  49. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts +16 -0
  50. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts.map +1 -0
  51. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.js +62 -0
  52. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +2 -2
  53. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +22 -5
  54. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
  55. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +5 -2
  56. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
  57. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +13 -6
  58. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +7 -1
  59. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -1
  60. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +10 -0
  61. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +8 -3
  62. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -1
  63. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +7 -4
  64. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +8 -3
  65. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -1
  66. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +153 -111
  67. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +10 -3
  68. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  69. package/dest/msg_validators/attestation_validator/attestation_validator.js +38 -16
  70. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +7 -3
  71. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
  72. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +4 -5
  73. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +8 -3
  74. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
  75. package/dest/msg_validators/proposal_validator/block_proposal_validator.js +2 -2
  76. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +8 -3
  77. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
  78. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +8 -2
  79. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +25 -3
  80. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
  81. package/dest/msg_validators/proposal_validator/proposal_validator.js +77 -14
  82. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +1 -1
  83. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  84. package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +8 -15
  85. package/dest/msg_validators/tx_validator/allowed_public_setup.js +3 -3
  86. package/dest/msg_validators/tx_validator/archive_cache.js +1 -1
  87. package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts +15 -0
  88. package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts.map +1 -0
  89. package/dest/msg_validators/tx_validator/cached_tx_validator.js +19 -0
  90. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts +9 -0
  91. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts.map +1 -0
  92. package/dest/msg_validators/tx_validator/contract_instance_validator.js +48 -0
  93. package/dest/msg_validators/tx_validator/data_validator.d.ts +2 -1
  94. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  95. package/dest/msg_validators/tx_validator/data_validator.js +36 -2
  96. package/dest/msg_validators/tx_validator/factory.d.ts +14 -15
  97. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  98. package/dest/msg_validators/tx_validator/factory.js +36 -17
  99. package/dest/msg_validators/tx_validator/gas_validator.d.ts +47 -10
  100. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  101. package/dest/msg_validators/tx_validator/gas_validator.js +65 -48
  102. package/dest/msg_validators/tx_validator/index.d.ts +3 -1
  103. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  104. package/dest/msg_validators/tx_validator/index.js +2 -0
  105. package/dest/msg_validators/tx_validator/phases_validator.js +3 -3
  106. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +2 -1
  107. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
  108. package/dest/msg_validators/tx_validator/tx_proof_validator.js +2 -0
  109. package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts +48 -0
  110. package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts.map +1 -0
  111. package/dest/msg_validators/tx_validator/tx_validation_cache.js +68 -0
  112. package/dest/services/data_store.d.ts +1 -1
  113. package/dest/services/data_store.d.ts.map +1 -1
  114. package/dest/services/data_store.js +5 -5
  115. package/dest/services/discv5/discV5_service.d.ts +13 -2
  116. package/dest/services/discv5/discV5_service.d.ts.map +1 -1
  117. package/dest/services/discv5/discV5_service.js +119 -23
  118. package/dest/services/discv5/persisted_enr_store.d.ts +38 -0
  119. package/dest/services/discv5/persisted_enr_store.d.ts.map +1 -0
  120. package/dest/services/discv5/persisted_enr_store.js +145 -0
  121. package/dest/services/dummy_service.d.ts +15 -15
  122. package/dest/services/dummy_service.d.ts.map +1 -1
  123. package/dest/services/dummy_service.js +15 -16
  124. package/dest/services/encoding.d.ts +8 -8
  125. package/dest/services/encoding.d.ts.map +1 -1
  126. package/dest/services/encoding.js +11 -15
  127. package/dest/services/gossipsub/topic_score_params.d.ts +6 -12
  128. package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -1
  129. package/dest/services/gossipsub/topic_score_params.js +4 -14
  130. package/dest/services/libp2p/instrumentation.d.ts +3 -1
  131. package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
  132. package/dest/services/libp2p/instrumentation.js +14 -0
  133. package/dest/services/libp2p/libp2p_service.d.ts +44 -39
  134. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  135. package/dest/services/libp2p/libp2p_service.js +383 -278
  136. package/dest/services/peer-manager/peer_manager.d.ts +20 -3
  137. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  138. package/dest/services/peer-manager/peer_manager.js +79 -23
  139. package/dest/services/peer-manager/peer_scoring.d.ts +34 -2
  140. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  141. package/dest/services/peer-manager/peer_scoring.js +102 -13
  142. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +1 -8
  143. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -1
  144. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +38 -44
  145. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +8 -5
  146. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
  147. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +5 -14
  148. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -1
  149. package/dest/services/reqresp/batch-tx-requester/tx_validator.js +6 -20
  150. package/dest/services/reqresp/config.d.ts +3 -3
  151. package/dest/services/reqresp/config.d.ts.map +1 -1
  152. package/dest/services/reqresp/interface.d.ts +16 -18
  153. package/dest/services/reqresp/interface.d.ts.map +1 -1
  154. package/dest/services/reqresp/interface.js +10 -20
  155. package/dest/services/reqresp/metrics.d.ts +1 -1
  156. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  157. package/dest/services/reqresp/metrics.js +0 -1
  158. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +4 -3
  159. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -1
  160. package/dest/services/reqresp/protocols/block_txs/bitvector.js +3 -2
  161. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +1 -1
  162. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
  163. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +31 -28
  164. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +12 -7
  165. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
  166. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +42 -24
  167. package/dest/services/reqresp/protocols/index.d.ts +1 -2
  168. package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
  169. package/dest/services/reqresp/protocols/index.js +0 -1
  170. package/dest/services/reqresp/protocols/tx.d.ts +1 -1
  171. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  172. package/dest/services/reqresp/protocols/tx.js +1 -3
  173. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +5 -4
  174. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
  175. package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -8
  176. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
  177. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
  178. package/dest/services/reqresp/rate-limiter/rate_limits.js +0 -10
  179. package/dest/services/reqresp/reqresp.d.ts +7 -29
  180. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  181. package/dest/services/reqresp/reqresp.js +26 -207
  182. package/dest/services/service.d.ts +25 -12
  183. package/dest/services/service.d.ts.map +1 -1
  184. package/dest/services/tx_collection/config.d.ts +2 -23
  185. package/dest/services/tx_collection/config.d.ts.map +1 -1
  186. package/dest/services/tx_collection/config.js +2 -55
  187. package/dest/services/tx_collection/file_store_tx_collection.d.ts +12 -28
  188. package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -1
  189. package/dest/services/tx_collection/file_store_tx_collection.js +43 -83
  190. package/dest/services/tx_collection/file_store_tx_source.d.ts +5 -4
  191. package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -1
  192. package/dest/services/tx_collection/file_store_tx_source.js +39 -29
  193. package/dest/services/tx_collection/index.d.ts +2 -3
  194. package/dest/services/tx_collection/index.d.ts.map +1 -1
  195. package/dest/services/tx_collection/index.js +0 -1
  196. package/dest/services/tx_collection/instrumentation.d.ts +1 -1
  197. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
  198. package/dest/services/tx_collection/instrumentation.js +0 -2
  199. package/dest/services/tx_collection/tx_collection.d.ts +35 -51
  200. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  201. package/dest/services/tx_collection/tx_collection.js +275 -119
  202. package/dest/services/tx_collection/tx_collection_sink.d.ts +1 -1
  203. package/dest/services/tx_collection/tx_collection_sink.js +2 -2
  204. package/dest/services/tx_collection/tx_source.d.ts +6 -5
  205. package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
  206. package/dest/services/tx_collection/tx_source.js +13 -8
  207. package/dest/services/tx_file_store/tx_file_store.d.ts +1 -3
  208. package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -1
  209. package/dest/services/tx_file_store/tx_file_store.js +4 -14
  210. package/dest/services/tx_provider.d.ts +3 -1
  211. package/dest/services/tx_provider.d.ts.map +1 -1
  212. package/dest/services/tx_provider.js +3 -0
  213. package/dest/test-helpers/make-test-p2p-clients.d.ts +1 -1
  214. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  215. package/dest/test-helpers/make-test-p2p-clients.js +5 -2
  216. package/dest/test-helpers/mock-pubsub.d.ts +23 -9
  217. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  218. package/dest/test-helpers/mock-pubsub.js +44 -44
  219. package/dest/test-helpers/reqresp-nodes.d.ts +4 -5
  220. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  221. package/dest/test-helpers/reqresp-nodes.js +16 -18
  222. package/dest/test-helpers/test_tx_provider.d.ts +3 -1
  223. package/dest/test-helpers/test_tx_provider.d.ts.map +1 -1
  224. package/dest/test-helpers/test_tx_provider.js +3 -0
  225. package/dest/test-helpers/testbench-utils.d.ts +14 -14
  226. package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
  227. package/dest/test-helpers/testbench-utils.js +25 -13
  228. package/dest/testbench/p2p_client_testbench_worker.d.ts +3 -5
  229. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  230. package/dest/testbench/p2p_client_testbench_worker.js +102 -41
  231. package/dest/testbench/worker_client_manager.d.ts +10 -6
  232. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  233. package/dest/testbench/worker_client_manager.js +51 -9
  234. package/dest/util.d.ts +11 -6
  235. package/dest/util.d.ts.map +1 -1
  236. package/dest/util.js +35 -14
  237. package/dest/versioning.d.ts +3 -6
  238. package/dest/versioning.d.ts.map +1 -1
  239. package/dest/versioning.js +3 -24
  240. package/package.json +16 -16
  241. package/src/bootstrap/bootstrap.ts +17 -3
  242. package/src/client/factory.ts +52 -24
  243. package/src/client/interface.ts +38 -17
  244. package/src/client/p2p_client.ts +118 -76
  245. package/src/client/test/{tx_proposal_collector/README.md → p2p_client.batch_tx_requester.bench.README.md} +23 -53
  246. package/src/config.ts +130 -31
  247. package/src/errors/p2p-service.error.ts +11 -0
  248. package/src/errors/reqresp.error.ts +0 -25
  249. package/src/index.ts +0 -1
  250. package/src/mem_pools/attestation_pool/attestation_pool.ts +319 -238
  251. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +198 -62
  252. package/src/mem_pools/attestation_pool/mocks.ts +13 -8
  253. package/src/mem_pools/index.ts +0 -3
  254. package/src/mem_pools/instrumentation.ts +5 -1
  255. package/src/mem_pools/tx_pool_v2/archive/tx_archive.ts +1 -9
  256. package/src/mem_pools/tx_pool_v2/deleted_pool.ts +7 -7
  257. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +1 -1
  258. package/src/mem_pools/tx_pool_v2/eviction/index.ts +1 -0
  259. package/src/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.ts +65 -0
  260. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +3 -3
  261. package/src/mem_pools/tx_pool_v2/interfaces.ts +18 -4
  262. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +20 -8
  263. package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +12 -0
  264. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +8 -4
  265. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +163 -117
  266. package/src/msg_validators/attestation_validator/attestation_validator.ts +46 -15
  267. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +15 -7
  268. package/src/msg_validators/proposal_validator/README.md +1 -1
  269. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +15 -3
  270. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +26 -3
  271. package/src/msg_validators/proposal_validator/proposal_validator.ts +89 -11
  272. package/src/msg_validators/tx_validator/README.md +13 -3
  273. package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +3 -12
  274. package/src/msg_validators/tx_validator/allowed_public_setup.ts +3 -3
  275. package/src/msg_validators/tx_validator/archive_cache.ts +1 -1
  276. package/src/msg_validators/tx_validator/cached_tx_validator.ts +31 -0
  277. package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
  278. package/src/msg_validators/tx_validator/data_validator.ts +44 -1
  279. package/src/msg_validators/tx_validator/factory.ts +44 -20
  280. package/src/msg_validators/tx_validator/gas_validator.ts +99 -54
  281. package/src/msg_validators/tx_validator/index.ts +2 -0
  282. package/src/msg_validators/tx_validator/phases_validator.ts +3 -3
  283. package/src/msg_validators/tx_validator/tx_proof_validator.ts +2 -0
  284. package/src/msg_validators/tx_validator/tx_validation_cache.ts +101 -0
  285. package/src/services/data_store.ts +5 -13
  286. package/src/services/discv5/discV5_service.ts +126 -14
  287. package/src/services/discv5/persisted_enr_store.ts +158 -0
  288. package/src/services/dummy_service.ts +20 -39
  289. package/src/services/encoding.ts +11 -21
  290. package/src/services/gossipsub/README.md +33 -11
  291. package/src/services/gossipsub/topic_score_params.ts +9 -18
  292. package/src/services/libp2p/instrumentation.ts +14 -0
  293. package/src/services/libp2p/libp2p_service.ts +436 -311
  294. package/src/services/peer-manager/peer_manager.ts +86 -22
  295. package/src/services/peer-manager/peer_scoring.ts +102 -8
  296. package/src/services/reqresp/README.md +0 -14
  297. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +42 -52
  298. package/src/services/reqresp/batch-tx-requester/interface.ts +11 -4
  299. package/src/services/reqresp/batch-tx-requester/tx_validator.ts +12 -25
  300. package/src/services/reqresp/config.ts +2 -2
  301. package/src/services/reqresp/interface.ts +21 -47
  302. package/src/services/reqresp/metrics.ts +0 -1
  303. package/src/services/reqresp/protocols/block_txs/bitvector.ts +3 -2
  304. package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +34 -30
  305. package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +47 -20
  306. package/src/services/reqresp/protocols/index.ts +0 -1
  307. package/src/services/reqresp/protocols/tx.ts +1 -3
  308. package/src/services/reqresp/rate-limiter/rate_limiter.ts +13 -9
  309. package/src/services/reqresp/rate-limiter/rate_limits.ts +0 -10
  310. package/src/services/reqresp/reqresp.ts +29 -252
  311. package/src/services/service.ts +31 -28
  312. package/src/services/tx_collection/config.ts +3 -80
  313. package/src/services/tx_collection/file_store_tx_collection.ts +54 -103
  314. package/src/services/tx_collection/file_store_tx_source.ts +43 -31
  315. package/src/services/tx_collection/index.ts +1 -6
  316. package/src/services/tx_collection/instrumentation.ts +1 -7
  317. package/src/services/tx_collection/tx_collection.ts +330 -173
  318. package/src/services/tx_collection/tx_collection_sink.ts +2 -2
  319. package/src/services/tx_collection/tx_source.ts +10 -8
  320. package/src/services/tx_file_store/tx_file_store.ts +5 -17
  321. package/src/services/tx_provider.ts +5 -0
  322. package/src/test-helpers/make-test-p2p-clients.ts +3 -0
  323. package/src/test-helpers/mock-pubsub.ts +46 -60
  324. package/src/test-helpers/reqresp-nodes.ts +12 -22
  325. package/src/test-helpers/test_tx_provider.ts +5 -0
  326. package/src/test-helpers/testbench-utils.ts +31 -26
  327. package/src/testbench/p2p_client_testbench_worker.ts +110 -55
  328. package/src/testbench/worker_client_manager.ts +59 -20
  329. package/src/util.ts +32 -17
  330. package/src/versioning.ts +3 -33
  331. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts +0 -2
  332. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts.map +0 -1
  333. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +0 -305
  334. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts +0 -73
  335. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts.map +0 -1
  336. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.js +0 -8
  337. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +0 -125
  338. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +0 -1
  339. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +0 -596
  340. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +0 -32
  341. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +0 -1
  342. package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +0 -112
  343. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +0 -157
  344. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +0 -1
  345. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +0 -52
  346. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +0 -16
  347. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +0 -1
  348. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +0 -123
  349. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +0 -17
  350. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +0 -1
  351. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +0 -84
  352. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +0 -19
  353. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +0 -1
  354. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +0 -78
  355. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +0 -26
  356. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +0 -1
  357. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +0 -84
  358. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +0 -25
  359. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +0 -1
  360. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +0 -57
  361. package/dest/mem_pools/tx_pool/index.d.ts +0 -3
  362. package/dest/mem_pools/tx_pool/index.d.ts.map +0 -1
  363. package/dest/mem_pools/tx_pool/index.js +0 -2
  364. package/dest/mem_pools/tx_pool/priority.d.ts +0 -12
  365. package/dest/mem_pools/tx_pool/priority.d.ts.map +0 -1
  366. package/dest/mem_pools/tx_pool/priority.js +0 -15
  367. package/dest/mem_pools/tx_pool/tx_pool.d.ts +0 -127
  368. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +0 -1
  369. package/dest/mem_pools/tx_pool/tx_pool.js +0 -3
  370. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +0 -7
  371. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +0 -1
  372. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +0 -402
  373. package/dest/msg_validators/clock_tolerance.d.ts +0 -21
  374. package/dest/msg_validators/clock_tolerance.d.ts.map +0 -1
  375. package/dest/msg_validators/clock_tolerance.js +0 -38
  376. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +0 -64
  377. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +0 -1
  378. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +0 -151
  379. package/dest/services/reqresp/protocols/block.d.ts +0 -9
  380. package/dest/services/reqresp/protocols/block.d.ts.map +0 -1
  381. package/dest/services/reqresp/protocols/block.js +0 -32
  382. package/dest/services/tx_collection/fast_tx_collection.d.ts +0 -51
  383. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +0 -1
  384. package/dest/services/tx_collection/fast_tx_collection.js +0 -311
  385. package/dest/services/tx_collection/proposal_tx_collector.d.ts +0 -48
  386. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +0 -1
  387. package/dest/services/tx_collection/proposal_tx_collector.js +0 -50
  388. package/dest/services/tx_collection/slow_tx_collection.d.ts +0 -57
  389. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +0 -1
  390. package/dest/services/tx_collection/slow_tx_collection.js +0 -211
  391. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +0 -344
  392. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.ts +0 -43
  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 -163
  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 -321
  406. package/src/msg_validators/clock_tolerance.ts +0 -52
  407. package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +0 -161
  408. package/src/services/reqresp/protocols/block.ts +0 -37
  409. package/src/services/tx_collection/fast_tx_collection.ts +0 -361
  410. package/src/services/tx_collection/proposal_tx_collector.ts +0 -108
  411. package/src/services/tx_collection/slow_tx_collection.ts +0 -266
@@ -1,13 +1,30 @@
1
1
  import type { EpochCacheInterface } from '@aztec/epoch-cache';
2
- import type { CheckpointProposal, P2PValidator, ValidationResult } from '@aztec/stdlib/p2p';
2
+ import type {
3
+ CheckpointProposal,
4
+ CoordinationSignatureContext,
5
+ P2PValidator,
6
+ ValidationResult,
7
+ } from '@aztec/stdlib/p2p';
8
+ import type { ConsensusTimetable } from '@aztec/stdlib/timetable';
3
9
 
4
10
  import { ProposalValidator } from '../proposal_validator/proposal_validator.js';
5
11
 
6
12
  export class CheckpointProposalValidator implements P2PValidator<CheckpointProposal> {
7
13
  private proposalValidator: ProposalValidator;
8
14
 
9
- constructor(epochCache: EpochCacheInterface, opts: { txsPermitted: boolean; maxTxsPerBlock?: number }) {
10
- this.proposalValidator = new ProposalValidator(epochCache, opts, 'p2p:checkpoint_proposal_validator');
15
+ constructor(
16
+ epochCache: EpochCacheInterface,
17
+ timetable: ConsensusTimetable,
18
+ opts: {
19
+ txsPermitted: boolean;
20
+ maxTxsPerBlock?: number;
21
+ maxBlocksPerCheckpoint?: number;
22
+ skipSlotValidation?: boolean;
23
+ signatureContext: CoordinationSignatureContext;
24
+ clockDisparityMs: number;
25
+ },
26
+ ) {
27
+ this.proposalValidator = new ProposalValidator(epochCache, timetable, opts, 'p2p:checkpoint_proposal_validator');
11
28
  }
12
29
 
13
30
  async validate(proposal: CheckpointProposal): Promise<ValidationResult> {
@@ -18,6 +35,12 @@ export class CheckpointProposalValidator implements P2PValidator<CheckpointPropo
18
35
 
19
36
  const blockProposal = proposal.getBlockProposal();
20
37
  if (blockProposal) {
38
+ // The terminal block is carried inside the checkpoint proposal rather than gossiped as a
39
+ // standalone block proposal, so apply the per-checkpoint block ceiling to it here too.
40
+ const indexResult = this.proposalValidator.validateBlockIndexWithinCheckpoint(blockProposal);
41
+ if (indexResult.result !== 'accept') {
42
+ return indexResult;
43
+ }
21
44
  return this.proposalValidator.validateTxs(blockProposal);
22
45
  }
23
46
 
@@ -1,48 +1,91 @@
1
1
  import type { EpochCacheInterface } from '@aztec/epoch-cache';
2
2
  import { NoCommitteeError } from '@aztec/ethereum/contracts';
3
3
  import { type Logger, createLogger } from '@aztec/foundation/log';
4
+ import { MAX_ATTESTABLE_BLOCKS_PER_CHECKPOINT } from '@aztec/stdlib/deserialization';
4
5
  import {
5
6
  type BlockProposal,
6
7
  type CheckpointProposalCore,
8
+ type CoordinationSignatureContext,
7
9
  PeerErrorSeverity,
8
10
  type ValidationResult,
11
+ hasValidSignatureContext,
9
12
  } from '@aztec/stdlib/p2p';
10
-
11
- import { isWithinClockTolerance } from '../clock_tolerance.js';
13
+ import type { ConsensusTimetable } from '@aztec/stdlib/timetable';
12
14
 
13
15
  /** Validates header-level and tx-level fields of block and checkpoint proposals. */
14
16
  export class ProposalValidator {
15
17
  private epochCache: EpochCacheInterface;
18
+ private timetable: ConsensusTimetable;
16
19
  private logger: Logger;
17
20
  private txsPermitted: boolean;
18
21
  private maxTxsPerBlock?: number;
22
+ private skipSlotValidation: boolean;
23
+ private signatureContext: CoordinationSignatureContext;
24
+ private clockDisparityMs: number;
19
25
 
20
26
  constructor(
21
27
  epochCache: EpochCacheInterface,
22
- opts: { txsPermitted: boolean; maxTxsPerBlock?: number },
28
+ timetable: ConsensusTimetable,
29
+ opts: {
30
+ txsPermitted: boolean;
31
+ maxTxsPerBlock?: number;
32
+ maxBlocksPerCheckpoint?: number;
33
+ skipSlotValidation?: boolean;
34
+ signatureContext: CoordinationSignatureContext;
35
+ clockDisparityMs: number;
36
+ },
23
37
  loggerName: string,
24
38
  ) {
25
39
  this.epochCache = epochCache;
40
+ this.timetable = timetable;
26
41
  this.txsPermitted = opts.txsPermitted;
27
42
  this.maxTxsPerBlock = opts.maxTxsPerBlock;
43
+ this.skipSlotValidation = opts.skipSlotValidation ?? false;
44
+ this.signatureContext = opts.signatureContext;
45
+ this.clockDisparityMs = opts.clockDisparityMs;
28
46
  this.logger = createLogger(loggerName);
29
47
  }
30
48
 
31
49
  /** Validates header-level fields: slot, signature, and proposer. */
32
50
  public async validate(proposal: BlockProposal | CheckpointProposalCore): Promise<ValidationResult> {
33
51
  try {
34
- // Slot check: use target slots since proposals target pipeline slots (slot + 1 when pipelining)
35
- const { targetSlot, nextSlot } = this.epochCache.getTargetAndNextSlot();
52
+ // Cross-chain replay check: reject proposals that carry a foreign signing domain.
53
+ if (!hasValidSignatureContext(proposal, this.signatureContext)) {
54
+ this.logger.warn(`Penalizing peer for proposal with foreign signature context`, {
55
+ chainId: proposal.signatureContext.chainId,
56
+ rollupAddress: proposal.signatureContext.rollupAddress.toString(),
57
+ expectedChainId: this.signatureContext.chainId,
58
+ expectedRollupAddress: this.signatureContext.rollupAddress.toString(),
59
+ });
60
+ return { result: 'reject', severity: PeerErrorSeverity.LowToleranceError };
61
+ }
36
62
 
63
+ // Slot check: the tight checkpoint proposal receive window (`[receiveStart - δ, target_slot_start -
64
+ // E - D + δ]`) is the sole acceptance gate, applied to both block and checkpoint proposals. The
65
+ // window itself bounds which slots are valid, so far/wrong slots fall outside it. Every block
66
+ // proposal for slot N is sent before the checkpoint proposal for slot N, so nothing legitimate can
67
+ // arrive after the checkpoint receive deadline; gating block proposals on the same window rejects
68
+ // late block proposals at p2p ingress. The attestation deadline remains their re-execution/
69
+ // validation deadline downstream, not their arrival gate.
37
70
  const slotNumber = proposal.slotNumber;
38
- if (slotNumber !== targetSlot && slotNumber !== nextSlot) {
39
- // Check if message is for previous slot and within clock tolerance
40
- if (!isWithinClockTolerance(slotNumber, targetSlot, this.epochCache)) {
41
- this.logger.warn(`Penalizing peer for invalid slot number ${slotNumber}`, { targetSlot, nextSlot });
71
+ if (!this.skipSlotValidation) {
72
+ // Proposal receive window: [checkpoint_proposal_receive_start, checkpoint_proposal_receive_deadline],
73
+ // widened by the configured clock-disparity tolerance on both ends.
74
+ const startSeconds = this.timetable.getCheckpointProposalReceiveStart(slotNumber);
75
+ const deadlineSeconds = this.timetable.getCheckpointProposalReceiveDeadline(slotNumber);
76
+ const nowMs = Number(this.epochCache.getEpochAndSlotNow().nowMs);
77
+ if (
78
+ nowMs < startSeconds * 1000 - this.clockDisparityMs ||
79
+ nowMs > deadlineSeconds * 1000 + this.clockDisparityMs
80
+ ) {
81
+ this.logger.warn(`Penalizing peer for invalid slot number ${slotNumber}`, {
82
+ slotNumber,
83
+ nowMs,
84
+ windowStartSeconds: startSeconds,
85
+ windowDeadlineSeconds: deadlineSeconds,
86
+ });
42
87
  return { result: 'reject', severity: PeerErrorSeverity.HighToleranceError };
43
88
  }
44
- this.logger.verbose(`Ignoring proposal for previous slot ${slotNumber} within clock tolerance`);
45
- return { result: 'ignore' };
46
89
  }
47
90
 
48
91
  // Signature validity
@@ -62,6 +105,19 @@ export class ProposalValidator {
62
105
  return { result: 'reject', severity: PeerErrorSeverity.MidToleranceError };
63
106
  }
64
107
 
108
+ // A block proposal whose index lands at or beyond the hard attestable ceiling is structurally
109
+ // impossible garbage, so reject it immediately at ingress. Indices in
110
+ // `[maxBlocksPerCheckpoint, MAX_ATTESTABLE_BLOCKS_PER_CHECKPOINT)` are over the consensus limit
111
+ // but structurally valid proposer misbehavior; they pass gossip validation here so the offending
112
+ // proposal can be retained and re-broadcast as slashing evidence (handled downstream in the p2p
113
+ // service), rather than penalizing the relaying peer.
114
+ if ('indexWithinCheckpoint' in proposal) {
115
+ const indexResult = this.validateBlockIndexWithinCheckpoint(proposal);
116
+ if (indexResult.result !== 'accept') {
117
+ return indexResult;
118
+ }
119
+ }
120
+
65
121
  return { result: 'accept' };
66
122
  } catch (e) {
67
123
  if (e instanceof NoCommitteeError) {
@@ -71,6 +127,28 @@ export class ProposalValidator {
71
127
  }
72
128
  }
73
129
 
130
+ /**
131
+ * Rejects a block proposal whose index within its checkpoint lands at or beyond the hard attestable
132
+ * ceiling `MAX_ATTESTABLE_BLOCKS_PER_CHECKPOINT` (a structurally impossible index that can never be
133
+ * part of any checkpoint we could attest to). `indexWithinCheckpoint` is 0-based, so a ceiling of 72
134
+ * rejects the 73rd block.
135
+ *
136
+ * Indices in `[maxBlocksPerCheckpoint, MAX_ATTESTABLE_BLOCKS_PER_CHECKPOINT)` are over the configured
137
+ * consensus limit but still structurally valid: they are proposer misbehavior, not relaying-peer
138
+ * fault, so they are *not* rejected here. The p2p service retains and re-broadcasts the first such
139
+ * proposal per (slot, proposer) as slashing evidence and skips processing it. Applies to standalone
140
+ * block proposals and to the terminal block embedded in a checkpoint proposal.
141
+ */
142
+ public validateBlockIndexWithinCheckpoint(proposal: BlockProposal): ValidationResult {
143
+ if (proposal.indexWithinCheckpoint >= MAX_ATTESTABLE_BLOCKS_PER_CHECKPOINT) {
144
+ this.logger.warn(
145
+ `Penalizing peer for proposal with indexWithinCheckpoint ${proposal.indexWithinCheckpoint} >= attestable ceiling ${MAX_ATTESTABLE_BLOCKS_PER_CHECKPOINT}`,
146
+ );
147
+ return { result: 'reject', severity: PeerErrorSeverity.MidToleranceError };
148
+ }
149
+ return { result: 'accept' };
150
+ }
151
+
74
152
  /** Validates transaction-related fields of a block proposal. */
75
153
  public async validateTxs(proposal: BlockProposal): Promise<ValidationResult> {
76
154
  // Transactions permitted check
@@ -75,7 +75,7 @@ This validator is invoked on **every** transaction potentially entering the pend
75
75
  - Startup hydration — revalidating persisted non-mined txs on node restart
76
76
 
77
77
  Runs:
78
- - DoubleSpend, BlockHeader, GasLimits, Timestamp, AllowedSetupCalls
78
+ - DoubleSpend, BlockHeader, GasLimits, MaxFeePerGas, Timestamp, AllowedSetupCalls
79
79
 
80
80
  Operates on `TxMetaData` (pre-built by the pool) rather than full `Tx` objects.
81
81
 
@@ -91,8 +91,9 @@ The `AllowedSetupCallsMetaValidator` checks a precomputed boolean flag (`TxMetaD
91
91
  | `MetadataTxValidator` | Chain ID, rollup version, protocol contracts hash, VK tree root | 4.18 us |
92
92
  | `TimestampTxValidator` | Transaction has not expired (expiration timestamp vs next slot) | 1.56 us |
93
93
  | `DoubleSpendTxValidator` | Nullifiers do not already exist in the nullifier tree | 106.08 us |
94
- | `GasTxValidator` | Gas limits are within bounds (delegates to `GasLimitsValidator`), max fee per gas meets current block fees, and fee payer has sufficient FeeJuice balance | 1.02 ms |
94
+ | `GasTxValidator` | Gas limits are within bounds (delegates to `GasLimitsValidator`), max fee per gas meets current block fees (delegates to `MaxFeePerGasValidator`), and fee payer has sufficient FeeJuice balance | 1.02 ms |
95
95
  | `GasLimitsValidator` | Gas limits are >= fixed minimums and <= AVM max processable L2 gas. Used standalone in pool migration; also called internally by `GasTxValidator` | 3–10 us |
96
+ | `MaxFeePerGasValidator` | Max fee per gas >= current block gas fees on both dimensions (DA and L2). Used standalone in pool migration; also called internally by `GasTxValidator` | 3–10 us |
96
97
  | `PhasesTxValidator` | Public function calls in setup phase are on the allow list | 10.12–13.12 us |
97
98
  | `AllowedSetupCallsMetaValidator` | Checks the precomputed `allowedSetupCalls` flag on `TxMetaData`. Used in pool migration instead of the full `PhasesTxValidator` | — |
98
99
  | `BlockHeaderTxValidator` | Transaction's anchor block hash exists in the archive tree | 98.88 us |
@@ -110,10 +111,19 @@ The `AllowedSetupCallsMetaValidator` checks a precomputed boolean flag (`TxMetaD
110
111
  | DoubleSpend | Stage 1 | Yes | — | Yes | Yes |
111
112
  | Gas (balance + limits) | Stage 1 | Optional* | — | Yes | — |
112
113
  | GasLimits (standalone) | — | — | — | — | Yes |
114
+ | MaxFeePerGas (standalone) | — | — | — | — | Yes |
113
115
  | Phases | Stage 1 | Yes | — | Yes | — |
114
116
  | AllowedSetupCalls | — | — | — | — | Yes |
115
117
  | BlockHeader | Stage 1 | Yes | — | Yes | Yes |
116
118
  | Proof | Stage 2 | Optional** | Yes | — | — |
117
119
 
118
- \* Gas balance check is skipped when `skipFeeEnforcement` is set (testing/dev). `GasTxValidator` internally delegates to `GasLimitsValidator` as its first step, so gas limits are checked wherever `GasTxValidator` runs. Pool migration uses `GasLimitsValidator` standalone because it doesn't need the balance or fee-per-gas checks.
120
+ \* Gas balance check is skipped when `skipFeeEnforcement` is set (testing/dev). `GasTxValidator` internally delegates to `GasLimitsValidator` and `MaxFeePerGasValidator` as its first steps, so gas limits and fee-per-gas are checked wherever `GasTxValidator` runs. Pool migration uses `GasLimitsValidator` and `MaxFeePerGasValidator` standalone because it doesn't need the balance check.
119
121
  \** Proof verification is skipped for simulations (no verifier provided).
122
+
123
+ The gas-limit bounds `GasLimitsValidator` enforces here — the per-tx protocol maxima and the network admission limits — are documented in [`stdlib/src/gas/README.md`](../../../../stdlib/src/gas/README.md) under "Gas and Data Limits".
124
+
125
+ ## Fee-Per-Gas Rejection Strategy
126
+
127
+ The `MaxFeePerGasValidator` and `InsufficientFeePerGasEvictionRule` reject and evict transactions whose `maxFeesPerGas` falls below the current block's gas fees. This is a simple strategy: if a tx can't pay the current fees, it gets rejected on entry and evicted after each new block.
128
+
129
+ **Caveat**: This may evict transactions that would become valid again if block fees drop. A more nuanced approach would be to define a threshold (e.g., 50%) and only reject/evict when the tx's max fee falls below that fraction of the current fees. The current approach is simpler and ensures the pool doesn't accumulate transactions with low max fees that are unlikely to be mined soon.
@@ -11,22 +11,13 @@ export class AggregateTxValidator<T> implements TxValidator<T> {
11
11
  }
12
12
 
13
13
  async validateTx(tx: T): Promise<TxValidationResult> {
14
- const aggregate: { result: string; reason?: string[] } = { result: 'valid', reason: [] };
14
+ const reasons: string[] = [];
15
15
  for (const validator of this.validators) {
16
16
  const result = await validator.validateTx(tx);
17
17
  if (result.result === 'invalid') {
18
- aggregate.result = 'invalid';
19
- aggregate.reason!.push(...result.reason);
20
- } else if (result.result === 'skipped') {
21
- if (aggregate.result === 'valid') {
22
- aggregate.result = 'skipped';
23
- }
24
- aggregate.reason!.push(...result.reason);
18
+ reasons.push(...result.reason);
25
19
  }
26
20
  }
27
- if (aggregate.result === 'valid') {
28
- delete aggregate.reason;
29
- }
30
- return aggregate as TxValidationResult;
21
+ return reasons.length > 0 ? { result: 'invalid', reason: reasons } : { result: 'valid' };
31
22
  }
32
23
  }
@@ -1,6 +1,6 @@
1
1
  import { ProtocolContractAddress } from '@aztec/protocol-contracts';
2
- import { AuthRegistryArtifact } from '@aztec/protocol-contracts/auth-registry';
3
2
  import { FeeJuiceArtifact } from '@aztec/protocol-contracts/fee-juice';
3
+ import { AuthRegistryArtifact, STANDARD_AUTH_REGISTRY_ADDRESS } from '@aztec/standard-contracts/auth-registry';
4
4
  import type { AllowedElement } from '@aztec/stdlib/interfaces/server';
5
5
 
6
6
  import { buildAllowedElement } from './allowed_setup_helpers.js';
@@ -12,12 +12,12 @@ export async function getDefaultAllowedSetupFunctions(): Promise<AllowedElement[
12
12
  if (defaultAllowedSetupFunctions === undefined) {
13
13
  defaultAllowedSetupFunctions = await Promise.all([
14
14
  // AuthRegistry: needed for authwit support via private path (set_authorized_private enqueues _set_authorized)
15
- buildAllowedElement(AuthRegistryArtifact, { address: ProtocolContractAddress.AuthRegistry }, '_set_authorized', {
15
+ buildAllowedElement(AuthRegistryArtifact, { address: STANDARD_AUTH_REGISTRY_ADDRESS }, '_set_authorized', {
16
16
  onlySelf: true,
17
17
  rejectNullMsgSender: true,
18
18
  }),
19
19
  // AuthRegistry: needed for authwit support via public path (PublicFeePaymentMethod calls set_authorized directly)
20
- buildAllowedElement(AuthRegistryArtifact, { address: ProtocolContractAddress.AuthRegistry }, 'set_authorized', {
20
+ buildAllowedElement(AuthRegistryArtifact, { address: STANDARD_AUTH_REGISTRY_ADDRESS }, 'set_authorized', {
21
21
  rejectNullMsgSender: true,
22
22
  }),
23
23
  // FeeJuice: needed for claiming on the same tx as a spend (claim_and_end_setup enqueues this)
@@ -15,7 +15,7 @@ export class ArchiveCache implements ArchiveSource {
15
15
  }
16
16
 
17
17
  public async getArchiveIndices(archives: BlockHash[]): Promise<(bigint | undefined)[]> {
18
- const toCheckDb = archives.filter(n => !this.archives.has(n.toString())).map(n => n.toFr());
18
+ const toCheckDb = archives.filter(n => !this.archives.has(n.toString()));
19
19
  const dbHits = await this.db.findLeafIndices(MerkleTreeId.ARCHIVE, toCheckDb);
20
20
  dbHits.forEach((x, index) => {
21
21
  if (x !== undefined) {
@@ -0,0 +1,31 @@
1
+ import type { Tx, TxValidationResult, TxValidator } from '@aztec/stdlib/tx';
2
+
3
+ import type { ITxValidationCache } from './tx_validation_cache.js';
4
+
5
+ /** Wraps a {@link TxValidator} to cache its results in a shared {@link ITxValidationCache}. */
6
+ export class CachedTxValidator<T extends Tx> implements TxValidator<T> {
7
+ constructor(
8
+ private readonly inner: TxValidator<T>,
9
+ private readonly validatorSymbol: symbol,
10
+ private readonly cache: ITxValidationCache,
11
+ ) {}
12
+
13
+ public static new<T extends Tx>(
14
+ inner: TxValidator<T> & { identifier: symbol },
15
+ cache?: ITxValidationCache,
16
+ ): TxValidator<T> {
17
+ return CachedTxValidator.newWithIdentifier(inner, inner.identifier, cache);
18
+ }
19
+
20
+ public static newWithIdentifier<T extends Tx>(
21
+ inner: TxValidator<T>,
22
+ identifier: symbol,
23
+ cache?: ITxValidationCache,
24
+ ): TxValidator<T> {
25
+ return cache ? new CachedTxValidator(inner, identifier, cache) : inner;
26
+ }
27
+
28
+ public validateTx(tx: T): Promise<TxValidationResult> {
29
+ return this.cache.getOrValidate(this.validatorSymbol, tx, () => this.inner.validateTx(tx));
30
+ }
31
+ }
@@ -0,0 +1,56 @@
1
+ import { type Logger, type LoggerBindings, createLogger } from '@aztec/foundation/log';
2
+ import { ContractInstancePublishedEvent } from '@aztec/protocol-contracts/instance-registry';
3
+ import { computeContractAddressFromInstance } from '@aztec/stdlib/contract';
4
+ import {
5
+ TX_ERROR_INCORRECT_CONTRACT_ADDRESS,
6
+ TX_ERROR_MALFORMED_CONTRACT_INSTANCE_LOG,
7
+ type Tx,
8
+ type TxValidationResult,
9
+ type TxValidator,
10
+ } from '@aztec/stdlib/tx';
11
+
12
+ /** Validates that contract instance deployment logs contain correct addresses. */
13
+ export class ContractInstanceTxValidator implements TxValidator<Tx> {
14
+ #log: Logger;
15
+
16
+ constructor(bindings?: LoggerBindings) {
17
+ this.#log = createLogger('p2p:tx_validator:contract_instance', bindings);
18
+ }
19
+
20
+ async validateTx(tx: Tx): Promise<TxValidationResult> {
21
+ const reason = await this.#hasCorrectContractInstanceAddresses(tx);
22
+ return reason ? { result: 'invalid', reason: [reason] } : { result: 'valid' };
23
+ }
24
+
25
+ async #hasCorrectContractInstanceAddresses(tx: Tx): Promise<string | undefined> {
26
+ const privateLogs = tx.data.getNonEmptyPrivateLogs();
27
+ for (const log of privateLogs) {
28
+ if (!ContractInstancePublishedEvent.isContractInstancePublishedEvent(log)) {
29
+ continue;
30
+ }
31
+
32
+ let event;
33
+ try {
34
+ event = ContractInstancePublishedEvent.fromLog(log);
35
+ } catch (e) {
36
+ this.#log.warn(`Rejecting tx ${tx.getTxHash()}: failed to parse contract instance event: ${e}`);
37
+ return TX_ERROR_MALFORMED_CONTRACT_INSTANCE_LOG;
38
+ }
39
+
40
+ try {
41
+ const instance = event.toContractInstance();
42
+ const computedAddress = await computeContractAddressFromInstance(instance);
43
+ if (!computedAddress.equals(instance.address)) {
44
+ this.#log.warn(
45
+ `Rejecting tx ${tx.getTxHash()}: contract instance address mismatch. Claimed ${instance.address}, computed ${computedAddress}`,
46
+ );
47
+ return TX_ERROR_INCORRECT_CONTRACT_ADDRESS;
48
+ }
49
+ } catch (e) {
50
+ this.#log.warn(`Rejecting tx ${tx.getTxHash()}: failed to compute contract instance address: ${e}`);
51
+ return TX_ERROR_MALFORMED_CONTRACT_INSTANCE_LOG;
52
+ }
53
+ }
54
+ return undefined;
55
+ }
56
+ }
@@ -1,5 +1,7 @@
1
1
  import { MAX_FR_CALLDATA_TO_ALL_ENQUEUED_CALLS } from '@aztec/constants';
2
2
  import { type Logger, type LoggerBindings, createLogger } from '@aztec/foundation/log';
3
+ import { ContractClassPublishedEvent } from '@aztec/protocol-contracts/class-registry';
4
+ import { computeContractClassId } from '@aztec/stdlib/contract';
3
5
  import { computeCalldataHash } from '@aztec/stdlib/hash';
4
6
  import {
5
7
  TX_ERROR_CALLDATA_COUNT_MISMATCH,
@@ -9,13 +11,17 @@ import {
9
11
  TX_ERROR_CONTRACT_CLASS_LOG_LENGTH,
10
12
  TX_ERROR_CONTRACT_CLASS_LOG_SORTING,
11
13
  TX_ERROR_INCORRECT_CALLDATA,
14
+ TX_ERROR_INCORRECT_CONTRACT_CLASS_ID,
12
15
  TX_ERROR_INCORRECT_HASH,
16
+ TX_ERROR_MALFORMED_CONTRACT_CLASS_LOG,
13
17
  Tx,
14
18
  type TxValidationResult,
15
19
  type TxValidator,
16
20
  } from '@aztec/stdlib/tx';
17
21
 
18
22
  export class DataTxValidator implements TxValidator<Tx> {
23
+ public readonly identifier: symbol = Symbol('DataTxValidator');
24
+
19
25
  #log: Logger;
20
26
 
21
27
  constructor(bindings?: LoggerBindings) {
@@ -26,7 +32,8 @@ export class DataTxValidator implements TxValidator<Tx> {
26
32
  const reason =
27
33
  (await this.#hasCorrectHash(tx)) ??
28
34
  (await this.#hasCorrectCalldata(tx)) ??
29
- (await this.#hasCorrectContractClassLogs(tx));
35
+ (await this.#hasCorrectContractClassLogs(tx)) ??
36
+ (await this.#hasCorrectContractClassIds(tx));
30
37
  return reason ? { result: 'invalid', reason: [reason] } : { result: 'valid' };
31
38
  }
32
39
 
@@ -127,4 +134,40 @@ export class DataTxValidator implements TxValidator<Tx> {
127
134
 
128
135
  return undefined;
129
136
  }
137
+
138
+ async #hasCorrectContractClassIds(tx: Tx): Promise<string | undefined> {
139
+ const contractClassLogs = tx.getContractClassLogs();
140
+ for (const log of contractClassLogs) {
141
+ if (!ContractClassPublishedEvent.isContractClassPublishedEvent(log)) {
142
+ continue;
143
+ }
144
+
145
+ let event;
146
+ try {
147
+ event = ContractClassPublishedEvent.fromLog(log);
148
+ } catch (e) {
149
+ this.#log.warn(`Rejecting tx ${tx.getTxHash()}: failed to parse contract class event: ${e}`);
150
+ return TX_ERROR_MALFORMED_CONTRACT_CLASS_LOG;
151
+ }
152
+
153
+ try {
154
+ const { publicBytecodeCommitment } = await event.toContractClassPublicWithBytecodeCommitment();
155
+ const computedClassId = await computeContractClassId({
156
+ artifactHash: event.artifactHash,
157
+ privateFunctionsRoot: event.privateFunctionsRoot,
158
+ publicBytecodeCommitment,
159
+ });
160
+ if (!computedClassId.equals(event.contractClassId)) {
161
+ this.#log.warn(
162
+ `Rejecting tx ${tx.getTxHash()}: contract class id mismatch. Claimed ${event.contractClassId}, computed ${computedClassId}`,
163
+ );
164
+ return TX_ERROR_INCORRECT_CONTRACT_CLASS_ID;
165
+ }
166
+ } catch (e) {
167
+ this.#log.warn(`Rejecting tx ${tx.getTxHash()}: failed to compute contract class id: ${e}`);
168
+ return TX_ERROR_MALFORMED_CONTRACT_CLASS_LOG;
169
+ }
170
+ }
171
+ return undefined;
172
+ }
130
173
  }
@@ -53,9 +53,11 @@ import type { TxMetaData } from '../../mem_pools/tx_pool_v2/tx_metadata.js';
53
53
  import { AggregateTxValidator } from './aggregate_tx_validator.js';
54
54
  import { ArchiveCache } from './archive_cache.js';
55
55
  import { type ArchiveSource, BlockHeaderTxValidator } from './block_header_validator.js';
56
+ import { CachedTxValidator } from './cached_tx_validator.js';
57
+ import { ContractInstanceTxValidator } from './contract_instance_validator.js';
56
58
  import { DataTxValidator } from './data_validator.js';
57
59
  import { DoubleSpendTxValidator, type NullifierSource } from './double_spend_validator.js';
58
- import { GasLimitsValidator, GasTxValidator } from './gas_validator.js';
60
+ import { GasLimitsValidator, GasTxValidator, MaxFeePerGasValidator } from './gas_validator.js';
59
61
  import { MetadataTxValidator } from './metadata_validator.js';
60
62
  import { NullifierCache } from './nullifier_cache.js';
61
63
  import { AllowedSetupCallsMetaValidator, PhasesTxValidator } from './phases_validator.js';
@@ -63,6 +65,7 @@ import { SizeTxValidator } from './size_validator.js';
63
65
  import { TimestampTxValidator } from './timestamp_validator.js';
64
66
  import { TxPermittedValidator } from './tx_permitted_validator.js';
65
67
  import { TxProofValidator } from './tx_proof_validator.js';
68
+ import { TxValidationCache } from './tx_validation_cache.js';
66
69
 
67
70
  /**
68
71
  * A validator paired with a peer penalty severity.
@@ -97,7 +100,7 @@ export function createFirstStageTxValidationsForGossipedTransactions(
97
100
  txsPermitted: boolean,
98
101
  allowedInSetup: AllowedElement[] = [],
99
102
  bindings?: LoggerBindings,
100
- gasLimitOpts?: { rollupManaLimit?: number; maxBlockL2Gas?: number; maxBlockDAGas?: number },
103
+ gasLimitOpts?: { maxTxL2Gas?: number; maxTxDAGas?: number },
101
104
  ): Record<string, TransactionValidator> {
102
105
  const merkleTree = worldStateSynchronizer.getCommitted();
103
106
 
@@ -167,6 +170,10 @@ export function createFirstStageTxValidationsForGossipedTransactions(
167
170
  validator: new DataTxValidator(bindings),
168
171
  severity: PeerErrorSeverity.MidToleranceError,
169
172
  },
173
+ contractInstanceValidator: {
174
+ validator: new ContractInstanceTxValidator(bindings),
175
+ severity: PeerErrorSeverity.MidToleranceError,
176
+ },
170
177
  };
171
178
  }
172
179
 
@@ -205,8 +212,9 @@ function createTxValidatorForMinimumTxIntegrityChecks(
205
212
  rollupVersion: number;
206
213
  },
207
214
  bindings?: LoggerBindings,
215
+ cache?: TxValidationCache,
208
216
  ): TxValidator {
209
- return new AggregateTxValidator(
217
+ const aggregate = new AggregateTxValidator(
210
218
  new MetadataTxValidator(
211
219
  {
212
220
  l1ChainId: new Fr(l1ChainId),
@@ -217,9 +225,14 @@ function createTxValidatorForMinimumTxIntegrityChecks(
217
225
  bindings,
218
226
  ),
219
227
  new SizeTxValidator(bindings),
220
- new DataTxValidator(bindings),
221
- new TxProofValidator(verifier, bindings),
228
+ CachedTxValidator.new(new DataTxValidator(bindings), cache),
229
+ new ContractInstanceTxValidator(bindings),
230
+ CachedTxValidator.new(new TxProofValidator(verifier, bindings), cache),
222
231
  );
232
+
233
+ // This validator is not state-dependent so we can cache it.
234
+ const identifier = Symbol('TxValidatorForMinimumTxIntegrityChecks');
235
+ return CachedTxValidator.newWithIdentifier(aggregate, identifier, cache);
223
236
  }
224
237
 
225
238
  /**
@@ -228,7 +241,7 @@ function createTxValidatorForMinimumTxIntegrityChecks(
228
241
  * are invalid against current state. State-dependent checks happen when the tx
229
242
  * enters the pending pool or during block building.
230
243
  */
231
- export function createTxValidatorForReqResponseReceivedTxs(
244
+ export function createTxValidatorForOnDemandReceivedTxs(
232
245
  verifier: ClientProtocolCircuitVerifier,
233
246
  {
234
247
  l1ChainId,
@@ -238,8 +251,9 @@ export function createTxValidatorForReqResponseReceivedTxs(
238
251
  rollupVersion: number;
239
252
  },
240
253
  bindings?: LoggerBindings,
254
+ cache?: TxValidationCache,
241
255
  ): TxValidator {
242
- return createTxValidatorForMinimumTxIntegrityChecks(verifier, { l1ChainId, rollupVersion }, bindings);
256
+ return createTxValidatorForMinimumTxIntegrityChecks(verifier, { l1ChainId, rollupVersion }, bindings, cache);
243
257
  }
244
258
 
245
259
  /**
@@ -257,8 +271,9 @@ export function createTxValidatorForBlockProposalReceivedTxs(
257
271
  rollupVersion: number;
258
272
  },
259
273
  bindings?: LoggerBindings,
274
+ cache?: TxValidationCache,
260
275
  ): TxValidator {
261
- return createTxValidatorForMinimumTxIntegrityChecks(verifier, { l1ChainId, rollupVersion }, bindings);
276
+ return createTxValidatorForMinimumTxIntegrityChecks(verifier, { l1ChainId, rollupVersion }, bindings, cache);
262
277
  }
263
278
 
264
279
  /**
@@ -277,24 +292,24 @@ export function createTxValidatorForAcceptingTxsOverRPC(
277
292
  setupAllowList,
278
293
  gasFees,
279
294
  skipFeeEnforcement,
295
+ isSimulation,
280
296
  timestamp,
281
297
  blockNumber,
282
298
  txsPermitted,
283
- rollupManaLimit,
284
- maxBlockL2Gas,
285
- maxBlockDAGas,
299
+ maxTxL2Gas,
300
+ maxTxDAGas,
286
301
  }: {
287
302
  l1ChainId: number;
288
303
  rollupVersion: number;
289
304
  setupAllowList: AllowedElement[];
290
305
  gasFees: GasFees;
291
306
  skipFeeEnforcement?: boolean;
307
+ isSimulation?: boolean;
292
308
  timestamp: UInt64;
293
309
  blockNumber: BlockNumber;
294
310
  txsPermitted: boolean;
295
- rollupManaLimit: number;
296
- maxBlockL2Gas?: number;
297
- maxBlockDAGas?: number;
311
+ maxTxL2Gas?: number;
312
+ maxTxDAGas?: number;
298
313
  },
299
314
  bindings?: LoggerBindings,
300
315
  ): TxValidator<Tx> {
@@ -321,15 +336,22 @@ export function createTxValidatorForAcceptingTxsOverRPC(
321
336
  new BlockHeaderTxValidator(new ArchiveCache(db), bindings),
322
337
  new DoubleSpendTxValidator(new NullifierCache(db), bindings),
323
338
  new DataTxValidator(bindings),
339
+ new ContractInstanceTxValidator(bindings),
324
340
  ];
325
341
 
342
+ // Declared gas-limit admission is not fee enforcement, so it runs even when fees are skipped, but it is
343
+ // skipped during simulation: gas estimation submits intentionally-inflated `forEstimation` limits (above
344
+ // the per-tx max) and the wallet clamps the real tx to the admission limit afterward, so enforcing the
345
+ // limit on the estimation tx would reject a valid estimation. The fee-balance check below stays behind
346
+ // `skipFeeEnforcement`, and GasTxValidator is constructed without the limit opts so it does not re-run
347
+ // this same check.
348
+ if (!isSimulation) {
349
+ validators.push(new GasLimitsValidator<Tx>({ maxTxL2Gas, maxTxDAGas, bindings }));
350
+ }
351
+
326
352
  if (!skipFeeEnforcement) {
327
353
  validators.push(
328
- new GasTxValidator(new DatabasePublicStateSource(db), ProtocolContractAddress.FeeJuice, gasFees, bindings, {
329
- rollupManaLimit,
330
- maxBlockL2Gas,
331
- maxBlockDAGas,
332
- }),
354
+ new GasTxValidator(new DatabasePublicStateSource(db), ProtocolContractAddress.FeeJuice, gasFees, bindings),
333
355
  );
334
356
  }
335
357
 
@@ -415,7 +437,8 @@ export async function createTxValidatorForTransactionsEnteringPendingTxPool(
415
437
  worldStateSynchronizer: WorldStateSynchronizer,
416
438
  timestamp: bigint,
417
439
  blockNumber: BlockNumber,
418
- gasLimitOpts: { rollupManaLimit?: number; maxBlockL2Gas?: number; maxBlockDAGas?: number },
440
+ gasLimitOpts: { maxTxL2Gas?: number; maxTxDAGas?: number },
441
+ gasFees: GasFees,
419
442
  bindings?: LoggerBindings,
420
443
  ): Promise<TxValidator<TxMetaData>> {
421
444
  await worldStateSynchronizer.syncImmediate();
@@ -433,6 +456,7 @@ export async function createTxValidatorForTransactionsEnteringPendingTxPool(
433
456
  };
434
457
  return new AggregateTxValidator<TxMetaData>(
435
458
  new GasLimitsValidator<TxMetaData>({ ...gasLimitOpts, bindings }),
459
+ new MaxFeePerGasValidator<TxMetaData>(gasFees, bindings),
436
460
  new TimestampTxValidator<TxMetaData>({ timestamp, blockNumber }, bindings),
437
461
  new DoubleSpendTxValidator<TxMetaData>(nullifierSource, bindings),
438
462
  new BlockHeaderTxValidator<TxMetaData>(archiveSource, bindings),