@aztec/p2p 0.0.1-commit.e558bd1c → 0.0.1-commit.e588bc7e5

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 (431) hide show
  1. package/README.md +129 -3
  2. package/dest/client/factory.d.ts +9 -9
  3. package/dest/client/factory.d.ts.map +1 -1
  4. package/dest/client/factory.js +52 -14
  5. package/dest/client/interface.d.ts +47 -34
  6. package/dest/client/interface.d.ts.map +1 -1
  7. package/dest/client/p2p_client.d.ts +39 -51
  8. package/dest/client/p2p_client.d.ts.map +1 -1
  9. package/dest/client/p2p_client.js +164 -224
  10. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +20 -10
  11. package/dest/config.d.ts +54 -17
  12. package/dest/config.d.ts.map +1 -1
  13. package/dest/config.js +102 -38
  14. package/dest/errors/p2p-service.error.d.ts +9 -0
  15. package/dest/errors/p2p-service.error.d.ts.map +1 -0
  16. package/dest/errors/p2p-service.error.js +10 -0
  17. package/dest/errors/tx-pool.error.d.ts +8 -0
  18. package/dest/errors/tx-pool.error.d.ts.map +1 -0
  19. package/dest/errors/tx-pool.error.js +9 -0
  20. package/dest/index.d.ts +2 -2
  21. package/dest/index.d.ts.map +1 -1
  22. package/dest/index.js +1 -1
  23. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +21 -12
  24. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  25. package/dest/mem_pools/attestation_pool/attestation_pool.js +75 -40
  26. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +1 -1
  27. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
  28. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +57 -57
  29. package/dest/mem_pools/attestation_pool/index.d.ts +2 -2
  30. package/dest/mem_pools/attestation_pool/index.d.ts.map +1 -1
  31. package/dest/mem_pools/attestation_pool/index.js +1 -1
  32. package/dest/mem_pools/attestation_pool/mocks.d.ts +2 -2
  33. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  34. package/dest/mem_pools/attestation_pool/mocks.js +2 -2
  35. package/dest/mem_pools/index.d.ts +2 -2
  36. package/dest/mem_pools/index.d.ts.map +1 -1
  37. package/dest/mem_pools/instrumentation.d.ts +4 -2
  38. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  39. package/dest/mem_pools/instrumentation.js +16 -14
  40. package/dest/mem_pools/interface.d.ts +3 -3
  41. package/dest/mem_pools/interface.d.ts.map +1 -1
  42. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +104 -0
  43. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -0
  44. package/dest/mem_pools/tx_pool_v2/deleted_pool.js +251 -0
  45. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts +3 -3
  46. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts.map +1 -1
  47. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.js +18 -9
  48. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +1 -1
  49. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -1
  50. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +7 -3
  51. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +3 -3
  52. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -1
  53. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +12 -4
  54. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +2 -2
  55. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -1
  56. package/dest/mem_pools/tx_pool_v2/eviction/index.js +1 -1
  57. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +54 -5
  58. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -1
  59. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.js +8 -0
  60. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +7 -5
  61. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +7 -5
  62. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +2 -2
  63. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -1
  64. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +14 -6
  65. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +4 -4
  66. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -1
  67. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +16 -4
  68. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +3 -3
  69. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -1
  70. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +3 -3
  71. package/dest/mem_pools/tx_pool_v2/index.d.ts +3 -2
  72. package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -1
  73. package/dest/mem_pools/tx_pool_v2/index.js +2 -1
  74. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts +15 -0
  75. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts.map +1 -0
  76. package/dest/mem_pools/tx_pool_v2/instrumentation.js +43 -0
  77. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +30 -12
  78. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
  79. package/dest/mem_pools/tx_pool_v2/interfaces.js +5 -1
  80. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +78 -15
  81. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
  82. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +144 -19
  83. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +12 -3
  84. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -1
  85. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +50 -45
  86. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +12 -5
  87. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -1
  88. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +17 -6
  89. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +14 -5
  90. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -1
  91. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +364 -189
  92. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +1 -1
  93. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  94. package/dest/msg_validators/attestation_validator/attestation_validator.js +5 -4
  95. package/dest/msg_validators/clock_tolerance.d.ts +1 -1
  96. package/dest/msg_validators/clock_tolerance.d.ts.map +1 -1
  97. package/dest/msg_validators/clock_tolerance.js +4 -3
  98. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +6 -4
  99. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
  100. package/dest/msg_validators/proposal_validator/block_proposal_validator.js +10 -2
  101. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +6 -4
  102. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
  103. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +16 -2
  104. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +13 -8
  105. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
  106. package/dest/msg_validators/proposal_validator/proposal_validator.js +53 -41
  107. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +4 -4
  108. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  109. package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +3 -3
  110. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +2 -1
  111. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -1
  112. package/dest/msg_validators/tx_validator/allowed_public_setup.js +24 -20
  113. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts +17 -0
  114. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts.map +1 -0
  115. package/dest/msg_validators/tx_validator/allowed_setup_helpers.js +24 -0
  116. package/dest/msg_validators/tx_validator/block_header_validator.d.ts +16 -3
  117. package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
  118. package/dest/msg_validators/tx_validator/block_header_validator.js +1 -1
  119. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts +9 -0
  120. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts.map +1 -0
  121. package/dest/msg_validators/tx_validator/contract_instance_validator.js +48 -0
  122. package/dest/msg_validators/tx_validator/data_validator.d.ts +1 -1
  123. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  124. package/dest/msg_validators/tx_validator/data_validator.js +35 -2
  125. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +13 -3
  126. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
  127. package/dest/msg_validators/tx_validator/double_spend_validator.js +4 -4
  128. package/dest/msg_validators/tx_validator/factory.d.ts +133 -6
  129. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  130. package/dest/msg_validators/tx_validator/factory.js +247 -60
  131. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +1 -1
  132. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -1
  133. package/dest/msg_validators/tx_validator/fee_payer_balance.js +6 -2
  134. package/dest/msg_validators/tx_validator/gas_validator.d.ts +67 -3
  135. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  136. package/dest/msg_validators/tx_validator/gas_validator.js +104 -37
  137. package/dest/msg_validators/tx_validator/index.d.ts +3 -1
  138. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  139. package/dest/msg_validators/tx_validator/index.js +2 -0
  140. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +1 -1
  141. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  142. package/dest/msg_validators/tx_validator/metadata_validator.js +4 -4
  143. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts +14 -0
  144. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts.map +1 -0
  145. package/dest/msg_validators/tx_validator/nullifier_cache.js +24 -0
  146. package/dest/msg_validators/tx_validator/phases_validator.d.ts +22 -2
  147. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
  148. package/dest/msg_validators/tx_validator/phases_validator.js +72 -24
  149. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +20 -4
  150. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
  151. package/dest/msg_validators/tx_validator/timestamp_validator.js +6 -6
  152. package/dest/services/dummy_service.d.ts +12 -6
  153. package/dest/services/dummy_service.d.ts.map +1 -1
  154. package/dest/services/dummy_service.js +12 -5
  155. package/dest/services/encoding.d.ts +7 -3
  156. package/dest/services/encoding.d.ts.map +1 -1
  157. package/dest/services/encoding.js +18 -11
  158. package/dest/services/gossipsub/index.d.ts +3 -0
  159. package/dest/services/gossipsub/index.d.ts.map +1 -0
  160. package/dest/services/gossipsub/index.js +2 -0
  161. package/dest/services/gossipsub/scoring.d.ts +21 -3
  162. package/dest/services/gossipsub/scoring.d.ts.map +1 -1
  163. package/dest/services/gossipsub/scoring.js +24 -7
  164. package/dest/services/gossipsub/topic_score_params.d.ts +173 -0
  165. package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -0
  166. package/dest/services/gossipsub/topic_score_params.js +346 -0
  167. package/dest/services/libp2p/libp2p_service.d.ts +37 -23
  168. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  169. package/dest/services/libp2p/libp2p_service.js +291 -202
  170. package/dest/services/peer-manager/metrics.d.ts +3 -1
  171. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  172. package/dest/services/peer-manager/metrics.js +6 -0
  173. package/dest/services/peer-manager/peer_manager.d.ts +6 -2
  174. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  175. package/dest/services/peer-manager/peer_manager.js +24 -9
  176. package/dest/services/peer-manager/peer_scoring.d.ts +5 -2
  177. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  178. package/dest/services/peer-manager/peer_scoring.js +53 -12
  179. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +12 -8
  180. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -1
  181. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +83 -106
  182. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +4 -7
  183. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
  184. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +11 -13
  185. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -1
  186. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +31 -46
  187. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +19 -11
  188. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -1
  189. package/dest/services/reqresp/batch-tx-requester/peer_collection.js +52 -15
  190. package/dest/services/reqresp/batch-tx-requester/tx_validator.js +2 -2
  191. package/dest/services/reqresp/interface.d.ts +10 -1
  192. package/dest/services/reqresp/interface.d.ts.map +1 -1
  193. package/dest/services/reqresp/interface.js +15 -1
  194. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +3 -3
  195. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
  196. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +7 -1
  197. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
  198. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +15 -0
  199. package/dest/services/reqresp/protocols/tx.d.ts +7 -1
  200. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  201. package/dest/services/reqresp/protocols/tx.js +20 -0
  202. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +5 -4
  203. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
  204. package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -8
  205. package/dest/services/reqresp/reqresp.d.ts +1 -1
  206. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  207. package/dest/services/reqresp/reqresp.js +30 -14
  208. package/dest/services/service.d.ts +26 -4
  209. package/dest/services/service.d.ts.map +1 -1
  210. package/dest/services/tx_collection/config.d.ts +19 -1
  211. package/dest/services/tx_collection/config.d.ts.map +1 -1
  212. package/dest/services/tx_collection/config.js +46 -0
  213. package/dest/services/tx_collection/fast_tx_collection.d.ts +3 -4
  214. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
  215. package/dest/services/tx_collection/fast_tx_collection.js +80 -76
  216. package/dest/services/tx_collection/file_store_tx_collection.d.ts +53 -0
  217. package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -0
  218. package/dest/services/tx_collection/file_store_tx_collection.js +167 -0
  219. package/dest/services/tx_collection/file_store_tx_source.d.ts +38 -0
  220. package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -0
  221. package/dest/services/tx_collection/file_store_tx_source.js +100 -0
  222. package/dest/services/tx_collection/index.d.ts +2 -1
  223. package/dest/services/tx_collection/index.d.ts.map +1 -1
  224. package/dest/services/tx_collection/index.js +1 -0
  225. package/dest/services/tx_collection/instrumentation.d.ts +1 -1
  226. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
  227. package/dest/services/tx_collection/instrumentation.js +2 -1
  228. package/dest/services/tx_collection/proposal_tx_collector.d.ts +7 -7
  229. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -1
  230. package/dest/services/tx_collection/proposal_tx_collector.js +5 -4
  231. package/dest/services/tx_collection/request_tracker.d.ts +53 -0
  232. package/dest/services/tx_collection/request_tracker.d.ts.map +1 -0
  233. package/dest/services/tx_collection/request_tracker.js +84 -0
  234. package/dest/services/tx_collection/slow_tx_collection.d.ts +7 -3
  235. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -1
  236. package/dest/services/tx_collection/slow_tx_collection.js +60 -26
  237. package/dest/services/tx_collection/tx_collection.d.ts +23 -13
  238. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  239. package/dest/services/tx_collection/tx_collection.js +75 -3
  240. package/dest/services/tx_collection/tx_collection_sink.d.ts +18 -8
  241. package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -1
  242. package/dest/services/tx_collection/tx_collection_sink.js +26 -29
  243. package/dest/services/tx_collection/tx_source.d.ts +13 -7
  244. package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
  245. package/dest/services/tx_collection/tx_source.js +26 -7
  246. package/dest/services/tx_file_store/config.d.ts +1 -3
  247. package/dest/services/tx_file_store/config.d.ts.map +1 -1
  248. package/dest/services/tx_file_store/config.js +0 -4
  249. package/dest/services/tx_file_store/tx_file_store.d.ts +4 -3
  250. package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -1
  251. package/dest/services/tx_file_store/tx_file_store.js +9 -6
  252. package/dest/services/tx_provider.d.ts +4 -4
  253. package/dest/services/tx_provider.d.ts.map +1 -1
  254. package/dest/services/tx_provider.js +9 -8
  255. package/dest/test-helpers/make-test-p2p-clients.d.ts +7 -8
  256. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  257. package/dest/test-helpers/make-test-p2p-clients.js +1 -2
  258. package/dest/test-helpers/mock-pubsub.d.ts +30 -4
  259. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  260. package/dest/test-helpers/mock-pubsub.js +105 -4
  261. package/dest/test-helpers/reqresp-nodes.d.ts +2 -3
  262. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  263. package/dest/test-helpers/reqresp-nodes.js +4 -3
  264. package/dest/test-helpers/testbench-utils.d.ts +35 -24
  265. package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
  266. package/dest/test-helpers/testbench-utils.js +124 -38
  267. package/dest/testbench/p2p_client_testbench_worker.d.ts +2 -2
  268. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  269. package/dest/testbench/p2p_client_testbench_worker.js +57 -27
  270. package/dest/testbench/worker_client_manager.d.ts +3 -1
  271. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  272. package/dest/testbench/worker_client_manager.js +6 -3
  273. package/dest/util.d.ts +3 -3
  274. package/dest/util.d.ts.map +1 -1
  275. package/package.json +14 -14
  276. package/src/client/factory.ts +102 -25
  277. package/src/client/interface.ts +52 -34
  278. package/src/client/p2p_client.ts +190 -266
  279. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +33 -14
  280. package/src/config.ts +158 -44
  281. package/src/errors/p2p-service.error.ts +11 -0
  282. package/src/errors/tx-pool.error.ts +12 -0
  283. package/src/index.ts +1 -1
  284. package/src/mem_pools/attestation_pool/attestation_pool.ts +104 -50
  285. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +61 -57
  286. package/src/mem_pools/attestation_pool/index.ts +3 -3
  287. package/src/mem_pools/attestation_pool/mocks.ts +2 -1
  288. package/src/mem_pools/index.ts +1 -1
  289. package/src/mem_pools/instrumentation.ts +17 -13
  290. package/src/mem_pools/interface.ts +2 -2
  291. package/src/mem_pools/tx_pool_v2/README.md +85 -11
  292. package/src/mem_pools/tx_pool_v2/deleted_pool.ts +321 -0
  293. package/src/mem_pools/tx_pool_v2/eviction/eviction_manager.ts +21 -8
  294. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +7 -3
  295. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +18 -4
  296. package/src/mem_pools/tx_pool_v2/eviction/index.ts +4 -0
  297. package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +59 -4
  298. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +5 -5
  299. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +5 -5
  300. package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +14 -9
  301. package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +33 -6
  302. package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +4 -3
  303. package/src/mem_pools/tx_pool_v2/index.ts +2 -1
  304. package/src/mem_pools/tx_pool_v2/instrumentation.ts +69 -0
  305. package/src/mem_pools/tx_pool_v2/interfaces.ts +32 -12
  306. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +209 -27
  307. package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +58 -45
  308. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +34 -8
  309. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +410 -187
  310. package/src/msg_validators/attestation_validator/README.md +49 -0
  311. package/src/msg_validators/attestation_validator/attestation_validator.ts +5 -4
  312. package/src/msg_validators/clock_tolerance.ts +4 -3
  313. package/src/msg_validators/proposal_validator/README.md +123 -0
  314. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +14 -4
  315. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +20 -7
  316. package/src/msg_validators/proposal_validator/proposal_validator.ts +69 -45
  317. package/src/msg_validators/tx_validator/README.md +119 -0
  318. package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +5 -5
  319. package/src/msg_validators/tx_validator/allowed_public_setup.ts +22 -27
  320. package/src/msg_validators/tx_validator/allowed_setup_helpers.ts +31 -0
  321. package/src/msg_validators/tx_validator/block_header_validator.ts +15 -3
  322. package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
  323. package/src/msg_validators/tx_validator/data_validator.ts +42 -1
  324. package/src/msg_validators/tx_validator/double_spend_validator.ts +11 -6
  325. package/src/msg_validators/tx_validator/factory.ts +394 -78
  326. package/src/msg_validators/tx_validator/fee_payer_balance.ts +6 -2
  327. package/src/msg_validators/tx_validator/gas_validator.ts +123 -27
  328. package/src/msg_validators/tx_validator/index.ts +2 -0
  329. package/src/msg_validators/tx_validator/metadata_validator.ts +12 -4
  330. package/src/msg_validators/tx_validator/nullifier_cache.ts +30 -0
  331. package/src/msg_validators/tx_validator/phases_validator.ts +82 -27
  332. package/src/msg_validators/tx_validator/timestamp_validator.ts +23 -18
  333. package/src/services/dummy_service.ts +18 -7
  334. package/src/services/encoding.ts +18 -10
  335. package/src/services/gossipsub/README.md +641 -0
  336. package/src/services/gossipsub/index.ts +2 -0
  337. package/src/services/gossipsub/scoring.ts +29 -5
  338. package/src/services/gossipsub/topic_score_params.ts +487 -0
  339. package/src/services/libp2p/libp2p_service.ts +307 -229
  340. package/src/services/peer-manager/metrics.ts +7 -0
  341. package/src/services/peer-manager/peer_manager.ts +28 -9
  342. package/src/services/peer-manager/peer_scoring.ts +46 -5
  343. package/src/services/reqresp/README.md +229 -0
  344. package/src/services/reqresp/batch-tx-requester/README.md +46 -7
  345. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +79 -112
  346. package/src/services/reqresp/batch-tx-requester/interface.ts +3 -6
  347. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +30 -71
  348. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +68 -24
  349. package/src/services/reqresp/batch-tx-requester/tx_validator.ts +2 -2
  350. package/src/services/reqresp/interface.ts +26 -1
  351. package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +2 -2
  352. package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +17 -0
  353. package/src/services/reqresp/protocols/tx.ts +22 -0
  354. package/src/services/reqresp/rate-limiter/rate_limiter.ts +13 -9
  355. package/src/services/reqresp/reqresp.ts +35 -15
  356. package/src/services/service.ts +37 -3
  357. package/src/services/tx_collection/config.ts +68 -0
  358. package/src/services/tx_collection/fast_tx_collection.ts +83 -76
  359. package/src/services/tx_collection/file_store_tx_collection.ts +202 -0
  360. package/src/services/tx_collection/file_store_tx_source.ts +129 -0
  361. package/src/services/tx_collection/index.ts +1 -0
  362. package/src/services/tx_collection/instrumentation.ts +7 -1
  363. package/src/services/tx_collection/proposal_tx_collector.ts +9 -13
  364. package/src/services/tx_collection/request_tracker.ts +127 -0
  365. package/src/services/tx_collection/slow_tx_collection.ts +66 -33
  366. package/src/services/tx_collection/tx_collection.ts +114 -19
  367. package/src/services/tx_collection/tx_collection_sink.ts +30 -34
  368. package/src/services/tx_collection/tx_source.ts +28 -8
  369. package/src/services/tx_file_store/config.ts +0 -6
  370. package/src/services/tx_file_store/tx_file_store.ts +10 -8
  371. package/src/services/tx_provider.ts +10 -9
  372. package/src/test-helpers/make-test-p2p-clients.ts +4 -6
  373. package/src/test-helpers/mock-pubsub.ts +146 -9
  374. package/src/test-helpers/reqresp-nodes.ts +5 -7
  375. package/src/test-helpers/testbench-utils.ts +146 -43
  376. package/src/testbench/p2p_client_testbench_worker.ts +63 -30
  377. package/src/testbench/worker_client_manager.ts +13 -6
  378. package/src/util.ts +8 -2
  379. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +0 -125
  380. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +0 -1
  381. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +0 -596
  382. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +0 -32
  383. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +0 -1
  384. package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +0 -112
  385. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +0 -157
  386. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +0 -1
  387. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +0 -52
  388. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +0 -16
  389. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +0 -1
  390. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +0 -122
  391. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +0 -17
  392. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +0 -1
  393. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +0 -84
  394. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +0 -19
  395. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +0 -1
  396. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +0 -78
  397. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +0 -26
  398. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +0 -1
  399. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +0 -84
  400. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +0 -25
  401. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +0 -1
  402. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +0 -57
  403. package/dest/mem_pools/tx_pool/index.d.ts +0 -3
  404. package/dest/mem_pools/tx_pool/index.d.ts.map +0 -1
  405. package/dest/mem_pools/tx_pool/index.js +0 -2
  406. package/dest/mem_pools/tx_pool/priority.d.ts +0 -12
  407. package/dest/mem_pools/tx_pool/priority.d.ts.map +0 -1
  408. package/dest/mem_pools/tx_pool/priority.js +0 -15
  409. package/dest/mem_pools/tx_pool/tx_pool.d.ts +0 -127
  410. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +0 -1
  411. package/dest/mem_pools/tx_pool/tx_pool.js +0 -3
  412. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +0 -7
  413. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +0 -1
  414. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +0 -400
  415. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +0 -23
  416. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +0 -1
  417. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +0 -212
  418. package/src/mem_pools/tx_pool/README.md +0 -270
  419. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -746
  420. package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +0 -132
  421. package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +0 -208
  422. package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +0 -162
  423. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +0 -104
  424. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +0 -93
  425. package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +0 -106
  426. package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +0 -75
  427. package/src/mem_pools/tx_pool/index.ts +0 -2
  428. package/src/mem_pools/tx_pool/priority.ts +0 -20
  429. package/src/mem_pools/tx_pool/tx_pool.ts +0 -141
  430. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +0 -319
  431. package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +0 -230
@@ -8,14 +8,18 @@ export type TryAddResult = {
8
8
  added: boolean;
9
9
  /** Whether the exact item already existed */
10
10
  alreadyExists: boolean;
11
- /** Total items for this position - used for duplicate detection */
12
- totalForPosition: number;
11
+ /** Count of items for the position. Meaning varies by method:
12
+ * - tryAddBlockProposal: proposals at (slot, indexWithinCheckpoint)
13
+ * - tryAddCheckpointProposal: proposals at slot
14
+ * - tryAddCheckpointAttestation: attestations by this signer for this slot */
15
+ count: number;
13
16
  };
14
- export declare const MAX_PROPOSALS_PER_SLOT = 5;
15
- export declare const MAX_PROPOSALS_PER_POSITION = 3;
16
- export declare const ATTESTATION_CAP_BUFFER = 10;
17
+ export declare const MAX_CHECKPOINT_PROPOSALS_PER_SLOT = 2;
18
+ export declare const MAX_BLOCK_PROPOSALS_PER_POSITION = 2;
19
+ /** Maximum attestations a single signer can make per slot before being rejected. */
20
+ export declare const MAX_ATTESTATIONS_PER_SLOT_AND_SIGNER = 2;
17
21
  /** Public API interface for attestation pools. Used for typing mocks and test implementations. */
18
- export type AttestationPoolApi = Pick<AttestationPool, 'tryAddBlockProposal' | 'getBlockProposal' | 'tryAddCheckpointProposal' | 'getCheckpointProposal' | 'addOwnCheckpointAttestations' | 'tryAddCheckpointAttestation' | 'deleteOlderThan' | 'getCheckpointAttestationsForSlot' | 'getCheckpointAttestationsForSlotAndProposal' | 'isEmpty'>;
22
+ export type AttestationPoolApi = Pick<AttestationPool, 'tryAddBlockProposal' | 'getBlockProposal' | 'tryAddCheckpointProposal' | 'getCheckpointProposal' | 'addOwnCheckpointAttestations' | 'tryAddCheckpointAttestation' | 'deleteOlderThan' | 'getCheckpointAttestationsForSlot' | 'getCheckpointAttestationsForSlotAndProposal' | 'hasBlockProposalsForSlot' | 'isEmpty'>;
19
23
  /**
20
24
  * Pool for storing attestations and proposals collected by a validator.
21
25
  *
@@ -31,6 +35,7 @@ export declare class AttestationPool {
31
35
  private checkpointProposalsForSlot;
32
36
  private blockProposals;
33
37
  private blockProposalsForSlotAndIndex;
38
+ private checkpointAttestationsPerSlotAndSigner;
34
39
  constructor(store: AztecAsyncKVStore, telemetry?: TelemetryClient, log?: import("@aztec/foundation/log").Logger);
35
40
  private poolStats;
36
41
  /** Returns whether the pool is empty. */
@@ -41,6 +46,8 @@ export declare class AttestationPool {
41
46
  private getAttestationKeyRangeForSlot;
42
47
  /** Returns range bounds for querying all attestations for a given (slot, proposalId). */
43
48
  private getAttestationKeyRangeForProposal;
49
+ /** Creates a key for the per-signer-per-slot attestation index. Uses padded slot for lexicographic ordering. */
50
+ private getSlotSignerKey;
44
51
  /** Number of bits reserved for indexWithinCheckpoint in position keys. */
45
52
  private static readonly INDEX_BITS;
46
53
  /** Maximum indexWithinCheckpoint value (2^10 - 1 = 1023). */
@@ -70,6 +77,8 @@ export declare class AttestationPool {
70
77
  * @return The block proposal if it exists, otherwise undefined.
71
78
  */
72
79
  getBlockProposal(id: string): Promise<BlockProposal | undefined>;
80
+ /** Checks if any block proposals exist for a given slot (at index 0). */
81
+ hasBlockProposalsForSlot(slot: SlotNumber): Promise<boolean>;
73
82
  /**
74
83
  * Attempts to add a checkpoint proposal to the pool.
75
84
  *
@@ -128,16 +137,16 @@ export declare class AttestationPool {
128
137
  *
129
138
  * This method performs validation and addition in a single call:
130
139
  * - Checks if the attestation already exists (returns alreadyExists: true if so)
131
- * - Checks if the (slot, proposalId) has reached the attestation cap (returns added: false if so)
140
+ * - Checks if this signer has reached the per-signer attestation cap for this slot
132
141
  * - Adds the attestation if validation passes
133
142
  *
134
143
  * @param attestation - The checkpoint attestation to add
135
- * @param committeeSize - Committee size for the attestation's slot
136
- * @returns Result indicating whether the attestation was added and existence info
144
+ * @returns Result indicating whether the attestation was added, existence info, and count of
145
+ * attestations by this signer for this slot (for equivocation detection)
137
146
  */
138
- tryAddCheckpointAttestation(attestation: CheckpointAttestation, committeeSize: number): Promise<TryAddResult>;
139
- private getAttestationCount;
147
+ tryAddCheckpointAttestation(attestation: CheckpointAttestation): Promise<TryAddResult>;
148
+ private getSignerAttestationCountForSlot;
140
149
  }
141
150
  /** Creates an AttestationPool backed by a temporary store for testing. */
142
151
  export declare function createTestAttestationPool(telemetry?: TelemetryClient): Promise<AttestationPool>;
143
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0ZXN0YXRpb25fcG9vbC5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL21lbV9wb29scy9hdHRlc3RhdGlvbl9wb29sL2F0dGVzdGF0aW9uX3Bvb2wudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUF5QixVQUFVLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUlwRixPQUFPLEtBQUssRUFBRSxpQkFBaUIsRUFBcUMsTUFBTSxpQkFBaUIsQ0FBQztBQUM1RixPQUFPLEVBQ0wsYUFBYSxFQUNiLHFCQUFxQixFQUVyQixLQUFLLHNCQUFzQixFQUM1QixNQUFNLG1CQUFtQixDQUFDO0FBQzNCLE9BQU8sRUFBRSxLQUFLLGVBQWUsRUFBc0IsTUFBTSx5QkFBeUIsQ0FBQztBQUluRiw0RUFBNEU7QUFDNUUsTUFBTSxNQUFNLFlBQVksR0FBRztJQUN6QixpQ0FBaUM7SUFDakMsS0FBSyxFQUFFLE9BQU8sQ0FBQztJQUNmLDZDQUE2QztJQUM3QyxhQUFhLEVBQUUsT0FBTyxDQUFDO0lBQ3ZCLG1FQUFtRTtJQUNuRSxnQkFBZ0IsRUFBRSxNQUFNLENBQUM7Q0FDMUIsQ0FBQztBQUVGLGVBQU8sTUFBTSxzQkFBc0IsSUFBSSxDQUFDO0FBQ3hDLGVBQU8sTUFBTSwwQkFBMEIsSUFBSSxDQUFDO0FBQzVDLGVBQU8sTUFBTSxzQkFBc0IsS0FBSyxDQUFDO0FBRXpDLGtHQUFrRztBQUNsRyxNQUFNLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUNuQyxlQUFlLEVBQ2IscUJBQXFCLEdBQ3JCLGtCQUFrQixHQUNsQiwwQkFBMEIsR0FDMUIsdUJBQXVCLEdBQ3ZCLDhCQUE4QixHQUM5Qiw2QkFBNkIsR0FDN0IsaUJBQWlCLEdBQ2pCLGtDQUFrQyxHQUNsQyw2Q0FBNkMsR0FDN0MsU0FBUyxDQUNaLENBQUM7QUFFRjs7Ozs7R0FLRztBQUNILHFCQUFhLGVBQWU7SUFzQnhCLE9BQU8sQ0FBQyxLQUFLO0lBRWIsT0FBTyxDQUFD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
152
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0ZXN0YXRpb25fcG9vbC5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL21lbV9wb29scy9hdHRlc3RhdGlvbl9wb29sL2F0dGVzdGF0aW9uX3Bvb2wudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUF5QixVQUFVLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUlwRixPQUFPLEtBQUssRUFBRSxpQkFBaUIsRUFBcUMsTUFBTSxpQkFBaUIsQ0FBQztBQUM1RixPQUFPLEVBQ0wsYUFBYSxFQUNiLHFCQUFxQixFQUVyQixLQUFLLHNCQUFzQixFQUM1QixNQUFNLG1CQUFtQixDQUFDO0FBQzNCLE9BQU8sRUFBRSxLQUFLLGVBQWUsRUFBc0IsTUFBTSx5QkFBeUIsQ0FBQztBQUluRiw0RUFBNEU7QUFDNUUsTUFBTSxNQUFNLFlBQVksR0FBRztJQUN6QixpQ0FBaUM7SUFDakMsS0FBSyxFQUFFLE9BQU8sQ0FBQztJQUNmLDZDQUE2QztJQUM3QyxhQUFhLEVBQUUsT0FBTyxDQUFDO0lBQ3ZCOzs7bUZBRytFO0lBQy9FLEtBQUssRUFBRSxNQUFNLENBQUM7Q0FDZixDQUFDO0FBRUYsZUFBTyxNQUFNLGlDQUFpQyxJQUFJLENBQUM7QUFDbkQsZUFBTyxNQUFNLGdDQUFnQyxJQUFJLENBQUM7QUFDbEQsb0ZBQW9GO0FBQ3BGLGVBQU8sTUFBTSxvQ0FBb0MsSUFBSSxDQUFDO0FBRXRELGtHQUFrRztBQUNsRyxNQUFNLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUNuQyxlQUFlLEVBQ2IscUJBQXFCLEdBQ3JCLGtCQUFrQixHQUNsQiwwQkFBMEIsR0FDMUIsdUJBQXVCLEdBQ3ZCLDhCQUE4QixHQUM5Qiw2QkFBNkIsR0FDN0IsaUJBQWlCLEdBQ2pCLGtDQUFrQyxHQUNsQyw2Q0FBNkMsR0FDN0MsMEJBQTBCLEdBQzFCLFNBQVMsQ0FDWixDQUFDO0FBRUY7Ozs7O0dBS0c7QUFDSCxxQkFBYSxlQUFlO0lBMEJ4QixPQUFP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
@@ -1 +1 @@
1
- {"version":3,"file":"attestation_pool.d.ts","sourceRoot":"","sources":["../../../src/mem_pools/attestation_pool/attestation_pool.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"attestation_pool.d.ts","sourceRoot":"","sources":["../../../src/mem_pools/attestation_pool/attestation_pool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyB,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAIpF,OAAO,KAAK,EAAE,iBAAiB,EAAqC,MAAM,iBAAiB,CAAC;AAC5F,OAAO,EACL,aAAa,EACb,qBAAqB,EAErB,KAAK,sBAAsB,EAC5B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,KAAK,eAAe,EAAsB,MAAM,yBAAyB,CAAC;AAInF,4EAA4E;AAC5E,MAAM,MAAM,YAAY,GAAG;IACzB,iCAAiC;IACjC,KAAK,EAAE,OAAO,CAAC;IACf,6CAA6C;IAC7C,aAAa,EAAE,OAAO,CAAC;IACvB;;;mFAG+E;IAC/E,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,eAAO,MAAM,iCAAiC,IAAI,CAAC;AACnD,eAAO,MAAM,gCAAgC,IAAI,CAAC;AAClD,oFAAoF;AACpF,eAAO,MAAM,oCAAoC,IAAI,CAAC;AAEtD,kGAAkG;AAClG,MAAM,MAAM,kBAAkB,GAAG,IAAI,CACnC,eAAe,EACb,qBAAqB,GACrB,kBAAkB,GAClB,0BAA0B,GAC1B,uBAAuB,GACvB,8BAA8B,GAC9B,6BAA6B,GAC7B,iBAAiB,GACjB,kCAAkC,GAClC,6CAA6C,GAC7C,0BAA0B,GAC1B,SAAS,CACZ,CAAC;AAEF;;;;;GAKG;AACH,qBAAa,eAAe;IA0BxB,OAAO,CAAC,KAAK;IAEb,OAAO,CAAC,GAAG;IA3Bb,OAAO,CAAC,OAAO,CAA6C;IAI5D,OAAO,CAAC,sBAAsB,CAAgC;IAG9D,OAAO,CAAC,mBAAmB,CAAgC;IAI3D,OAAO,CAAC,0BAA0B,CAAqC;IAGvE,OAAO,CAAC,cAAc,CAAgC;IAItD,OAAO,CAAC,6BAA6B,CAAqC;IAI1E,OAAO,CAAC,sCAAsC,CAAqC;IAEnF,YACU,KAAK,EAAE,iBAAiB,EAChC,SAAS,GAAE,eAAsC,EACzC,GAAG,yCAAyC,EAerD;IAED,OAAO,CAAC,SAAS,CAIf;IAEF,yCAAyC;IAC5B,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,CAQvC;IAED,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,iBAAiB;IAIzB,2EAA2E;IAC3E,OAAO,CAAC,6BAA6B;IAKrC,yFAAyF;IACzF,OAAO,CAAC,iCAAiC;IAKzC,gHAAgH;IAChH,OAAO,CAAC,gBAAgB;IAKxB,0EAA0E;IAC1E,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAM;IACxC,6DAA6D;IAC7D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAyC;IAE1E,wFAAwF;IACxF,OAAO,CAAC,mBAAmB;IAS3B;;;;;;;;;;OAUG;IACU,mBAAmB,CAAC,aAAa,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CAsCpF;IAED,4FAA4F;IAC5F,OAAO,CAAC,gCAAgC;YAS1B,gBAAgB;IAU9B;;;;;;OAMG;IACU,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CAW5E;IAED,yEAAyE;IAC5D,wBAAwB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,CAIxE;IAED;;;;;;;;;;;;;;OAcG;IACU,wBAAwB,CAAC,QAAQ,EAAE,sBAAsB,GAAG,OAAO,CAAC,YAAY,CAAC,CA6B7F;YAGa,qBAAqB;IAQnC;;;;;;;;OAQG;IACU,qBAAqB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,GAAG,SAAS,CAAC,CAW1F;IAED;;;OAGG;IACU,4BAA4B,CAAC,YAAY,EAAE,qBAAqB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA+B9F;IAED;;;;;OAKG;IACU,gCAAgC,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAShG;IAED;;;;;;OAMG;IACU,2CAA2C,CACtD,IAAI,EAAE,UAAU,EAChB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,qBAAqB,EAAE,CAAC,CASlC;IAED;;;;OAIG;IACU,eAAe,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAoDlE;IAED;;;;;;;;;;;OAWG;IACU,2BAA2B,CAAC,WAAW,EAAE,qBAAqB,GAAG,OAAO,CAAC,YAAY,CAAC,CA+DlG;YAGa,gCAAgC;CAI/C;AAED,0EAA0E;AAC1E,wBAAsB,yBAAyB,CAAC,SAAS,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,CAIrG"}
@@ -4,9 +4,9 @@ import { createLogger } from '@aztec/foundation/log';
4
4
  import { BlockProposal, CheckpointAttestation, CheckpointProposal } from '@aztec/stdlib/p2p';
5
5
  import { getTelemetryClient } from '@aztec/telemetry-client';
6
6
  import { PoolInstrumentation, PoolName } from '../instrumentation.js';
7
- export const MAX_PROPOSALS_PER_SLOT = 5;
8
- export const MAX_PROPOSALS_PER_POSITION = 3;
9
- export const ATTESTATION_CAP_BUFFER = 10;
7
+ export const MAX_CHECKPOINT_PROPOSALS_PER_SLOT = 2;
8
+ export const MAX_BLOCK_PROPOSALS_PER_POSITION = 2;
9
+ /** Maximum attestations a single signer can make per slot before being rejected. */ export const MAX_ATTESTATIONS_PER_SLOT_AND_SIGNER = 2;
10
10
  /**
11
11
  * Pool for storing attestations and proposals collected by a validator.
12
12
  *
@@ -29,6 +29,9 @@ export const ATTESTATION_CAP_BUFFER = 10;
29
29
  // Block proposals indexed by slot and index-within-checkpoint for duplicate detection
30
30
  // Key: (slot << 10) | indexWithinCheckpoint, Value: archive string
31
31
  blockProposalsForSlotAndIndex;
32
+ // Checkpoint attestations indexed by (slot, signer) for tracking attestations per (slot, signer) for duplicate detection
33
+ // Key: `${Fr(slot).toString()}-${signerAddress}` string (padded for lexicographic ordering), Value: `proposalId` strings
34
+ checkpointAttestationsPerSlotAndSigner;
32
35
  constructor(store, telemetry = getTelemetryClient(), log = createLogger('aztec:attestation_pool')){
33
36
  this.store = store;
34
37
  this.log = log;
@@ -42,6 +45,7 @@ export const ATTESTATION_CAP_BUFFER = 10;
42
45
  this.blockProposalsForSlotAndIndex = store.openMultiMap('block_proposals_for_slot_and_index');
43
46
  // Initialize checkpoint attestations storage
44
47
  this.checkpointAttestations = store.openMap('checkpoint_attestations');
48
+ this.checkpointAttestationsPerSlotAndSigner = store.openMultiMap('checkpoint_attestations_per_slot_and_signer');
45
49
  // Initialize checkpoint proposal storage
46
50
  this.checkpointProposals = store.openMap('checkpoint_proposals');
47
51
  this.checkpointProposalsForSlot = store.openMultiMap('checkpoint_proposals_for_slot');
@@ -79,6 +83,10 @@ export const ATTESTATION_CAP_BUFFER = 10;
79
83
  end: `${proposalKey}-Z`
80
84
  };
81
85
  }
86
+ /** Creates a key for the per-signer-per-slot attestation index. Uses padded slot for lexicographic ordering. */ getSlotSignerKey(slot, signerAddress) {
87
+ const slotStr = new Fr(slot).toString();
88
+ return `${slotStr}-${signerAddress}`;
89
+ }
82
90
  /** Number of bits reserved for indexWithinCheckpoint in position keys. */ static INDEX_BITS = 10;
83
91
  /** Maximum indexWithinCheckpoint value (2^10 - 1 = 1023). */ static MAX_INDEX = (1 << AttestationPool.INDEX_BITS) - 1;
84
92
  /** Creates a position key for block proposals: (slot << 10) | indexWithinCheckpoint. */ getBlockPositionKey(slot, indexWithinCheckpoint) {
@@ -103,20 +111,20 @@ export const ATTESTATION_CAP_BUFFER = 10;
103
111
  // Check if already exists
104
112
  const alreadyExists = await this.blockProposals.hasAsync(proposalId);
105
113
  if (alreadyExists) {
106
- const totalForPosition = await this.getBlockProposalCountForPosition(blockProposal.slotNumber, blockProposal.indexWithinCheckpoint);
114
+ const count = await this.getBlockProposalCountForPosition(blockProposal.slotNumber, blockProposal.indexWithinCheckpoint);
107
115
  return {
108
116
  added: false,
109
117
  alreadyExists: true,
110
- totalForPosition
118
+ count
111
119
  };
112
120
  }
113
121
  // Get current count for position and check cap, do not add if exceeded
114
- const totalForPosition = await this.getBlockProposalCountForPosition(blockProposal.slotNumber, blockProposal.indexWithinCheckpoint);
115
- if (totalForPosition >= MAX_PROPOSALS_PER_POSITION) {
122
+ const count = await this.getBlockProposalCountForPosition(blockProposal.slotNumber, blockProposal.indexWithinCheckpoint);
123
+ if (count >= MAX_BLOCK_PROPOSALS_PER_POSITION) {
116
124
  return {
117
125
  added: false,
118
126
  alreadyExists: false,
119
- totalForPosition
127
+ count
120
128
  };
121
129
  }
122
130
  // Add the proposal
@@ -129,7 +137,7 @@ export const ATTESTATION_CAP_BUFFER = 10;
129
137
  return {
130
138
  added: true,
131
139
  alreadyExists: false,
132
- totalForPosition: totalForPosition + 1
140
+ count: count + 1
133
141
  };
134
142
  });
135
143
  }
@@ -162,6 +170,11 @@ export const ATTESTATION_CAP_BUFFER = 10;
162
170
  }
163
171
  return undefined;
164
172
  }
173
+ /** Checks if any block proposals exist for a given slot (at index 0). */ async hasBlockProposalsForSlot(slot) {
174
+ const positionKey = this.getBlockPositionKey(slot, 0);
175
+ const count = await this.blockProposalsForSlotAndIndex.getValueCountAsync(positionKey);
176
+ return count > 0;
177
+ }
165
178
  /**
166
179
  * Attempts to add a checkpoint proposal to the pool.
167
180
  *
@@ -177,25 +190,25 @@ export const ATTESTATION_CAP_BUFFER = 10;
177
190
  * @param proposal - The checkpoint proposal core to add
178
191
  * @returns Result indicating whether the proposal was added and duplicate detection info
179
192
  */ async tryAddCheckpointProposal(proposal) {
180
- return await this.store.transactionAsync(async ()=>{
193
+ const result = await this.store.transactionAsync(async ()=>{
181
194
  const proposalId = proposal.archive.toString();
182
195
  // Check if already exists
183
196
  const alreadyExists = await this.checkpointProposals.hasAsync(proposalId);
184
197
  if (alreadyExists) {
185
- const totalForPosition = await this.checkpointProposalsForSlot.getValueCountAsync(proposal.slotNumber);
198
+ const count = await this.checkpointProposalsForSlot.getValueCountAsync(proposal.slotNumber);
186
199
  return {
187
200
  added: false,
188
201
  alreadyExists: true,
189
- totalForPosition
202
+ count
190
203
  };
191
204
  }
192
205
  // Get current count for slot and check cap
193
- const totalForPosition = await this.checkpointProposalsForSlot.getValueCountAsync(proposal.slotNumber);
194
- if (totalForPosition >= MAX_PROPOSALS_PER_SLOT) {
206
+ const count = await this.checkpointProposalsForSlot.getValueCountAsync(proposal.slotNumber);
207
+ if (count >= MAX_CHECKPOINT_PROPOSALS_PER_SLOT) {
195
208
  return {
196
209
  added: false,
197
210
  alreadyExists: false,
198
- totalForPosition
211
+ count
199
212
  };
200
213
  }
201
214
  // Add the proposal if cap not exceeded
@@ -207,9 +220,10 @@ export const ATTESTATION_CAP_BUFFER = 10;
207
220
  return {
208
221
  added: true,
209
222
  alreadyExists: false,
210
- totalForPosition: totalForPosition + 1
223
+ count: count + 1
211
224
  };
212
225
  });
226
+ return result;
213
227
  }
214
228
  /** Internal method - must be called within a transaction. */ async addCheckpointProposal(proposal) {
215
229
  const slotKey = proposal.slotNumber;
@@ -243,7 +257,7 @@ export const ATTESTATION_CAP_BUFFER = 10;
243
257
  await this.store.transactionAsync(async ()=>{
244
258
  for (const attestation of attestations){
245
259
  const slotNumber = attestation.payload.header.slotNumber;
246
- const proposalId = attestation.archive;
260
+ const proposalId = attestation.archive.toString();
247
261
  const sender = attestation.getSender();
248
262
  // Skip attestations with invalid signatures
249
263
  if (!sender) {
@@ -255,7 +269,9 @@ export const ATTESTATION_CAP_BUFFER = 10;
255
269
  continue;
256
270
  }
257
271
  const address = sender.toString();
258
- await this.checkpointAttestations.set(this.getAttestationKey(slotNumber, proposalId, address), attestation.toBuffer());
272
+ const ownKey = this.getAttestationKey(slotNumber, proposalId, address);
273
+ await this.checkpointAttestations.set(ownKey, attestation.toBuffer());
274
+ this.metrics.trackMempoolItemAdded(ownKey);
259
275
  this.log.debug(`Added own checkpoint attestation for slot ${slotNumber} from ${address}`, {
260
276
  signature: attestation.signature.toString(),
261
277
  slotNumber,
@@ -308,8 +324,18 @@ export const ATTESTATION_CAP_BUFFER = 10;
308
324
  end: attestationEndKey
309
325
  })){
310
326
  await this.checkpointAttestations.delete(key);
327
+ this.metrics.trackMempoolItemRemoved(key);
311
328
  numberOfAttestations++;
312
329
  }
330
+ // Clean up per-signer-per-slot index. Keys are formatted as `${Fr(slot).toString()}-${signerAddress}`.
331
+ // Since Fr pads to fixed-width hex, Fr(oldestSlot) is lexicographically greater than any key with
332
+ // a smaller slot (even with the signer suffix), so using it as the exclusive end bound is correct.
333
+ const slotSignerEndKey = new Fr(oldestSlot).toString();
334
+ for await (const key of this.checkpointAttestationsPerSlotAndSigner.keysAsync({
335
+ end: slotSignerEndKey
336
+ })){
337
+ await this.checkpointAttestationsPerSlotAndSigner.delete(key);
338
+ }
313
339
  // Delete checkpoint proposals for slots < oldestSlot, using checkpointProposalsForSlot as index
314
340
  for await (const slot of this.checkpointProposalsForSlot.keysAsync({
315
341
  end: oldestSlot
@@ -347,13 +373,13 @@ export const ATTESTATION_CAP_BUFFER = 10;
347
373
  *
348
374
  * This method performs validation and addition in a single call:
349
375
  * - Checks if the attestation already exists (returns alreadyExists: true if so)
350
- * - Checks if the (slot, proposalId) has reached the attestation cap (returns added: false if so)
376
+ * - Checks if this signer has reached the per-signer attestation cap for this slot
351
377
  * - Adds the attestation if validation passes
352
378
  *
353
379
  * @param attestation - The checkpoint attestation to add
354
- * @param committeeSize - Committee size for the attestation's slot
355
- * @returns Result indicating whether the attestation was added and existence info
356
- */ async tryAddCheckpointAttestation(attestation, committeeSize) {
380
+ * @returns Result indicating whether the attestation was added, existence info, and count of
381
+ * attestations by this signer for this slot (for equivocation detection)
382
+ */ async tryAddCheckpointAttestation(attestation) {
357
383
  const slotNumber = attestation.payload.header.slotNumber;
358
384
  const proposalId = attestation.archive.toString();
359
385
  const sender = attestation.getSender();
@@ -361,50 +387,59 @@ export const ATTESTATION_CAP_BUFFER = 10;
361
387
  return {
362
388
  added: false,
363
389
  alreadyExists: false,
364
- totalForPosition: 0
390
+ count: 0
365
391
  };
366
392
  }
393
+ const signerAddress = sender.toString();
367
394
  return await this.store.transactionAsync(async ()=>{
368
- const key = this.getAttestationKey(slotNumber, proposalId, sender.toString());
395
+ const key = this.getAttestationKey(slotNumber, proposalId, signerAddress);
369
396
  const alreadyExists = await this.checkpointAttestations.hasAsync(key);
397
+ // Get count of attestations by this signer for this slot (for duplicate detection)
398
+ const signerAttestationCount = await this.getSignerAttestationCountForSlot(slotNumber, signerAddress);
370
399
  if (alreadyExists) {
371
- const total = await this.getAttestationCount(slotNumber, proposalId);
372
400
  return {
373
401
  added: false,
374
402
  alreadyExists: true,
375
- totalForPosition: total
403
+ count: signerAttestationCount
376
404
  };
377
405
  }
378
- const limit = committeeSize + ATTESTATION_CAP_BUFFER;
379
- const currentCount = await this.getAttestationCount(slotNumber, proposalId);
380
- if (currentCount >= limit) {
406
+ // Check if this signer has exceeded the per-signer cap for this slot
407
+ if (signerAttestationCount >= MAX_ATTESTATIONS_PER_SLOT_AND_SIGNER) {
408
+ this.log.debug(`Rejecting attestation: signer ${signerAddress} exceeded per-slot cap for slot ${slotNumber}`, {
409
+ slotNumber,
410
+ signerAddress,
411
+ proposalId,
412
+ signerAttestationCount
413
+ });
381
414
  return {
382
415
  added: false,
383
416
  alreadyExists: false,
384
- totalForPosition: currentCount
417
+ count: signerAttestationCount
385
418
  };
386
419
  }
420
+ // Add the attestation
387
421
  await this.checkpointAttestations.set(key, attestation.toBuffer());
388
- this.log.debug(`Added checkpoint attestation for slot ${slotNumber} from ${sender.toString()}`, {
422
+ this.metrics.trackMempoolItemAdded(key);
423
+ // Track this attestation in the per-signer-per-slot index for duplicate detection
424
+ const slotSignerKey = this.getSlotSignerKey(slotNumber, signerAddress);
425
+ await this.checkpointAttestationsPerSlotAndSigner.set(slotSignerKey, proposalId);
426
+ this.log.debug(`Added checkpoint attestation for slot ${slotNumber} from ${signerAddress}`, {
389
427
  signature: attestation.signature.toString(),
390
428
  slotNumber,
391
- address: sender.toString(),
429
+ address: signerAddress,
392
430
  proposalId
393
431
  });
432
+ // Return the new count
394
433
  return {
395
434
  added: true,
396
435
  alreadyExists: false,
397
- totalForPosition: currentCount + 1
436
+ count: signerAttestationCount + 1
398
437
  };
399
438
  });
400
439
  }
401
- /** Gets the count of attestations for a given (slot, proposalId). */ async getAttestationCount(slot, proposalId) {
402
- const range = this.getAttestationKeyRangeForProposal(slot, proposalId);
403
- let count = 0;
404
- for await (const _ of this.checkpointAttestations.keysAsync(range)){
405
- count++;
406
- }
407
- return count;
440
+ /** Gets the count of attestations by a specific signer for a given slot. */ async getSignerAttestationCountForSlot(slot, signerAddress) {
441
+ const slotSignerKey = this.getSlotSignerKey(slot, signerAddress);
442
+ return await this.checkpointAttestationsPerSlotAndSigner.getValueCountAsync(slotSignerKey);
408
443
  }
409
444
  }
410
445
  /** Creates an AttestationPool backed by a temporary store for testing. */ export async function createTestAttestationPool(telemetry) {
@@ -1,3 +1,3 @@
1
1
  import { type AttestationPool } from './attestation_pool.js';
2
2
  export declare function describeAttestationPool(getAttestationPool: () => AttestationPool): void;
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0ZXN0YXRpb25fcG9vbF90ZXN0X3N1aXRlLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbWVtX3Bvb2xzL2F0dGVzdGF0aW9uX3Bvb2wvYXR0ZXN0YXRpb25fcG9vbF90ZXN0X3N1aXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVlBLE9BQU8sRUFBRSxLQUFLLGVBQWUsRUFBc0QsTUFBTSx1QkFBdUIsQ0FBQztBQUtqSCx3QkFBZ0IsdUJBQXVCLENBQUMsa0JBQWtCLEVBQUUsTUFBTSxlQUFlLFFBMnJCaEYifQ==
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0ZXN0YXRpb25fcG9vbF90ZXN0X3N1aXRlLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbWVtX3Bvb2xzL2F0dGVzdGF0aW9uX3Bvb2wvYXR0ZXN0YXRpb25fcG9vbF90ZXN0X3N1aXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVlBLE9BQU8sRUFDTCxLQUFLLGVBQWUsRUFHckIsTUFBTSx1QkFBdUIsQ0FBQztBQUsvQix3QkFBZ0IsdUJBQXVCLENBQUMsa0JBQWtCLEVBQUUsTUFBTSxlQUFlLFFBMnJCaEYifQ==
@@ -1 +1 @@
1
- {"version":3,"file":"attestation_pool_test_suite.d.ts","sourceRoot":"","sources":["../../../src/mem_pools/attestation_pool/attestation_pool_test_suite.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,KAAK,eAAe,EAAsD,MAAM,uBAAuB,CAAC;AAKjH,wBAAgB,uBAAuB,CAAC,kBAAkB,EAAE,MAAM,eAAe,QA2rBhF"}
1
+ {"version":3,"file":"attestation_pool_test_suite.d.ts","sourceRoot":"","sources":["../../../src/mem_pools/attestation_pool/attestation_pool_test_suite.ts"],"names":[],"mappings":"AAYA,OAAO,EACL,KAAK,eAAe,EAGrB,MAAM,uBAAuB,CAAC;AAK/B,wBAAgB,uBAAuB,CAAC,kBAAkB,EAAE,MAAM,eAAe,QA2rBhF"}