@aztec/p2p 3.0.0-devnet.2 → 3.0.0-devnet.2-patch.1

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 (259) hide show
  1. package/dest/bootstrap/bootstrap.d.ts +1 -1
  2. package/dest/bootstrap/bootstrap.d.ts.map +1 -1
  3. package/dest/client/factory.d.ts +1 -1
  4. package/dest/client/index.d.ts +1 -1
  5. package/dest/client/interface.d.ts +4 -2
  6. package/dest/client/interface.d.ts.map +1 -1
  7. package/dest/client/p2p_client.d.ts +8 -26
  8. package/dest/client/p2p_client.d.ts.map +1 -1
  9. package/dest/client/p2p_client.js +31 -24
  10. package/dest/config.d.ts +60 -54
  11. package/dest/config.d.ts.map +1 -1
  12. package/dest/config.js +12 -2
  13. package/dest/enr/generate-enr.d.ts +1 -1
  14. package/dest/enr/index.d.ts +1 -1
  15. package/dest/errors/attestation-pool.error.d.ts +7 -0
  16. package/dest/errors/attestation-pool.error.d.ts.map +1 -0
  17. package/dest/errors/attestation-pool.error.js +12 -0
  18. package/dest/errors/reqresp.error.d.ts +1 -1
  19. package/dest/errors/reqresp.error.d.ts.map +1 -1
  20. package/dest/index.d.ts +1 -1
  21. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +43 -6
  22. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  23. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +1 -1
  24. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
  25. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +67 -34
  26. package/dest/mem_pools/attestation_pool/index.d.ts +1 -1
  27. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +15 -6
  28. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +1 -1
  29. package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +57 -18
  30. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +13 -6
  31. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +1 -1
  32. package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +51 -7
  33. package/dest/mem_pools/attestation_pool/mocks.d.ts +226 -5
  34. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  35. package/dest/mem_pools/attestation_pool/mocks.js +2 -2
  36. package/dest/mem_pools/index.d.ts +1 -1
  37. package/dest/mem_pools/instrumentation.d.ts +3 -1
  38. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  39. package/dest/mem_pools/instrumentation.js +11 -2
  40. package/dest/mem_pools/interface.d.ts +1 -1
  41. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +5 -38
  42. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +1 -1
  43. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +9 -3
  44. package/dest/mem_pools/tx_pool/index.d.ts +1 -1
  45. package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts +5 -3
  46. package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts.map +1 -1
  47. package/dest/mem_pools/tx_pool/memory_tx_pool.js +7 -0
  48. package/dest/mem_pools/tx_pool/priority.d.ts +1 -1
  49. package/dest/mem_pools/tx_pool/tx_pool.d.ts +10 -3
  50. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +1 -1
  51. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +1 -1
  52. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +1 -1
  53. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +5 -4
  54. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +4 -3
  55. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  56. package/dest/msg_validators/attestation_validator/attestation_validator.js +12 -12
  57. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +20 -0
  58. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -0
  59. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +67 -0
  60. package/dest/msg_validators/attestation_validator/index.d.ts +2 -1
  61. package/dest/msg_validators/attestation_validator/index.d.ts.map +1 -1
  62. package/dest/msg_validators/attestation_validator/index.js +1 -0
  63. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts +1 -1
  64. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts.map +1 -1
  65. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.js +22 -10
  66. package/dest/msg_validators/block_proposal_validator/index.d.ts +1 -1
  67. package/dest/msg_validators/index.d.ts +1 -1
  68. package/dest/msg_validators/msg_seen_validator/msg_seen_validator.d.ts +1 -1
  69. package/dest/msg_validators/msg_seen_validator/msg_seen_validator.d.ts.map +1 -1
  70. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +1 -1
  71. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  72. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +1 -1
  73. package/dest/msg_validators/tx_validator/archive_cache.d.ts +2 -2
  74. package/dest/msg_validators/tx_validator/archive_cache.d.ts.map +1 -1
  75. package/dest/msg_validators/tx_validator/block_header_validator.d.ts +2 -2
  76. package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
  77. package/dest/msg_validators/tx_validator/data_validator.d.ts +1 -1
  78. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  79. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +1 -1
  80. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
  81. package/dest/msg_validators/tx_validator/factory.d.ts +4 -3
  82. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  83. package/dest/msg_validators/tx_validator/factory.js +1 -1
  84. package/dest/msg_validators/tx_validator/gas_validator.d.ts +1 -1
  85. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  86. package/dest/msg_validators/tx_validator/index.d.ts +1 -1
  87. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +2 -2
  88. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  89. package/dest/msg_validators/tx_validator/phases_validator.d.ts +1 -1
  90. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
  91. package/dest/msg_validators/tx_validator/phases_validator.js +3 -1
  92. package/dest/msg_validators/tx_validator/test_utils.d.ts +2 -2
  93. package/dest/msg_validators/tx_validator/test_utils.d.ts.map +1 -1
  94. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +3 -2
  95. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
  96. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts +1 -1
  97. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts.map +1 -1
  98. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +1 -1
  99. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
  100. package/dest/services/data_store.d.ts +1 -1
  101. package/dest/services/data_store.d.ts.map +1 -1
  102. package/dest/services/discv5/discV5_service.d.ts +1 -1
  103. package/dest/services/discv5/discV5_service.d.ts.map +1 -1
  104. package/dest/services/dummy_service.d.ts +1 -1
  105. package/dest/services/dummy_service.d.ts.map +1 -1
  106. package/dest/services/encoding.d.ts +25 -4
  107. package/dest/services/encoding.d.ts.map +1 -1
  108. package/dest/services/encoding.js +74 -6
  109. package/dest/services/gossipsub/scoring.d.ts +1 -1
  110. package/dest/services/index.d.ts +1 -1
  111. package/dest/services/libp2p/instrumentation.d.ts +3 -1
  112. package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
  113. package/dest/services/libp2p/instrumentation.js +9 -2
  114. package/dest/services/libp2p/libp2p_service.d.ts +25 -74
  115. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  116. package/dest/services/libp2p/libp2p_service.js +308 -84
  117. package/dest/services/peer-manager/interface.d.ts +1 -1
  118. package/dest/services/peer-manager/metrics.d.ts +3 -1
  119. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  120. package/dest/services/peer-manager/metrics.js +11 -0
  121. package/dest/services/peer-manager/peer_manager.d.ts +1 -32
  122. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  123. package/dest/services/peer-manager/peer_manager.js +4 -2
  124. package/dest/services/peer-manager/peer_scoring.d.ts +7 -2
  125. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  126. package/dest/services/peer-manager/peer_scoring.js +40 -2
  127. package/dest/services/reqresp/config.d.ts +1 -1
  128. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +1 -1
  129. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +1 -1
  130. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +1 -4
  131. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -1
  132. package/dest/services/reqresp/index.d.ts +1 -1
  133. package/dest/services/reqresp/interface.d.ts +2 -2
  134. package/dest/services/reqresp/interface.d.ts.map +1 -1
  135. package/dest/services/reqresp/interface.js +1 -1
  136. package/dest/services/reqresp/metrics.d.ts +1 -1
  137. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  138. package/dest/services/reqresp/protocols/auth.d.ts +2 -2
  139. package/dest/services/reqresp/protocols/auth.d.ts.map +1 -1
  140. package/dest/services/reqresp/protocols/auth.js +2 -2
  141. package/dest/services/reqresp/protocols/block.d.ts +1 -1
  142. package/dest/services/reqresp/protocols/block.d.ts.map +1 -1
  143. package/dest/services/reqresp/protocols/block.js +3 -2
  144. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +1 -1
  145. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -1
  146. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +1 -1
  147. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +4 -6
  148. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
  149. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +1 -1
  150. package/dest/services/reqresp/protocols/block_txs/index.d.ts +1 -1
  151. package/dest/services/reqresp/protocols/goodbye.d.ts +1 -1
  152. package/dest/services/reqresp/protocols/goodbye.d.ts.map +1 -1
  153. package/dest/services/reqresp/protocols/index.d.ts +1 -1
  154. package/dest/services/reqresp/protocols/ping.d.ts +1 -1
  155. package/dest/services/reqresp/protocols/status.d.ts +6 -5
  156. package/dest/services/reqresp/protocols/status.d.ts.map +1 -1
  157. package/dest/services/reqresp/protocols/status.js +4 -3
  158. package/dest/services/reqresp/protocols/tx.d.ts +1 -1
  159. package/dest/services/reqresp/rate-limiter/index.d.ts +1 -1
  160. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +2 -2
  161. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
  162. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
  163. package/dest/services/reqresp/reqresp.d.ts +1 -41
  164. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  165. package/dest/services/reqresp/reqresp.js +2 -2
  166. package/dest/services/reqresp/status.d.ts +2 -2
  167. package/dest/services/reqresp/status.d.ts.map +1 -1
  168. package/dest/services/service.d.ts +1 -1
  169. package/dest/services/tx_collection/config.d.ts +1 -1
  170. package/dest/services/tx_collection/fast_tx_collection.d.ts +4 -9
  171. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
  172. package/dest/services/tx_collection/index.d.ts +1 -1
  173. package/dest/services/tx_collection/instrumentation.d.ts +1 -1
  174. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
  175. package/dest/services/tx_collection/slow_tx_collection.d.ts +6 -7
  176. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -1
  177. package/dest/services/tx_collection/slow_tx_collection.js +2 -1
  178. package/dest/services/tx_collection/tx_collection.d.ts +11 -11
  179. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  180. package/dest/services/tx_collection/tx_collection_sink.d.ts +3 -3
  181. package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -1
  182. package/dest/services/tx_collection/tx_source.d.ts +1 -1
  183. package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
  184. package/dest/services/tx_provider.d.ts +5 -4
  185. package/dest/services/tx_provider.d.ts.map +1 -1
  186. package/dest/services/tx_provider_instrumentation.d.ts +1 -1
  187. package/dest/services/tx_provider_instrumentation.d.ts.map +1 -1
  188. package/dest/test-helpers/generate-peer-id-private-keys.d.ts +1 -1
  189. package/dest/test-helpers/get-ports.d.ts +1 -1
  190. package/dest/test-helpers/get-ports.d.ts.map +1 -1
  191. package/dest/test-helpers/index.d.ts +1 -1
  192. package/dest/test-helpers/make-enrs.d.ts +1 -1
  193. package/dest/test-helpers/make-test-p2p-clients.d.ts +2 -2
  194. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  195. package/dest/test-helpers/mock-pubsub.d.ts +4 -4
  196. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  197. package/dest/test-helpers/mock-tx-helpers.d.ts +2 -2
  198. package/dest/test-helpers/mock-tx-helpers.d.ts.map +1 -1
  199. package/dest/test-helpers/mock-tx-helpers.js +1 -1
  200. package/dest/test-helpers/reqresp-nodes.d.ts +1 -1
  201. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  202. package/dest/testbench/p2p_client_testbench_worker.d.ts +1 -1
  203. package/dest/testbench/p2p_client_testbench_worker.js +14 -8
  204. package/dest/testbench/parse_log_file.d.ts +1 -1
  205. package/dest/testbench/testbench.d.ts +1 -1
  206. package/dest/testbench/testbench.js +2 -2
  207. package/dest/testbench/worker_client_manager.d.ts +1 -1
  208. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  209. package/dest/types/index.d.ts +1 -1
  210. package/dest/util.d.ts +2 -1
  211. package/dest/util.d.ts.map +1 -1
  212. package/dest/util.js +11 -2
  213. package/dest/versioning.d.ts +1 -1
  214. package/package.json +19 -18
  215. package/src/client/interface.ts +4 -1
  216. package/src/client/p2p_client.ts +51 -43
  217. package/src/config.ts +19 -2
  218. package/src/errors/attestation-pool.error.ts +13 -0
  219. package/src/mem_pools/attestation_pool/attestation_pool.ts +46 -5
  220. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +84 -34
  221. package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +87 -24
  222. package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +77 -15
  223. package/src/mem_pools/attestation_pool/mocks.ts +3 -3
  224. package/src/mem_pools/instrumentation.ts +13 -0
  225. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +15 -9
  226. package/src/mem_pools/tx_pool/memory_tx_pool.ts +13 -6
  227. package/src/mem_pools/tx_pool/tx_pool.ts +10 -2
  228. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +5 -4
  229. package/src/msg_validators/attestation_validator/attestation_validator.ts +14 -16
  230. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +91 -0
  231. package/src/msg_validators/attestation_validator/index.ts +1 -0
  232. package/src/msg_validators/block_proposal_validator/block_proposal_validator.ts +26 -10
  233. package/src/msg_validators/tx_validator/archive_cache.ts +1 -1
  234. package/src/msg_validators/tx_validator/block_header_validator.ts +1 -1
  235. package/src/msg_validators/tx_validator/factory.ts +3 -2
  236. package/src/msg_validators/tx_validator/metadata_validator.ts +1 -1
  237. package/src/msg_validators/tx_validator/phases_validator.ts +3 -1
  238. package/src/msg_validators/tx_validator/test_utils.ts +1 -1
  239. package/src/msg_validators/tx_validator/timestamp_validator.ts +2 -1
  240. package/src/services/encoding.ts +81 -6
  241. package/src/services/libp2p/instrumentation.ts +10 -1
  242. package/src/services/libp2p/libp2p_service.ts +334 -91
  243. package/src/services/peer-manager/metrics.ts +10 -0
  244. package/src/services/peer-manager/peer_manager.ts +4 -2
  245. package/src/services/peer-manager/peer_scoring.ts +46 -3
  246. package/src/services/reqresp/interface.ts +1 -1
  247. package/src/services/reqresp/protocols/auth.ts +2 -2
  248. package/src/services/reqresp/protocols/block.ts +3 -2
  249. package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +1 -1
  250. package/src/services/reqresp/protocols/status.ts +9 -8
  251. package/src/services/reqresp/reqresp.ts +2 -2
  252. package/src/services/tx_collection/fast_tx_collection.ts +3 -2
  253. package/src/services/tx_collection/slow_tx_collection.ts +7 -6
  254. package/src/services/tx_collection/tx_collection.ts +10 -9
  255. package/src/services/tx_provider.ts +4 -3
  256. package/src/test-helpers/mock-tx-helpers.ts +1 -1
  257. package/src/testbench/p2p_client_testbench_worker.ts +11 -5
  258. package/src/testbench/testbench.ts +2 -2
  259. package/src/util.ts +12 -2
@@ -25,4 +25,4 @@ export declare class CollectiveReqRespTimeoutError extends Error {
25
25
  export declare class InvalidResponseError extends Error {
26
26
  constructor();
27
27
  }
28
- //# sourceMappingURL=reqresp.error.d.ts.map
28
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxcmVzcC5lcnJvci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Vycm9ycy9yZXFyZXNwLmVycm9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFDSCxxQkFBYSw2QkFBOEIsU0FBUSxLQUFLO0lBQ3RELGNBRUM7Q0FDRjtBQUVEOzs7O0dBSUc7QUFDSCxxQkFBYSw2QkFBOEIsU0FBUSxLQUFLO0lBQ3RELGNBRUM7Q0FDRjtBQUVEOzs7Ozs7O0dBT0c7QUFDSCxxQkFBYSxvQkFBcUIsU0FBUSxLQUFLO0lBQzdDLGNBRUM7Q0FDRiJ9
@@ -1 +1 @@
1
- {"version":3,"file":"reqresp.error.d.ts","sourceRoot":"","sources":["../../src/errors/reqresp.error.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,qBAAa,6BAA8B,SAAQ,KAAK;;CAIvD;AAED;;;;GAIG;AACH,qBAAa,6BAA8B,SAAQ,KAAK;;CAIvD;AAED;;;;;;;GAOG;AACH,qBAAa,oBAAqB,SAAQ,KAAK;;CAI9C"}
1
+ {"version":3,"file":"reqresp.error.d.ts","sourceRoot":"","sources":["../../src/errors/reqresp.error.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,qBAAa,6BAA8B,SAAQ,KAAK;IACtD,cAEC;CACF;AAED;;;;GAIG;AACH,qBAAa,6BAA8B,SAAQ,KAAK;IACtD,cAEC;CACF;AAED;;;;;;;GAOG;AACH,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,cAEC;CACF"}
package/dest/index.d.ts CHANGED
@@ -8,4 +8,4 @@ export * from './mem_pools/attestation_pool/index.js';
8
8
  export * from './mem_pools/tx_pool/index.js';
9
9
  export * from './msg_validators/index.js';
10
10
  export * from './services/index.js';
11
- //# sourceMappingURL=index.d.ts.map
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNoRSxZQUFZLEVBQUUsTUFBTSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFaEQsY0FBYywwQkFBMEIsQ0FBQztBQUN6QyxjQUFjLG1CQUFtQixDQUFDO0FBQ2xDLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyx1Q0FBdUMsQ0FBQztBQUN0RCxjQUFjLDhCQUE4QixDQUFDO0FBQzdDLGNBQWMsMkJBQTJCLENBQUM7QUFDMUMsY0FBYyxxQkFBcUIsQ0FBQyJ9
@@ -1,3 +1,4 @@
1
+ import type { SlotNumber } from '@aztec/foundation/branded-types';
1
2
  import type { BlockAttestation, BlockProposal } from '@aztec/stdlib/p2p';
2
3
  /**
3
4
  * An Attestation Pool contains attestations collected by a validator
@@ -18,6 +19,14 @@ export interface AttestationPool {
18
19
  * @return The block proposal if it exists, otherwise undefined.
19
20
  */
20
21
  getBlockProposal(id: string): Promise<BlockProposal | undefined>;
22
+ /**
23
+ * Check if a block proposal exists in the pool
24
+ *
25
+ * @param idOrProposal - The ID of the block proposal or the block proposal itself to check. The ID is proposal.payload.archive
26
+ *
27
+ * @return True if the block proposal exists, false otherwise.
28
+ */
29
+ hasBlockProposal(idOrProposal: string | BlockProposal): Promise<boolean>;
21
30
  /**
22
31
  * AddAttestations
23
32
  *
@@ -37,7 +46,7 @@ export interface AttestationPool {
37
46
  *
38
47
  * @param slot - The oldest slot to keep.
39
48
  */
40
- deleteAttestationsOlderThan(slot: bigint): Promise<void>;
49
+ deleteAttestationsOlderThan(slot: SlotNumber): Promise<void>;
41
50
  /**
42
51
  * Delete Attestations for slot
43
52
  *
@@ -45,7 +54,7 @@ export interface AttestationPool {
45
54
  *
46
55
  * @param slot - The slot to delete.
47
56
  */
48
- deleteAttestationsForSlot(slot: bigint): Promise<void>;
57
+ deleteAttestationsForSlot(slot: SlotNumber): Promise<void>;
49
58
  /**
50
59
  * Delete Attestations for slot and proposal
51
60
  *
@@ -54,7 +63,7 @@ export interface AttestationPool {
54
63
  * @param slot - The slot to delete.
55
64
  * @param proposalId - The proposal to delete.
56
65
  */
57
- deleteAttestationsForSlotAndProposal(slot: bigint, proposalId: string): Promise<void>;
66
+ deleteAttestationsForSlotAndProposal(slot: SlotNumber, proposalId: string): Promise<void>;
58
67
  /**
59
68
  * Get all Attestations for all proposals for a given slot
60
69
  *
@@ -63,7 +72,7 @@ export interface AttestationPool {
63
72
  * @param slot - The slot to query
64
73
  * @return BlockAttestations
65
74
  */
66
- getAttestationsForSlot(slot: bigint): Promise<BlockAttestation[]>;
75
+ getAttestationsForSlot(slot: SlotNumber): Promise<BlockAttestation[]>;
67
76
  /**
68
77
  * Get Attestations for slot and given proposal
69
78
  *
@@ -73,8 +82,36 @@ export interface AttestationPool {
73
82
  * @param proposalId - The proposal to query
74
83
  * @return BlockAttestations
75
84
  */
76
- getAttestationsForSlotAndProposal(slot: bigint, proposalId: string): Promise<BlockAttestation[]>;
85
+ getAttestationsForSlotAndProposal(slot: SlotNumber, proposalId: string): Promise<BlockAttestation[]>;
86
+ /**
87
+ * Check if a specific attestation exists in the pool
88
+ *
89
+ * @param attestation - The attestation to check
90
+ * @return True if the attestation exists, false otherwise
91
+ */
92
+ hasAttestation(attestation: BlockAttestation): Promise<boolean>;
93
+ /**
94
+ * Returns whether adding this proposal is permitted at current capacity:
95
+ * - True if the proposal already exists, allow overwrite to keep parity with tests.
96
+ * - True if the slot is below the proposal cap.
97
+ * - False if the slot is at/above cap and this would be a new unique proposal.
98
+ *
99
+ * @param block - The block proposal to check
100
+ * @returns True if the proposal can be added (or already exists), false otherwise.
101
+ */
102
+ canAddProposal(block: BlockProposal): Promise<boolean>;
103
+ /**
104
+ * Returns whether an attestation would be accepted for (slot, proposalId):
105
+ * - True if the attestation already exists for this sender.
106
+ * - True if the attestation cap for (slot, proposalId) has not been reached.
107
+ * - False if the cap is reached and this attestation would be a new unique entry.
108
+ *
109
+ * @param attestation - The attestation to check
110
+ * @param committeeSize - Committee size for the attestation's slot, implementation may add a small buffer
111
+ * @returns True if the attestation can be added, false otherwise.
112
+ */
113
+ canAddAttestation(attestation: BlockAttestation, committeeSize: number): Promise<boolean>;
77
114
  /** Returns whether the pool is empty. */
78
115
  isEmpty(): Promise<boolean>;
79
116
  }
80
- //# sourceMappingURL=attestation_pool.d.ts.map
117
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0ZXN0YXRpb25fcG9vbC5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL21lbV9wb29scy9hdHRlc3RhdGlvbl9wb29sL2F0dGVzdGF0aW9uX3Bvb2wudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDbEUsT0FBTyxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFekU7Ozs7O0dBS0c7QUFDSCxNQUFNLFdBQVcsZUFBZTtJQUM5Qjs7T0FFRztJQUNILGdCQUFnQixDQUFDLGFBQWEsRUFBRSxhQUFhLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRTlEOzs7Ozs7T0FNRztJQUNILGdCQUFnQixDQUFDLEVBQUUsRUFBRSxNQUFNLEdBQUcsT0FBTyxDQUFDLGFBQWEsR0FBRyxTQUFTLENBQUMsQ0FBQztJQUVqRTs7Ozs7O09BTUc7SUFDSCxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsTUFBTSxHQUFHLGFBQWEsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7SUFFekU7Ozs7T0FJRztJQUNILGVBQWUsQ0FBQyxZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFakU7Ozs7T0FJRztJQUNILGtCQUFrQixDQUFDLFlBQVksRUFBRSxnQkFBZ0IsRUFBRSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUVwRTs7Ozs7O09BTUc7SUFDSCwyQkFBMkIsQ0FBQyxJQUFJLEVBQUUsVUFBVSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUU3RDs7Ozs7O09BTUc7SUFDSCx5QkFBeUIsQ0FBQyxJQUFJLEVBQUUsVUFBVSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUUzRDs7Ozs7OztPQU9HO0lBQ0gsb0NBQW9DLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsTUFBTSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUUxRjs7Ozs7OztPQU9HO0lBQ0gsc0JBQXNCLENBQUMsSUFBSSxFQUFFLFVBQVUsR0FBRyxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO0lBRXRFOzs7Ozs7OztPQVFHO0lBQ0gsaUNBQWlDLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsTUFBTSxHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUM7SUFFckc7Ozs7O09BS0c7SUFDSCxjQUFjLENBQUMsV0FBVyxFQUFFLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUVoRTs7Ozs7Ozs7T0FRRztJQUNILGNBQWMsQ0FBQyxLQUFLLEVBQUUsYUFBYSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUV2RDs7Ozs7Ozs7O09BU0c7SUFDSCxpQkFBaUIsQ0FBQyxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsYUFBYSxFQUFFLE1BQU0sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7SUFFMUYseUNBQXlDO0lBQ3pDLE9BQU8sSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7Q0FDN0IifQ==
@@ -1 +1 @@
1
- {"version":3,"file":"attestation_pool.d.ts","sourceRoot":"","sources":["../../../src/mem_pools/attestation_pool/attestation_pool.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEzE;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B;;OAEG;IACH,gBAAgB,CAAC,aAAa,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE9D;;;;;;OAMG;IACH,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CAAC;IAEjE;;;;OAIG;IACH,eAAe,CAAC,YAAY,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjE;;;;OAIG;IACH,kBAAkB,CAAC,YAAY,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEpE;;;;;;OAMG;IACH,2BAA2B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEzD;;;;;;OAMG;IACH,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvD;;;;;;;OAOG;IACH,oCAAoC,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtF;;;;;;;OAOG;IACH,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;IAElE;;;;;;;;OAQG;IACH,iCAAiC,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;IAEjG,yCAAyC;IACzC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;CAC7B"}
1
+ {"version":3,"file":"attestation_pool.d.ts","sourceRoot":"","sources":["../../../src/mem_pools/attestation_pool/attestation_pool.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEzE;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B;;OAEG;IACH,gBAAgB,CAAC,aAAa,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE9D;;;;;;OAMG;IACH,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CAAC;IAEjE;;;;;;OAMG;IACH,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAEzE;;;;OAIG;IACH,eAAe,CAAC,YAAY,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjE;;;;OAIG;IACH,kBAAkB,CAAC,YAAY,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEpE;;;;;;OAMG;IACH,2BAA2B,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE7D;;;;;;OAMG;IACH,yBAAyB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE3D;;;;;;;OAOG;IACH,oCAAoC,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE1F;;;;;;;OAOG;IACH,sBAAsB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;IAEtE;;;;;;;;OAQG;IACH,iCAAiC,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;IAErG;;;;;OAKG;IACH,cAAc,CAAC,WAAW,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAEhE;;;;;;;;OAQG;IACH,cAAc,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAEvD;;;;;;;;;OASG;IACH,iBAAiB,CAAC,WAAW,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAE1F,yCAAyC;IACzC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;CAC7B"}
@@ -1,3 +1,3 @@
1
1
  import type { AttestationPool } from './attestation_pool.js';
2
2
  export declare function describeAttestationPool(getAttestationPool: () => AttestationPool): void;
3
- //# sourceMappingURL=attestation_pool_test_suite.d.ts.map
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0ZXN0YXRpb25fcG9vbF90ZXN0X3N1aXRlLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbWVtX3Bvb2xzL2F0dGVzdGF0aW9uX3Bvb2wvYXR0ZXN0YXRpb25fcG9vbF90ZXN0X3N1aXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQWlCQSxPQUFPLEtBQUssRUFBRSxlQUFlLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUs3RCx3QkFBZ0IsdUJBQXVCLENBQUMsa0JBQWtCLEVBQUUsTUFBTSxlQUFlLFFBc1poRiJ9
@@ -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":"AAgBA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAK7D,wBAAgB,uBAAuB,CAAC,kBAAkB,EAAE,MAAM,eAAe,QAqWhF"}
1
+ {"version":3,"file":"attestation_pool_test_suite.d.ts","sourceRoot":"","sources":["../../../src/mem_pools/attestation_pool/attestation_pool_test_suite.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAK7D,wBAAgB,uBAAuB,CAAC,kBAAkB,EAAE,MAAM,eAAe,QAsZhF"}
@@ -1,5 +1,6 @@
1
- import { Secp256k1Signer } from '@aztec/foundation/crypto';
2
- import { Fr } from '@aztec/foundation/fields';
1
+ import { SlotNumber } from '@aztec/foundation/branded-types';
2
+ import { Secp256k1Signer } from '@aztec/foundation/crypto/secp256k1-signer';
3
+ import { Fr } from '@aztec/foundation/curves/bn254';
3
4
  import { BlockProposal as BlockProposalClass, ConsensusPayload, SignatureDomainSeparator, getHashedSignaturePayloadEthSignedMessage } from '@aztec/stdlib/p2p';
4
5
  import { makeL2BlockHeader } from '@aztec/stdlib/testing';
5
6
  import { TxHash } from '@aztec/stdlib/tx';
@@ -27,7 +28,7 @@ export function describeAttestationPool(getAttestationPool) {
27
28
  };
28
29
  const mockBlockProposal = (signer, slotNumber, archive = Fr.random())=>{
29
30
  const header = makeL2BlockHeader(1, 2, slotNumber);
30
- const payload = new ConsensusPayload(header.toCheckpointHeader(), archive, header.state);
31
+ const payload = new ConsensusPayload(header.toCheckpointHeader(), archive);
31
32
  const hash = getHashedSignaturePayloadEthSignedMessage(payload, SignatureDomainSeparator.blockProposal);
32
33
  const signature = signer.sign(hash);
33
34
  const txHashes = [
@@ -49,10 +50,14 @@ export function describeAttestationPool(getAttestationPool) {
49
50
  const archive = Fr.random();
50
51
  const attestations = signers.slice(0, -1).map((signer)=>mockAttestation(signer, slotNumber, archive));
51
52
  await ap.addAttestations(attestations);
52
- const retrievedAttestations = await ap.getAttestationsForSlotAndProposal(BigInt(slotNumber), archive.toString());
53
+ const retrievedAttestations = await ap.getAttestationsForSlotAndProposal(SlotNumber(slotNumber), archive.toString());
53
54
  expect(retrievedAttestations.length).toBe(attestations.length);
54
55
  compareAttestations(retrievedAttestations, attestations);
55
- const retrievedAttestationsForSlot = await ap.getAttestationsForSlot(BigInt(slotNumber));
56
+ // Check hasAttestation for added attestations
57
+ for (const attestation of attestations){
58
+ expect(await ap.hasAttestation(attestation)).toBe(true);
59
+ }
60
+ const retrievedAttestationsForSlot = await ap.getAttestationsForSlot(SlotNumber(slotNumber));
56
61
  expect(retrievedAttestationsForSlot.length).toBe(attestations.length);
57
62
  compareAttestations(retrievedAttestationsForSlot, attestations);
58
63
  // Add another one
@@ -60,22 +65,28 @@ export function describeAttestationPool(getAttestationPool) {
60
65
  await ap.addAttestations([
61
66
  newAttestation
62
67
  ]);
63
- const retrievedAttestationsAfterAdd = await ap.getAttestationsForSlotAndProposal(BigInt(slotNumber), archive.toString());
68
+ const retrievedAttestationsAfterAdd = await ap.getAttestationsForSlotAndProposal(SlotNumber(slotNumber), archive.toString());
64
69
  expect(retrievedAttestationsAfterAdd.length).toBe(attestations.length + 1);
65
70
  compareAttestations(retrievedAttestationsAfterAdd, [
66
71
  ...attestations,
67
72
  newAttestation
68
73
  ]);
69
- const retrievedAttestationsForSlotAfterAdd = await ap.getAttestationsForSlot(BigInt(slotNumber));
74
+ expect(await ap.hasAttestation(newAttestation)).toBe(true);
75
+ const retrievedAttestationsForSlotAfterAdd = await ap.getAttestationsForSlot(SlotNumber(slotNumber));
70
76
  expect(retrievedAttestationsForSlotAfterAdd.length).toBe(attestations.length + 1);
71
77
  compareAttestations(retrievedAttestationsForSlotAfterAdd, [
72
78
  ...attestations,
73
79
  newAttestation
74
80
  ]);
75
81
  // Delete by slot
76
- await ap.deleteAttestationsForSlot(BigInt(slotNumber));
77
- const retreivedAttestationsAfterDelete = await ap.getAttestationsForSlotAndProposal(BigInt(slotNumber), archive.toString());
82
+ await ap.deleteAttestationsForSlot(SlotNumber(slotNumber));
83
+ const retreivedAttestationsAfterDelete = await ap.getAttestationsForSlotAndProposal(SlotNumber(slotNumber), archive.toString());
78
84
  expect(retreivedAttestationsAfterDelete.length).toBe(0);
85
+ // Check hasAttestation after deletion
86
+ for (const attestation of attestations){
87
+ expect(await ap.hasAttestation(attestation)).toBe(false);
88
+ }
89
+ expect(await ap.hasAttestation(newAttestation)).toBe(false);
79
90
  });
80
91
  it('should handle duplicate proposals in a slot', async ()=>{
81
92
  const slotNumber = 420;
@@ -88,7 +99,7 @@ export function describeAttestationPool(getAttestationPool) {
88
99
  }
89
100
  // Add them to store and check we end up with only one
90
101
  await ap.addAttestations(attestations);
91
- const retreivedAttestations = await ap.getAttestationsForSlotAndProposal(BigInt(slotNumber), archive.toString());
102
+ const retreivedAttestations = await ap.getAttestationsForSlotAndProposal(SlotNumber(slotNumber), archive.toString());
92
103
  expect(retreivedAttestations.length).toBe(1);
93
104
  expect(retreivedAttestations[0].toBuffer()).toEqual(attestations[0].toBuffer());
94
105
  expect(retreivedAttestations[0].getSender()?.toString()).toEqual(signer.address.toString());
@@ -96,7 +107,7 @@ export function describeAttestationPool(getAttestationPool) {
96
107
  await ap.addAttestations([
97
108
  attestations[0]
98
109
  ]);
99
- expect(await ap.getAttestationsForSlotAndProposal(BigInt(slotNumber), archive.toString())).toHaveLength(1);
110
+ expect(await ap.getAttestationsForSlotAndProposal(SlotNumber(slotNumber), archive.toString())).toHaveLength(1);
100
111
  });
101
112
  it('should store attestations by differing slot', async ()=>{
102
113
  const slotNumbers = [
@@ -110,7 +121,7 @@ export function describeAttestationPool(getAttestationPool) {
110
121
  for (const attestation of attestations){
111
122
  const slot = attestation.payload.header.slotNumber;
112
123
  const archive = attestation.archive.toString();
113
- const retreivedAttestations = await ap.getAttestationsForSlotAndProposal(slot.toBigInt(), archive);
124
+ const retreivedAttestations = await ap.getAttestationsForSlotAndProposal(slot, archive);
114
125
  expect(retreivedAttestations.length).toBe(1);
115
126
  expect(retreivedAttestations[0].toBuffer()).toEqual(attestation.toBuffer());
116
127
  expect(retreivedAttestations[0].payload.header.slotNumber).toEqual(slot);
@@ -134,7 +145,7 @@ export function describeAttestationPool(getAttestationPool) {
134
145
  for (const attestation of attestations){
135
146
  const slot = attestation.payload.header.slotNumber;
136
147
  const proposalId = attestation.archive.toString();
137
- const retreivedAttestations = await ap.getAttestationsForSlotAndProposal(slot.toBigInt(), proposalId);
148
+ const retreivedAttestations = await ap.getAttestationsForSlotAndProposal(slot, proposalId);
138
149
  expect(retreivedAttestations.length).toBe(1);
139
150
  expect(retreivedAttestations[0].toBuffer()).toEqual(attestation.toBuffer());
140
151
  expect(retreivedAttestations[0].payload.header.slotNumber).toEqual(slot);
@@ -146,12 +157,20 @@ export function describeAttestationPool(getAttestationPool) {
146
157
  const attestations = signers.map((signer)=>mockAttestation(signer, slotNumber, archive));
147
158
  const proposalId = attestations[0].archive.toString();
148
159
  await ap.addAttestations(attestations);
149
- const retreivedAttestations = await ap.getAttestationsForSlotAndProposal(BigInt(slotNumber), proposalId);
160
+ const retreivedAttestations = await ap.getAttestationsForSlotAndProposal(SlotNumber(slotNumber), proposalId);
150
161
  expect(retreivedAttestations.length).toBe(NUMBER_OF_SIGNERS_PER_TEST);
151
162
  compareAttestations(retreivedAttestations, attestations);
163
+ // Check hasAttestation before deletion
164
+ for (const attestation of attestations){
165
+ expect(await ap.hasAttestation(attestation)).toBe(true);
166
+ }
152
167
  await ap.deleteAttestations(attestations);
153
- const gottenAfterDelete = await ap.getAttestationsForSlotAndProposal(BigInt(slotNumber), proposalId);
168
+ const gottenAfterDelete = await ap.getAttestationsForSlotAndProposal(SlotNumber(slotNumber), proposalId);
154
169
  expect(gottenAfterDelete.length).toBe(0);
170
+ // Check hasAttestation after deletion
171
+ for (const attestation of attestations){
172
+ expect(await ap.hasAttestation(attestation)).toBe(false);
173
+ }
155
174
  });
156
175
  it('should blanket delete attestations per slot', async ()=>{
157
176
  const slotNumber = 420;
@@ -159,11 +178,11 @@ export function describeAttestationPool(getAttestationPool) {
159
178
  const attestations = signers.map((signer)=>mockAttestation(signer, slotNumber, archive));
160
179
  const proposalId = attestations[0].archive.toString();
161
180
  await ap.addAttestations(attestations);
162
- const retreivedAttestations = await ap.getAttestationsForSlotAndProposal(BigInt(slotNumber), proposalId);
181
+ const retreivedAttestations = await ap.getAttestationsForSlotAndProposal(SlotNumber(slotNumber), proposalId);
163
182
  expect(retreivedAttestations.length).toBe(NUMBER_OF_SIGNERS_PER_TEST);
164
183
  compareAttestations(retreivedAttestations, attestations);
165
- await ap.deleteAttestationsForSlot(BigInt(slotNumber));
166
- const retreivedAttestationsAfterDelete = await ap.getAttestationsForSlotAndProposal(BigInt(slotNumber), proposalId);
184
+ await ap.deleteAttestationsForSlot(SlotNumber(slotNumber));
185
+ const retreivedAttestationsAfterDelete = await ap.getAttestationsForSlotAndProposal(SlotNumber(slotNumber), proposalId);
167
186
  expect(retreivedAttestationsAfterDelete.length).toBe(0);
168
187
  });
169
188
  it('should blanket delete attestations per slot and proposal', async ()=>{
@@ -177,13 +196,13 @@ export function describeAttestationPool(getAttestationPool) {
177
196
  const proposalId2 = attestations2[0].archive.toString();
178
197
  await ap.addAttestations(attestations);
179
198
  await ap.addAttestations(attestations2);
180
- const retreivedAttestations = await ap.getAttestationsForSlotAndProposal(BigInt(slotNumber), proposalId);
199
+ const retreivedAttestations = await ap.getAttestationsForSlotAndProposal(SlotNumber(slotNumber), proposalId);
181
200
  expect(retreivedAttestations.length).toBe(NUMBER_OF_SIGNERS_PER_TEST);
182
201
  compareAttestations(retreivedAttestations, attestations);
183
- await ap.deleteAttestationsForSlotAndProposal(BigInt(slotNumber), proposalId);
184
- const retreivedAttestationsAfterDelete = await ap.getAttestationsForSlotAndProposal(BigInt(slotNumber), proposalId);
202
+ await ap.deleteAttestationsForSlotAndProposal(SlotNumber(slotNumber), proposalId);
203
+ const retreivedAttestationsAfterDelete = await ap.getAttestationsForSlotAndProposal(SlotNumber(slotNumber), proposalId);
185
204
  expect(retreivedAttestationsAfterDelete.length).toBe(0);
186
- const retreivedAttestationsAfterDeleteForOtherProposal = await ap.getAttestationsForSlotAndProposal(BigInt(slotNumber), proposalId2);
205
+ const retreivedAttestationsAfterDeleteForOtherProposal = await ap.getAttestationsForSlotAndProposal(SlotNumber(slotNumber), proposalId2);
187
206
  expect(retreivedAttestationsAfterDeleteForOtherProposal.length).toBe(NUMBER_OF_SIGNERS_PER_TEST);
188
207
  compareAttestations(retreivedAttestationsAfterDeleteForOtherProposal, attestations2);
189
208
  });
@@ -201,18 +220,18 @@ export function describeAttestationPool(getAttestationPool) {
201
220
  const attestations = (await Promise.all(slotNumbers.map((slotNumber)=>createAttestationsForSlot(slotNumber)))).flat();
202
221
  const proposalId = attestations[0].archive.toString();
203
222
  await ap.addAttestations(attestations);
204
- const attestationsForSlot1 = await ap.getAttestationsForSlotAndProposal(BigInt(1), proposalId);
223
+ const attestationsForSlot1 = await ap.getAttestationsForSlotAndProposal(SlotNumber(1), proposalId);
205
224
  expect(attestationsForSlot1.length).toBe(signers.length);
206
225
  const deleteAttestationsSpy = jest.spyOn(ap, 'deleteAttestationsForSlot');
207
- await ap.deleteAttestationsOlderThan(BigInt(73));
208
- const attestationsForSlot1AfterDelete = await ap.getAttestationsForSlotAndProposal(BigInt(1), proposalId);
226
+ await ap.deleteAttestationsOlderThan(SlotNumber(73));
227
+ const attestationsForSlot1AfterDelete = await ap.getAttestationsForSlotAndProposal(SlotNumber(1), proposalId);
209
228
  expect(attestationsForSlot1AfterDelete.length).toBe(0);
210
229
  expect(deleteAttestationsSpy).toHaveBeenCalledTimes(5);
211
- expect(deleteAttestationsSpy).toHaveBeenCalledWith(BigInt(1));
212
- expect(deleteAttestationsSpy).toHaveBeenCalledWith(BigInt(2));
213
- expect(deleteAttestationsSpy).toHaveBeenCalledWith(BigInt(3));
214
- expect(deleteAttestationsSpy).toHaveBeenCalledWith(BigInt(69));
215
- expect(deleteAttestationsSpy).toHaveBeenCalledWith(BigInt(72));
230
+ expect(deleteAttestationsSpy).toHaveBeenCalledWith(SlotNumber(1));
231
+ expect(deleteAttestationsSpy).toHaveBeenCalledWith(SlotNumber(2));
232
+ expect(deleteAttestationsSpy).toHaveBeenCalledWith(SlotNumber(3));
233
+ expect(deleteAttestationsSpy).toHaveBeenCalledWith(SlotNumber(69));
234
+ expect(deleteAttestationsSpy).toHaveBeenCalledWith(SlotNumber(72));
216
235
  });
217
236
  describe('BlockProposal in attestation pool', ()=>{
218
237
  it('should add and retrieve block proposal', async ()=>{
@@ -224,11 +243,16 @@ export function describeAttestationPool(getAttestationPool) {
224
243
  const retrievedProposal = await ap.getBlockProposal(proposalId);
225
244
  expect(retrievedProposal).toBeDefined();
226
245
  expect(retrievedProposal).toEqual(proposal);
246
+ // Check hasBlockProposal with both id and object
247
+ expect(await ap.hasBlockProposal(proposalId)).toBe(true);
248
+ expect(await ap.hasBlockProposal(proposal)).toBe(true);
227
249
  });
228
250
  it('should return undefined for non-existent block proposal', async ()=>{
229
251
  const nonExistentId = Fr.random().toString();
230
252
  const retrievedProposal = await ap.getBlockProposal(nonExistentId);
231
253
  expect(retrievedProposal).toBeUndefined();
254
+ // Check hasBlockProposal returns false for non-existent proposal
255
+ expect(await ap.hasBlockProposal(nonExistentId)).toBe(false);
232
256
  });
233
257
  it('should update block proposal if added twice with same id', async ()=>{
234
258
  const slotNumber = 420;
@@ -256,7 +280,7 @@ export function describeAttestationPool(getAttestationPool) {
256
280
  const retrievedProposal = await ap.getBlockProposal(proposalId);
257
281
  expect(retrievedProposal).toBeDefined();
258
282
  expect(retrievedProposal.toBuffer()).toEqual(proposal2.toBuffer());
259
- expect(retrievedProposal.slotNumber.toBigInt()).toBe(BigInt(200));
283
+ expect(retrievedProposal.slotNumber).toBe(SlotNumber(200));
260
284
  });
261
285
  it('should delete block proposal when deleting attestations for slot and proposal', async ()=>{
262
286
  const slotNumber = 420;
@@ -270,11 +294,13 @@ export function describeAttestationPool(getAttestationPool) {
270
294
  // Verify proposal exists
271
295
  let retrievedProposal = await ap.getBlockProposal(proposalId);
272
296
  expect(retrievedProposal).toBeDefined();
297
+ expect(await ap.hasBlockProposal(proposalId)).toBe(true);
273
298
  // Delete attestations for slot and proposal
274
- await ap.deleteAttestationsForSlotAndProposal(BigInt(slotNumber), proposalId);
299
+ await ap.deleteAttestationsForSlotAndProposal(SlotNumber(slotNumber), proposalId);
275
300
  // Proposal should be deleted
276
301
  retrievedProposal = await ap.getBlockProposal(proposalId);
277
302
  expect(retrievedProposal).toBeUndefined();
303
+ expect(await ap.hasBlockProposal(proposalId)).toBe(false);
278
304
  });
279
305
  it('should delete block proposal when deleting attestations for slot', async ()=>{
280
306
  const slotNumber = 420;
@@ -286,11 +312,13 @@ export function describeAttestationPool(getAttestationPool) {
286
312
  // Verify proposal exists
287
313
  let retrievedProposal = await ap.getBlockProposal(proposalId);
288
314
  expect(retrievedProposal).toBeDefined();
315
+ expect(await ap.hasBlockProposal(proposal)).toBe(true);
289
316
  // Delete attestations for slot
290
- await ap.deleteAttestationsForSlot(BigInt(slotNumber));
317
+ await ap.deleteAttestationsForSlot(SlotNumber(slotNumber));
291
318
  // Proposal should be deleted
292
319
  retrievedProposal = await ap.getBlockProposal(proposalId);
293
320
  expect(retrievedProposal).toBeUndefined();
321
+ expect(await ap.hasBlockProposal(proposal)).toBe(false);
294
322
  });
295
323
  it('should be able to fetch both block proposal and attestations', async ()=>{
296
324
  const slotNumber = 420;
@@ -304,10 +332,15 @@ export function describeAttestationPool(getAttestationPool) {
304
332
  await ap.addAttestations(attestations);
305
333
  // Retrieve both proposal and attestations
306
334
  const retrievedProposal = await ap.getBlockProposal(proposalId);
307
- const retrievedAttestations = await ap.getAttestationsForSlotAndProposal(BigInt(slotNumber), proposalId);
335
+ const retrievedAttestations = await ap.getAttestationsForSlotAndProposal(SlotNumber(slotNumber), proposalId);
308
336
  expect(retrievedProposal).toBeDefined();
309
337
  expect(retrievedProposal).toEqual(proposal);
338
+ expect(await ap.hasBlockProposal(proposalId)).toBe(true);
310
339
  compareAttestations(retrievedAttestations, attestations);
340
+ // Check hasAttestation for all attestations
341
+ for (const attestation of attestations){
342
+ expect(await ap.hasAttestation(attestation)).toBe(true);
343
+ }
311
344
  });
312
345
  });
313
346
  }
@@ -1,3 +1,3 @@
1
1
  export * from './attestation_pool.js';
2
2
  export * from './memory_attestation_pool.js';
3
- //# sourceMappingURL=index.d.ts.map
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tZW1fcG9vbHMvYXR0ZXN0YXRpb25fcG9vbC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMsOEJBQThCLENBQUMifQ==
@@ -1,7 +1,10 @@
1
+ import { SlotNumber } from '@aztec/foundation/branded-types';
1
2
  import type { AztecAsyncKVStore } from '@aztec/kv-store';
2
3
  import { BlockAttestation, BlockProposal } from '@aztec/stdlib/p2p';
3
4
  import { type TelemetryClient } from '@aztec/telemetry-client';
4
5
  import type { AttestationPool } from './attestation_pool.js';
6
+ export declare const MAX_PROPOSALS_PER_SLOT = 5;
7
+ export declare const ATTESTATION_CAP_BUFFER = 10;
5
8
  export declare class KvAttestationPool implements AttestationPool {
6
9
  private store;
7
10
  private log;
@@ -16,13 +19,19 @@ export declare class KvAttestationPool implements AttestationPool {
16
19
  private getProposalKey;
17
20
  private getAttestationKey;
18
21
  addAttestations(attestations: BlockAttestation[]): Promise<void>;
19
- getAttestationsForSlot(slot: bigint): Promise<BlockAttestation[]>;
20
- getAttestationsForSlotAndProposal(slot: bigint, proposalId: string): Promise<BlockAttestation[]>;
21
- deleteAttestationsOlderThan(oldestSlot: bigint): Promise<void>;
22
- deleteAttestationsForSlot(slot: bigint): Promise<void>;
23
- deleteAttestationsForSlotAndProposal(slot: bigint, proposalId: string): Promise<void>;
22
+ getAttestationsForSlot(slot: SlotNumber): Promise<BlockAttestation[]>;
23
+ getAttestationsForSlotAndProposal(slot: SlotNumber, proposalId: string): Promise<BlockAttestation[]>;
24
+ deleteAttestationsOlderThan(oldestSlot: SlotNumber): Promise<void>;
25
+ deleteAttestationsForSlot(slot: SlotNumber): Promise<void>;
26
+ deleteAttestationsForSlotAndProposal(slot: SlotNumber, proposalId: string): Promise<void>;
24
27
  deleteAttestations(attestations: BlockAttestation[]): Promise<void>;
28
+ hasAttestation(attestation: BlockAttestation): Promise<boolean>;
25
29
  getBlockProposal(id: string): Promise<BlockProposal | undefined>;
30
+ hasBlockProposal(idOrProposal: string | BlockProposal): Promise<boolean>;
26
31
  addBlockProposal(blockProposal: BlockProposal): Promise<void>;
32
+ hasReachedProposalCap(slot: SlotNumber): Promise<boolean>;
33
+ hasReachedAttestationCap(slot: SlotNumber, proposalId: string, committeeSize: number): Promise<boolean>;
34
+ canAddProposal(block: BlockProposal): Promise<boolean>;
35
+ canAddAttestation(attestation: BlockAttestation, committeeSize: number): Promise<boolean>;
27
36
  }
28
- //# sourceMappingURL=kv_attestation_pool.d.ts.map
37
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia3ZfYXR0ZXN0YXRpb25fcG9vbC5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL21lbV9wb29scy9hdHRlc3RhdGlvbl9wb29sL2t2X2F0dGVzdGF0aW9uX3Bvb2wudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBSTdELE9BQU8sS0FBSyxFQUFFLGlCQUFpQixFQUFxQyxNQUFNLGlCQUFpQixDQUFDO0FBQzVGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsS0FBSyxlQUFlLEVBQXNCLE1BQU0seUJBQXlCLENBQUM7QUFJbkYsT0FBTyxLQUFLLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFN0QsZUFBTyxNQUFNLHNCQUFzQixJQUFJLENBQUM7QUFDeEMsZUFBTyxNQUFNLHNCQUFzQixLQUFLLENBQUM7QUFFekMscUJBQWEsaUJBQWtCLFlBQVcsZUFBZTtJQVlyRCxPQUFPLENBQUMsS0FBSztJQUViLE9BQU8sQ0FBQyxHQUFHO0lBYmIsT0FBTyxDQUFDLE9BQU8sQ0FBd0M7SUFFdkQsT0FBTyxDQUFDLFlBQVksQ0FBZ0M7SUFDcEQsT0FBTyxDQUFDLFNBQVMsQ0FHZjtJQUNGLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBcUM7SUFDN0QsT0FBTyxDQUFDLHVCQUF1QixDQUFxQztJQUVwRSxZQUNVLEtBQUssRUFBRSxpQkFBaUIsRUFDaEMsU0FBUyxHQUFFLGVBQXNDLEVBQ3pDLEdBQUcseUNBQXlDLEVBUXJEO0lBRUQsT0FBTyxDQUFDLFNBQVMsQ0FJZjtJQUVXLE9BQU8sSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLENBS3ZDO0lBRUQsT0FBTyxDQUFDLGNBQWM7SUFZdEIsT0FBTyxDQUFDLGlCQUFpQjtJQUlaLGVBQWUsQ0FBQyxZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBbUM1RTtJQUVZLHNCQUFzQixDQUFDLElBQUksRUFBRSxVQUFVLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FTakY7SUFFWSxpQ0FBaUMsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxNQUFNLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FvQmhIO0lBRVksMkJBQTJCLENBQUMsVUFBVSxFQUFFLFVBQVUsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBSzlFO0lBRVkseUJBQXlCLENBQUMsSUFBSSxFQUFFLFVBQVUsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBdUJ0RTtJQUVZLG9DQUFvQyxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLE1BQU0sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBa0JyRztJQUVZLGtCQUFrQixDQUFDLFlBQVksRUFBRSxnQkFBZ0IsRUFBRSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0E0Qi9FO0lBRVksY0FBYyxDQUFDLFdBQVcsRUFBRSxnQkFBZ0IsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBYzNFO0lBRVksZ0JBQWdCLENBQUMsRUFBRSxFQUFFLE1BQU0sR0FBRyxPQUFPLENBQUMsYUFBYSxHQUFHLFNBQVMsQ0FBQyxDQVc1RTtJQUVZLGdCQUFnQixDQUFDLFlBQVksRUFBRSxNQUFNLEdBQUcsYUFBYSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FHcEY7SUFFWSxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUUsYUFBYSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FlekU7SUFFWSxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsVUFBVSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FHckU7SUFFWSx3QkFBd0IsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLE1BQU0sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBR25IO0lBRVksY0FBYyxDQUFDLEtBQUssRUFBRSxhQUFhLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUlsRTtJQUVZLGlCQUFpQixDQUFDLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRSxhQUFhLEVBQUUsTUFBTSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FTckc7Q0FDRiJ9
@@ -1 +1 @@
1
- {"version":3,"file":"kv_attestation_pool.d.ts","sourceRoot":"","sources":["../../../src/mem_pools/attestation_pool/kv_attestation_pool.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAqC,MAAM,iBAAiB,CAAC;AAC5F,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACpE,OAAO,EAAE,KAAK,eAAe,EAAsB,MAAM,yBAAyB,CAAC;AAGnF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE7D,qBAAa,iBAAkB,YAAW,eAAe;IAYrD,OAAO,CAAC,KAAK;IAEb,OAAO,CAAC,GAAG;IAbb,OAAO,CAAC,OAAO,CAAwC;IAEvD,OAAO,CAAC,YAAY,CAAgC;IACpD,OAAO,CAAC,SAAS,CAGf;IACF,OAAO,CAAC,gBAAgB,CAAqC;IAC7D,OAAO,CAAC,uBAAuB,CAAqC;gBAG1D,KAAK,EAAE,iBAAiB,EAChC,SAAS,GAAE,eAAsC,EACzC,GAAG,yCAAyC;IAUtD,OAAO,CAAC,SAAS,CAIf;IAEW,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;IAOxC,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,iBAAiB;IAIZ,eAAe,CAAC,YAAY,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAqChE,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAYjE,iCAAiC,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAsBhG,2BAA2B,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO9D,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBtD,oCAAoC,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBrF,kBAAkB,CAAC,YAAY,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA8BnE,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC;IAahE,gBAAgB,CAAC,aAAa,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;CAM3E"}
1
+ {"version":3,"file":"kv_attestation_pool.d.ts","sourceRoot":"","sources":["../../../src/mem_pools/attestation_pool/kv_attestation_pool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAI7D,OAAO,KAAK,EAAE,iBAAiB,EAAqC,MAAM,iBAAiB,CAAC;AAC5F,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACpE,OAAO,EAAE,KAAK,eAAe,EAAsB,MAAM,yBAAyB,CAAC;AAInF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE7D,eAAO,MAAM,sBAAsB,IAAI,CAAC;AACxC,eAAO,MAAM,sBAAsB,KAAK,CAAC;AAEzC,qBAAa,iBAAkB,YAAW,eAAe;IAYrD,OAAO,CAAC,KAAK;IAEb,OAAO,CAAC,GAAG;IAbb,OAAO,CAAC,OAAO,CAAwC;IAEvD,OAAO,CAAC,YAAY,CAAgC;IACpD,OAAO,CAAC,SAAS,CAGf;IACF,OAAO,CAAC,gBAAgB,CAAqC;IAC7D,OAAO,CAAC,uBAAuB,CAAqC;IAEpE,YACU,KAAK,EAAE,iBAAiB,EAChC,SAAS,GAAE,eAAsC,EACzC,GAAG,yCAAyC,EAQrD;IAED,OAAO,CAAC,SAAS,CAIf;IAEW,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,CAKvC;IAED,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,iBAAiB;IAIZ,eAAe,CAAC,YAAY,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAmC5E;IAEY,sBAAsB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CASjF;IAEY,iCAAiC,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAoBhH;IAEY,2BAA2B,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAK9E;IAEY,yBAAyB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAuBtE;IAEY,oCAAoC,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBrG;IAEY,kBAAkB,CAAC,YAAY,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA4B/E;IAEY,cAAc,CAAC,WAAW,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,CAc3E;IAEY,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CAW5E;IAEY,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAGpF;IAEY,gBAAgB,CAAC,aAAa,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAezE;IAEY,qBAAqB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,CAGrE;IAEY,wBAAwB,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAGnH;IAEY,cAAc,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAIlE;IAEY,iBAAiB,CAAC,WAAW,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CASrG;CACF"}
@@ -1,9 +1,13 @@
1
- import { Fr } from '@aztec/foundation/fields';
1
+ import { SlotNumber } from '@aztec/foundation/branded-types';
2
+ import { Fr } from '@aztec/foundation/curves/bn254';
2
3
  import { toArray } from '@aztec/foundation/iterable';
3
4
  import { createLogger } from '@aztec/foundation/log';
4
5
  import { BlockAttestation, BlockProposal } from '@aztec/stdlib/p2p';
5
6
  import { getTelemetryClient } from '@aztec/telemetry-client';
7
+ import { ProposalSlotCapExceededError } from '../../errors/attestation-pool.error.js';
6
8
  import { PoolInstrumentation, PoolName } from '../instrumentation.js';
9
+ export const MAX_PROPOSALS_PER_SLOT = 5;
10
+ export const ATTESTATION_CAP_BUFFER = 10;
7
11
  export class KvAttestationPool {
8
12
  store;
9
13
  log;
@@ -49,7 +53,7 @@ export class KvAttestationPool {
49
53
  const sender = attestation.getSender();
50
54
  // Skip attestations with invalid signatures
51
55
  if (!sender) {
52
- this.log.warn(`Skipping attestation with invalid signature for slot ${slotNumber.toBigInt()}`, {
56
+ this.log.warn(`Skipping attestation with invalid signature for slot ${slotNumber}`, {
53
57
  signature: attestation.signature.toString(),
54
58
  slotNumber,
55
59
  proposalId
@@ -58,9 +62,9 @@ export class KvAttestationPool {
58
62
  }
59
63
  const address = sender.toString();
60
64
  await this.attestations.set(this.getAttestationKey(slotNumber, proposalId, address), attestation.toBuffer());
61
- await this.proposalsForSlot.set(slotNumber.toString(), proposalId.toString());
65
+ await this.proposalsForSlot.set(slotNumber, proposalId.toString());
62
66
  await this.attestationsForProposal.set(this.getProposalKey(slotNumber, proposalId), this.getAttestationKey(slotNumber, proposalId, address));
63
- this.log.verbose(`Added attestation for slot ${slotNumber.toBigInt()} from ${address}`, {
67
+ this.log.verbose(`Added attestation for slot ${slotNumber} from ${address}`, {
64
68
  signature: attestation.signature.toString(),
65
69
  slotNumber,
66
70
  address,
@@ -70,8 +74,7 @@ export class KvAttestationPool {
70
74
  });
71
75
  }
72
76
  async getAttestationsForSlot(slot) {
73
- const slotFr = new Fr(slot);
74
- const proposalIds = await toArray(this.proposalsForSlot.getValuesAsync(slotFr.toString()));
77
+ const proposalIds = await toArray(this.proposalsForSlot.getValuesAsync(slot));
75
78
  const attestations = [];
76
79
  for (const proposalId of proposalIds){
77
80
  attestations.push(...await this.getAttestationsForSlotAndProposal(slot, proposalId));
@@ -95,41 +98,41 @@ export class KvAttestationPool {
95
98
  }
96
99
  async deleteAttestationsOlderThan(oldestSlot) {
97
100
  const olderThan = await toArray(this.proposalsForSlot.keysAsync({
98
- end: new Fr(oldestSlot).toString()
101
+ end: oldestSlot
99
102
  }));
100
103
  for (const oldSlot of olderThan){
101
- await this.deleteAttestationsForSlot(BigInt(oldSlot));
104
+ await this.deleteAttestationsForSlot(SlotNumber(oldSlot));
102
105
  }
103
106
  }
104
107
  async deleteAttestationsForSlot(slot) {
105
- const slotFr = new Fr(slot);
106
108
  let numberOfAttestations = 0;
107
109
  await this.store.transactionAsync(async ()=>{
108
- const proposalIds = await toArray(this.proposalsForSlot.getValuesAsync(slotFr.toString()));
110
+ const proposalIds = await toArray(this.proposalsForSlot.getValuesAsync(slot));
109
111
  for (const proposalId of proposalIds){
110
- const attestations = await toArray(this.attestationsForProposal.getValuesAsync(this.getProposalKey(slotFr, proposalId)));
112
+ const attestations = await toArray(this.attestationsForProposal.getValuesAsync(this.getProposalKey(slot, proposalId)));
111
113
  numberOfAttestations += attestations.length;
112
114
  for (const attestation of attestations){
113
115
  await this.attestations.delete(attestation);
114
116
  }
115
117
  await this.proposals.delete(proposalId);
116
- await this.attestationsForProposal.delete(this.getProposalKey(slotFr, proposalId));
118
+ await this.attestationsForProposal.delete(this.getProposalKey(slot, proposalId));
117
119
  }
120
+ // Delete from proposalsForSlot
121
+ await this.proposalsForSlot.delete(slot);
118
122
  this.log.verbose(`Removed ${numberOfAttestations} attestations for slot ${slot}`);
119
123
  });
120
124
  }
121
125
  async deleteAttestationsForSlotAndProposal(slot, proposalId) {
122
126
  let numberOfAttestations = 0;
123
127
  await this.store.transactionAsync(async ()=>{
124
- const slotString = new Fr(slot).toString();
125
128
  const attestations = await toArray(this.attestationsForProposal.getValuesAsync(this.getProposalKey(slot, proposalId)));
126
129
  numberOfAttestations += attestations.length;
127
130
  for (const attestation of attestations){
128
131
  await this.attestations.delete(attestation);
129
132
  }
130
133
  await this.proposals.delete(proposalId);
131
- await this.proposalsForSlot.deleteValue(slotString, proposalId);
132
- await this.attestationsForProposal.delete(this.getProposalKey(slotString, proposalId));
134
+ await this.proposalsForSlot.deleteValue(slot, proposalId);
135
+ await this.attestationsForProposal.delete(this.getProposalKey(slot, proposalId));
133
136
  this.log.verbose(`Removed ${numberOfAttestations} attestations for slot ${slot} and proposal ${proposalId}`);
134
137
  });
135
138
  }
@@ -141,7 +144,7 @@ export class KvAttestationPool {
141
144
  const sender = attestation.getSender();
142
145
  // Skip attestations with invalid signatures
143
146
  if (!sender) {
144
- this.log.warn(`Skipping deletion of attestation with invalid signature for slot ${slotNumber.toBigInt()}`);
147
+ this.log.warn(`Skipping deletion of attestation with invalid signature for slot ${slotNumber}`);
145
148
  continue;
146
149
  }
147
150
  const address = sender.toString();
@@ -154,6 +157,18 @@ export class KvAttestationPool {
154
157
  }
155
158
  });
156
159
  }
160
+ async hasAttestation(attestation) {
161
+ const slotNumber = attestation.payload.header.slotNumber;
162
+ const proposalId = attestation.archive;
163
+ const sender = attestation.getSender();
164
+ // Attestations with invalid signatures are never in the pool
165
+ if (!sender) {
166
+ return false;
167
+ }
168
+ const address = sender.toString();
169
+ const key = this.getAttestationKey(slotNumber, proposalId, address);
170
+ return await this.attestations.hasAsync(key);
171
+ }
157
172
  async getBlockProposal(id) {
158
173
  const buffer = await this.proposals.getAsync(id);
159
174
  try {
@@ -165,10 +180,34 @@ export class KvAttestationPool {
165
180
  }
166
181
  return Promise.resolve(undefined);
167
182
  }
183
+ async hasBlockProposal(idOrProposal) {
184
+ const id = typeof idOrProposal === 'string' ? idOrProposal : idOrProposal.payload.archive.toString();
185
+ return await this.proposals.hasAsync(id);
186
+ }
168
187
  async addBlockProposal(blockProposal) {
169
188
  await this.store.transactionAsync(async ()=>{
170
- await this.proposalsForSlot.set(blockProposal.slotNumber.toString(), blockProposal.archive.toString());
171
- await this.proposals.set(blockProposal.payload.archive.toString(), blockProposal.toBuffer());
189
+ const slotKey = blockProposal.slotNumber;
190
+ const proposalId = blockProposal.archive.toString();
191
+ if (!await this.canAddProposal(blockProposal)) {
192
+ throw new ProposalSlotCapExceededError(`Maximum proposals per slot reached: slot=${slotKey} cap=${MAX_PROPOSALS_PER_SLOT} proposal=${proposalId}`);
193
+ }
194
+ await this.proposalsForSlot.set(slotKey, proposalId);
195
+ // Always update the stored proposal buffer so re-adds overwrite with latest data
196
+ await this.proposals.set(proposalId, blockProposal.toBuffer());
172
197
  });
173
198
  }
199
+ async hasReachedProposalCap(slot) {
200
+ const uniqueProposalCount = await this.proposalsForSlot.getValueCountAsync(slot);
201
+ return uniqueProposalCount >= MAX_PROPOSALS_PER_SLOT;
202
+ }
203
+ async hasReachedAttestationCap(slot, proposalId, committeeSize) {
204
+ const limit = committeeSize + ATTESTATION_CAP_BUFFER;
205
+ return await this.attestationsForProposal.getValueCountAsync(this.getProposalKey(slot, proposalId)) >= limit;
206
+ }
207
+ async canAddProposal(block) {
208
+ return await this.proposals.hasAsync(block.archive.toString()) || !await this.hasReachedProposalCap(block.slotNumber);
209
+ }
210
+ async canAddAttestation(attestation, committeeSize) {
211
+ return await this.hasAttestation(attestation) || !await this.hasReachedAttestationCap(attestation.payload.header.slotNumber, attestation.archive.toString(), committeeSize);
212
+ }
174
213
  }