@aztec/p2p 0.0.0-test.1 → 0.0.1-commit.1142ef1

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 (443) hide show
  1. package/dest/bootstrap/bootstrap.d.ts +1 -1
  2. package/dest/bootstrap/bootstrap.d.ts.map +1 -1
  3. package/dest/bootstrap/bootstrap.js +22 -9
  4. package/dest/client/factory.d.ts +15 -5
  5. package/dest/client/factory.d.ts.map +1 -1
  6. package/dest/client/factory.js +60 -25
  7. package/dest/client/index.d.ts +2 -1
  8. package/dest/client/index.d.ts.map +1 -1
  9. package/dest/client/index.js +1 -0
  10. package/dest/client/interface.d.ts +170 -0
  11. package/dest/client/interface.d.ts.map +1 -0
  12. package/dest/client/interface.js +9 -0
  13. package/dest/client/p2p_client.d.ts +75 -193
  14. package/dest/client/p2p_client.d.ts.map +1 -1
  15. package/dest/client/p2p_client.js +757 -228
  16. package/dest/config.d.ts +148 -125
  17. package/dest/config.d.ts.map +1 -1
  18. package/dest/config.js +180 -34
  19. package/dest/enr/generate-enr.d.ts +11 -3
  20. package/dest/enr/generate-enr.d.ts.map +1 -1
  21. package/dest/enr/generate-enr.js +27 -5
  22. package/dest/enr/index.d.ts +1 -1
  23. package/dest/errors/attestation-pool.error.d.ts +7 -0
  24. package/dest/errors/attestation-pool.error.d.ts.map +1 -0
  25. package/dest/errors/attestation-pool.error.js +12 -0
  26. package/dest/errors/reqresp.error.d.ts +1 -1
  27. package/dest/errors/reqresp.error.d.ts.map +1 -1
  28. package/dest/index.d.ts +4 -1
  29. package/dest/index.d.ts.map +1 -1
  30. package/dest/index.js +2 -0
  31. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +104 -25
  32. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  33. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +1 -1
  34. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
  35. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +288 -174
  36. package/dest/mem_pools/attestation_pool/index.d.ts +1 -1
  37. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +29 -11
  38. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +1 -1
  39. package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +168 -62
  40. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +24 -10
  41. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +1 -1
  42. package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +133 -82
  43. package/dest/mem_pools/attestation_pool/mocks.d.ts +232 -11
  44. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  45. package/dest/mem_pools/attestation_pool/mocks.js +15 -20
  46. package/dest/mem_pools/index.d.ts +1 -1
  47. package/dest/mem_pools/instrumentation.d.ts +16 -12
  48. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  49. package/dest/mem_pools/instrumentation.js +55 -40
  50. package/dest/mem_pools/interface.d.ts +3 -4
  51. package/dest/mem_pools/interface.d.ts.map +1 -1
  52. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +70 -16
  53. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +1 -1
  54. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +452 -142
  55. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +18 -0
  56. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +1 -0
  57. package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +56 -0
  58. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +83 -0
  59. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +1 -0
  60. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +5 -0
  61. package/dest/mem_pools/tx_pool/eviction/insufficient_fee_payer_balance_rule.d.ts +15 -0
  62. package/dest/mem_pools/tx_pool/eviction/insufficient_fee_payer_balance_rule.d.ts.map +1 -0
  63. package/dest/mem_pools/tx_pool/eviction/insufficient_fee_payer_balance_rule.js +88 -0
  64. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +17 -0
  65. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -0
  66. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +84 -0
  67. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +19 -0
  68. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -0
  69. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +76 -0
  70. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +26 -0
  71. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +1 -0
  72. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +84 -0
  73. package/dest/mem_pools/tx_pool/index.d.ts +1 -2
  74. package/dest/mem_pools/tx_pool/index.d.ts.map +1 -1
  75. package/dest/mem_pools/tx_pool/index.js +0 -1
  76. package/dest/mem_pools/tx_pool/priority.d.ts +5 -1
  77. package/dest/mem_pools/tx_pool/priority.d.ts.map +1 -1
  78. package/dest/mem_pools/tx_pool/priority.js +7 -2
  79. package/dest/mem_pools/tx_pool/tx_pool.d.ts +72 -11
  80. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +1 -1
  81. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +1 -1
  82. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +1 -1
  83. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +276 -45
  84. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +7 -5
  85. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  86. package/dest/msg_validators/attestation_validator/attestation_validator.js +48 -10
  87. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +20 -0
  88. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -0
  89. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +64 -0
  90. package/dest/msg_validators/attestation_validator/index.d.ts +2 -1
  91. package/dest/msg_validators/attestation_validator/index.d.ts.map +1 -1
  92. package/dest/msg_validators/attestation_validator/index.js +1 -0
  93. package/dest/msg_validators/index.d.ts +2 -2
  94. package/dest/msg_validators/index.d.ts.map +1 -1
  95. package/dest/msg_validators/index.js +1 -1
  96. package/dest/msg_validators/msg_seen_validator/msg_seen_validator.d.ts +10 -0
  97. package/dest/msg_validators/msg_seen_validator/msg_seen_validator.d.ts.map +1 -0
  98. package/dest/msg_validators/msg_seen_validator/msg_seen_validator.js +36 -0
  99. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +9 -0
  100. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -0
  101. package/dest/msg_validators/proposal_validator/block_proposal_validator.js +6 -0
  102. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +9 -0
  103. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -0
  104. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +6 -0
  105. package/dest/msg_validators/proposal_validator/index.d.ts +4 -0
  106. package/dest/msg_validators/proposal_validator/index.d.ts.map +1 -0
  107. package/dest/msg_validators/proposal_validator/index.js +3 -0
  108. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +13 -0
  109. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -0
  110. package/dest/msg_validators/proposal_validator/proposal_validator.js +80 -0
  111. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +23 -0
  112. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +1 -0
  113. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +183 -0
  114. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +1 -1
  115. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  116. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +3 -0
  117. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -0
  118. package/dest/msg_validators/tx_validator/allowed_public_setup.js +27 -0
  119. package/dest/msg_validators/tx_validator/archive_cache.d.ts +14 -0
  120. package/dest/msg_validators/tx_validator/archive_cache.d.ts.map +1 -0
  121. package/dest/msg_validators/tx_validator/archive_cache.js +22 -0
  122. package/dest/msg_validators/tx_validator/block_header_validator.d.ts +2 -2
  123. package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
  124. package/dest/msg_validators/tx_validator/block_header_validator.js +4 -4
  125. package/dest/msg_validators/tx_validator/data_validator.d.ts +1 -1
  126. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  127. package/dest/msg_validators/tx_validator/data_validator.js +56 -86
  128. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +1 -3
  129. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
  130. package/dest/msg_validators/tx_validator/double_spend_validator.js +21 -27
  131. package/dest/msg_validators/tx_validator/factory.d.ts +16 -0
  132. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -0
  133. package/dest/msg_validators/tx_validator/factory.js +74 -0
  134. package/dest/msg_validators/tx_validator/gas_validator.d.ts +11 -0
  135. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -0
  136. package/dest/msg_validators/tx_validator/gas_validator.js +115 -0
  137. package/dest/msg_validators/tx_validator/index.d.ts +8 -1
  138. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  139. package/dest/msg_validators/tx_validator/index.js +7 -0
  140. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +9 -5
  141. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  142. package/dest/msg_validators/tx_validator/metadata_validator.js +39 -20
  143. package/dest/msg_validators/tx_validator/phases_validator.d.ts +14 -0
  144. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -0
  145. package/dest/msg_validators/tx_validator/phases_validator.js +93 -0
  146. package/dest/msg_validators/tx_validator/test_utils.d.ts +17 -0
  147. package/dest/msg_validators/tx_validator/test_utils.d.ts.map +1 -0
  148. package/dest/msg_validators/tx_validator/test_utils.js +22 -0
  149. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +13 -0
  150. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -0
  151. package/dest/msg_validators/tx_validator/timestamp_validator.js +32 -0
  152. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts +8 -0
  153. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts.map +1 -0
  154. package/dest/msg_validators/tx_validator/tx_permitted_validator.js +24 -0
  155. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +1 -1
  156. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
  157. package/dest/msg_validators/tx_validator/tx_proof_validator.js +6 -5
  158. package/dest/services/data_store.d.ts +1 -1
  159. package/dest/services/data_store.d.ts.map +1 -1
  160. package/dest/services/discv5/discV5_service.d.ts +10 -9
  161. package/dest/services/discv5/discV5_service.d.ts.map +1 -1
  162. package/dest/services/discv5/discV5_service.js +63 -36
  163. package/dest/services/dummy_service.d.ts +54 -11
  164. package/dest/services/dummy_service.d.ts.map +1 -1
  165. package/dest/services/dummy_service.js +91 -5
  166. package/dest/services/encoding.d.ts +26 -7
  167. package/dest/services/encoding.d.ts.map +1 -1
  168. package/dest/services/encoding.js +76 -6
  169. package/dest/services/gossipsub/scoring.d.ts +1 -1
  170. package/dest/services/index.d.ts +5 -1
  171. package/dest/services/index.d.ts.map +1 -1
  172. package/dest/services/index.js +4 -0
  173. package/dest/services/libp2p/instrumentation.d.ts +20 -0
  174. package/dest/services/libp2p/instrumentation.d.ts.map +1 -0
  175. package/dest/services/libp2p/instrumentation.js +111 -0
  176. package/dest/services/libp2p/libp2p_service.d.ts +102 -96
  177. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  178. package/dest/services/libp2p/libp2p_service.js +1307 -301
  179. package/dest/services/peer-manager/interface.d.ts +23 -0
  180. package/dest/services/peer-manager/interface.d.ts.map +1 -0
  181. package/dest/services/peer-manager/interface.js +1 -0
  182. package/dest/services/peer-manager/metrics.d.ts +11 -2
  183. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  184. package/dest/services/peer-manager/metrics.js +29 -12
  185. package/dest/services/peer-manager/peer_manager.d.ts +103 -23
  186. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  187. package/dest/services/peer-manager/peer_manager.js +551 -82
  188. package/dest/services/peer-manager/peer_scoring.d.ts +7 -2
  189. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  190. package/dest/services/peer-manager/peer_scoring.js +37 -2
  191. package/dest/services/reqresp/config.d.ts +11 -9
  192. package/dest/services/reqresp/config.d.ts.map +1 -1
  193. package/dest/services/reqresp/config.js +18 -4
  194. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +2 -2
  195. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +1 -1
  196. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +10 -6
  197. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +31 -17
  198. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -1
  199. package/dest/services/reqresp/connection-sampler/connection_sampler.js +142 -84
  200. package/dest/services/reqresp/index.d.ts +3 -2
  201. package/dest/services/reqresp/index.d.ts.map +1 -1
  202. package/dest/services/reqresp/index.js +2 -1
  203. package/dest/services/reqresp/interface.d.ts +73 -24
  204. package/dest/services/reqresp/interface.d.ts.map +1 -1
  205. package/dest/services/reqresp/interface.js +46 -27
  206. package/dest/services/reqresp/metrics.d.ts +1 -1
  207. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  208. package/dest/services/reqresp/metrics.js +5 -21
  209. package/dest/services/reqresp/protocols/auth.d.ts +43 -0
  210. package/dest/services/reqresp/protocols/auth.d.ts.map +1 -0
  211. package/dest/services/reqresp/protocols/auth.js +71 -0
  212. package/dest/services/reqresp/protocols/block.d.ts +6 -1
  213. package/dest/services/reqresp/protocols/block.d.ts.map +1 -1
  214. package/dest/services/reqresp/protocols/block.js +30 -6
  215. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +30 -0
  216. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -0
  217. package/dest/services/reqresp/protocols/block_txs/bitvector.js +75 -0
  218. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +11 -0
  219. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -0
  220. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +39 -0
  221. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +47 -0
  222. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -0
  223. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +75 -0
  224. package/dest/services/reqresp/protocols/block_txs/index.d.ts +4 -0
  225. package/dest/services/reqresp/protocols/block_txs/index.d.ts.map +1 -0
  226. package/dest/services/reqresp/protocols/block_txs/index.js +3 -0
  227. package/dest/services/reqresp/protocols/goodbye.d.ts +3 -5
  228. package/dest/services/reqresp/protocols/goodbye.d.ts.map +1 -1
  229. package/dest/services/reqresp/protocols/goodbye.js +7 -7
  230. package/dest/services/reqresp/protocols/index.d.ts +3 -1
  231. package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
  232. package/dest/services/reqresp/protocols/index.js +2 -0
  233. package/dest/services/reqresp/protocols/ping.d.ts +1 -3
  234. package/dest/services/reqresp/protocols/ping.d.ts.map +1 -1
  235. package/dest/services/reqresp/protocols/status.d.ts +40 -7
  236. package/dest/services/reqresp/protocols/status.d.ts.map +1 -1
  237. package/dest/services/reqresp/protocols/status.js +75 -5
  238. package/dest/services/reqresp/protocols/tx.d.ts +14 -4
  239. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  240. package/dest/services/reqresp/protocols/tx.js +34 -6
  241. package/dest/services/reqresp/rate-limiter/index.d.ts +1 -1
  242. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +6 -4
  243. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
  244. package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -2
  245. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
  246. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
  247. package/dest/services/reqresp/rate-limiter/rate_limits.js +21 -1
  248. package/dest/services/reqresp/reqresp.d.ts +24 -66
  249. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  250. package/dest/services/reqresp/reqresp.js +699 -230
  251. package/dest/services/reqresp/status.d.ts +10 -4
  252. package/dest/services/reqresp/status.d.ts.map +1 -1
  253. package/dest/services/reqresp/status.js +9 -2
  254. package/dest/services/service.d.ts +37 -20
  255. package/dest/services/service.d.ts.map +1 -1
  256. package/dest/services/tx_collection/config.d.ts +25 -0
  257. package/dest/services/tx_collection/config.d.ts.map +1 -0
  258. package/dest/services/tx_collection/config.js +58 -0
  259. package/dest/services/tx_collection/fast_tx_collection.d.ts +51 -0
  260. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -0
  261. package/dest/services/tx_collection/fast_tx_collection.js +300 -0
  262. package/dest/services/tx_collection/index.d.ts +3 -0
  263. package/dest/services/tx_collection/index.d.ts.map +1 -0
  264. package/dest/services/tx_collection/index.js +2 -0
  265. package/dest/services/tx_collection/instrumentation.d.ts +10 -0
  266. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -0
  267. package/dest/services/tx_collection/instrumentation.js +24 -0
  268. package/dest/services/tx_collection/slow_tx_collection.d.ts +53 -0
  269. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -0
  270. package/dest/services/tx_collection/slow_tx_collection.js +177 -0
  271. package/dest/services/tx_collection/tx_collection.d.ts +110 -0
  272. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -0
  273. package/dest/services/tx_collection/tx_collection.js +128 -0
  274. package/dest/services/tx_collection/tx_collection_sink.d.ts +30 -0
  275. package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -0
  276. package/dest/services/tx_collection/tx_collection_sink.js +111 -0
  277. package/dest/services/tx_collection/tx_source.d.ts +18 -0
  278. package/dest/services/tx_collection/tx_source.d.ts.map +1 -0
  279. package/dest/services/tx_collection/tx_source.js +31 -0
  280. package/dest/services/tx_provider.d.ts +51 -0
  281. package/dest/services/tx_provider.d.ts.map +1 -0
  282. package/dest/services/tx_provider.js +219 -0
  283. package/dest/services/tx_provider_instrumentation.d.ts +16 -0
  284. package/dest/services/tx_provider_instrumentation.d.ts.map +1 -0
  285. package/dest/services/tx_provider_instrumentation.js +34 -0
  286. package/dest/test-helpers/generate-peer-id-private-keys.d.ts +1 -1
  287. package/dest/test-helpers/get-ports.d.ts +1 -1
  288. package/dest/test-helpers/get-ports.d.ts.map +1 -1
  289. package/dest/test-helpers/index.d.ts +2 -1
  290. package/dest/test-helpers/index.d.ts.map +1 -1
  291. package/dest/test-helpers/index.js +1 -0
  292. package/dest/test-helpers/make-enrs.d.ts +1 -1
  293. package/dest/test-helpers/make-enrs.d.ts.map +1 -1
  294. package/dest/test-helpers/make-enrs.js +4 -5
  295. package/dest/test-helpers/make-test-p2p-clients.d.ts +33 -5
  296. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  297. package/dest/test-helpers/make-test-p2p-clients.js +86 -16
  298. package/dest/test-helpers/mock-pubsub.d.ts +59 -0
  299. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -0
  300. package/dest/test-helpers/mock-pubsub.js +130 -0
  301. package/dest/test-helpers/mock-tx-helpers.d.ts +12 -0
  302. package/dest/test-helpers/mock-tx-helpers.d.ts.map +1 -0
  303. package/dest/test-helpers/mock-tx-helpers.js +19 -0
  304. package/dest/test-helpers/reqresp-nodes.d.ts +15 -11
  305. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  306. package/dest/test-helpers/reqresp-nodes.js +62 -28
  307. package/dest/testbench/p2p_client_testbench_worker.d.ts +1 -1
  308. package/dest/testbench/p2p_client_testbench_worker.js +124 -35
  309. package/dest/testbench/parse_log_file.d.ts +1 -1
  310. package/dest/testbench/parse_log_file.js +4 -4
  311. package/dest/testbench/testbench.d.ts +1 -1
  312. package/dest/testbench/testbench.js +4 -4
  313. package/dest/testbench/worker_client_manager.d.ts +1 -6
  314. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  315. package/dest/testbench/worker_client_manager.js +17 -20
  316. package/dest/types/index.d.ts +4 -2
  317. package/dest/types/index.d.ts.map +1 -1
  318. package/dest/types/index.js +2 -0
  319. package/dest/util.d.ts +24 -16
  320. package/dest/util.d.ts.map +1 -1
  321. package/dest/util.js +75 -69
  322. package/dest/versioning.d.ts +4 -4
  323. package/dest/versioning.d.ts.map +1 -1
  324. package/dest/versioning.js +8 -3
  325. package/package.json +32 -27
  326. package/src/bootstrap/bootstrap.ts +27 -11
  327. package/src/client/factory.ts +139 -53
  328. package/src/client/index.ts +1 -0
  329. package/src/client/interface.ts +213 -0
  330. package/src/client/p2p_client.ts +471 -385
  331. package/src/config.ts +299 -134
  332. package/src/enr/generate-enr.ts +39 -6
  333. package/src/errors/attestation-pool.error.ts +13 -0
  334. package/src/index.ts +4 -0
  335. package/src/mem_pools/attestation_pool/attestation_pool.ts +119 -24
  336. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +344 -201
  337. package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +233 -72
  338. package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +199 -96
  339. package/src/mem_pools/attestation_pool/mocks.ts +21 -16
  340. package/src/mem_pools/instrumentation.ts +71 -48
  341. package/src/mem_pools/interface.ts +2 -4
  342. package/src/mem_pools/tx_pool/README.md +255 -0
  343. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +537 -155
  344. package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +71 -0
  345. package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +93 -0
  346. package/src/mem_pools/tx_pool/eviction/insufficient_fee_payer_balance_rule.ts +108 -0
  347. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +104 -0
  348. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +91 -0
  349. package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +106 -0
  350. package/src/mem_pools/tx_pool/index.ts +0 -1
  351. package/src/mem_pools/tx_pool/priority.ts +9 -2
  352. package/src/mem_pools/tx_pool/tx_pool.ts +75 -10
  353. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +225 -36
  354. package/src/msg_validators/attestation_validator/attestation_validator.ts +60 -14
  355. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +88 -0
  356. package/src/msg_validators/attestation_validator/index.ts +1 -0
  357. package/src/msg_validators/index.ts +1 -1
  358. package/src/msg_validators/msg_seen_validator/msg_seen_validator.ts +36 -0
  359. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +10 -0
  360. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +13 -0
  361. package/src/msg_validators/proposal_validator/index.ts +3 -0
  362. package/src/msg_validators/proposal_validator/proposal_validator.ts +92 -0
  363. package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +206 -0
  364. package/src/msg_validators/tx_validator/allowed_public_setup.ts +35 -0
  365. package/src/msg_validators/tx_validator/archive_cache.ts +28 -0
  366. package/src/msg_validators/tx_validator/block_header_validator.ts +5 -5
  367. package/src/msg_validators/tx_validator/data_validator.ts +89 -69
  368. package/src/msg_validators/tx_validator/double_spend_validator.ts +19 -17
  369. package/src/msg_validators/tx_validator/factory.ts +110 -0
  370. package/src/msg_validators/tx_validator/gas_validator.ts +134 -0
  371. package/src/msg_validators/tx_validator/index.ts +7 -0
  372. package/src/msg_validators/tx_validator/metadata_validator.ts +67 -22
  373. package/src/msg_validators/tx_validator/phases_validator.ts +116 -0
  374. package/src/msg_validators/tx_validator/test_utils.ts +43 -0
  375. package/src/msg_validators/tx_validator/timestamp_validator.ts +49 -0
  376. package/src/msg_validators/tx_validator/tx_permitted_validator.ts +17 -0
  377. package/src/msg_validators/tx_validator/tx_proof_validator.ts +6 -5
  378. package/src/services/discv5/discV5_service.ts +84 -38
  379. package/src/services/dummy_service.ts +153 -9
  380. package/src/services/encoding.ts +83 -6
  381. package/src/services/index.ts +4 -0
  382. package/src/services/libp2p/instrumentation.ts +113 -0
  383. package/src/services/libp2p/libp2p_service.ts +1120 -329
  384. package/src/services/peer-manager/interface.ts +29 -0
  385. package/src/services/peer-manager/metrics.ts +38 -12
  386. package/src/services/peer-manager/peer_manager.ts +657 -80
  387. package/src/services/peer-manager/peer_scoring.ts +42 -3
  388. package/src/services/reqresp/config.ts +26 -9
  389. package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +12 -6
  390. package/src/services/reqresp/connection-sampler/connection_sampler.ts +150 -95
  391. package/src/services/reqresp/index.ts +2 -0
  392. package/src/services/reqresp/interface.ts +92 -37
  393. package/src/services/reqresp/metrics.ts +11 -24
  394. package/src/services/reqresp/protocols/auth.ts +83 -0
  395. package/src/services/reqresp/protocols/block.ts +26 -4
  396. package/src/services/reqresp/protocols/block_txs/bitvector.ts +90 -0
  397. package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +53 -0
  398. package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +79 -0
  399. package/src/services/reqresp/protocols/block_txs/index.ts +3 -0
  400. package/src/services/reqresp/protocols/goodbye.ts +9 -7
  401. package/src/services/reqresp/protocols/index.ts +2 -0
  402. package/src/services/reqresp/protocols/status.ts +119 -5
  403. package/src/services/reqresp/protocols/tx.ts +36 -8
  404. package/src/services/reqresp/rate-limiter/rate_limiter.ts +12 -3
  405. package/src/services/reqresp/rate-limiter/rate_limits.ts +21 -1
  406. package/src/services/reqresp/reqresp.ts +387 -256
  407. package/src/services/reqresp/status.ts +12 -3
  408. package/src/services/service.ts +61 -22
  409. package/src/services/tx_collection/config.ts +84 -0
  410. package/src/services/tx_collection/fast_tx_collection.ts +341 -0
  411. package/src/services/tx_collection/index.ts +2 -0
  412. package/src/services/tx_collection/instrumentation.ts +26 -0
  413. package/src/services/tx_collection/slow_tx_collection.ts +233 -0
  414. package/src/services/tx_collection/tx_collection.ts +216 -0
  415. package/src/services/tx_collection/tx_collection_sink.ts +129 -0
  416. package/src/services/tx_collection/tx_source.ts +37 -0
  417. package/src/services/tx_provider.ts +232 -0
  418. package/src/services/tx_provider_instrumentation.ts +48 -0
  419. package/src/test-helpers/index.ts +1 -0
  420. package/src/test-helpers/make-enrs.ts +4 -5
  421. package/src/test-helpers/make-test-p2p-clients.ts +111 -21
  422. package/src/test-helpers/mock-pubsub.ts +188 -0
  423. package/src/test-helpers/mock-tx-helpers.ts +24 -0
  424. package/src/test-helpers/reqresp-nodes.ts +87 -36
  425. package/src/testbench/p2p_client_testbench_worker.ts +182 -32
  426. package/src/testbench/parse_log_file.ts +4 -4
  427. package/src/testbench/testbench.ts +4 -4
  428. package/src/testbench/worker_client_manager.ts +23 -24
  429. package/src/types/index.ts +2 -0
  430. package/src/util.ts +105 -91
  431. package/src/versioning.ts +11 -4
  432. package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts +0 -56
  433. package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts.map +0 -1
  434. package/dest/mem_pools/tx_pool/memory_tx_pool.js +0 -141
  435. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts +0 -8
  436. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts.map +0 -1
  437. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.js +0 -21
  438. package/dest/msg_validators/block_proposal_validator/index.d.ts +0 -2
  439. package/dest/msg_validators/block_proposal_validator/index.d.ts.map +0 -1
  440. package/dest/msg_validators/block_proposal_validator/index.js +0 -1
  441. package/src/mem_pools/tx_pool/memory_tx_pool.ts +0 -174
  442. package/src/msg_validators/block_proposal_validator/block_proposal_validator.ts +0 -29
  443. package/src/msg_validators/block_proposal_validator/index.ts +0 -1
@@ -0,0 +1,36 @@
1
+ // Implements a queue of message IDs
2
+ export class MessageSeenValidator {
3
+ private queue: Array<string>;
4
+ private writePointer = 0;
5
+ private seenMessages: Set<string> = new Set();
6
+
7
+ constructor(private queueLength: number) {
8
+ if (this.queueLength <= 0) {
9
+ throw new Error('Queue length must be greater than 0');
10
+ }
11
+ this.queue = new Array<string>(this.queueLength);
12
+ }
13
+
14
+ // Adds a message if not seen before. Returns true if added, false if already seen.
15
+ public addMessage(msgId: string): boolean {
16
+ // Check if the message is already in the cache
17
+ if (this.seenMessages.has(msgId)) {
18
+ return false;
19
+ }
20
+ // If we are at the cache limit, remove the oldest msg ID
21
+ if (this.seenMessages.size >= this.queueLength) {
22
+ const msgToRemove = this.queue[this.writePointer];
23
+ this.seenMessages.delete(msgToRemove);
24
+ }
25
+
26
+ // Insert the message into the cache and the queue
27
+ this.seenMessages.add(msgId);
28
+ this.queue[this.writePointer] = msgId;
29
+ this.writePointer = this.writePointer === this.queueLength - 1 ? 0 : this.writePointer + 1;
30
+ return true;
31
+ }
32
+
33
+ public size() {
34
+ return this.seenMessages.size;
35
+ }
36
+ }
@@ -0,0 +1,10 @@
1
+ import type { EpochCacheInterface } from '@aztec/epoch-cache';
2
+ import type { BlockProposal, P2PValidator } from '@aztec/stdlib/p2p';
3
+
4
+ import { ProposalValidator } from '../proposal_validator/proposal_validator.js';
5
+
6
+ export class BlockProposalValidator extends ProposalValidator<BlockProposal> implements P2PValidator<BlockProposal> {
7
+ constructor(epochCache: EpochCacheInterface, opts: { txsPermitted: boolean }) {
8
+ super(epochCache, opts, 'p2p:block_proposal_validator');
9
+ }
10
+ }
@@ -0,0 +1,13 @@
1
+ import type { EpochCacheInterface } from '@aztec/epoch-cache';
2
+ import type { CheckpointProposal, P2PValidator } from '@aztec/stdlib/p2p';
3
+
4
+ import { ProposalValidator } from '../proposal_validator/proposal_validator.js';
5
+
6
+ export class CheckpointProposalValidator
7
+ extends ProposalValidator<CheckpointProposal>
8
+ implements P2PValidator<CheckpointProposal>
9
+ {
10
+ constructor(epochCache: EpochCacheInterface, opts: { txsPermitted: boolean }) {
11
+ super(epochCache, opts, 'p2p:checkpoint_proposal_validator');
12
+ }
13
+ }
@@ -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,92 @@
1
+ import type { EpochCacheInterface } from '@aztec/epoch-cache';
2
+ import { NoCommitteeError } from '@aztec/ethereum/contracts';
3
+ import { type Logger, createLogger } from '@aztec/foundation/log';
4
+ import { BlockProposal, CheckpointProposal, PeerErrorSeverity } from '@aztec/stdlib/p2p';
5
+
6
+ export abstract class ProposalValidator<TProposal extends BlockProposal | CheckpointProposal> {
7
+ protected epochCache: EpochCacheInterface;
8
+ protected logger: Logger;
9
+ protected txsPermitted: boolean;
10
+
11
+ constructor(epochCache: EpochCacheInterface, opts: { txsPermitted: boolean }, loggerName: string) {
12
+ this.epochCache = epochCache;
13
+ this.txsPermitted = opts.txsPermitted;
14
+ this.logger = createLogger(loggerName);
15
+ }
16
+
17
+ public async validate(proposal: TProposal): Promise<PeerErrorSeverity | undefined> {
18
+ try {
19
+ // Signature validity
20
+ const proposer = proposal.getSender();
21
+ if (!proposer) {
22
+ this.logger.debug(`Penalizing peer for proposal with invalid signature`);
23
+ return PeerErrorSeverity.MidToleranceError;
24
+ }
25
+
26
+ // Transactions permitted check
27
+ const embeddedTxCount = proposal.txs?.length ?? 0;
28
+ if (!this.txsPermitted && (proposal.txHashes.length > 0 || embeddedTxCount > 0)) {
29
+ this.logger.debug(
30
+ `Penalizing peer for proposal with ${proposal.txHashes.length} transaction(s) when transactions are not permitted`,
31
+ );
32
+ return PeerErrorSeverity.MidToleranceError;
33
+ }
34
+
35
+ // Embedded txs must be listed in txHashes
36
+ const hashSet = new Set(proposal.txHashes.map(h => h.toString()));
37
+ const missingTxHashes =
38
+ embeddedTxCount > 0
39
+ ? proposal.txs!.filter(tx => !hashSet.has(tx.getTxHash().toString())).map(tx => tx.getTxHash().toString())
40
+ : [];
41
+ if (embeddedTxCount > 0 && missingTxHashes.length > 0) {
42
+ this.logger.warn('Penalizing peer for embedded transaction(s) not included in txHashes', {
43
+ embeddedTxCount,
44
+ txHashesLength: proposal.txHashes.length,
45
+ missingTxHashes,
46
+ });
47
+ return PeerErrorSeverity.MidToleranceError;
48
+ }
49
+
50
+ // Slot and proposer checks
51
+ const { currentProposer, nextProposer, currentSlot, nextSlot } =
52
+ await this.epochCache.getProposerAttesterAddressInCurrentOrNextSlot();
53
+ const slotNumber = proposal.slotNumber;
54
+ if (slotNumber !== currentSlot && slotNumber !== nextSlot) {
55
+ this.logger.debug(`Penalizing peer for invalid slot number ${slotNumber}`, { currentSlot, nextSlot });
56
+ return PeerErrorSeverity.HighToleranceError;
57
+ }
58
+ if (slotNumber === currentSlot && currentProposer !== undefined && !proposer.equals(currentProposer)) {
59
+ this.logger.debug(`Penalizing peer for invalid proposer for current slot ${slotNumber}`, {
60
+ currentProposer,
61
+ nextProposer,
62
+ proposer: proposer.toString(),
63
+ });
64
+ return PeerErrorSeverity.MidToleranceError;
65
+ }
66
+ if (slotNumber === nextSlot && nextProposer !== undefined && !proposer.equals(nextProposer)) {
67
+ this.logger.debug(`Penalizing peer for invalid proposer for next slot ${slotNumber}`, {
68
+ currentProposer,
69
+ nextProposer,
70
+ proposer: proposer.toString(),
71
+ });
72
+ return PeerErrorSeverity.MidToleranceError;
73
+ }
74
+
75
+ // Validate tx hashes for all txs embedded in the proposal
76
+ if (!(await Promise.all(proposal.txs?.map(tx => tx.validateTxHash()) ?? [])).every(v => v)) {
77
+ this.logger.warn(`Penalizing peer for invalid tx hashes in proposal`, {
78
+ proposer,
79
+ slotNumber,
80
+ });
81
+ return PeerErrorSeverity.LowToleranceError;
82
+ }
83
+
84
+ return undefined;
85
+ } catch (e) {
86
+ if (e instanceof NoCommitteeError) {
87
+ return PeerErrorSeverity.LowToleranceError;
88
+ }
89
+ throw e;
90
+ }
91
+ }
92
+ }
@@ -0,0 +1,206 @@
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
+
7
+ import type { MockProxy } from 'jest-mock-extended';
8
+
9
+ export interface ProposalValidatorTestParams<TProposal extends BlockProposal | CheckpointProposal> {
10
+ validatorFactory: (
11
+ epochCache: EpochCacheInterface,
12
+ opts: { txsPermitted: boolean },
13
+ ) => { validate: (proposal: TProposal) => Promise<PeerErrorSeverity | undefined> };
14
+ makeProposal: (options?: any) => Promise<TProposal>;
15
+ makeHeader: (epochNumber: number | bigint, slotNumber: number | bigint, blockNumber: number | bigint) => any;
16
+ getSigner: () => Secp256k1Signer;
17
+ getAddress: (signer?: Secp256k1Signer) => EthAddress;
18
+ getSlot: (slot: number | bigint) => any;
19
+ getTxHashes: (n: number) => TxHash[];
20
+ getTxs: () => any[];
21
+ epochCacheMock: () => MockProxy<EpochCacheInterface>;
22
+ }
23
+
24
+ export function sharedProposalValidatorTests<TProposal extends BlockProposal | CheckpointProposal>(
25
+ params: ProposalValidatorTestParams<TProposal>,
26
+ ) {
27
+ const { validatorFactory, makeProposal, makeHeader, getSigner, getAddress, getSlot, getTxHashes, epochCacheMock } =
28
+ params;
29
+
30
+ describe('shared proposal validation logic', () => {
31
+ let epochCache: MockProxy<EpochCacheInterface>;
32
+ let validator: { validate: (proposal: TProposal) => Promise<PeerErrorSeverity | undefined> };
33
+
34
+ beforeEach(() => {
35
+ epochCache = epochCacheMock();
36
+ validator = validatorFactory(epochCache, { txsPermitted: true });
37
+ });
38
+
39
+ it('returns high tolerance error if slot number is not current or next slot', async () => {
40
+ const header = makeHeader(1, 97, 97);
41
+ const mockProposal = await makeProposal({ blockHeader: header, lastBlockHeader: header });
42
+ epochCache.getProposerAttesterAddressInCurrentOrNextSlot.mockResolvedValue({
43
+ currentSlot: getSlot(98),
44
+ nextSlot: getSlot(99),
45
+ currentProposer: getAddress(),
46
+ nextProposer: getAddress(),
47
+ });
48
+ const result = await validator.validate(mockProposal);
49
+ expect(result).toBe(PeerErrorSeverity.HighToleranceError);
50
+ });
51
+
52
+ it('returns mid tolerance error if proposer is not current proposer for current slot', async () => {
53
+ const currentProposer = getSigner();
54
+ const nextProposer = getSigner();
55
+ const invalidProposer = getSigner();
56
+ const header = makeHeader(1, 100, 100);
57
+ const mockProposal = await makeProposal({
58
+ blockHeader: header,
59
+ lastBlockHeader: header,
60
+ signer: invalidProposer,
61
+ });
62
+ epochCache.getProposerAttesterAddressInCurrentOrNextSlot.mockResolvedValue({
63
+ currentSlot: getSlot(100),
64
+ nextSlot: getSlot(101),
65
+ currentProposer: getAddress(currentProposer),
66
+ nextProposer: getAddress(nextProposer),
67
+ });
68
+ const result = await validator.validate(mockProposal);
69
+ expect(result).toBe(PeerErrorSeverity.MidToleranceError);
70
+ });
71
+
72
+ it('returns mid tolerance error if proposer is not next proposer for next slot', async () => {
73
+ const currentProposer = getSigner();
74
+ const nextProposer = getSigner();
75
+ const invalidProposer = getSigner();
76
+ const header = makeHeader(1, 101, 101);
77
+ const mockProposal = await makeProposal({
78
+ blockHeader: header,
79
+ lastBlockHeader: header,
80
+ signer: invalidProposer,
81
+ });
82
+ epochCache.getProposerAttesterAddressInCurrentOrNextSlot.mockResolvedValue({
83
+ currentSlot: getSlot(100),
84
+ nextSlot: getSlot(101),
85
+ currentProposer: getAddress(currentProposer),
86
+ nextProposer: getAddress(nextProposer),
87
+ });
88
+ const result = await validator.validate(mockProposal);
89
+ expect(result).toBe(PeerErrorSeverity.MidToleranceError);
90
+ });
91
+
92
+ it('returns mid tolerance error if proposer is current proposer but proposal is for next slot', async () => {
93
+ const currentProposer = getSigner();
94
+ const nextProposer = getSigner();
95
+ const header = makeHeader(1, 101, 101);
96
+ const mockProposal = await makeProposal({
97
+ blockHeader: header,
98
+ lastBlockHeader: header,
99
+ signer: currentProposer,
100
+ });
101
+ epochCache.getProposerAttesterAddressInCurrentOrNextSlot.mockResolvedValue({
102
+ currentSlot: getSlot(100),
103
+ nextSlot: getSlot(101),
104
+ currentProposer: getAddress(currentProposer),
105
+ nextProposer: getAddress(nextProposer),
106
+ });
107
+ const result = await validator.validate(mockProposal);
108
+ expect(result).toBe(PeerErrorSeverity.MidToleranceError);
109
+ });
110
+
111
+ it('returns undefined if proposal is valid for current slot and proposer', async () => {
112
+ const currentProposer = getSigner();
113
+ const nextProposer = getSigner();
114
+ const header = makeHeader(1, 100, 100);
115
+ const mockProposal = await makeProposal({
116
+ blockHeader: header,
117
+ lastBlockHeader: header,
118
+ signer: currentProposer,
119
+ });
120
+ epochCache.getProposerAttesterAddressInCurrentOrNextSlot.mockResolvedValue({
121
+ currentSlot: getSlot(100),
122
+ nextSlot: getSlot(101),
123
+ currentProposer: getAddress(currentProposer),
124
+ nextProposer: getAddress(nextProposer),
125
+ });
126
+ const result = await validator.validate(mockProposal);
127
+ expect(result).toBeUndefined();
128
+ });
129
+
130
+ it('returns undefined if proposal is valid for next slot and proposer', async () => {
131
+ const currentProposer = getSigner();
132
+ const nextProposer = getSigner();
133
+ const header = makeHeader(1, 101, 101);
134
+ const mockProposal = await makeProposal({ blockHeader: header, lastBlockHeader: header, signer: nextProposer });
135
+ epochCache.getProposerAttesterAddressInCurrentOrNextSlot.mockResolvedValue({
136
+ currentSlot: getSlot(100),
137
+ nextSlot: getSlot(101),
138
+ currentProposer: getAddress(currentProposer),
139
+ nextProposer: getAddress(nextProposer),
140
+ });
141
+ const result = await validator.validate(mockProposal);
142
+ expect(result).toBeUndefined();
143
+ });
144
+
145
+ describe('transaction permission validation', () => {
146
+ it('returns mid tolerance error if txs not permitted and proposal contains txHashes', async () => {
147
+ const currentProposer = getSigner();
148
+ const validatorWithTxsDisabled = validatorFactory(epochCache, { txsPermitted: false });
149
+ const header = makeHeader(1, 100, 100);
150
+ const mockProposal = await makeProposal({
151
+ blockHeader: header,
152
+ lastBlockHeader: header,
153
+ signer: currentProposer,
154
+ txHashes: getTxHashes(2),
155
+ });
156
+ epochCache.getProposerAttesterAddressInCurrentOrNextSlot.mockResolvedValue({
157
+ currentSlot: getSlot(100),
158
+ nextSlot: getSlot(101),
159
+ currentProposer: getAddress(currentProposer),
160
+ nextProposer: getAddress(),
161
+ });
162
+ const result = await validatorWithTxsDisabled.validate(mockProposal);
163
+ expect(result).toBe(PeerErrorSeverity.MidToleranceError);
164
+ });
165
+
166
+ it('returns undefined if txs not permitted but proposal has no txHashes', async () => {
167
+ const currentProposer = getSigner();
168
+ const validatorWithTxsDisabled = validatorFactory(epochCache, { txsPermitted: false });
169
+ const header = makeHeader(1, 100, 100);
170
+ const mockProposal = await makeProposal({
171
+ blockHeader: header,
172
+ lastBlockHeader: header,
173
+ signer: currentProposer,
174
+ txHashes: getTxHashes(0),
175
+ });
176
+ epochCache.getProposerAttesterAddressInCurrentOrNextSlot.mockResolvedValue({
177
+ currentSlot: getSlot(100),
178
+ nextSlot: getSlot(101),
179
+ currentProposer: getAddress(currentProposer),
180
+ nextProposer: getAddress(),
181
+ });
182
+ const result = await validatorWithTxsDisabled.validate(mockProposal);
183
+ expect(result).toBeUndefined();
184
+ });
185
+
186
+ it('returns undefined if txs permitted and proposal contains txHashes', async () => {
187
+ const currentProposer = getSigner();
188
+ const header = makeHeader(1, 100, 100);
189
+ const mockProposal = await makeProposal({
190
+ blockHeader: header,
191
+ lastBlockHeader: header,
192
+ signer: currentProposer,
193
+ txHashes: getTxHashes(2),
194
+ });
195
+ epochCache.getProposerAttesterAddressInCurrentOrNextSlot.mockResolvedValue({
196
+ currentSlot: getSlot(100),
197
+ nextSlot: getSlot(101),
198
+ currentProposer: getAddress(currentProposer),
199
+ nextProposer: getAddress(),
200
+ });
201
+ const result = await validator.validate(mockProposal);
202
+ expect(result).toBeUndefined();
203
+ });
204
+ });
205
+ });
206
+ }
@@ -0,0 +1,35 @@
1
+ import { FPCContract } from '@aztec/noir-contracts.js/FPC';
2
+ import { TokenContractArtifact } from '@aztec/noir-contracts.js/Token';
3
+ import { ProtocolContractAddress } from '@aztec/protocol-contracts';
4
+ import { getContractClassFromArtifact } from '@aztec/stdlib/contract';
5
+ import type { AllowedElement } from '@aztec/stdlib/interfaces/server';
6
+
7
+ let defaultAllowedSetupFunctions: AllowedElement[] | undefined = undefined;
8
+ export async function getDefaultAllowedSetupFunctions(): Promise<AllowedElement[]> {
9
+ if (defaultAllowedSetupFunctions === undefined) {
10
+ defaultAllowedSetupFunctions = [
11
+ // needed for authwit support
12
+ {
13
+ address: ProtocolContractAddress.AuthRegistry,
14
+ },
15
+ // needed for claiming on the same tx as a spend
16
+ {
17
+ address: ProtocolContractAddress.FeeJuice,
18
+ // We can't restrict the selector because public functions get routed via dispatch.
19
+ // selector: FunctionSelector.fromSignature('_increase_public_balance((Field),u128)'),
20
+ },
21
+ // needed for private transfers via FPC
22
+ {
23
+ classId: (await getContractClassFromArtifact(TokenContractArtifact)).id,
24
+ // We can't restrict the selector because public functions get routed via dispatch.
25
+ // selector: FunctionSelector.fromSignature('_increase_public_balance((Field),u128)'),
26
+ },
27
+ {
28
+ classId: (await getContractClassFromArtifact(FPCContract.artifact)).id,
29
+ // We can't restrict the selector because public functions get routed via dispatch.
30
+ // selector: FunctionSelector.fromSignature('prepare_fee((Field),Field,(Field),Field)'),
31
+ },
32
+ ];
33
+ }
34
+ return defaultAllowedSetupFunctions;
35
+ }
@@ -0,0 +1,28 @@
1
+ import type { Fr } from '@aztec/foundation/curves/bn254';
2
+ import type { ArchiveSource } from '@aztec/p2p';
3
+ import type { MerkleTreeReadOperations } from '@aztec/stdlib/interfaces/server';
4
+ import { MerkleTreeId } from '@aztec/stdlib/trees';
5
+
6
+ /**
7
+ * Implements an archive source by checking a DB and an in-memory collection.
8
+ * Intended for validating transactions as they are added to a block.
9
+ */
10
+ export class ArchiveCache implements ArchiveSource {
11
+ archives: Map<string, bigint>;
12
+
13
+ constructor(private db: MerkleTreeReadOperations) {
14
+ this.archives = new Map<string, bigint>();
15
+ }
16
+
17
+ public async getArchiveIndices(archives: Fr[]): Promise<(bigint | undefined)[]> {
18
+ const toCheckDb = archives.filter(n => !this.archives.has(n.toString()));
19
+ const dbHits = await this.db.findLeafIndices(MerkleTreeId.ARCHIVE, toCheckDb);
20
+ dbHits.forEach((x, index) => {
21
+ if (x !== undefined) {
22
+ this.archives.set(toCheckDb[index].toString(), x);
23
+ }
24
+ });
25
+
26
+ return archives.map(n => this.archives.get(n.toString()));
27
+ }
28
+ }
@@ -1,6 +1,6 @@
1
- import type { Fr } from '@aztec/foundation/fields';
1
+ import type { Fr } from '@aztec/foundation/curves/bn254';
2
2
  import { createLogger } from '@aztec/foundation/log';
3
- import { type AnyTx, Tx, type TxValidationResult, type TxValidator } from '@aztec/stdlib/tx';
3
+ import { type AnyTx, TX_ERROR_BLOCK_HEADER, type TxValidationResult, type TxValidator } from '@aztec/stdlib/tx';
4
4
 
5
5
  export interface ArchiveSource {
6
6
  getArchiveIndices: (archives: Fr[]) => Promise<(bigint | undefined)[]>;
@@ -15,10 +15,10 @@ export class BlockHeaderTxValidator<T extends AnyTx> implements TxValidator<T> {
15
15
  }
16
16
 
17
17
  async validateTx(tx: T): Promise<TxValidationResult> {
18
- const [index] = await this.#archiveSource.getArchiveIndices([await tx.data.constants.historicalHeader.hash()]);
18
+ const [index] = await this.#archiveSource.getArchiveIndices([await tx.data.constants.anchorBlockHeader.hash()]);
19
19
  if (index === undefined) {
20
- this.#log.warn(`Rejecting tx ${await Tx.getHash(tx)} for referencing an unknown block header`);
21
- return { result: 'invalid', reason: ['Block header not found'] };
20
+ this.#log.verbose(`Rejecting tx ${'txHash' in tx ? tx.txHash : tx.hash} for referencing an unknown block header`);
21
+ return { result: 'invalid', reason: [TX_ERROR_BLOCK_HEADER] };
22
22
  }
23
23
  return { result: 'valid' };
24
24
  }
@@ -1,106 +1,126 @@
1
- import { MAX_FR_ARGS_TO_ALL_ENQUEUED_CALLS } from '@aztec/constants';
1
+ import { MAX_FR_CALLDATA_TO_ALL_ENQUEUED_CALLS } from '@aztec/constants';
2
2
  import { createLogger } from '@aztec/foundation/log';
3
- import { Tx, type TxValidationResult, type TxValidator } from '@aztec/stdlib/tx';
3
+ import { computeCalldataHash } from '@aztec/stdlib/hash';
4
+ import {
5
+ TX_ERROR_CALLDATA_COUNT_MISMATCH,
6
+ TX_ERROR_CALLDATA_COUNT_TOO_LARGE,
7
+ TX_ERROR_CONTRACT_CLASS_LOGS,
8
+ TX_ERROR_CONTRACT_CLASS_LOG_COUNT,
9
+ TX_ERROR_CONTRACT_CLASS_LOG_LENGTH,
10
+ TX_ERROR_CONTRACT_CLASS_LOG_SORTING,
11
+ TX_ERROR_INCORRECT_CALLDATA,
12
+ TX_ERROR_INCORRECT_HASH,
13
+ Tx,
14
+ type TxValidationResult,
15
+ type TxValidator,
16
+ } from '@aztec/stdlib/tx';
4
17
 
5
18
  export class DataTxValidator implements TxValidator<Tx> {
6
19
  #log = createLogger('p2p:tx_validator:tx_data');
7
20
 
8
21
  async validateTx(tx: Tx): Promise<TxValidationResult> {
9
- const execRequestRes = this.#hasCorrectExecutionRequests(tx);
10
- // Note: If we ever skip txs here, must change this return statement to account for them.
11
- return (await execRequestRes).result === 'invalid' ? execRequestRes : this.#hasCorrectContractClassLogs(tx);
22
+ const reason =
23
+ (await this.#hasCorrectHash(tx)) ??
24
+ (await this.#hasCorrectCalldata(tx)) ??
25
+ (await this.#hasCorrectContractClassLogs(tx));
26
+ return reason ? { result: 'invalid', reason: [reason] } : { result: 'valid' };
12
27
  }
13
28
 
14
- async #hasCorrectExecutionRequests(tx: Tx): Promise<TxValidationResult> {
15
- const callRequests = [
16
- ...tx.data.getRevertiblePublicCallRequests(),
17
- ...tx.data.getNonRevertiblePublicCallRequests(),
18
- ];
19
- if (callRequests.length !== tx.enqueuedPublicFunctionCalls.length) {
20
- this.#log.warn(
21
- `Rejecting tx ${Tx.getHash(tx)} because of mismatch number of execution requests for public calls. Expected ${
22
- callRequests.length
23
- }. Got ${tx.enqueuedPublicFunctionCalls.length}.`,
29
+ async #hasCorrectHash(tx: Tx): Promise<string | undefined> {
30
+ const expected = await Tx.computeTxHash(tx);
31
+ if (!tx.getTxHash().equals(expected)) {
32
+ const reason = TX_ERROR_INCORRECT_HASH;
33
+ this.#log.verbose(
34
+ `Rejecting tx ${tx.getTxHash().toString()}. Reason: ${reason}. Expected hash ${expected.toString()}. Got ${tx
35
+ .getTxHash()
36
+ .toString()}.`,
24
37
  );
25
- return { result: 'invalid', reason: ['Wrong number of execution requests for public calls'] };
38
+ return reason;
26
39
  }
40
+ return undefined;
41
+ }
27
42
 
28
- if (tx.getTotalPublicArgsCount() > MAX_FR_ARGS_TO_ALL_ENQUEUED_CALLS) {
29
- this.#log.warn(
30
- `Rejecting tx ${await Tx.getHash(
31
- tx,
32
- )} because the total length of args to public enqueued calls is greater than ${MAX_FR_ARGS_TO_ALL_ENQUEUED_CALLS}`,
43
+ async #hasCorrectCalldata(tx: Tx): Promise<string | undefined> {
44
+ if (tx.publicFunctionCalldata.length !== tx.numberOfPublicCalls()) {
45
+ const reason = TX_ERROR_CALLDATA_COUNT_MISMATCH;
46
+ this.#log.verbose(
47
+ `Rejecting tx ${tx.getTxHash().toString()}. Reason: ${reason}. Expected ${tx.numberOfPublicCalls()}. Got ${
48
+ tx.publicFunctionCalldata.length
49
+ }.`,
33
50
  );
34
- return { result: 'invalid', reason: ['Too many args in total to enqueued public calls'] };
51
+ return reason;
35
52
  }
36
- const invalidExecutionRequestIndex = (
37
- await Promise.all(
38
- tx.enqueuedPublicFunctionCalls.map(
39
- async (execRequest, i) => !(await execRequest.isForCallRequest(callRequests[i])),
40
- ),
41
- )
42
- ).findIndex(Boolean);
43
- if (invalidExecutionRequestIndex !== -1) {
44
- this.#log.warn(
45
- `Rejecting tx ${await Tx.getHash(
46
- tx,
47
- )} because of incorrect execution requests for public call at index ${invalidExecutionRequestIndex}.`,
53
+
54
+ if (tx.getTotalPublicCalldataCount() > MAX_FR_CALLDATA_TO_ALL_ENQUEUED_CALLS) {
55
+ const reason = TX_ERROR_CALLDATA_COUNT_TOO_LARGE;
56
+ this.#log.verbose(
57
+ `Rejecting tx ${tx
58
+ .getTxHash()
59
+ .toString()}. Reason: ${reason}. Expected no greater than ${MAX_FR_CALLDATA_TO_ALL_ENQUEUED_CALLS} fields. Got ${tx.getTotalPublicCalldataCount()}.`,
48
60
  );
49
- return { result: 'invalid', reason: ['Incorrect execution request for public call'] };
61
+ return reason;
50
62
  }
51
63
 
52
- const teardownCallRequest = tx.data.getTeardownPublicCallRequest();
53
- const isInvalidTeardownExecutionRequest =
54
- (!teardownCallRequest && !tx.publicTeardownFunctionCall.isEmpty()) ||
55
- (teardownCallRequest && !(await tx.publicTeardownFunctionCall.isForCallRequest(teardownCallRequest)));
56
- if (isInvalidTeardownExecutionRequest) {
57
- this.#log.warn(`Rejecting tx ${await Tx.getHash(tx)} because of incorrect teardown execution requests.`);
58
- return { result: 'invalid', reason: ['Incorrect teardown execution request'] };
64
+ const callRequests = tx.getPublicCallRequestsWithCalldata();
65
+ for (let i = 0; i < callRequests.length; i++) {
66
+ const { request, calldata } = callRequests[i];
67
+ const hash = await computeCalldataHash(calldata);
68
+ if (!hash.equals(request.calldataHash)) {
69
+ const reason = TX_ERROR_INCORRECT_CALLDATA;
70
+ this.#log.verbose(`Rejecting tx ${tx.getTxHash().toString()}. Reason: ${reason}. Call request index: ${i}.`);
71
+ return reason;
72
+ }
59
73
  }
60
74
 
61
- return { result: 'valid' };
75
+ return undefined;
62
76
  }
63
77
 
64
- async #hasCorrectContractClassLogs(tx: Tx): Promise<TxValidationResult> {
78
+ async #hasCorrectContractClassLogs(tx: Tx): Promise<string | undefined> {
65
79
  const contractClassLogsHashes = tx.data.getNonEmptyContractClassLogsHashes();
66
- const hashedContractClasslogs = await Promise.all(tx.contractClassLogs.map(l => l.hash()));
67
- if (contractClassLogsHashes.length !== hashedContractClasslogs.length) {
68
- this.#log.warn(
69
- `Rejecting tx ${Tx.getHash(tx)} because of mismatched number of contract class logs. Expected ${
80
+ if (contractClassLogsHashes.length !== tx.contractClassLogFields.length) {
81
+ this.#log.verbose(
82
+ `Rejecting tx ${tx.getTxHash().toString()} because of mismatched number of contract class logs. Expected ${
70
83
  contractClassLogsHashes.length
71
- }. Got ${hashedContractClasslogs.length}.`,
84
+ }. Got ${tx.contractClassLogFields.length}.`,
72
85
  );
73
- return { result: 'invalid', reason: ['Mismatched number of contract class logs'] };
86
+ return TX_ERROR_CONTRACT_CLASS_LOG_COUNT;
74
87
  }
88
+
89
+ const expectedHashes = await Promise.all(tx.contractClassLogFields.map(l => l.hash()));
75
90
  for (const [i, logHash] of contractClassLogsHashes.entries()) {
76
- const hashedLog = hashedContractClasslogs[i];
77
- if (!logHash.value.equals(hashedLog)) {
78
- if (hashedContractClasslogs.some(l => logHash.value.equals(l))) {
79
- const matchingLogIndex = hashedContractClasslogs.findIndex(l => logHash.value.equals(l));
80
- this.#log.warn(
81
- `Rejecting tx ${Tx.getHash(
82
- tx,
83
- )} because of mismatched contract class logs indices. Expected ${i} from the kernel's log hashes. Got ${matchingLogIndex} in the tx.`,
91
+ const hash = expectedHashes[i];
92
+ if (!logHash.value.equals(hash)) {
93
+ if (expectedHashes.some(h => logHash.value.equals(h))) {
94
+ const matchingLogIndex = expectedHashes.findIndex(l => logHash.value.equals(l));
95
+ this.#log.verbose(
96
+ `Rejecting tx ${tx
97
+ .getTxHash()
98
+ .toString()} because of mismatched contract class logs indices. Expected ${i} from the kernel's log hashes. Got ${matchingLogIndex} in the tx.`,
84
99
  );
85
- return { result: 'invalid', reason: ['Incorrectly sorted contract class logs'] };
100
+ return TX_ERROR_CONTRACT_CLASS_LOG_SORTING;
86
101
  } else {
87
- this.#log.warn(
88
- `Rejecting tx ${Tx.getHash(tx)} because of mismatched contract class logs. Expected hash ${
102
+ this.#log.verbose(
103
+ `Rejecting tx ${tx.getTxHash().toString()} because of mismatched contract class logs. Expected hash ${
89
104
  logHash.value
90
- } from the kernels. Got ${hashedLog} in the tx.`,
105
+ } from the kernels. Got ${hash} in the tx.`,
91
106
  );
92
- return { result: 'invalid', reason: ['Mismatched contract class logs'] };
107
+ return TX_ERROR_CONTRACT_CLASS_LOGS;
93
108
  }
94
109
  }
95
- if (logHash.logHash.length !== tx.contractClassLogs[i].getEmittedLength()) {
96
- this.#log.warn(
97
- `Rejecting tx ${Tx.getHash(tx)} because of mismatched contract class logs length. Expected ${
110
+
111
+ const expectedMinLength = 1 + tx.contractClassLogFields[i].fields.findLastIndex(f => !f.isZero());
112
+ if (logHash.logHash.length < expectedMinLength) {
113
+ this.#log.verbose(
114
+ `Rejecting tx ${tx
115
+ .getTxHash()
116
+ .toString()} because of incorrect contract class log length. Expected the length to be at least ${expectedMinLength}. Got ${
98
117
  logHash.logHash.length
99
- } from the kernel's log hashes. Got ${tx.contractClassLogs[i].getEmittedLength()} in the tx.`,
118
+ }.`,
100
119
  );
101
- return { result: 'invalid', reason: ['Mismatched contract class logs length'] };
120
+ return TX_ERROR_CONTRACT_CLASS_LOG_LENGTH;
102
121
  }
103
122
  }
104
- return { result: 'valid' };
123
+
124
+ return undefined;
105
125
  }
106
126
  }