@aztec/p2p 0.0.0-test.0 → 0.0.1-commit.023c3e5

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 (512) hide show
  1. package/dest/bootstrap/bootstrap.d.ts +4 -3
  2. package/dest/bootstrap/bootstrap.d.ts.map +1 -1
  3. package/dest/bootstrap/bootstrap.js +26 -13
  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 +61 -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 +765 -229
  16. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts +2 -0
  17. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts.map +1 -0
  18. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +305 -0
  19. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts +73 -0
  20. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts.map +1 -0
  21. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.js +8 -0
  22. package/dest/config.d.ts +154 -125
  23. package/dest/config.d.ts.map +1 -1
  24. package/dest/config.js +182 -34
  25. package/dest/enr/generate-enr.d.ts +11 -3
  26. package/dest/enr/generate-enr.d.ts.map +1 -1
  27. package/dest/enr/generate-enr.js +27 -5
  28. package/dest/enr/index.d.ts +1 -1
  29. package/dest/errors/attestation-pool.error.d.ts +7 -0
  30. package/dest/errors/attestation-pool.error.d.ts.map +1 -0
  31. package/dest/errors/attestation-pool.error.js +12 -0
  32. package/dest/errors/reqresp.error.d.ts +1 -1
  33. package/dest/errors/reqresp.error.d.ts.map +1 -1
  34. package/dest/index.d.ts +4 -1
  35. package/dest/index.d.ts.map +1 -1
  36. package/dest/index.js +2 -0
  37. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +104 -25
  38. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  39. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +1 -1
  40. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
  41. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +299 -174
  42. package/dest/mem_pools/attestation_pool/index.d.ts +1 -1
  43. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +29 -11
  44. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +1 -1
  45. package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +168 -62
  46. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +24 -10
  47. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +1 -1
  48. package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +133 -82
  49. package/dest/mem_pools/attestation_pool/mocks.d.ts +234 -11
  50. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  51. package/dest/mem_pools/attestation_pool/mocks.js +19 -21
  52. package/dest/mem_pools/index.d.ts +1 -1
  53. package/dest/mem_pools/instrumentation.d.ts +16 -12
  54. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  55. package/dest/mem_pools/instrumentation.js +56 -41
  56. package/dest/mem_pools/interface.d.ts +3 -4
  57. package/dest/mem_pools/interface.d.ts.map +1 -1
  58. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +75 -16
  59. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +1 -1
  60. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +493 -142
  61. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +32 -0
  62. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +1 -0
  63. package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +112 -0
  64. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +157 -0
  65. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +1 -0
  66. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +52 -0
  67. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +16 -0
  68. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -0
  69. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +122 -0
  70. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +17 -0
  71. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -0
  72. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +84 -0
  73. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +19 -0
  74. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -0
  75. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +78 -0
  76. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +26 -0
  77. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +1 -0
  78. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +84 -0
  79. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +25 -0
  80. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +1 -0
  81. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +57 -0
  82. package/dest/mem_pools/tx_pool/index.d.ts +1 -2
  83. package/dest/mem_pools/tx_pool/index.d.ts.map +1 -1
  84. package/dest/mem_pools/tx_pool/index.js +0 -1
  85. package/dest/mem_pools/tx_pool/priority.d.ts +5 -1
  86. package/dest/mem_pools/tx_pool/priority.d.ts.map +1 -1
  87. package/dest/mem_pools/tx_pool/priority.js +7 -2
  88. package/dest/mem_pools/tx_pool/tx_pool.d.ts +72 -11
  89. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +1 -1
  90. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +1 -1
  91. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +1 -1
  92. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +276 -45
  93. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +7 -5
  94. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  95. package/dest/msg_validators/attestation_validator/attestation_validator.js +79 -10
  96. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +20 -0
  97. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -0
  98. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +76 -0
  99. package/dest/msg_validators/attestation_validator/index.d.ts +2 -1
  100. package/dest/msg_validators/attestation_validator/index.d.ts.map +1 -1
  101. package/dest/msg_validators/attestation_validator/index.js +1 -0
  102. package/dest/msg_validators/clock_tolerance.d.ts +21 -0
  103. package/dest/msg_validators/clock_tolerance.d.ts.map +1 -0
  104. package/dest/msg_validators/clock_tolerance.js +37 -0
  105. package/dest/msg_validators/index.d.ts +2 -2
  106. package/dest/msg_validators/index.d.ts.map +1 -1
  107. package/dest/msg_validators/index.js +1 -1
  108. package/dest/msg_validators/msg_seen_validator/msg_seen_validator.d.ts +10 -0
  109. package/dest/msg_validators/msg_seen_validator/msg_seen_validator.d.ts.map +1 -0
  110. package/dest/msg_validators/msg_seen_validator/msg_seen_validator.js +36 -0
  111. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +9 -0
  112. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -0
  113. package/dest/msg_validators/proposal_validator/block_proposal_validator.js +6 -0
  114. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +9 -0
  115. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -0
  116. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +6 -0
  117. package/dest/msg_validators/proposal_validator/index.d.ts +4 -0
  118. package/dest/msg_validators/proposal_validator/index.d.ts.map +1 -0
  119. package/dest/msg_validators/proposal_validator/index.js +3 -0
  120. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +13 -0
  121. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -0
  122. package/dest/msg_validators/proposal_validator/proposal_validator.js +104 -0
  123. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +23 -0
  124. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +1 -0
  125. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +212 -0
  126. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +1 -1
  127. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  128. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +3 -0
  129. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -0
  130. package/dest/msg_validators/tx_validator/allowed_public_setup.js +27 -0
  131. package/dest/msg_validators/tx_validator/archive_cache.d.ts +14 -0
  132. package/dest/msg_validators/tx_validator/archive_cache.d.ts.map +1 -0
  133. package/dest/msg_validators/tx_validator/archive_cache.js +22 -0
  134. package/dest/msg_validators/tx_validator/block_header_validator.d.ts +5 -4
  135. package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
  136. package/dest/msg_validators/tx_validator/block_header_validator.js +7 -6
  137. package/dest/msg_validators/tx_validator/data_validator.d.ts +3 -1
  138. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  139. package/dest/msg_validators/tx_validator/data_validator.js +60 -87
  140. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +3 -4
  141. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
  142. package/dest/msg_validators/tx_validator/double_spend_validator.js +24 -29
  143. package/dest/msg_validators/tx_validator/factory.d.ts +21 -0
  144. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -0
  145. package/dest/msg_validators/tx_validator/factory.js +84 -0
  146. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +10 -0
  147. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -0
  148. package/dest/msg_validators/tx_validator/fee_payer_balance.js +20 -0
  149. package/dest/msg_validators/tx_validator/gas_validator.d.ts +12 -0
  150. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -0
  151. package/dest/msg_validators/tx_validator/gas_validator.js +110 -0
  152. package/dest/msg_validators/tx_validator/index.d.ts +9 -1
  153. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  154. package/dest/msg_validators/tx_validator/index.js +8 -0
  155. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +10 -5
  156. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  157. package/dest/msg_validators/tx_validator/metadata_validator.js +40 -21
  158. package/dest/msg_validators/tx_validator/phases_validator.d.ts +15 -0
  159. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -0
  160. package/dest/msg_validators/tx_validator/phases_validator.js +93 -0
  161. package/dest/msg_validators/tx_validator/size_validator.d.ts +8 -0
  162. package/dest/msg_validators/tx_validator/size_validator.d.ts.map +1 -0
  163. package/dest/msg_validators/tx_validator/size_validator.js +23 -0
  164. package/dest/msg_validators/tx_validator/test_utils.d.ts +17 -0
  165. package/dest/msg_validators/tx_validator/test_utils.d.ts.map +1 -0
  166. package/dest/msg_validators/tx_validator/test_utils.js +22 -0
  167. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +14 -0
  168. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -0
  169. package/dest/msg_validators/tx_validator/timestamp_validator.js +32 -0
  170. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts +9 -0
  171. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts.map +1 -0
  172. package/dest/msg_validators/tx_validator/tx_permitted_validator.js +24 -0
  173. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +3 -2
  174. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
  175. package/dest/msg_validators/tx_validator/tx_proof_validator.js +8 -7
  176. package/dest/services/data_store.d.ts +1 -1
  177. package/dest/services/data_store.d.ts.map +1 -1
  178. package/dest/services/data_store.js +10 -6
  179. package/dest/services/discv5/discV5_service.d.ts +10 -9
  180. package/dest/services/discv5/discV5_service.d.ts.map +1 -1
  181. package/dest/services/discv5/discV5_service.js +64 -37
  182. package/dest/services/dummy_service.d.ts +66 -11
  183. package/dest/services/dummy_service.d.ts.map +1 -1
  184. package/dest/services/dummy_service.js +130 -5
  185. package/dest/services/encoding.d.ts +26 -7
  186. package/dest/services/encoding.d.ts.map +1 -1
  187. package/dest/services/encoding.js +75 -6
  188. package/dest/services/gossipsub/scoring.d.ts +1 -1
  189. package/dest/services/index.d.ts +5 -1
  190. package/dest/services/index.d.ts.map +1 -1
  191. package/dest/services/index.js +4 -0
  192. package/dest/services/libp2p/instrumentation.d.ts +20 -0
  193. package/dest/services/libp2p/instrumentation.d.ts.map +1 -0
  194. package/dest/services/libp2p/instrumentation.js +122 -0
  195. package/dest/services/libp2p/libp2p_service.d.ts +107 -95
  196. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  197. package/dest/services/libp2p/libp2p_service.js +1328 -313
  198. package/dest/services/peer-manager/interface.d.ts +23 -0
  199. package/dest/services/peer-manager/interface.d.ts.map +1 -0
  200. package/dest/services/peer-manager/interface.js +1 -0
  201. package/dest/services/peer-manager/metrics.d.ts +12 -3
  202. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  203. package/dest/services/peer-manager/metrics.js +44 -12
  204. package/dest/services/peer-manager/peer_manager.d.ts +103 -23
  205. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  206. package/dest/services/peer-manager/peer_manager.js +551 -82
  207. package/dest/services/peer-manager/peer_scoring.d.ts +7 -2
  208. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  209. package/dest/services/peer-manager/peer_scoring.js +43 -2
  210. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +47 -0
  211. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -0
  212. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +566 -0
  213. package/dest/services/reqresp/batch-tx-requester/config.d.ts +17 -0
  214. package/dest/services/reqresp/batch-tx-requester/config.d.ts.map +1 -0
  215. package/dest/services/reqresp/batch-tx-requester/config.js +27 -0
  216. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +50 -0
  217. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -0
  218. package/dest/services/reqresp/batch-tx-requester/interface.js +1 -0
  219. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +37 -0
  220. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -0
  221. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +151 -0
  222. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +54 -0
  223. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -0
  224. package/dest/services/reqresp/batch-tx-requester/peer_collection.js +139 -0
  225. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +20 -0
  226. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -0
  227. package/dest/services/reqresp/batch-tx-requester/tx_validator.js +21 -0
  228. package/dest/services/reqresp/config.d.ts +11 -9
  229. package/dest/services/reqresp/config.d.ts.map +1 -1
  230. package/dest/services/reqresp/config.js +18 -4
  231. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +23 -4
  232. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +1 -1
  233. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +73 -10
  234. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +32 -17
  235. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -1
  236. package/dest/services/reqresp/connection-sampler/connection_sampler.js +154 -84
  237. package/dest/services/reqresp/constants.d.ts +12 -0
  238. package/dest/services/reqresp/constants.d.ts.map +1 -0
  239. package/dest/services/reqresp/constants.js +7 -0
  240. package/dest/services/reqresp/index.d.ts +3 -2
  241. package/dest/services/reqresp/index.d.ts.map +1 -1
  242. package/dest/services/reqresp/index.js +2 -1
  243. package/dest/services/reqresp/interface.d.ts +75 -24
  244. package/dest/services/reqresp/interface.d.ts.map +1 -1
  245. package/dest/services/reqresp/interface.js +46 -27
  246. package/dest/services/reqresp/metrics.d.ts +6 -5
  247. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  248. package/dest/services/reqresp/metrics.js +17 -21
  249. package/dest/services/reqresp/protocols/auth.d.ts +43 -0
  250. package/dest/services/reqresp/protocols/auth.d.ts.map +1 -0
  251. package/dest/services/reqresp/protocols/auth.js +71 -0
  252. package/dest/services/reqresp/protocols/block.d.ts +6 -1
  253. package/dest/services/reqresp/protocols/block.d.ts.map +1 -1
  254. package/dest/services/reqresp/protocols/block.js +30 -6
  255. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +34 -0
  256. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -0
  257. package/dest/services/reqresp/protocols/block_txs/bitvector.js +87 -0
  258. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +11 -0
  259. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -0
  260. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +52 -0
  261. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +59 -0
  262. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -0
  263. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +105 -0
  264. package/dest/services/reqresp/protocols/block_txs/index.d.ts +4 -0
  265. package/dest/services/reqresp/protocols/block_txs/index.d.ts.map +1 -0
  266. package/dest/services/reqresp/protocols/block_txs/index.js +3 -0
  267. package/dest/services/reqresp/protocols/goodbye.d.ts +3 -5
  268. package/dest/services/reqresp/protocols/goodbye.d.ts.map +1 -1
  269. package/dest/services/reqresp/protocols/goodbye.js +7 -7
  270. package/dest/services/reqresp/protocols/index.d.ts +3 -1
  271. package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
  272. package/dest/services/reqresp/protocols/index.js +2 -0
  273. package/dest/services/reqresp/protocols/ping.d.ts +1 -3
  274. package/dest/services/reqresp/protocols/ping.d.ts.map +1 -1
  275. package/dest/services/reqresp/protocols/status.d.ts +40 -7
  276. package/dest/services/reqresp/protocols/status.d.ts.map +1 -1
  277. package/dest/services/reqresp/protocols/status.js +76 -5
  278. package/dest/services/reqresp/protocols/tx.d.ts +14 -4
  279. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  280. package/dest/services/reqresp/protocols/tx.js +34 -6
  281. package/dest/services/reqresp/rate-limiter/index.d.ts +1 -1
  282. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +6 -4
  283. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
  284. package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -2
  285. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
  286. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
  287. package/dest/services/reqresp/rate-limiter/rate_limits.js +21 -1
  288. package/dest/services/reqresp/reqresp.d.ts +29 -66
  289. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  290. package/dest/services/reqresp/reqresp.js +753 -248
  291. package/dest/services/reqresp/status.d.ts +10 -4
  292. package/dest/services/reqresp/status.d.ts.map +1 -1
  293. package/dest/services/reqresp/status.js +9 -2
  294. package/dest/services/service.d.ts +40 -20
  295. package/dest/services/service.d.ts.map +1 -1
  296. package/dest/services/tx_collection/config.d.ts +28 -0
  297. package/dest/services/tx_collection/config.d.ts.map +1 -0
  298. package/dest/services/tx_collection/config.js +66 -0
  299. package/dest/services/tx_collection/fast_tx_collection.d.ts +53 -0
  300. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -0
  301. package/dest/services/tx_collection/fast_tx_collection.js +311 -0
  302. package/dest/services/tx_collection/index.d.ts +4 -0
  303. package/dest/services/tx_collection/index.d.ts.map +1 -0
  304. package/dest/services/tx_collection/index.js +3 -0
  305. package/dest/services/tx_collection/instrumentation.d.ts +10 -0
  306. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -0
  307. package/dest/services/tx_collection/instrumentation.js +31 -0
  308. package/dest/services/tx_collection/proposal_tx_collector.d.ts +48 -0
  309. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -0
  310. package/dest/services/tx_collection/proposal_tx_collector.js +50 -0
  311. package/dest/services/tx_collection/slow_tx_collection.d.ts +53 -0
  312. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -0
  313. package/dest/services/tx_collection/slow_tx_collection.js +177 -0
  314. package/dest/services/tx_collection/tx_collection.d.ts +110 -0
  315. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -0
  316. package/dest/services/tx_collection/tx_collection.js +128 -0
  317. package/dest/services/tx_collection/tx_collection_sink.d.ts +30 -0
  318. package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -0
  319. package/dest/services/tx_collection/tx_collection_sink.js +111 -0
  320. package/dest/services/tx_collection/tx_source.d.ts +18 -0
  321. package/dest/services/tx_collection/tx_source.d.ts.map +1 -0
  322. package/dest/services/tx_collection/tx_source.js +31 -0
  323. package/dest/services/tx_provider.d.ts +51 -0
  324. package/dest/services/tx_provider.d.ts.map +1 -0
  325. package/dest/services/tx_provider.js +219 -0
  326. package/dest/services/tx_provider_instrumentation.d.ts +16 -0
  327. package/dest/services/tx_provider_instrumentation.d.ts.map +1 -0
  328. package/dest/services/tx_provider_instrumentation.js +34 -0
  329. package/dest/test-helpers/generate-peer-id-private-keys.d.ts +1 -1
  330. package/dest/test-helpers/get-ports.d.ts +1 -1
  331. package/dest/test-helpers/get-ports.d.ts.map +1 -1
  332. package/dest/test-helpers/index.d.ts +4 -1
  333. package/dest/test-helpers/index.d.ts.map +1 -1
  334. package/dest/test-helpers/index.js +3 -0
  335. package/dest/test-helpers/make-enrs.d.ts +1 -1
  336. package/dest/test-helpers/make-enrs.d.ts.map +1 -1
  337. package/dest/test-helpers/make-enrs.js +4 -5
  338. package/dest/test-helpers/make-test-p2p-clients.d.ts +33 -5
  339. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  340. package/dest/test-helpers/make-test-p2p-clients.js +86 -16
  341. package/dest/test-helpers/mock-pubsub.d.ts +59 -0
  342. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -0
  343. package/dest/test-helpers/mock-pubsub.js +130 -0
  344. package/dest/test-helpers/mock-tx-helpers.d.ts +12 -0
  345. package/dest/test-helpers/mock-tx-helpers.d.ts.map +1 -0
  346. package/dest/test-helpers/mock-tx-helpers.js +19 -0
  347. package/dest/test-helpers/reqresp-nodes.d.ts +15 -11
  348. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  349. package/dest/test-helpers/reqresp-nodes.js +62 -28
  350. package/dest/test-helpers/test_tx_provider.d.ts +40 -0
  351. package/dest/test-helpers/test_tx_provider.d.ts.map +1 -0
  352. package/dest/test-helpers/test_tx_provider.js +41 -0
  353. package/dest/test-helpers/testbench-utils.d.ts +158 -0
  354. package/dest/test-helpers/testbench-utils.d.ts.map +1 -0
  355. package/dest/test-helpers/testbench-utils.js +297 -0
  356. package/dest/testbench/p2p_client_testbench_worker.d.ts +28 -2
  357. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  358. package/dest/testbench/p2p_client_testbench_worker.js +259 -90
  359. package/dest/testbench/parse_log_file.d.ts +1 -1
  360. package/dest/testbench/parse_log_file.js +4 -4
  361. package/dest/testbench/testbench.d.ts +1 -1
  362. package/dest/testbench/testbench.js +4 -4
  363. package/dest/testbench/worker_client_manager.d.ts +51 -11
  364. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  365. package/dest/testbench/worker_client_manager.js +232 -53
  366. package/dest/types/index.d.ts +4 -2
  367. package/dest/types/index.d.ts.map +1 -1
  368. package/dest/types/index.js +2 -0
  369. package/dest/util.d.ts +24 -16
  370. package/dest/util.d.ts.map +1 -1
  371. package/dest/util.js +75 -69
  372. package/dest/versioning.d.ts +4 -4
  373. package/dest/versioning.d.ts.map +1 -1
  374. package/dest/versioning.js +8 -3
  375. package/package.json +32 -27
  376. package/src/bootstrap/bootstrap.ts +34 -15
  377. package/src/client/factory.ts +135 -53
  378. package/src/client/index.ts +1 -0
  379. package/src/client/interface.ts +213 -0
  380. package/src/client/p2p_client.ts +476 -383
  381. package/src/client/test/tx_proposal_collector/README.md +227 -0
  382. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +336 -0
  383. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.ts +43 -0
  384. package/src/config.ts +304 -134
  385. package/src/enr/generate-enr.ts +39 -6
  386. package/src/errors/attestation-pool.error.ts +13 -0
  387. package/src/index.ts +4 -0
  388. package/src/mem_pools/attestation_pool/attestation_pool.ts +119 -24
  389. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +352 -201
  390. package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +233 -72
  391. package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +199 -96
  392. package/src/mem_pools/attestation_pool/mocks.ts +24 -17
  393. package/src/mem_pools/instrumentation.ts +72 -48
  394. package/src/mem_pools/interface.ts +2 -4
  395. package/src/mem_pools/tx_pool/README.md +270 -0
  396. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +580 -143
  397. package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +132 -0
  398. package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +208 -0
  399. package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +162 -0
  400. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +104 -0
  401. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +93 -0
  402. package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +106 -0
  403. package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +75 -0
  404. package/src/mem_pools/tx_pool/index.ts +0 -1
  405. package/src/mem_pools/tx_pool/priority.ts +9 -2
  406. package/src/mem_pools/tx_pool/tx_pool.ts +75 -10
  407. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +225 -36
  408. package/src/msg_validators/attestation_validator/attestation_validator.ts +72 -14
  409. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +94 -0
  410. package/src/msg_validators/attestation_validator/index.ts +1 -0
  411. package/src/msg_validators/clock_tolerance.ts +51 -0
  412. package/src/msg_validators/index.ts +1 -1
  413. package/src/msg_validators/msg_seen_validator/msg_seen_validator.ts +36 -0
  414. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +10 -0
  415. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +13 -0
  416. package/src/msg_validators/proposal_validator/index.ts +3 -0
  417. package/src/msg_validators/proposal_validator/proposal_validator.ts +92 -0
  418. package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +230 -0
  419. package/src/msg_validators/tx_validator/allowed_public_setup.ts +35 -0
  420. package/src/msg_validators/tx_validator/archive_cache.ts +28 -0
  421. package/src/msg_validators/tx_validator/block_header_validator.ts +10 -9
  422. package/src/msg_validators/tx_validator/data_validator.ts +95 -71
  423. package/src/msg_validators/tx_validator/double_spend_validator.ts +23 -20
  424. package/src/msg_validators/tx_validator/factory.ts +151 -0
  425. package/src/msg_validators/tx_validator/fee_payer_balance.ts +40 -0
  426. package/src/msg_validators/tx_validator/gas_validator.ts +123 -0
  427. package/src/msg_validators/tx_validator/index.ts +8 -0
  428. package/src/msg_validators/tx_validator/metadata_validator.ts +72 -24
  429. package/src/msg_validators/tx_validator/phases_validator.ts +118 -0
  430. package/src/msg_validators/tx_validator/size_validator.ts +22 -0
  431. package/src/msg_validators/tx_validator/test_utils.ts +43 -0
  432. package/src/msg_validators/tx_validator/timestamp_validator.ts +52 -0
  433. package/src/msg_validators/tx_validator/tx_permitted_validator.ts +22 -0
  434. package/src/msg_validators/tx_validator/tx_proof_validator.ts +14 -8
  435. package/src/services/data_store.ts +10 -7
  436. package/src/services/discv5/discV5_service.ts +85 -39
  437. package/src/services/dummy_service.ts +198 -9
  438. package/src/services/encoding.ts +82 -6
  439. package/src/services/index.ts +4 -0
  440. package/src/services/libp2p/instrumentation.ts +126 -0
  441. package/src/services/libp2p/libp2p_service.ts +1170 -353
  442. package/src/services/peer-manager/interface.ts +29 -0
  443. package/src/services/peer-manager/metrics.ts +55 -12
  444. package/src/services/peer-manager/peer_manager.ts +657 -80
  445. package/src/services/peer-manager/peer_scoring.ts +45 -3
  446. package/src/services/reqresp/batch-tx-requester/README.md +305 -0
  447. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +706 -0
  448. package/src/services/reqresp/batch-tx-requester/config.ts +40 -0
  449. package/src/services/reqresp/batch-tx-requester/interface.ts +57 -0
  450. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +209 -0
  451. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +205 -0
  452. package/src/services/reqresp/batch-tx-requester/tx_validator.ts +37 -0
  453. package/src/services/reqresp/config.ts +26 -9
  454. package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +77 -10
  455. package/src/services/reqresp/connection-sampler/connection_sampler.ts +166 -95
  456. package/src/services/reqresp/constants.ts +14 -0
  457. package/src/services/reqresp/index.ts +2 -0
  458. package/src/services/reqresp/interface.ts +95 -37
  459. package/src/services/reqresp/metrics.ts +40 -28
  460. package/src/services/reqresp/protocols/auth.ts +83 -0
  461. package/src/services/reqresp/protocols/block.ts +26 -4
  462. package/src/services/reqresp/protocols/block_txs/bitvector.ts +106 -0
  463. package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +67 -0
  464. package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +121 -0
  465. package/src/services/reqresp/protocols/block_txs/index.ts +3 -0
  466. package/src/services/reqresp/protocols/goodbye.ts +9 -7
  467. package/src/services/reqresp/protocols/index.ts +2 -0
  468. package/src/services/reqresp/protocols/status.ts +121 -5
  469. package/src/services/reqresp/protocols/tx.ts +36 -8
  470. package/src/services/reqresp/rate-limiter/rate_limiter.ts +12 -3
  471. package/src/services/reqresp/rate-limiter/rate_limits.ts +21 -1
  472. package/src/services/reqresp/reqresp.ts +449 -271
  473. package/src/services/reqresp/status.ts +12 -3
  474. package/src/services/service.ts +65 -22
  475. package/src/services/tx_collection/config.ts +98 -0
  476. package/src/services/tx_collection/fast_tx_collection.ts +364 -0
  477. package/src/services/tx_collection/index.ts +7 -0
  478. package/src/services/tx_collection/instrumentation.ts +35 -0
  479. package/src/services/tx_collection/proposal_tx_collector.ts +114 -0
  480. package/src/services/tx_collection/slow_tx_collection.ts +233 -0
  481. package/src/services/tx_collection/tx_collection.ts +216 -0
  482. package/src/services/tx_collection/tx_collection_sink.ts +129 -0
  483. package/src/services/tx_collection/tx_source.ts +37 -0
  484. package/src/services/tx_provider.ts +232 -0
  485. package/src/services/tx_provider_instrumentation.ts +54 -0
  486. package/src/test-helpers/index.ts +3 -0
  487. package/src/test-helpers/make-enrs.ts +4 -5
  488. package/src/test-helpers/make-test-p2p-clients.ts +111 -21
  489. package/src/test-helpers/mock-pubsub.ts +188 -0
  490. package/src/test-helpers/mock-tx-helpers.ts +24 -0
  491. package/src/test-helpers/reqresp-nodes.ts +87 -36
  492. package/src/test-helpers/test_tx_provider.ts +64 -0
  493. package/src/test-helpers/testbench-utils.ts +374 -0
  494. package/src/testbench/p2p_client_testbench_worker.ts +434 -89
  495. package/src/testbench/parse_log_file.ts +4 -4
  496. package/src/testbench/testbench.ts +4 -4
  497. package/src/testbench/worker_client_manager.ts +315 -59
  498. package/src/types/index.ts +2 -0
  499. package/src/util.ts +105 -91
  500. package/src/versioning.ts +11 -4
  501. package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts +0 -56
  502. package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts.map +0 -1
  503. package/dest/mem_pools/tx_pool/memory_tx_pool.js +0 -141
  504. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts +0 -8
  505. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts.map +0 -1
  506. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.js +0 -21
  507. package/dest/msg_validators/block_proposal_validator/index.d.ts +0 -2
  508. package/dest/msg_validators/block_proposal_validator/index.d.ts.map +0 -1
  509. package/dest/msg_validators/block_proposal_validator/index.js +0 -1
  510. package/src/mem_pools/tx_pool/memory_tx_pool.ts +0 -174
  511. package/src/msg_validators/block_proposal_validator/block_proposal_validator.ts +0 -29
  512. package/src/msg_validators/block_proposal_validator/index.ts +0 -1
@@ -1,26 +1,84 @@
1
1
  import type { EpochCacheInterface } from '@aztec/epoch-cache';
2
- import { type BlockAttestation, type P2PValidator, PeerErrorSeverity } from '@aztec/stdlib/p2p';
2
+ import { NoCommitteeError } from '@aztec/ethereum/contracts';
3
+ import { type Logger, createLogger } from '@aztec/foundation/log';
4
+ import {
5
+ type CheckpointAttestation,
6
+ type P2PValidator,
7
+ PeerErrorSeverity,
8
+ type ValidationResult,
9
+ } from '@aztec/stdlib/p2p';
3
10
 
4
- export class AttestationValidator implements P2PValidator<BlockAttestation> {
5
- private epochCache: EpochCacheInterface;
11
+ import { isWithinClockTolerance } from '../clock_tolerance.js';
12
+
13
+ export class CheckpointAttestationValidator implements P2PValidator<CheckpointAttestation> {
14
+ protected epochCache: EpochCacheInterface;
15
+ protected logger: Logger;
6
16
 
7
17
  constructor(epochCache: EpochCacheInterface) {
8
18
  this.epochCache = epochCache;
19
+ this.logger = createLogger('p2p:checkpoint-attestation-validator');
9
20
  }
10
21
 
11
- async validate(message: BlockAttestation): Promise<PeerErrorSeverity | undefined> {
12
- const { currentSlot, nextSlot } = await this.epochCache.getProposerInCurrentOrNextSlot();
22
+ async validate(message: CheckpointAttestation): Promise<ValidationResult> {
23
+ const slotNumber = message.payload.header.slotNumber;
13
24
 
14
- const slotNumberBigInt = message.payload.header.globalVariables.slotNumber.toBigInt();
15
- if (slotNumberBigInt !== currentSlot && slotNumberBigInt !== nextSlot) {
16
- return PeerErrorSeverity.HighToleranceError;
17
- }
25
+ try {
26
+ const { currentSlot, nextSlot } = this.epochCache.getCurrentAndNextSlot();
18
27
 
19
- const attester = await message.getSender();
20
- if (!(await this.epochCache.isInCommittee(attester))) {
21
- return PeerErrorSeverity.HighToleranceError;
22
- }
28
+ if (slotNumber !== currentSlot && slotNumber !== nextSlot) {
29
+ // Check if message is for previous slot and within clock tolerance
30
+ if (!isWithinClockTolerance(slotNumber, currentSlot, this.epochCache)) {
31
+ this.logger.warn(
32
+ `Checkpoint attestation slot ${slotNumber} is not current (${currentSlot}) or next (${nextSlot}) slot`,
33
+ );
34
+ return { result: 'reject', severity: PeerErrorSeverity.HighToleranceError };
35
+ }
36
+ this.logger.debug(`Ignoring checkpoint attestation for previous slot ${slotNumber} within clock tolerance`);
37
+ return { result: 'ignore' };
38
+ }
39
+
40
+ // Verify the signature is valid
41
+ const attester = message.getSender();
42
+ if (attester === undefined) {
43
+ this.logger.warn(`Invalid signature in checkpoint attestation for slot ${slotNumber}`);
44
+ return { result: 'reject', severity: PeerErrorSeverity.LowToleranceError };
45
+ }
23
46
 
24
- return undefined;
47
+ // Verify the attester is in the committee for this slot
48
+ if (!(await this.epochCache.isInCommittee(slotNumber, attester))) {
49
+ this.logger.warn(`Attester ${attester.toString()} is not in committee for slot ${slotNumber}`);
50
+ return { result: 'reject', severity: PeerErrorSeverity.HighToleranceError };
51
+ }
52
+
53
+ // Verify the proposer signature matches the expected proposer for the attestation's slot
54
+ // We look up the proposer for the specific slot rather than using currentSlot/nextSlot
55
+ // since timing differences could cause mismatches
56
+ const proposer = message.getProposer();
57
+ const expectedProposer = await this.epochCache.getProposerAttesterAddressInSlot(slotNumber);
58
+ if (!expectedProposer) {
59
+ this.logger.warn(`No proposer defined for slot ${slotNumber}`);
60
+ return { result: 'reject', severity: PeerErrorSeverity.HighToleranceError };
61
+ }
62
+ if (!proposer) {
63
+ this.logger.warn(`Invalid proposer signature in checkpoint attestation for slot ${slotNumber}`);
64
+ return { result: 'reject', severity: PeerErrorSeverity.LowToleranceError };
65
+ }
66
+ if (!proposer.equals(expectedProposer)) {
67
+ this.logger.warn(
68
+ `Proposer signature mismatch in checkpoint attestation. ` +
69
+ `Expected ${expectedProposer?.toString() ?? 'none'} but got ${proposer.toString()} for slot ${slotNumber}`,
70
+ );
71
+ return { result: 'reject', severity: PeerErrorSeverity.HighToleranceError };
72
+ }
73
+
74
+ return { result: 'accept' };
75
+ } catch (e) {
76
+ // People shouldn't be sending us attestations if the committee doesn't exist
77
+ if (e instanceof NoCommitteeError) {
78
+ this.logger.warn(`No committee exists for checkpoint attestation for slot ${slotNumber}`);
79
+ return { result: 'reject', severity: PeerErrorSeverity.LowToleranceError };
80
+ }
81
+ throw e;
82
+ }
25
83
  }
26
84
  }
@@ -0,0 +1,94 @@
1
+ import type { EpochCacheInterface } from '@aztec/epoch-cache';
2
+ import { type CheckpointAttestation, PeerErrorSeverity, type ValidationResult } from '@aztec/stdlib/p2p';
3
+ import { Attributes, Metrics, type TelemetryClient, createUpDownCounterWithDefault } from '@aztec/telemetry-client';
4
+
5
+ import type { AttestationPool } from '../../mem_pools/attestation_pool/attestation_pool.js';
6
+ import { CheckpointAttestationValidator } from './attestation_validator.js';
7
+
8
+ /**
9
+ * FishermanAttestationValidator extends the base AttestationValidator to add
10
+ * additional validation for fisherman nodes: verifying that attestations sign
11
+ * the same payload as the original proposal.
12
+ * Invalid attestations are rejected (not propagated), but peer penalization is
13
+ * handled by LibP2PService based on the fishermanMode config to ensure a better
14
+ * view of the network.
15
+ */
16
+ export class FishermanAttestationValidator extends CheckpointAttestationValidator {
17
+ private invalidAttestationCounter;
18
+
19
+ constructor(
20
+ epochCache: EpochCacheInterface,
21
+ private attestationPool: AttestationPool,
22
+ telemetryClient: TelemetryClient,
23
+ ) {
24
+ super(epochCache);
25
+ this.logger = this.logger.createChild('[FISHERMAN]');
26
+
27
+ const meter = telemetryClient.getMeter('FishermanAttestationValidator');
28
+ this.invalidAttestationCounter = createUpDownCounterWithDefault(
29
+ meter,
30
+ Metrics.VALIDATOR_INVALID_ATTESTATION_RECEIVED_COUNT,
31
+ {
32
+ [Attributes.ERROR_TYPE]: ['base_validation_failed', 'payload_mismatch'],
33
+ },
34
+ );
35
+ }
36
+
37
+ override async validate(message: CheckpointAttestation): Promise<ValidationResult> {
38
+ // First run the standard validation
39
+ const baseValidationResult = await super.validate(message);
40
+ if (baseValidationResult.result !== 'accept') {
41
+ // Track base validation failures (invalid signature, wrong committee, etc.)
42
+ this.invalidAttestationCounter.add(1, {
43
+ [Attributes.ERROR_TYPE]: 'base_validation_failed',
44
+ });
45
+ return baseValidationResult;
46
+ }
47
+
48
+ // fisherman validation: verify attestation payload matches proposal payload
49
+ const slotNumberBigInt = message.payload.header.slotNumber;
50
+ const attester = message.getSender();
51
+ const proposer = message.getProposer();
52
+
53
+ if (!attester || !proposer) {
54
+ return { result: 'accept' };
55
+ }
56
+
57
+ const proposalId = message.archive.toString();
58
+ const proposal = await this.attestationPool.getCheckpointProposal(proposalId);
59
+
60
+ if (proposal) {
61
+ // Compare the attestation payload with the proposal payload
62
+ if (!message.payload.equals(proposal)) {
63
+ this.logger.error(
64
+ `Attestation payload mismatch for slot ${slotNumberBigInt}! ` +
65
+ `Attester ${attester.toString()} signed different data than the proposal.`,
66
+ {
67
+ slot: slotNumberBigInt.toString(),
68
+ attester: attester.toString(),
69
+ proposer: proposer.toString(),
70
+ proposalArchive: proposal.archive.toString(),
71
+ attestationArchive: message.archive.toString(),
72
+ proposalHeader: proposal.checkpointHeader.hash().toString(),
73
+ attestationHeader: message.payload.header.hash().toString(),
74
+ },
75
+ );
76
+
77
+ // Track invalid attestation metric
78
+ this.invalidAttestationCounter.add(1, {
79
+ [Attributes.ERROR_TYPE]: 'payload_mismatch',
80
+ });
81
+
82
+ // Return error to reject the message, but LibP2PService won't penalize in fisherman mode
83
+ return { result: 'reject', severity: PeerErrorSeverity.LowToleranceError };
84
+ }
85
+ } else {
86
+ // We might receive attestations before proposals in some cases
87
+ this.logger.debug(
88
+ `Received attestation for slot ${slotNumberBigInt} but proposal not found yet. ` + `Proposal ID: ${proposalId}`,
89
+ );
90
+ }
91
+
92
+ return { result: 'accept' };
93
+ }
94
+ }
@@ -1 +1,2 @@
1
1
  export * from './attestation_validator.js';
2
+ export * from './fisherman_attestation_validator.js';
@@ -0,0 +1,51 @@
1
+ import type { EpochCacheInterface } from '@aztec/epoch-cache';
2
+ import { SlotNumber } from '@aztec/foundation/branded-types';
3
+
4
+ /**
5
+ * Maximum clock disparity tolerance for P2P message validation (in milliseconds).
6
+ * Messages for the previous slot are accepted if we're within this many milliseconds
7
+ * of the current slot start. This prevents penalizing peers for messages that
8
+ * were valid when sent but arrived slightly late due to network latency.
9
+ *
10
+ * This follows Ethereum's MAXIMUM_GOSSIP_CLOCK_DISPARITY approach.
11
+ */
12
+ export const MAXIMUM_GOSSIP_CLOCK_DISPARITY_MS = 500;
13
+
14
+ /**
15
+ * Checks if a message for the previous slot should be accepted due to clock tolerance.
16
+ *
17
+ * @param messageSlot - The slot number from the received message
18
+ * @param currentSlot - The current slot number
19
+ * @param epochCache - EpochCache to get timing information
20
+ * @returns true if the message is for the previous slot AND we're within the clock tolerance window
21
+ */
22
+ export function isWithinClockTolerance(
23
+ messageSlot: SlotNumber,
24
+ currentSlot: SlotNumber,
25
+ epochCache: EpochCacheInterface,
26
+ ): boolean {
27
+ // Guard against slot 0 edge case (genesis)
28
+ if (currentSlot === SlotNumber.ZERO) {
29
+ return false;
30
+ }
31
+
32
+ // Only apply tolerance to messages for the previous slot
33
+ const previousSlot = SlotNumber(currentSlot - 1);
34
+ if (messageSlot !== previousSlot) {
35
+ return false;
36
+ }
37
+
38
+ // Check how far we are into the current slot (in milliseconds)
39
+ const { ts: slotStartTs, nowMs, slot } = epochCache.getEpochAndSlotNow();
40
+
41
+ // Sanity check: ensure the epoch cache's current slot matches the expected current slot
42
+ if (slot !== currentSlot) {
43
+ return false;
44
+ }
45
+
46
+ // ts is in seconds, convert to ms; nowMs is already in milliseconds
47
+ const slotStartMs = slotStartTs * 1000n;
48
+ const elapsedMs = Number(nowMs - slotStartMs);
49
+
50
+ return elapsedMs < MAXIMUM_GOSSIP_CLOCK_DISPARITY_MS;
51
+ }
@@ -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';
@@ -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, type ValidationResult } from '@aztec/stdlib/p2p';
5
+
6
+ import { isWithinClockTolerance } from '../clock_tolerance.js';
7
+
8
+ export abstract class ProposalValidator<TProposal extends BlockProposal | CheckpointProposal> {
9
+ protected epochCache: EpochCacheInterface;
10
+ protected logger: Logger;
11
+ protected txsPermitted: boolean;
12
+
13
+ constructor(epochCache: EpochCacheInterface, opts: { txsPermitted: boolean }, loggerName: string) {
14
+ this.epochCache = epochCache;
15
+ this.txsPermitted = opts.txsPermitted;
16
+ this.logger = createLogger(loggerName);
17
+ }
18
+
19
+ public async validate(proposal: TProposal): Promise<ValidationResult> {
20
+ try {
21
+ // Slot check
22
+ const { currentSlot, nextSlot } = this.epochCache.getCurrentAndNextSlot();
23
+ const slotNumber = proposal.slotNumber;
24
+ if (slotNumber !== currentSlot && slotNumber !== nextSlot) {
25
+ // Check if message is for previous slot and within clock tolerance
26
+ if (!isWithinClockTolerance(slotNumber, currentSlot, this.epochCache)) {
27
+ this.logger.warn(`Penalizing peer for invalid slot number ${slotNumber}`, { currentSlot, nextSlot });
28
+ return { result: 'reject', severity: PeerErrorSeverity.HighToleranceError };
29
+ }
30
+ this.logger.verbose(`Ignoring proposal for previous slot ${slotNumber} within clock tolerance`);
31
+ return { result: 'ignore' };
32
+ }
33
+
34
+ // Signature validity
35
+ const proposer = proposal.getSender();
36
+ if (!proposer) {
37
+ this.logger.warn(`Penalizing peer for proposal with invalid signature`);
38
+ return { result: 'reject', severity: PeerErrorSeverity.MidToleranceError };
39
+ }
40
+
41
+ // Transactions permitted check
42
+ const embeddedTxCount = proposal.txs?.length ?? 0;
43
+ if (!this.txsPermitted && (proposal.txHashes.length > 0 || embeddedTxCount > 0)) {
44
+ this.logger.warn(
45
+ `Penalizing peer for proposal with ${proposal.txHashes.length} transaction(s) when transactions are not permitted`,
46
+ );
47
+ return { result: 'reject', severity: PeerErrorSeverity.MidToleranceError };
48
+ }
49
+
50
+ // Embedded txs must be listed in txHashes
51
+ const hashSet = new Set(proposal.txHashes.map(h => h.toString()));
52
+ const missingTxHashes =
53
+ embeddedTxCount > 0
54
+ ? proposal.txs!.filter(tx => !hashSet.has(tx.getTxHash().toString())).map(tx => tx.getTxHash().toString())
55
+ : [];
56
+ if (embeddedTxCount > 0 && missingTxHashes.length > 0) {
57
+ this.logger.warn('Penalizing peer for embedded transaction(s) not included in txHashes', {
58
+ embeddedTxCount,
59
+ txHashesLength: proposal.txHashes.length,
60
+ missingTxHashes,
61
+ });
62
+ return { result: 'reject', severity: PeerErrorSeverity.MidToleranceError };
63
+ }
64
+
65
+ // Proposer check
66
+ const expectedProposer = await this.epochCache.getProposerAttesterAddressInSlot(slotNumber);
67
+ if (expectedProposer !== undefined && !proposer.equals(expectedProposer)) {
68
+ this.logger.warn(`Penalizing peer for invalid proposer for current slot ${slotNumber}`, {
69
+ expectedProposer,
70
+ proposer: proposer.toString(),
71
+ });
72
+ return { result: 'reject', severity: 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 { result: 'reject', severity: PeerErrorSeverity.LowToleranceError };
82
+ }
83
+
84
+ return { result: 'accept' };
85
+ } catch (e) {
86
+ if (e instanceof NoCommitteeError) {
87
+ return { result: 'reject', severity: PeerErrorSeverity.LowToleranceError };
88
+ }
89
+ throw e;
90
+ }
91
+ }
92
+ }
@@ -0,0 +1,230 @@
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 {
5
+ type BlockProposal,
6
+ type CheckpointProposal,
7
+ PeerErrorSeverity,
8
+ type ValidationResult,
9
+ } from '@aztec/stdlib/p2p';
10
+ import type { TxHash } from '@aztec/stdlib/tx';
11
+
12
+ import type { MockProxy } from 'jest-mock-extended';
13
+
14
+ export interface ProposalValidatorTestParams<TProposal extends BlockProposal | CheckpointProposal> {
15
+ validatorFactory: (
16
+ epochCache: EpochCacheInterface,
17
+ opts: { txsPermitted: boolean },
18
+ ) => { validate: (proposal: TProposal) => Promise<ValidationResult> };
19
+ makeProposal: (options?: any) => Promise<TProposal>;
20
+ makeHeader: (epochNumber: number | bigint, slotNumber: number | bigint, blockNumber: number | bigint) => any;
21
+ getSigner: () => Secp256k1Signer;
22
+ getAddress: (signer?: Secp256k1Signer) => EthAddress;
23
+ getSlot: (slot: number | bigint) => any;
24
+ getTxHashes: (n: number) => TxHash[];
25
+ getTxs: () => any[];
26
+ epochCacheMock: () => MockProxy<EpochCacheInterface>;
27
+ }
28
+
29
+ export function sharedProposalValidatorTests<TProposal extends BlockProposal | CheckpointProposal>(
30
+ params: ProposalValidatorTestParams<TProposal>,
31
+ ) {
32
+ const { validatorFactory, makeProposal, makeHeader, getSigner, getAddress, getSlot, getTxHashes, epochCacheMock } =
33
+ params;
34
+
35
+ describe('shared proposal validation logic', () => {
36
+ let epochCache: MockProxy<EpochCacheInterface>;
37
+ let validator: { validate: (proposal: TProposal) => Promise<ValidationResult> };
38
+ const previousSlot = getSlot(99);
39
+ const currentSlot = getSlot(100);
40
+ const nextSlot = getSlot(101);
41
+
42
+ function mockGetProposer(currentProposer: EthAddress, nextProposer: EthAddress, previousProposer?: EthAddress) {
43
+ epochCache.getProposerAttesterAddressInSlot.mockImplementation(slot => {
44
+ if (slot === currentSlot) {
45
+ return Promise.resolve(currentProposer);
46
+ }
47
+ if (slot === nextSlot) {
48
+ return Promise.resolve(nextProposer);
49
+ }
50
+ if (slot === previousSlot && previousProposer) {
51
+ return Promise.resolve(previousProposer);
52
+ }
53
+ throw new Error('Unexpected argument');
54
+ });
55
+ }
56
+
57
+ beforeEach(() => {
58
+ epochCache = epochCacheMock();
59
+ validator = validatorFactory(epochCache, { txsPermitted: true });
60
+ epochCache.getCurrentAndNextSlot.mockReturnValue({
61
+ currentSlot: currentSlot,
62
+ nextSlot: nextSlot,
63
+ });
64
+ });
65
+
66
+ it('returns high tolerance error if slot number is not current or next slot (outside clock tolerance)', async () => {
67
+ const header = makeHeader(1, 99, 99);
68
+ const mockProposal = await makeProposal({ blockHeader: header, lastBlockHeader: header });
69
+
70
+ // Mock getEpochAndSlotNow to return time OUTSIDE clock tolerance (1000ms elapsed)
71
+ epochCache.getEpochAndSlotNow.mockReturnValue({
72
+ epoch: 1 as any,
73
+ slot: currentSlot,
74
+ ts: 1000n, // slot started at 1000 seconds
75
+ nowMs: 1001000n, // 1000ms elapsed, outside 500ms tolerance
76
+ });
77
+
78
+ epochCache.getProposerAttesterAddressInSlot.mockResolvedValue(getAddress());
79
+ const result = await validator.validate(mockProposal);
80
+ expect(result).toEqual({ result: 'reject', severity: PeerErrorSeverity.HighToleranceError });
81
+
82
+ // Should not try to resolve proposers if base validation fails
83
+ expect(epochCache.getProposerAttesterAddressInSlot).not.toHaveBeenCalled();
84
+ });
85
+
86
+ it('returns ignore if previous slot proposal is within clock tolerance', async () => {
87
+ const previousProposer = getSigner();
88
+ const header = makeHeader(1, 99, 99);
89
+ const mockProposal = await makeProposal({
90
+ blockHeader: header,
91
+ lastBlockHeader: header,
92
+ signer: previousProposer,
93
+ });
94
+
95
+ // Mock getEpochAndSlotNow to return time WITHIN clock tolerance (100ms elapsed)
96
+ epochCache.getEpochAndSlotNow.mockReturnValue({
97
+ epoch: 1 as any,
98
+ slot: currentSlot,
99
+ ts: 1000n, // slot started at 1000 seconds
100
+ nowMs: 1000100n, // 100ms elapsed, within 500ms tolerance
101
+ });
102
+
103
+ mockGetProposer(getAddress(), getAddress(), getAddress(previousProposer));
104
+ const result = await validator.validate(mockProposal);
105
+ expect(result).toEqual({ result: 'ignore' });
106
+ });
107
+
108
+ it('returns mid tolerance error if proposer is not current proposer for current slot', async () => {
109
+ const currentProposer = getSigner();
110
+ const nextProposer = getSigner();
111
+ const invalidProposer = getSigner();
112
+ const header = makeHeader(1, 100, 100);
113
+ const mockProposal = await makeProposal({
114
+ blockHeader: header,
115
+ lastBlockHeader: header,
116
+ signer: invalidProposer,
117
+ });
118
+
119
+ mockGetProposer(getAddress(currentProposer), getAddress(nextProposer));
120
+ const result = await validator.validate(mockProposal);
121
+ expect(result).toEqual({ result: 'reject', severity: PeerErrorSeverity.MidToleranceError });
122
+ });
123
+
124
+ it('returns mid tolerance error if proposer is not next proposer for next slot', async () => {
125
+ const currentProposer = getSigner();
126
+ const nextProposer = getSigner();
127
+ const invalidProposer = getSigner();
128
+ const header = makeHeader(1, 101, 101);
129
+ const mockProposal = await makeProposal({
130
+ blockHeader: header,
131
+ lastBlockHeader: header,
132
+ signer: invalidProposer,
133
+ });
134
+
135
+ mockGetProposer(getAddress(currentProposer), getAddress(nextProposer));
136
+ const result = await validator.validate(mockProposal);
137
+ expect(result).toEqual({ result: 'reject', severity: PeerErrorSeverity.MidToleranceError });
138
+ });
139
+
140
+ it('returns mid tolerance error if proposer is current proposer but proposal is for next slot', async () => {
141
+ const currentProposer = getSigner();
142
+ const nextProposer = getSigner();
143
+ const header = makeHeader(1, 101, 101);
144
+ const mockProposal = await makeProposal({
145
+ blockHeader: header,
146
+ lastBlockHeader: header,
147
+ signer: currentProposer,
148
+ });
149
+
150
+ mockGetProposer(getAddress(currentProposer), getAddress(nextProposer));
151
+ const result = await validator.validate(mockProposal);
152
+ expect(result).toEqual({ result: 'reject', severity: PeerErrorSeverity.MidToleranceError });
153
+ });
154
+
155
+ it('returns undefined if proposal is valid for current slot and proposer', async () => {
156
+ const currentProposer = getSigner();
157
+ const nextProposer = getSigner();
158
+ const header = makeHeader(1, 100, 100);
159
+ const mockProposal = await makeProposal({
160
+ blockHeader: header,
161
+ lastBlockHeader: header,
162
+ signer: currentProposer,
163
+ });
164
+
165
+ mockGetProposer(getAddress(currentProposer), getAddress(nextProposer));
166
+ const result = await validator.validate(mockProposal);
167
+ expect(result).toEqual({ result: 'accept' });
168
+ });
169
+
170
+ it('returns undefined if proposal is valid for next slot and proposer', async () => {
171
+ const currentProposer = getSigner();
172
+ const nextProposer = getSigner();
173
+ const header = makeHeader(1, 101, 101);
174
+ const mockProposal = await makeProposal({ blockHeader: header, lastBlockHeader: header, signer: nextProposer });
175
+
176
+ mockGetProposer(getAddress(currentProposer), getAddress(nextProposer));
177
+ const result = await validator.validate(mockProposal);
178
+ expect(result).toEqual({ result: 'accept' });
179
+ });
180
+
181
+ describe('transaction permission validation', () => {
182
+ it('returns mid tolerance error if txs not permitted and proposal contains txHashes', async () => {
183
+ const currentProposer = getSigner();
184
+ const validatorWithTxsDisabled = validatorFactory(epochCache, { txsPermitted: false });
185
+ const header = makeHeader(1, 100, 100);
186
+ const mockProposal = await makeProposal({
187
+ blockHeader: header,
188
+ lastBlockHeader: header,
189
+ signer: currentProposer,
190
+ txHashes: getTxHashes(2),
191
+ });
192
+
193
+ mockGetProposer(getAddress(currentProposer), getAddress());
194
+ const result = await validatorWithTxsDisabled.validate(mockProposal);
195
+ expect(result).toEqual({ result: 'reject', severity: PeerErrorSeverity.MidToleranceError });
196
+ });
197
+
198
+ it('returns undefined if txs not permitted but proposal has no txHashes', async () => {
199
+ const currentProposer = getSigner();
200
+ const validatorWithTxsDisabled = validatorFactory(epochCache, { txsPermitted: false });
201
+ const header = makeHeader(1, 100, 100);
202
+ const mockProposal = await makeProposal({
203
+ blockHeader: header,
204
+ lastBlockHeader: header,
205
+ signer: currentProposer,
206
+ txHashes: getTxHashes(0),
207
+ });
208
+
209
+ mockGetProposer(getAddress(currentProposer), getAddress());
210
+ const result = await validatorWithTxsDisabled.validate(mockProposal);
211
+ expect(result).toEqual({ result: 'accept' });
212
+ });
213
+
214
+ it('returns undefined if txs permitted and proposal contains txHashes', async () => {
215
+ const currentProposer = getSigner();
216
+ const header = makeHeader(1, 100, 100);
217
+ const mockProposal = await makeProposal({
218
+ blockHeader: header,
219
+ lastBlockHeader: header,
220
+ signer: currentProposer,
221
+ txHashes: getTxHashes(2),
222
+ });
223
+
224
+ mockGetProposer(getAddress(currentProposer), getAddress());
225
+ const result = await validator.validate(mockProposal);
226
+ expect(result).toEqual({ result: 'accept' });
227
+ });
228
+ });
229
+ });
230
+ }