@aztec/p2p 0.0.1-commit.24de95ac → 0.0.1-commit.3469e52

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 (362) hide show
  1. package/dest/bootstrap/bootstrap.d.ts +1 -1
  2. package/dest/bootstrap/bootstrap.d.ts.map +1 -1
  3. package/dest/client/factory.d.ts +2 -2
  4. package/dest/client/factory.d.ts.map +1 -1
  5. package/dest/client/factory.js +2 -3
  6. package/dest/client/index.d.ts +1 -1
  7. package/dest/client/interface.d.ts +18 -3
  8. package/dest/client/interface.d.ts.map +1 -1
  9. package/dest/client/p2p_client.d.ts +16 -37
  10. package/dest/client/p2p_client.d.ts.map +1 -1
  11. package/dest/client/p2p_client.js +464 -126
  12. package/dest/config.d.ts +62 -59
  13. package/dest/config.d.ts.map +1 -1
  14. package/dest/config.js +21 -14
  15. package/dest/enr/generate-enr.d.ts +1 -1
  16. package/dest/enr/index.d.ts +1 -1
  17. package/dest/errors/attestation-pool.error.d.ts +7 -0
  18. package/dest/errors/attestation-pool.error.d.ts.map +1 -0
  19. package/dest/errors/attestation-pool.error.js +12 -0
  20. package/dest/errors/reqresp.error.d.ts +1 -1
  21. package/dest/errors/reqresp.error.d.ts.map +1 -1
  22. package/dest/index.d.ts +1 -1
  23. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +77 -36
  24. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  25. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +1 -1
  26. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
  27. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +241 -266
  28. package/dest/mem_pools/attestation_pool/index.d.ts +1 -1
  29. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +24 -14
  30. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +1 -1
  31. package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +123 -95
  32. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +18 -12
  33. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +1 -1
  34. package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +91 -108
  35. package/dest/mem_pools/attestation_pool/mocks.d.ts +234 -10
  36. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  37. package/dest/mem_pools/attestation_pool/mocks.js +17 -13
  38. package/dest/mem_pools/index.d.ts +1 -1
  39. package/dest/mem_pools/instrumentation.d.ts +9 -1
  40. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  41. package/dest/mem_pools/instrumentation.js +36 -9
  42. package/dest/mem_pools/interface.d.ts +3 -4
  43. package/dest/mem_pools/interface.d.ts.map +1 -1
  44. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +34 -59
  45. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +1 -1
  46. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +314 -335
  47. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +31 -0
  48. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +1 -0
  49. package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +112 -0
  50. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +156 -0
  51. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +1 -0
  52. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +52 -0
  53. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +16 -0
  54. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -0
  55. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +115 -0
  56. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +17 -0
  57. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -0
  58. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +84 -0
  59. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +19 -0
  60. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -0
  61. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +76 -0
  62. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +26 -0
  63. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +1 -0
  64. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +84 -0
  65. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +25 -0
  66. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +1 -0
  67. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +57 -0
  68. package/dest/mem_pools/tx_pool/index.d.ts +1 -2
  69. package/dest/mem_pools/tx_pool/index.d.ts.map +1 -1
  70. package/dest/mem_pools/tx_pool/index.js +0 -1
  71. package/dest/mem_pools/tx_pool/priority.d.ts +5 -1
  72. package/dest/mem_pools/tx_pool/priority.d.ts.map +1 -1
  73. package/dest/mem_pools/tx_pool/priority.js +6 -1
  74. package/dest/mem_pools/tx_pool/tx_pool.d.ts +11 -6
  75. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +1 -1
  76. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +1 -1
  77. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +1 -1
  78. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +30 -24
  79. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +7 -6
  80. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  81. package/dest/msg_validators/attestation_validator/attestation_validator.js +18 -16
  82. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +20 -0
  83. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -0
  84. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +64 -0
  85. package/dest/msg_validators/attestation_validator/index.d.ts +2 -1
  86. package/dest/msg_validators/attestation_validator/index.d.ts.map +1 -1
  87. package/dest/msg_validators/attestation_validator/index.js +1 -0
  88. package/dest/msg_validators/index.d.ts +2 -2
  89. package/dest/msg_validators/index.d.ts.map +1 -1
  90. package/dest/msg_validators/index.js +1 -1
  91. package/dest/msg_validators/msg_seen_validator/msg_seen_validator.d.ts +1 -1
  92. package/dest/msg_validators/msg_seen_validator/msg_seen_validator.d.ts.map +1 -1
  93. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +9 -0
  94. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -0
  95. package/dest/msg_validators/proposal_validator/block_proposal_validator.js +6 -0
  96. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +9 -0
  97. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -0
  98. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +6 -0
  99. package/dest/msg_validators/proposal_validator/index.d.ts +4 -0
  100. package/dest/msg_validators/proposal_validator/index.d.ts.map +1 -0
  101. package/dest/msg_validators/proposal_validator/index.js +3 -0
  102. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +13 -0
  103. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -0
  104. package/dest/msg_validators/proposal_validator/proposal_validator.js +73 -0
  105. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +23 -0
  106. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +1 -0
  107. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +157 -0
  108. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +1 -1
  109. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  110. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +1 -1
  111. package/dest/msg_validators/tx_validator/archive_cache.d.ts +2 -2
  112. package/dest/msg_validators/tx_validator/archive_cache.d.ts.map +1 -1
  113. package/dest/msg_validators/tx_validator/block_header_validator.d.ts +2 -2
  114. package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
  115. package/dest/msg_validators/tx_validator/data_validator.d.ts +1 -1
  116. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  117. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +1 -1
  118. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
  119. package/dest/msg_validators/tx_validator/factory.d.ts +4 -3
  120. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  121. package/dest/msg_validators/tx_validator/factory.js +1 -1
  122. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +10 -0
  123. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -0
  124. package/dest/msg_validators/tx_validator/fee_payer_balance.js +20 -0
  125. package/dest/msg_validators/tx_validator/gas_validator.d.ts +1 -1
  126. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  127. package/dest/msg_validators/tx_validator/gas_validator.js +8 -14
  128. package/dest/msg_validators/tx_validator/index.d.ts +2 -1
  129. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  130. package/dest/msg_validators/tx_validator/index.js +1 -0
  131. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +2 -2
  132. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  133. package/dest/msg_validators/tx_validator/phases_validator.d.ts +1 -1
  134. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
  135. package/dest/msg_validators/tx_validator/phases_validator.js +3 -1
  136. package/dest/msg_validators/tx_validator/size_validator.d.ts +6 -0
  137. package/dest/msg_validators/tx_validator/size_validator.d.ts.map +1 -0
  138. package/dest/msg_validators/tx_validator/size_validator.js +20 -0
  139. package/dest/msg_validators/tx_validator/test_utils.d.ts +2 -2
  140. package/dest/msg_validators/tx_validator/test_utils.d.ts.map +1 -1
  141. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +3 -2
  142. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
  143. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts +1 -1
  144. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts.map +1 -1
  145. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +1 -1
  146. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
  147. package/dest/services/data_store.d.ts +1 -1
  148. package/dest/services/data_store.d.ts.map +1 -1
  149. package/dest/services/discv5/discV5_service.d.ts +1 -1
  150. package/dest/services/discv5/discV5_service.d.ts.map +1 -1
  151. package/dest/services/dummy_service.d.ts +6 -2
  152. package/dest/services/dummy_service.d.ts.map +1 -1
  153. package/dest/services/dummy_service.js +3 -0
  154. package/dest/services/encoding.d.ts +1 -1
  155. package/dest/services/encoding.d.ts.map +1 -1
  156. package/dest/services/encoding.js +7 -6
  157. package/dest/services/gossipsub/scoring.d.ts +1 -1
  158. package/dest/services/index.d.ts +1 -1
  159. package/dest/services/libp2p/instrumentation.d.ts +3 -1
  160. package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
  161. package/dest/services/libp2p/instrumentation.js +26 -72
  162. package/dest/services/libp2p/libp2p_service.d.ts +40 -79
  163. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  164. package/dest/services/libp2p/libp2p_service.js +885 -161
  165. package/dest/services/peer-manager/interface.d.ts +1 -1
  166. package/dest/services/peer-manager/metrics.d.ts +8 -1
  167. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  168. package/dest/services/peer-manager/metrics.js +24 -16
  169. package/dest/services/peer-manager/peer_manager.d.ts +2 -33
  170. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  171. package/dest/services/peer-manager/peer_manager.js +6 -12
  172. package/dest/services/peer-manager/peer_scoring.d.ts +7 -2
  173. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  174. package/dest/services/peer-manager/peer_scoring.js +37 -2
  175. package/dest/services/reqresp/config.d.ts +1 -1
  176. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +1 -1
  177. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +1 -1
  178. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +1 -4
  179. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -1
  180. package/dest/services/reqresp/constants.d.ts +12 -0
  181. package/dest/services/reqresp/constants.d.ts.map +1 -0
  182. package/dest/services/reqresp/constants.js +7 -0
  183. package/dest/services/reqresp/index.d.ts +1 -1
  184. package/dest/services/reqresp/interface.d.ts +4 -4
  185. package/dest/services/reqresp/interface.d.ts.map +1 -1
  186. package/dest/services/reqresp/interface.js +3 -3
  187. package/dest/services/reqresp/metrics.d.ts +1 -1
  188. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  189. package/dest/services/reqresp/metrics.js +5 -21
  190. package/dest/services/reqresp/protocols/auth.d.ts +2 -2
  191. package/dest/services/reqresp/protocols/auth.d.ts.map +1 -1
  192. package/dest/services/reqresp/protocols/auth.js +2 -2
  193. package/dest/services/reqresp/protocols/block.d.ts +1 -1
  194. package/dest/services/reqresp/protocols/block.d.ts.map +1 -1
  195. package/dest/services/reqresp/protocols/block.js +3 -2
  196. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +1 -1
  197. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -1
  198. package/dest/services/reqresp/protocols/block_txs/bitvector.js +7 -0
  199. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +1 -1
  200. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +4 -6
  201. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
  202. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +1 -1
  203. package/dest/services/reqresp/protocols/block_txs/index.d.ts +1 -1
  204. package/dest/services/reqresp/protocols/goodbye.d.ts +1 -1
  205. package/dest/services/reqresp/protocols/goodbye.d.ts.map +1 -1
  206. package/dest/services/reqresp/protocols/index.d.ts +1 -1
  207. package/dest/services/reqresp/protocols/ping.d.ts +1 -1
  208. package/dest/services/reqresp/protocols/status.d.ts +6 -5
  209. package/dest/services/reqresp/protocols/status.d.ts.map +1 -1
  210. package/dest/services/reqresp/protocols/status.js +7 -3
  211. package/dest/services/reqresp/protocols/tx.d.ts +2 -3
  212. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  213. package/dest/services/reqresp/rate-limiter/index.d.ts +1 -1
  214. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +2 -2
  215. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
  216. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
  217. package/dest/services/reqresp/reqresp.d.ts +1 -41
  218. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  219. package/dest/services/reqresp/reqresp.js +402 -24
  220. package/dest/services/reqresp/status.d.ts +2 -2
  221. package/dest/services/reqresp/status.d.ts.map +1 -1
  222. package/dest/services/service.d.ts +16 -3
  223. package/dest/services/service.d.ts.map +1 -1
  224. package/dest/services/tx_collection/config.d.ts +1 -1
  225. package/dest/services/tx_collection/config.js +1 -1
  226. package/dest/services/tx_collection/fast_tx_collection.d.ts +4 -9
  227. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
  228. package/dest/services/tx_collection/index.d.ts +1 -1
  229. package/dest/services/tx_collection/instrumentation.d.ts +1 -1
  230. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
  231. package/dest/services/tx_collection/instrumentation.js +4 -14
  232. package/dest/services/tx_collection/slow_tx_collection.d.ts +6 -7
  233. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -1
  234. package/dest/services/tx_collection/slow_tx_collection.js +2 -1
  235. package/dest/services/tx_collection/tx_collection.d.ts +11 -11
  236. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  237. package/dest/services/tx_collection/tx_collection_sink.d.ts +3 -3
  238. package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -1
  239. package/dest/services/tx_collection/tx_source.d.ts +1 -1
  240. package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
  241. package/dest/services/tx_provider.d.ts +6 -4
  242. package/dest/services/tx_provider.d.ts.map +1 -1
  243. package/dest/services/tx_provider.js +11 -2
  244. package/dest/services/tx_provider_instrumentation.d.ts +5 -2
  245. package/dest/services/tx_provider_instrumentation.d.ts.map +1 -1
  246. package/dest/services/tx_provider_instrumentation.js +13 -13
  247. package/dest/test-helpers/generate-peer-id-private-keys.d.ts +1 -1
  248. package/dest/test-helpers/get-ports.d.ts +1 -1
  249. package/dest/test-helpers/get-ports.d.ts.map +1 -1
  250. package/dest/test-helpers/index.d.ts +1 -1
  251. package/dest/test-helpers/make-enrs.d.ts +1 -1
  252. package/dest/test-helpers/make-test-p2p-clients.d.ts +2 -2
  253. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  254. package/dest/test-helpers/mock-pubsub.d.ts +4 -4
  255. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  256. package/dest/test-helpers/mock-tx-helpers.d.ts +2 -2
  257. package/dest/test-helpers/mock-tx-helpers.d.ts.map +1 -1
  258. package/dest/test-helpers/mock-tx-helpers.js +1 -1
  259. package/dest/test-helpers/reqresp-nodes.d.ts +2 -2
  260. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  261. package/dest/testbench/p2p_client_testbench_worker.d.ts +1 -1
  262. package/dest/testbench/p2p_client_testbench_worker.js +37 -21
  263. package/dest/testbench/parse_log_file.d.ts +1 -1
  264. package/dest/testbench/testbench.d.ts +1 -1
  265. package/dest/testbench/worker_client_manager.d.ts +1 -1
  266. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  267. package/dest/testbench/worker_client_manager.js +6 -1
  268. package/dest/types/index.d.ts +1 -1
  269. package/dest/util.d.ts +2 -1
  270. package/dest/util.d.ts.map +1 -1
  271. package/dest/util.js +11 -2
  272. package/dest/versioning.d.ts +1 -1
  273. package/package.json +19 -18
  274. package/src/client/factory.ts +5 -10
  275. package/src/client/interface.ts +20 -2
  276. package/src/client/p2p_client.ts +111 -158
  277. package/src/config.ts +30 -19
  278. package/src/errors/attestation-pool.error.ts +13 -0
  279. package/src/mem_pools/attestation_pool/attestation_pool.ts +86 -35
  280. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +243 -278
  281. package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +175 -111
  282. package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +147 -136
  283. package/src/mem_pools/attestation_pool/mocks.ts +21 -15
  284. package/src/mem_pools/instrumentation.ts +47 -10
  285. package/src/mem_pools/interface.ts +2 -4
  286. package/src/mem_pools/tx_pool/README.md +270 -0
  287. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +368 -372
  288. package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +131 -0
  289. package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +207 -0
  290. package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +159 -0
  291. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +104 -0
  292. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +91 -0
  293. package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +106 -0
  294. package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +75 -0
  295. package/src/mem_pools/tx_pool/index.ts +0 -1
  296. package/src/mem_pools/tx_pool/priority.ts +8 -1
  297. package/src/mem_pools/tx_pool/tx_pool.ts +11 -5
  298. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +23 -17
  299. package/src/msg_validators/attestation_validator/attestation_validator.ts +23 -22
  300. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +88 -0
  301. package/src/msg_validators/attestation_validator/index.ts +1 -0
  302. package/src/msg_validators/index.ts +1 -1
  303. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +10 -0
  304. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +13 -0
  305. package/src/msg_validators/proposal_validator/index.ts +3 -0
  306. package/src/msg_validators/proposal_validator/proposal_validator.ts +85 -0
  307. package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +191 -0
  308. package/src/msg_validators/tx_validator/archive_cache.ts +1 -1
  309. package/src/msg_validators/tx_validator/block_header_validator.ts +1 -1
  310. package/src/msg_validators/tx_validator/data_validator.ts +12 -4
  311. package/src/msg_validators/tx_validator/factory.ts +3 -2
  312. package/src/msg_validators/tx_validator/fee_payer_balance.ts +40 -0
  313. package/src/msg_validators/tx_validator/gas_validator.ts +8 -25
  314. package/src/msg_validators/tx_validator/index.ts +1 -0
  315. package/src/msg_validators/tx_validator/metadata_validator.ts +13 -5
  316. package/src/msg_validators/tx_validator/phases_validator.ts +3 -1
  317. package/src/msg_validators/tx_validator/size_validator.ts +18 -0
  318. package/src/msg_validators/tx_validator/test_utils.ts +1 -1
  319. package/src/msg_validators/tx_validator/timestamp_validator.ts +5 -2
  320. package/src/services/dummy_service.ts +6 -0
  321. package/src/services/encoding.ts +6 -5
  322. package/src/services/libp2p/instrumentation.ts +26 -71
  323. package/src/services/libp2p/libp2p_service.ts +555 -145
  324. package/src/services/peer-manager/metrics.ts +27 -16
  325. package/src/services/peer-manager/peer_manager.ts +7 -4
  326. package/src/services/peer-manager/peer_scoring.ts +42 -3
  327. package/src/services/reqresp/connection-sampler/connection_sampler.ts +3 -1
  328. package/src/services/reqresp/constants.ts +14 -0
  329. package/src/services/reqresp/interface.ts +3 -3
  330. package/src/services/reqresp/metrics.ts +7 -23
  331. package/src/services/reqresp/protocols/auth.ts +2 -2
  332. package/src/services/reqresp/protocols/block.ts +3 -2
  333. package/src/services/reqresp/protocols/block_txs/bitvector.ts +9 -0
  334. package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +1 -1
  335. package/src/services/reqresp/protocols/status.ts +16 -12
  336. package/src/services/reqresp/protocols/tx.ts +1 -2
  337. package/src/services/service.ts +19 -4
  338. package/src/services/tx_collection/config.ts +1 -1
  339. package/src/services/tx_collection/fast_tx_collection.ts +3 -2
  340. package/src/services/tx_collection/instrumentation.ts +4 -21
  341. package/src/services/tx_collection/slow_tx_collection.ts +7 -6
  342. package/src/services/tx_collection/tx_collection.ts +10 -9
  343. package/src/services/tx_provider.ts +21 -5
  344. package/src/services/tx_provider_instrumentation.ts +18 -14
  345. package/src/test-helpers/mock-pubsub.ts +1 -1
  346. package/src/test-helpers/mock-tx-helpers.ts +1 -1
  347. package/src/test-helpers/reqresp-nodes.ts +1 -1
  348. package/src/testbench/p2p_client_testbench_worker.ts +45 -22
  349. package/src/testbench/worker_client_manager.ts +6 -1
  350. package/src/util.ts +12 -2
  351. package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts +0 -80
  352. package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts.map +0 -1
  353. package/dest/mem_pools/tx_pool/memory_tx_pool.js +0 -238
  354. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts +0 -12
  355. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts.map +0 -1
  356. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.js +0 -70
  357. package/dest/msg_validators/block_proposal_validator/index.d.ts +0 -2
  358. package/dest/msg_validators/block_proposal_validator/index.d.ts.map +0 -1
  359. package/dest/msg_validators/block_proposal_validator/index.js +0 -1
  360. package/src/mem_pools/tx_pool/memory_tx_pool.ts +0 -283
  361. package/src/msg_validators/block_proposal_validator/block_proposal_validator.ts +0 -81
  362. package/src/msg_validators/block_proposal_validator/index.ts +0 -1
@@ -1,52 +1,54 @@
1
- import { NoCommitteeError } from '@aztec/ethereum';
1
+ import { NoCommitteeError } from '@aztec/ethereum/contracts';
2
2
  import { createLogger } from '@aztec/foundation/log';
3
3
  import { PeerErrorSeverity } from '@aztec/stdlib/p2p';
4
- export class AttestationValidator {
4
+ export class CheckpointAttestationValidator {
5
5
  epochCache;
6
6
  logger;
7
7
  constructor(epochCache){
8
8
  this.epochCache = epochCache;
9
- this.logger = createLogger('p2p:attestation-validator');
9
+ this.logger = createLogger('p2p:checkpoint-attestation-validator');
10
10
  }
11
11
  async validate(message) {
12
- const slotNumberBigInt = message.payload.header.slotNumber.toBigInt();
12
+ const slotNumber = message.payload.header.slotNumber;
13
13
  try {
14
- const { currentProposer, nextProposer, currentSlot, nextSlot } = await this.epochCache.getProposerAttesterAddressInCurrentOrNextSlot();
15
- if (slotNumberBigInt !== currentSlot && slotNumberBigInt !== nextSlot) {
16
- this.logger.warn(`Attestation slot ${slotNumberBigInt} is not current (${currentSlot}) or next (${nextSlot}) slot`);
14
+ const { currentSlot, nextSlot } = this.epochCache.getCurrentAndNextSlot();
15
+ if (slotNumber !== currentSlot && slotNumber !== nextSlot) {
16
+ this.logger.warn(`Checkpoint attestation slot ${slotNumber} is not current (${currentSlot}) or next (${nextSlot}) slot`);
17
17
  return PeerErrorSeverity.HighToleranceError;
18
18
  }
19
19
  // Verify the signature is valid
20
20
  const attester = message.getSender();
21
21
  if (attester === undefined) {
22
- this.logger.warn(`Invalid signature in attestation for slot ${slotNumberBigInt}`);
22
+ this.logger.warn(`Invalid signature in checkpoint attestation for slot ${slotNumber}`);
23
23
  return PeerErrorSeverity.LowToleranceError;
24
24
  }
25
25
  // Verify the attester is in the committee for this slot
26
- if (!await this.epochCache.isInCommittee(slotNumberBigInt, attester)) {
27
- this.logger.warn(`Attester ${attester.toString()} is not in committee for slot ${slotNumberBigInt}`);
26
+ if (!await this.epochCache.isInCommittee(slotNumber, attester)) {
27
+ this.logger.warn(`Attester ${attester.toString()} is not in committee for slot ${slotNumber}`);
28
28
  return PeerErrorSeverity.HighToleranceError;
29
29
  }
30
- // Verify the proposer signature matches the expected proposer for this slot
30
+ // Verify the proposer signature matches the expected proposer for the attestation's slot
31
+ // We look up the proposer for the specific slot rather than using currentSlot/nextSlot
32
+ // since timing differences could cause mismatches
31
33
  const proposer = message.getProposer();
32
- const expectedProposer = slotNumberBigInt === currentSlot ? currentProposer : nextProposer;
34
+ const expectedProposer = await this.epochCache.getProposerAttesterAddressInSlot(slotNumber);
33
35
  if (!expectedProposer) {
34
- this.logger.warn(`No proposer defined for slot ${slotNumberBigInt}`);
36
+ this.logger.warn(`No proposer defined for slot ${slotNumber}`);
35
37
  return PeerErrorSeverity.HighToleranceError;
36
38
  }
37
39
  if (!proposer) {
38
- this.logger.warn(`Invalid proposer signature in attestation for slot ${slotNumberBigInt}`);
40
+ this.logger.warn(`Invalid proposer signature in checkpoint attestation for slot ${slotNumber}`);
39
41
  return PeerErrorSeverity.LowToleranceError;
40
42
  }
41
43
  if (!proposer.equals(expectedProposer)) {
42
- this.logger.warn(`Proposer signature mismatch in attestation. ` + `Expected ${expectedProposer?.toString() ?? 'none'} but got ${proposer.toString()} for slot ${slotNumberBigInt}`);
44
+ this.logger.warn(`Proposer signature mismatch in checkpoint attestation. ` + `Expected ${expectedProposer?.toString() ?? 'none'} but got ${proposer.toString()} for slot ${slotNumber}`);
43
45
  return PeerErrorSeverity.HighToleranceError;
44
46
  }
45
47
  return undefined;
46
48
  } catch (e) {
47
49
  // People shouldn't be sending us attestations if the committee doesn't exist
48
50
  if (e instanceof NoCommitteeError) {
49
- this.logger.warn(`No committee exists for attestation for slot ${slotNumberBigInt}`);
51
+ this.logger.warn(`No committee exists for checkpoint attestation for slot ${slotNumber}`);
50
52
  return PeerErrorSeverity.LowToleranceError;
51
53
  }
52
54
  throw e;
@@ -0,0 +1,20 @@
1
+ import type { EpochCacheInterface } from '@aztec/epoch-cache';
2
+ import { type CheckpointAttestation, PeerErrorSeverity } from '@aztec/stdlib/p2p';
3
+ import { type TelemetryClient } from '@aztec/telemetry-client';
4
+ import type { AttestationPool } from '../../mem_pools/attestation_pool/attestation_pool.js';
5
+ import { CheckpointAttestationValidator } from './attestation_validator.js';
6
+ /**
7
+ * FishermanAttestationValidator extends the base AttestationValidator to add
8
+ * additional validation for fisherman nodes: verifying that attestations sign
9
+ * the same payload as the original proposal.
10
+ * Invalid attestations are rejected (not propagated), but peer penalization is
11
+ * handled by LibP2PService based on the fishermanMode config to ensure a better
12
+ * view of the network.
13
+ */
14
+ export declare class FishermanAttestationValidator extends CheckpointAttestationValidator {
15
+ private attestationPool;
16
+ private invalidAttestationCounter;
17
+ constructor(epochCache: EpochCacheInterface, attestationPool: AttestationPool, telemetryClient: TelemetryClient);
18
+ validate(message: CheckpointAttestation): Promise<PeerErrorSeverity | undefined>;
19
+ }
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlzaGVybWFuX2F0dGVzdGF0aW9uX3ZhbGlkYXRvci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL21zZ192YWxpZGF0b3JzL2F0dGVzdGF0aW9uX3ZhbGlkYXRvci9maXNoZXJtYW5fYXR0ZXN0YXRpb25fdmFsaWRhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDOUQsT0FBTyxFQUFFLEtBQUsscUJBQXFCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNsRixPQUFPLEVBQXVCLEtBQUssZUFBZSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFcEYsT0FBTyxLQUFLLEVBQUUsZUFBZSxFQUFFLE1BQU0sc0RBQXNELENBQUM7QUFDNUYsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFNUU7Ozs7Ozs7R0FPRztBQUNILHFCQUFhLDZCQUE4QixTQUFRLDhCQUE4QjtJQUs3RSxPQUFPLENBQUMsZUFBZTtJQUp6QixPQUFPLENBQUMseUJBQXlCLENBQUM7SUFFbEMsWUFDRSxVQUFVLEVBQUUsbUJBQW1CLEVBQ3ZCLGVBQWUsRUFBRSxlQUFlLEVBQ3hDLGVBQWUsRUFBRSxlQUFlLEVBT2pDO0lBRWMsUUFBUSxDQUFDLE9BQU8sRUFBRSxxQkFBcUIsR0FBRyxPQUFPLENBQUMsaUJBQWlCLEdBQUcsU0FBUyxDQUFDLENBd0Q5RjtDQUNGIn0=
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fisherman_attestation_validator.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/attestation_validator/fisherman_attestation_validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,KAAK,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAClF,OAAO,EAAuB,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAEpF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sDAAsD,CAAC;AAC5F,OAAO,EAAE,8BAA8B,EAAE,MAAM,4BAA4B,CAAC;AAE5E;;;;;;;GAOG;AACH,qBAAa,6BAA8B,SAAQ,8BAA8B;IAK7E,OAAO,CAAC,eAAe;IAJzB,OAAO,CAAC,yBAAyB,CAAC;IAElC,YACE,UAAU,EAAE,mBAAmB,EACvB,eAAe,EAAE,eAAe,EACxC,eAAe,EAAE,eAAe,EAOjC;IAEc,QAAQ,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC,CAwD9F;CACF"}
@@ -0,0 +1,64 @@
1
+ import { PeerErrorSeverity } from '@aztec/stdlib/p2p';
2
+ import { Attributes, Metrics } from '@aztec/telemetry-client';
3
+ import { CheckpointAttestationValidator } from './attestation_validator.js';
4
+ /**
5
+ * FishermanAttestationValidator extends the base AttestationValidator to add
6
+ * additional validation for fisherman nodes: verifying that attestations sign
7
+ * the same payload as the original proposal.
8
+ * Invalid attestations are rejected (not propagated), but peer penalization is
9
+ * handled by LibP2PService based on the fishermanMode config to ensure a better
10
+ * view of the network.
11
+ */ export class FishermanAttestationValidator extends CheckpointAttestationValidator {
12
+ attestationPool;
13
+ invalidAttestationCounter;
14
+ constructor(epochCache, attestationPool, telemetryClient){
15
+ super(epochCache), this.attestationPool = attestationPool;
16
+ this.logger = this.logger.createChild('[FISHERMAN]');
17
+ const meter = telemetryClient.getMeter('FishermanAttestationValidator');
18
+ this.invalidAttestationCounter = meter.createUpDownCounter(Metrics.VALIDATOR_INVALID_ATTESTATION_RECEIVED_COUNT);
19
+ }
20
+ async validate(message) {
21
+ // First run the standard validation
22
+ const baseValidationResult = await super.validate(message);
23
+ if (baseValidationResult !== undefined) {
24
+ // Track base validation failures (invalid signature, wrong committee, etc.)
25
+ this.invalidAttestationCounter.add(1, {
26
+ [Attributes.ERROR_TYPE]: 'base_validation_failed'
27
+ });
28
+ return baseValidationResult;
29
+ }
30
+ // fisherman validation: verify attestation payload matches proposal payload
31
+ const slotNumberBigInt = message.payload.header.slotNumber;
32
+ const attester = message.getSender();
33
+ const proposer = message.getProposer();
34
+ if (!attester || !proposer) {
35
+ return undefined;
36
+ }
37
+ const proposalId = message.archive.toString();
38
+ const proposal = await this.attestationPool.getCheckpointProposal(proposalId);
39
+ if (proposal) {
40
+ // Compare the attestation payload with the proposal payload
41
+ if (!message.payload.equals(proposal)) {
42
+ this.logger.error(`Attestation payload mismatch for slot ${slotNumberBigInt}! ` + `Attester ${attester.toString()} signed different data than the proposal.`, {
43
+ slot: slotNumberBigInt.toString(),
44
+ attester: attester.toString(),
45
+ proposer: proposer.toString(),
46
+ proposalArchive: proposal.archive.toString(),
47
+ attestationArchive: message.archive.toString(),
48
+ proposalHeader: proposal.checkpointHeader.hash().toString(),
49
+ attestationHeader: message.payload.header.hash().toString()
50
+ });
51
+ // Track invalid attestation metric
52
+ this.invalidAttestationCounter.add(1, {
53
+ [Attributes.ERROR_TYPE]: 'payload_mismatch'
54
+ });
55
+ // Return error to reject the message, but LibP2PService won't penalize in fisherman mode
56
+ return PeerErrorSeverity.LowToleranceError;
57
+ }
58
+ } else {
59
+ // We might receive attestations before proposals in some cases
60
+ this.logger.debug(`Received attestation for slot ${slotNumberBigInt} but proposal not found yet. ` + `Proposal ID: ${proposalId}`);
61
+ }
62
+ return undefined;
63
+ }
64
+ }
@@ -1,2 +1,3 @@
1
1
  export * from './attestation_validator.js';
2
- //# sourceMappingURL=index.d.ts.map
2
+ export * from './fisherman_attestation_validator.js';
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tc2dfdmFsaWRhdG9ycy9hdHRlc3RhdGlvbl92YWxpZGF0b3IvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxjQUFjLHNDQUFzQyxDQUFDIn0=
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/attestation_validator/index.ts"],"names":[],"mappings":"AAAA,cAAc,4BAA4B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/attestation_validator/index.ts"],"names":[],"mappings":"AAAA,cAAc,4BAA4B,CAAC;AAC3C,cAAc,sCAAsC,CAAC"}
@@ -1 +1,2 @@
1
1
  export * from './attestation_validator.js';
2
+ export * from './fisherman_attestation_validator.js';
@@ -1,4 +1,4 @@
1
1
  export * from './tx_validator/index.js';
2
- export * from './block_proposal_validator/index.js';
2
+ export * from './proposal_validator/index.js';
3
3
  export * from './attestation_validator/index.js';
4
- //# sourceMappingURL=index.d.ts.map
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tc2dfdmFsaWRhdG9ycy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLGNBQWMsK0JBQStCLENBQUM7QUFDOUMsY0FBYyxrQ0FBa0MsQ0FBQyJ9
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/msg_validators/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,qCAAqC,CAAC;AACpD,cAAc,kCAAkC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/msg_validators/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,kCAAkC,CAAC"}
@@ -1,3 +1,3 @@
1
1
  export * from './tx_validator/index.js';
2
- export * from './block_proposal_validator/index.js';
2
+ export * from './proposal_validator/index.js';
3
3
  export * from './attestation_validator/index.js';
@@ -7,4 +7,4 @@ export declare class MessageSeenValidator {
7
7
  addMessage(msgId: string): boolean;
8
8
  size(): number;
9
9
  }
10
- //# sourceMappingURL=msg_seen_validator.d.ts.map
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXNnX3NlZW5fdmFsaWRhdG9yLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbXNnX3ZhbGlkYXRvcnMvbXNnX3NlZW5fdmFsaWRhdG9yL21zZ19zZWVuX3ZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxxQkFBYSxvQkFBb0I7SUFLbkIsT0FBTyxDQUFDLFdBQVc7SUFKL0IsT0FBTyxDQUFDLEtBQUssQ0FBZ0I7SUFDN0IsT0FBTyxDQUFDLFlBQVksQ0FBSztJQUN6QixPQUFPLENBQUMsWUFBWSxDQUEwQjtJQUU5QyxZQUFvQixXQUFXLEVBQUUsTUFBTSxFQUt0QztJQUdNLFVBQVUsQ0FBQyxLQUFLLEVBQUUsTUFBTSxHQUFHLE9BQU8sQ0FnQnhDO0lBRU0sSUFBSSxXQUVWO0NBQ0YifQ==
@@ -1 +1 @@
1
- {"version":3,"file":"msg_seen_validator.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/msg_seen_validator/msg_seen_validator.ts"],"names":[],"mappings":"AACA,qBAAa,oBAAoB;IAKnB,OAAO,CAAC,WAAW;IAJ/B,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,YAAY,CAA0B;gBAE1B,WAAW,EAAE,MAAM;IAQhC,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAkBlC,IAAI;CAGZ"}
1
+ {"version":3,"file":"msg_seen_validator.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/msg_seen_validator/msg_seen_validator.ts"],"names":[],"mappings":"AACA,qBAAa,oBAAoB;IAKnB,OAAO,CAAC,WAAW;IAJ/B,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,YAAY,CAA0B;IAE9C,YAAoB,WAAW,EAAE,MAAM,EAKtC;IAGM,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAgBxC;IAEM,IAAI,WAEV;CACF"}
@@ -0,0 +1,9 @@
1
+ import type { EpochCacheInterface } from '@aztec/epoch-cache';
2
+ import type { BlockProposal, P2PValidator } from '@aztec/stdlib/p2p';
3
+ import { ProposalValidator } from '../proposal_validator/proposal_validator.js';
4
+ export declare class BlockProposalValidator extends ProposalValidator<BlockProposal> implements P2PValidator<BlockProposal> {
5
+ constructor(epochCache: EpochCacheInterface, opts: {
6
+ txsPermitted: boolean;
7
+ });
8
+ }
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvY2tfcHJvcG9zYWxfdmFsaWRhdG9yLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbXNnX3ZhbGlkYXRvcnMvcHJvcG9zYWxfdmFsaWRhdG9yL2Jsb2NrX3Byb3Bvc2FsX3ZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzlELE9BQU8sS0FBSyxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUVyRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUVoRixxQkFBYSxzQkFBdUIsU0FBUSxpQkFBaUIsQ0FBQyxhQUFhLENBQUUsWUFBVyxZQUFZLENBQUMsYUFBYSxDQUFDO0lBQ2pILFlBQVksVUFBVSxFQUFFLG1CQUFtQixFQUFFLElBQUksRUFBRTtRQUFFLFlBQVksRUFBRSxPQUFPLENBQUE7S0FBRSxFQUUzRTtDQUNGIn0=
@@ -0,0 +1 @@
1
+ {"version":3,"file":"block_proposal_validator.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/proposal_validator/block_proposal_validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAErE,OAAO,EAAE,iBAAiB,EAAE,MAAM,6CAA6C,CAAC;AAEhF,qBAAa,sBAAuB,SAAQ,iBAAiB,CAAC,aAAa,CAAE,YAAW,YAAY,CAAC,aAAa,CAAC;IACjH,YAAY,UAAU,EAAE,mBAAmB,EAAE,IAAI,EAAE;QAAE,YAAY,EAAE,OAAO,CAAA;KAAE,EAE3E;CACF"}
@@ -0,0 +1,6 @@
1
+ import { ProposalValidator } from '../proposal_validator/proposal_validator.js';
2
+ export class BlockProposalValidator extends ProposalValidator {
3
+ constructor(epochCache, opts){
4
+ super(epochCache, opts, 'p2p:block_proposal_validator');
5
+ }
6
+ }
@@ -0,0 +1,9 @@
1
+ import type { EpochCacheInterface } from '@aztec/epoch-cache';
2
+ import type { CheckpointProposal, P2PValidator } from '@aztec/stdlib/p2p';
3
+ import { ProposalValidator } from '../proposal_validator/proposal_validator.js';
4
+ export declare class CheckpointProposalValidator extends ProposalValidator<CheckpointProposal> implements P2PValidator<CheckpointProposal> {
5
+ constructor(epochCache: EpochCacheInterface, opts: {
6
+ txsPermitted: boolean;
7
+ });
8
+ }
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2twb2ludF9wcm9wb3NhbF92YWxpZGF0b3IuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tc2dfdmFsaWRhdG9ycy9wcm9wb3NhbF92YWxpZGF0b3IvY2hlY2twb2ludF9wcm9wb3NhbF92YWxpZGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM5RCxPQUFPLEtBQUssRUFBRSxrQkFBa0IsRUFBRSxZQUFZLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUUxRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUVoRixxQkFBYSwyQkFDWCxTQUFRLGlCQUFpQixDQUFDLGtCQUFrQixDQUM1QyxZQUFXLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQztJQUUzQyxZQUFZLFVBQVUsRUFBRSxtQkFBbUIsRUFBRSxJQUFJLEVBQUU7UUFBRSxZQUFZLEVBQUUsT0FBTyxDQUFBO0tBQUUsRUFFM0U7Q0FDRiJ9
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkpoint_proposal_validator.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,KAAK,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAE1E,OAAO,EAAE,iBAAiB,EAAE,MAAM,6CAA6C,CAAC;AAEhF,qBAAa,2BACX,SAAQ,iBAAiB,CAAC,kBAAkB,CAC5C,YAAW,YAAY,CAAC,kBAAkB,CAAC;IAE3C,YAAY,UAAU,EAAE,mBAAmB,EAAE,IAAI,EAAE;QAAE,YAAY,EAAE,OAAO,CAAA;KAAE,EAE3E;CACF"}
@@ -0,0 +1,6 @@
1
+ import { ProposalValidator } from '../proposal_validator/proposal_validator.js';
2
+ export class CheckpointProposalValidator extends ProposalValidator {
3
+ constructor(epochCache, opts){
4
+ super(epochCache, opts, 'p2p:checkpoint_proposal_validator');
5
+ }
6
+ }
@@ -0,0 +1,4 @@
1
+ export * from './block_proposal_validator.js';
2
+ export * from './checkpoint_proposal_validator.js';
3
+ export * from './proposal_validator.js';
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tc2dfdmFsaWRhdG9ycy9wcm9wb3NhbF92YWxpZGF0b3IvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYywrQkFBK0IsQ0FBQztBQUM5QyxjQUFjLG9DQUFvQyxDQUFDO0FBQ25ELGNBQWMseUJBQXlCLENBQUMifQ==
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/proposal_validator/index.ts"],"names":[],"mappings":"AAAA,cAAc,+BAA+B,CAAC;AAC9C,cAAc,oCAAoC,CAAC;AACnD,cAAc,yBAAyB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from './block_proposal_validator.js';
2
+ export * from './checkpoint_proposal_validator.js';
3
+ export * from './proposal_validator.js';
@@ -0,0 +1,13 @@
1
+ import type { EpochCacheInterface } from '@aztec/epoch-cache';
2
+ import { type Logger } from '@aztec/foundation/log';
3
+ import { BlockProposal, CheckpointProposal, PeerErrorSeverity } from '@aztec/stdlib/p2p';
4
+ export declare abstract class ProposalValidator<TProposal extends BlockProposal | CheckpointProposal> {
5
+ protected epochCache: EpochCacheInterface;
6
+ protected logger: Logger;
7
+ protected txsPermitted: boolean;
8
+ constructor(epochCache: EpochCacheInterface, opts: {
9
+ txsPermitted: boolean;
10
+ }, loggerName: string);
11
+ validate(proposal: TProposal): Promise<PeerErrorSeverity | undefined>;
12
+ }
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcG9zYWxfdmFsaWRhdG9yLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbXNnX3ZhbGlkYXRvcnMvcHJvcG9zYWxfdmFsaWRhdG9yL3Byb3Bvc2FsX3ZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRTlELE9BQU8sRUFBRSxLQUFLLE1BQU0sRUFBZ0IsTUFBTSx1QkFBdUIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsYUFBYSxFQUFFLGtCQUFrQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFekYsOEJBQXNCLGlCQUFpQixDQUFDLFNBQVMsU0FBUyxhQUFhLEdBQUcsa0JBQWtCO0lBQzFGLFNBQVMsQ0FBQyxVQUFVLEVBQUUsbUJBQW1CLENBQUM7SUFDMUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUM7SUFDekIsU0FBUyxDQUFDLFlBQVksRUFBRSxPQUFPLENBQUM7SUFFaEMsWUFBWSxVQUFVLEVBQUUsbUJBQW1CLEVBQUUsSUFBSSxFQUFFO1FBQUUsWUFBWSxFQUFFLE9BQU8sQ0FBQTtLQUFFLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFJL0Y7SUFFWSxRQUFRLENBQUMsUUFBUSxFQUFFLFNBQVMsR0FBRyxPQUFPLENBQUMsaUJBQWlCLEdBQUcsU0FBUyxDQUFDLENBbUVqRjtDQUNGIn0=
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proposal_validator.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/proposal_validator/proposal_validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAE9D,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEzF,8BAAsB,iBAAiB,CAAC,SAAS,SAAS,aAAa,GAAG,kBAAkB;IAC1F,SAAS,CAAC,UAAU,EAAE,mBAAmB,CAAC;IAC1C,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,YAAY,EAAE,OAAO,CAAC;IAEhC,YAAY,UAAU,EAAE,mBAAmB,EAAE,IAAI,EAAE;QAAE,YAAY,EAAE,OAAO,CAAA;KAAE,EAAE,UAAU,EAAE,MAAM,EAI/F;IAEY,QAAQ,CAAC,QAAQ,EAAE,SAAS,GAAG,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC,CAmEjF;CACF"}
@@ -0,0 +1,73 @@
1
+ import { NoCommitteeError } from '@aztec/ethereum/contracts';
2
+ import { createLogger } from '@aztec/foundation/log';
3
+ import { PeerErrorSeverity } from '@aztec/stdlib/p2p';
4
+ export class ProposalValidator {
5
+ epochCache;
6
+ logger;
7
+ txsPermitted;
8
+ constructor(epochCache, opts, loggerName){
9
+ this.epochCache = epochCache;
10
+ this.txsPermitted = opts.txsPermitted;
11
+ this.logger = createLogger(loggerName);
12
+ }
13
+ async validate(proposal) {
14
+ try {
15
+ // Slot check
16
+ const { currentSlot, nextSlot } = this.epochCache.getCurrentAndNextSlot();
17
+ const slotNumber = proposal.slotNumber;
18
+ if (slotNumber !== currentSlot && slotNumber !== nextSlot) {
19
+ this.logger.debug(`Penalizing peer for invalid slot number ${slotNumber}`, {
20
+ currentSlot,
21
+ nextSlot
22
+ });
23
+ return PeerErrorSeverity.HighToleranceError;
24
+ }
25
+ // Signature validity
26
+ const proposer = proposal.getSender();
27
+ if (!proposer) {
28
+ this.logger.debug(`Penalizing peer for proposal with invalid signature`);
29
+ return PeerErrorSeverity.MidToleranceError;
30
+ }
31
+ // Transactions permitted check
32
+ const embeddedTxCount = proposal.txs?.length ?? 0;
33
+ if (!this.txsPermitted && (proposal.txHashes.length > 0 || embeddedTxCount > 0)) {
34
+ this.logger.debug(`Penalizing peer for proposal with ${proposal.txHashes.length} transaction(s) when transactions are not permitted`);
35
+ return PeerErrorSeverity.MidToleranceError;
36
+ }
37
+ // Embedded txs must be listed in txHashes
38
+ const hashSet = new Set(proposal.txHashes.map((h)=>h.toString()));
39
+ const missingTxHashes = embeddedTxCount > 0 ? proposal.txs.filter((tx)=>!hashSet.has(tx.getTxHash().toString())).map((tx)=>tx.getTxHash().toString()) : [];
40
+ if (embeddedTxCount > 0 && missingTxHashes.length > 0) {
41
+ this.logger.warn('Penalizing peer for embedded transaction(s) not included in txHashes', {
42
+ embeddedTxCount,
43
+ txHashesLength: proposal.txHashes.length,
44
+ missingTxHashes
45
+ });
46
+ return PeerErrorSeverity.MidToleranceError;
47
+ }
48
+ // Proposer check
49
+ const expectedProposer = await this.epochCache.getProposerAttesterAddressInSlot(slotNumber);
50
+ if (expectedProposer !== undefined && !proposer.equals(expectedProposer)) {
51
+ this.logger.debug(`Penalizing peer for invalid proposer for current slot ${slotNumber}`, {
52
+ expectedProposer,
53
+ proposer: proposer.toString()
54
+ });
55
+ return PeerErrorSeverity.MidToleranceError;
56
+ }
57
+ // Validate tx hashes for all txs embedded in the proposal
58
+ if (!(await Promise.all(proposal.txs?.map((tx)=>tx.validateTxHash()) ?? [])).every((v)=>v)) {
59
+ this.logger.warn(`Penalizing peer for invalid tx hashes in proposal`, {
60
+ proposer,
61
+ slotNumber
62
+ });
63
+ return PeerErrorSeverity.LowToleranceError;
64
+ }
65
+ return undefined;
66
+ } catch (e) {
67
+ if (e instanceof NoCommitteeError) {
68
+ return PeerErrorSeverity.LowToleranceError;
69
+ }
70
+ throw e;
71
+ }
72
+ }
73
+ }
@@ -0,0 +1,23 @@
1
+ import type { EpochCacheInterface } from '@aztec/epoch-cache';
2
+ import type { Secp256k1Signer } from '@aztec/foundation/crypto/secp256k1-signer';
3
+ import type { EthAddress } from '@aztec/foundation/eth-address';
4
+ import { type BlockProposal, type CheckpointProposal, PeerErrorSeverity } from '@aztec/stdlib/p2p';
5
+ import type { TxHash } from '@aztec/stdlib/tx';
6
+ import type { MockProxy } from 'jest-mock-extended';
7
+ export interface ProposalValidatorTestParams<TProposal extends BlockProposal | CheckpointProposal> {
8
+ validatorFactory: (epochCache: EpochCacheInterface, opts: {
9
+ txsPermitted: boolean;
10
+ }) => {
11
+ validate: (proposal: TProposal) => Promise<PeerErrorSeverity | undefined>;
12
+ };
13
+ makeProposal: (options?: any) => Promise<TProposal>;
14
+ makeHeader: (epochNumber: number | bigint, slotNumber: number | bigint, blockNumber: number | bigint) => any;
15
+ getSigner: () => Secp256k1Signer;
16
+ getAddress: (signer?: Secp256k1Signer) => EthAddress;
17
+ getSlot: (slot: number | bigint) => any;
18
+ getTxHashes: (n: number) => TxHash[];
19
+ getTxs: () => any[];
20
+ epochCacheMock: () => MockProxy<EpochCacheInterface>;
21
+ }
22
+ export declare function sharedProposalValidatorTests<TProposal extends BlockProposal | CheckpointProposal>(params: ProposalValidatorTestParams<TProposal>): void;
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcG9zYWxfdmFsaWRhdG9yX3Rlc3Rfc3VpdGUuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tc2dfdmFsaWRhdG9ycy9wcm9wb3NhbF92YWxpZGF0b3IvcHJvcG9zYWxfdmFsaWRhdG9yX3Rlc3Rfc3VpdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM5RCxPQUFPLEtBQUssRUFBRSxlQUFlLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUNqRixPQUFPLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNoRSxPQUFPLEVBQUUsS0FBSyxhQUFhLEVBQUUsS0FBSyxrQkFBa0IsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ25HLE9BQU8sS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRS9DLE9BQU8sS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRXBELE1BQU0sV0FBVywyQkFBMkIsQ0FBQyxTQUFTLFNBQVMsYUFBYSxHQUFHLGtCQUFrQjtJQUMvRixnQkFBZ0IsRUFBRSxDQUNoQixVQUFVLEVBQUUsbUJBQW1CLEVBQy9CLElBQUksRUFBRTtRQUFFLFlBQVksRUFBRSxPQUFPLENBQUE7S0FBRSxLQUM1QjtRQUFFLFFBQVEsRUFBRSxDQUFDLFFBQVEsRUFBRSxTQUFTLEtBQUssT0FBTyxDQUFDLGlCQUFpQixHQUFHLFNBQVMsQ0FBQyxDQUFBO0tBQUUsQ0FBQztJQUNuRixZQUFZLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxHQUFHLEtBQUssT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3BELFVBQVUsRUFBRSxDQUFDLFdBQVcsRUFBRSxNQUFNLEdBQUcsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLEdBQUcsTUFBTSxFQUFFLFdBQVcsRUFBRSxNQUFNLEdBQUcsTUFBTSxLQUFLLEdBQUcsQ0FBQztJQUM3RyxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7SUFDakMsVUFBVSxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsZUFBZSxLQUFLLFVBQVUsQ0FBQztJQUNyRCxPQUFPLEVBQUUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxHQUFHLE1BQU0sS0FBSyxHQUFHLENBQUM7SUFDeEMsV0FBVyxFQUFFLENBQUMsQ0FBQyxFQUFFLE1BQU0sS0FBSyxNQUFNLEVBQUUsQ0FBQztJQUNyQyxNQUFNLEVBQUUsTUFBTSxHQUFHLEVBQUUsQ0FBQztJQUNwQixjQUFjLEVBQUUsTUFBTSxTQUFTLENBQUMsbUJBQW1CLENBQUMsQ0FBQztDQUN0RDtBQUVELHdCQUFnQiw0QkFBNEIsQ0FBQyxTQUFTLFNBQVMsYUFBYSxHQUFHLGtCQUFrQixFQUMvRixNQUFNLEVBQUUsMkJBQTJCLENBQUMsU0FBUyxDQUFDLFFBc0svQyJ9
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proposal_validator_test_suite.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/proposal_validator/proposal_validator_test_suite.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACnG,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD,MAAM,WAAW,2BAA2B,CAAC,SAAS,SAAS,aAAa,GAAG,kBAAkB;IAC/F,gBAAgB,EAAE,CAChB,UAAU,EAAE,mBAAmB,EAC/B,IAAI,EAAE;QAAE,YAAY,EAAE,OAAO,CAAA;KAAE,KAC5B;QAAE,QAAQ,EAAE,CAAC,QAAQ,EAAE,SAAS,KAAK,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC,CAAA;KAAE,CAAC;IACnF,YAAY,EAAE,CAAC,OAAO,CAAC,EAAE,GAAG,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;IACpD,UAAU,EAAE,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,KAAK,GAAG,CAAC;IAC7G,SAAS,EAAE,MAAM,eAAe,CAAC;IACjC,UAAU,EAAE,CAAC,MAAM,CAAC,EAAE,eAAe,KAAK,UAAU,CAAC;IACrD,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,KAAK,GAAG,CAAC;IACxC,WAAW,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;IACrC,MAAM,EAAE,MAAM,GAAG,EAAE,CAAC;IACpB,cAAc,EAAE,MAAM,SAAS,CAAC,mBAAmB,CAAC,CAAC;CACtD;AAED,wBAAgB,4BAA4B,CAAC,SAAS,SAAS,aAAa,GAAG,kBAAkB,EAC/F,MAAM,EAAE,2BAA2B,CAAC,SAAS,CAAC,QAsK/C"}
@@ -0,0 +1,157 @@
1
+ import { PeerErrorSeverity } from '@aztec/stdlib/p2p';
2
+ export function sharedProposalValidatorTests(params) {
3
+ const { validatorFactory, makeProposal, makeHeader, getSigner, getAddress, getSlot, getTxHashes, epochCacheMock } = params;
4
+ describe('shared proposal validation logic', ()=>{
5
+ let epochCache;
6
+ let validator;
7
+ const currentSlot = getSlot(100);
8
+ const nextSlot = getSlot(101);
9
+ function mockGetProposer(currentProposer, nextProposer) {
10
+ epochCache.getProposerAttesterAddressInSlot.mockImplementation((slot)=>{
11
+ if (slot === currentSlot) {
12
+ return Promise.resolve(currentProposer);
13
+ }
14
+ if (slot === nextSlot) {
15
+ return Promise.resolve(nextProposer);
16
+ }
17
+ throw new Error('Unexpected argument');
18
+ });
19
+ }
20
+ beforeEach(()=>{
21
+ epochCache = epochCacheMock();
22
+ validator = validatorFactory(epochCache, {
23
+ txsPermitted: true
24
+ });
25
+ epochCache.getCurrentAndNextSlot.mockReturnValue({
26
+ currentSlot: currentSlot,
27
+ nextSlot: nextSlot
28
+ });
29
+ });
30
+ it('returns high tolerance error if slot number is not current or next slot', async ()=>{
31
+ const header = makeHeader(1, 99, 99);
32
+ const mockProposal = await makeProposal({
33
+ blockHeader: header,
34
+ lastBlockHeader: header
35
+ });
36
+ epochCache.getProposerAttesterAddressInSlot.mockResolvedValue(getAddress());
37
+ const result = await validator.validate(mockProposal);
38
+ expect(result).toBe(PeerErrorSeverity.HighToleranceError);
39
+ // Should not try to resolve proposers if base validation fails
40
+ expect(epochCache.getProposerAttesterAddressInSlot).not.toHaveBeenCalled();
41
+ });
42
+ it('returns mid tolerance error if proposer is not current proposer for current slot', async ()=>{
43
+ const currentProposer = getSigner();
44
+ const nextProposer = getSigner();
45
+ const invalidProposer = getSigner();
46
+ const header = makeHeader(1, 100, 100);
47
+ const mockProposal = await makeProposal({
48
+ blockHeader: header,
49
+ lastBlockHeader: header,
50
+ signer: invalidProposer
51
+ });
52
+ mockGetProposer(getAddress(currentProposer), getAddress(nextProposer));
53
+ const result = await validator.validate(mockProposal);
54
+ expect(result).toBe(PeerErrorSeverity.MidToleranceError);
55
+ });
56
+ it('returns mid tolerance error if proposer is not next proposer for next slot', async ()=>{
57
+ const currentProposer = getSigner();
58
+ const nextProposer = getSigner();
59
+ const invalidProposer = getSigner();
60
+ const header = makeHeader(1, 101, 101);
61
+ const mockProposal = await makeProposal({
62
+ blockHeader: header,
63
+ lastBlockHeader: header,
64
+ signer: invalidProposer
65
+ });
66
+ mockGetProposer(getAddress(currentProposer), getAddress(nextProposer));
67
+ const result = await validator.validate(mockProposal);
68
+ expect(result).toBe(PeerErrorSeverity.MidToleranceError);
69
+ });
70
+ it('returns mid tolerance error if proposer is current proposer but proposal is for next slot', async ()=>{
71
+ const currentProposer = getSigner();
72
+ const nextProposer = getSigner();
73
+ const header = makeHeader(1, 101, 101);
74
+ const mockProposal = await makeProposal({
75
+ blockHeader: header,
76
+ lastBlockHeader: header,
77
+ signer: currentProposer
78
+ });
79
+ mockGetProposer(getAddress(currentProposer), getAddress(nextProposer));
80
+ const result = await validator.validate(mockProposal);
81
+ expect(result).toBe(PeerErrorSeverity.MidToleranceError);
82
+ });
83
+ it('returns undefined if proposal is valid for current slot and proposer', async ()=>{
84
+ const currentProposer = getSigner();
85
+ const nextProposer = getSigner();
86
+ const header = makeHeader(1, 100, 100);
87
+ const mockProposal = await makeProposal({
88
+ blockHeader: header,
89
+ lastBlockHeader: header,
90
+ signer: currentProposer
91
+ });
92
+ mockGetProposer(getAddress(currentProposer), getAddress(nextProposer));
93
+ const result = await validator.validate(mockProposal);
94
+ expect(result).toBeUndefined();
95
+ });
96
+ it('returns undefined if proposal is valid for next slot and proposer', async ()=>{
97
+ const currentProposer = getSigner();
98
+ const nextProposer = getSigner();
99
+ const header = makeHeader(1, 101, 101);
100
+ const mockProposal = await makeProposal({
101
+ blockHeader: header,
102
+ lastBlockHeader: header,
103
+ signer: nextProposer
104
+ });
105
+ mockGetProposer(getAddress(currentProposer), getAddress(nextProposer));
106
+ const result = await validator.validate(mockProposal);
107
+ expect(result).toBeUndefined();
108
+ });
109
+ describe('transaction permission validation', ()=>{
110
+ it('returns mid tolerance error if txs not permitted and proposal contains txHashes', async ()=>{
111
+ const currentProposer = getSigner();
112
+ const validatorWithTxsDisabled = validatorFactory(epochCache, {
113
+ txsPermitted: false
114
+ });
115
+ const header = makeHeader(1, 100, 100);
116
+ const mockProposal = await makeProposal({
117
+ blockHeader: header,
118
+ lastBlockHeader: header,
119
+ signer: currentProposer,
120
+ txHashes: getTxHashes(2)
121
+ });
122
+ mockGetProposer(getAddress(currentProposer), getAddress());
123
+ const result = await validatorWithTxsDisabled.validate(mockProposal);
124
+ expect(result).toBe(PeerErrorSeverity.MidToleranceError);
125
+ });
126
+ it('returns undefined if txs not permitted but proposal has no txHashes', async ()=>{
127
+ const currentProposer = getSigner();
128
+ const validatorWithTxsDisabled = validatorFactory(epochCache, {
129
+ txsPermitted: false
130
+ });
131
+ const header = makeHeader(1, 100, 100);
132
+ const mockProposal = await makeProposal({
133
+ blockHeader: header,
134
+ lastBlockHeader: header,
135
+ signer: currentProposer,
136
+ txHashes: getTxHashes(0)
137
+ });
138
+ mockGetProposer(getAddress(currentProposer), getAddress());
139
+ const result = await validatorWithTxsDisabled.validate(mockProposal);
140
+ expect(result).toBeUndefined();
141
+ });
142
+ it('returns undefined if txs permitted and proposal contains txHashes', async ()=>{
143
+ const currentProposer = getSigner();
144
+ const header = makeHeader(1, 100, 100);
145
+ const mockProposal = await makeProposal({
146
+ blockHeader: header,
147
+ lastBlockHeader: header,
148
+ signer: currentProposer,
149
+ txHashes: getTxHashes(2)
150
+ });
151
+ mockGetProposer(getAddress(currentProposer), getAddress());
152
+ const result = await validator.validate(mockProposal);
153
+ expect(result).toBeUndefined();
154
+ });
155
+ });
156
+ });
157
+ }
@@ -4,4 +4,4 @@ export declare class AggregateTxValidator<T extends Tx | ProcessedTx> implements
4
4
  constructor(...validators: TxValidator<T>[]);
5
5
  validateTx(tx: T): Promise<TxValidationResult>;
6
6
  }
7
- //# sourceMappingURL=aggregate_tx_validator.d.ts.map
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdncmVnYXRlX3R4X3ZhbGlkYXRvci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL21zZ192YWxpZGF0b3JzL3R4X3ZhbGlkYXRvci9hZ2dyZWdhdGVfdHhfdmFsaWRhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUUsa0JBQWtCLEVBQUUsV0FBVyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFekYscUJBQWEsb0JBQW9CLENBQUMsQ0FBQyxTQUFTLEVBQUUsR0FBRyxXQUFXLENBQUUsWUFBVyxXQUFXLENBQUMsQ0FBQyxDQUFDOztJQUVyRixZQUFZLEdBQUcsVUFBVSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQU0xQztJQUVLLFVBQVUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQWtCbkQ7Q0FDRiJ9
@@ -1 +1 @@
1
- {"version":3,"file":"aggregate_tx_validator.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/tx_validator/aggregate_tx_validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,EAAE,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEzF,qBAAa,oBAAoB,CAAC,CAAC,SAAS,EAAE,GAAG,WAAW,CAAE,YAAW,WAAW,CAAC,CAAC,CAAC;;gBAEzE,GAAG,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE;IAQrC,UAAU,CAAC,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC,kBAAkB,CAAC;CAmBrD"}
1
+ {"version":3,"file":"aggregate_tx_validator.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/tx_validator/aggregate_tx_validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,EAAE,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEzF,qBAAa,oBAAoB,CAAC,CAAC,SAAS,EAAE,GAAG,WAAW,CAAE,YAAW,WAAW,CAAC,CAAC,CAAC;;IAErF,YAAY,GAAG,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,EAM1C;IAEK,UAAU,CAAC,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAkBnD;CACF"}
@@ -1,3 +1,3 @@
1
1
  import type { AllowedElement } from '@aztec/stdlib/interfaces/server';
2
2
  export declare function getDefaultAllowedSetupFunctions(): Promise<AllowedElement[]>;
3
- //# sourceMappingURL=allowed_public_setup.d.ts.map
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxsb3dlZF9wdWJsaWNfc2V0dXAuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tc2dfdmFsaWRhdG9ycy90eF92YWxpZGF0b3IvYWxsb3dlZF9wdWJsaWNfc2V0dXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBSUEsT0FBTyxLQUFLLEVBQUUsY0FBYyxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFHdEUsd0JBQXNCLCtCQUErQixJQUFJLE9BQU8sQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQTJCakYifQ==
@@ -1,4 +1,4 @@
1
- import type { Fr } from '@aztec/foundation/fields';
1
+ import type { Fr } from '@aztec/foundation/curves/bn254';
2
2
  import type { ArchiveSource } from '@aztec/p2p';
3
3
  import type { MerkleTreeReadOperations } from '@aztec/stdlib/interfaces/server';
4
4
  /**
@@ -11,4 +11,4 @@ export declare class ArchiveCache implements ArchiveSource {
11
11
  constructor(db: MerkleTreeReadOperations);
12
12
  getArchiveIndices(archives: Fr[]): Promise<(bigint | undefined)[]>;
13
13
  }
14
- //# sourceMappingURL=archive_cache.d.ts.map
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJjaGl2ZV9jYWNoZS5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL21zZ192YWxpZGF0b3JzL3R4X3ZhbGlkYXRvci9hcmNoaXZlX2NhY2hlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLEVBQUUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3pELE9BQU8sS0FBSyxFQUFFLGFBQWEsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNoRCxPQUFPLEtBQUssRUFBRSx3QkFBd0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBR2hGOzs7R0FHRztBQUNILHFCQUFhLFlBQWEsWUFBVyxhQUFhO0lBR3BDLE9BQU8sQ0FBQyxFQUFFO0lBRnRCLFFBQVEsRUFBRSxHQUFHLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBRTlCLFlBQW9CLEVBQUUsRUFBRSx3QkFBd0IsRUFFL0M7SUFFWSxpQkFBaUIsQ0FBQyxRQUFRLEVBQUUsRUFBRSxFQUFFLEdBQUcsT0FBTyxDQUFDLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FVOUU7Q0FDRiJ9
@@ -1 +1 @@
1
- {"version":3,"file":"archive_cache.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/tx_validator/archive_cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AACnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAGhF;;;GAGG;AACH,qBAAa,YAAa,YAAW,aAAa;IAGpC,OAAO,CAAC,EAAE;IAFtB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBAEV,EAAE,EAAE,wBAAwB;IAInC,iBAAiB,CAAC,QAAQ,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,CAAC;CAWhF"}
1
+ {"version":3,"file":"archive_cache.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/tx_validator/archive_cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAGhF;;;GAGG;AACH,qBAAa,YAAa,YAAW,aAAa;IAGpC,OAAO,CAAC,EAAE;IAFtB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAE9B,YAAoB,EAAE,EAAE,wBAAwB,EAE/C;IAEY,iBAAiB,CAAC,QAAQ,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,CAAC,CAU9E;CACF"}
@@ -1,4 +1,4 @@
1
- import type { Fr } from '@aztec/foundation/fields';
1
+ import type { Fr } from '@aztec/foundation/curves/bn254';
2
2
  import { type AnyTx, type TxValidationResult, type TxValidator } from '@aztec/stdlib/tx';
3
3
  export interface ArchiveSource {
4
4
  getArchiveIndices: (archives: Fr[]) => Promise<(bigint | undefined)[]>;
@@ -8,4 +8,4 @@ export declare class BlockHeaderTxValidator<T extends AnyTx> implements TxValida
8
8
  constructor(archiveSource: ArchiveSource);
9
9
  validateTx(tx: T): Promise<TxValidationResult>;
10
10
  }
11
- //# sourceMappingURL=block_header_validator.d.ts.map
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvY2tfaGVhZGVyX3ZhbGlkYXRvci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL21zZ192YWxpZGF0b3JzL3R4X3ZhbGlkYXRvci9ibG9ja19oZWFkZXJfdmFsaWRhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLEVBQUUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRXpELE9BQU8sRUFBRSxLQUFLLEtBQUssRUFBeUIsS0FBSyxrQkFBa0IsRUFBRSxLQUFLLFdBQVcsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRWhILE1BQU0sV0FBVyxhQUFhO0lBQzVCLGlCQUFpQixFQUFFLENBQUMsUUFBUSxFQUFFLEVBQUUsRUFBRSxLQUFLLE9BQU8sQ0FBQyxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7Q0FDeEU7QUFFRCxxQkFBYSxzQkFBc0IsQ0FBQyxDQUFDLFNBQVMsS0FBSyxDQUFFLFlBQVcsV0FBVyxDQUFDLENBQUMsQ0FBQzs7SUFJNUUsWUFBWSxhQUFhLEVBQUUsYUFBYSxFQUV2QztJQUVLLFVBQVUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQU9uRDtDQUNGIn0=