@aztec/p2p 0.0.1-commit.fcb71a6 → 0.0.1-commit.ff7989d6c

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 (524) hide show
  1. package/dest/bootstrap/bootstrap.d.ts +4 -3
  2. package/dest/bootstrap/bootstrap.d.ts.map +1 -1
  3. package/dest/bootstrap/bootstrap.js +4 -4
  4. package/dest/client/factory.d.ts +7 -6
  5. package/dest/client/factory.d.ts.map +1 -1
  6. package/dest/client/factory.js +53 -14
  7. package/dest/client/interface.d.ts +58 -25
  8. package/dest/client/interface.d.ts.map +1 -1
  9. package/dest/client/p2p_client.d.ts +46 -51
  10. package/dest/client/p2p_client.d.ts.map +1 -1
  11. package/dest/client/p2p_client.js +601 -259
  12. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts +2 -0
  13. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts.map +1 -0
  14. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +305 -0
  15. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts +73 -0
  16. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts.map +1 -0
  17. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.js +8 -0
  18. package/dest/config.d.ts +35 -7
  19. package/dest/config.d.ts.map +1 -1
  20. package/dest/config.js +23 -9
  21. package/dest/errors/tx-pool.error.d.ts +8 -0
  22. package/dest/errors/tx-pool.error.d.ts.map +1 -0
  23. package/dest/errors/tx-pool.error.js +9 -0
  24. package/dest/index.d.ts +2 -1
  25. package/dest/index.d.ts.map +1 -1
  26. package/dest/index.js +1 -0
  27. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +111 -76
  28. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  29. package/dest/mem_pools/attestation_pool/attestation_pool.js +441 -3
  30. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +2 -2
  31. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
  32. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +527 -287
  33. package/dest/mem_pools/attestation_pool/index.d.ts +2 -3
  34. package/dest/mem_pools/attestation_pool/index.d.ts.map +1 -1
  35. package/dest/mem_pools/attestation_pool/index.js +1 -2
  36. package/dest/mem_pools/attestation_pool/mocks.d.ts +9 -6
  37. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  38. package/dest/mem_pools/attestation_pool/mocks.js +16 -12
  39. package/dest/mem_pools/index.d.ts +3 -2
  40. package/dest/mem_pools/index.d.ts.map +1 -1
  41. package/dest/mem_pools/index.js +1 -1
  42. package/dest/mem_pools/instrumentation.d.ts +1 -1
  43. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  44. package/dest/mem_pools/instrumentation.js +5 -14
  45. package/dest/mem_pools/interface.d.ts +5 -5
  46. package/dest/mem_pools/interface.d.ts.map +1 -1
  47. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +15 -10
  48. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +1 -1
  49. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +91 -50
  50. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +19 -5
  51. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +1 -1
  52. package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +59 -3
  53. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +79 -5
  54. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +1 -1
  55. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +47 -0
  56. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +16 -0
  57. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -0
  58. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +122 -0
  59. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +2 -2
  60. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -1
  61. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +3 -3
  62. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +4 -4
  63. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -1
  64. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +2 -0
  65. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +2 -2
  66. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +1 -1
  67. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +25 -0
  68. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +1 -0
  69. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +57 -0
  70. package/dest/mem_pools/tx_pool_v2/archive/index.d.ts +2 -0
  71. package/dest/mem_pools/tx_pool_v2/archive/index.d.ts.map +1 -0
  72. package/dest/mem_pools/tx_pool_v2/archive/index.js +1 -0
  73. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts +43 -0
  74. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts.map +1 -0
  75. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.js +103 -0
  76. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +104 -0
  77. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -0
  78. package/dest/mem_pools/tx_pool_v2/deleted_pool.js +251 -0
  79. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts +47 -0
  80. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts.map +1 -0
  81. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.js +128 -0
  82. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +17 -0
  83. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -0
  84. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +93 -0
  85. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +19 -0
  86. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -0
  87. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +95 -0
  88. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +10 -0
  89. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -0
  90. package/dest/mem_pools/tx_pool_v2/eviction/index.js +11 -0
  91. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +174 -0
  92. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -0
  93. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.js +25 -0
  94. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts +15 -0
  95. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -0
  96. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +65 -0
  97. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts +17 -0
  98. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -0
  99. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +93 -0
  100. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +16 -0
  101. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -0
  102. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +78 -0
  103. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +20 -0
  104. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -0
  105. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +73 -0
  106. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +15 -0
  107. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -0
  108. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +19 -0
  109. package/dest/mem_pools/tx_pool_v2/index.d.ts +6 -0
  110. package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -0
  111. package/dest/mem_pools/tx_pool_v2/index.js +5 -0
  112. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts +15 -0
  113. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts.map +1 -0
  114. package/dest/mem_pools/tx_pool_v2/instrumentation.js +43 -0
  115. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +211 -0
  116. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -0
  117. package/dest/mem_pools/tx_pool_v2/interfaces.js +9 -0
  118. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +97 -0
  119. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -0
  120. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +152 -0
  121. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts +26 -0
  122. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts.map +1 -0
  123. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.js +70 -0
  124. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +108 -0
  125. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -0
  126. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +355 -0
  127. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +60 -0
  128. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -0
  129. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +161 -0
  130. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +77 -0
  131. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -0
  132. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +896 -0
  133. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +4 -4
  134. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  135. package/dest/msg_validators/attestation_validator/attestation_validator.js +51 -18
  136. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +7 -7
  137. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
  138. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +22 -13
  139. package/dest/msg_validators/clock_tolerance.d.ts +21 -0
  140. package/dest/msg_validators/clock_tolerance.d.ts.map +1 -0
  141. package/dest/msg_validators/clock_tolerance.js +37 -0
  142. package/dest/msg_validators/index.d.ts +2 -2
  143. package/dest/msg_validators/index.d.ts.map +1 -1
  144. package/dest/msg_validators/index.js +1 -1
  145. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +9 -0
  146. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -0
  147. package/dest/msg_validators/proposal_validator/block_proposal_validator.js +6 -0
  148. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +9 -0
  149. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -0
  150. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +6 -0
  151. package/dest/msg_validators/proposal_validator/index.d.ts +4 -0
  152. package/dest/msg_validators/proposal_validator/index.d.ts.map +1 -0
  153. package/dest/msg_validators/proposal_validator/index.js +3 -0
  154. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +13 -0
  155. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -0
  156. package/dest/msg_validators/proposal_validator/proposal_validator.js +104 -0
  157. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +23 -0
  158. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +1 -0
  159. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +212 -0
  160. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +3 -3
  161. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  162. package/dest/msg_validators/tx_validator/archive_cache.d.ts +3 -3
  163. package/dest/msg_validators/tx_validator/archive_cache.d.ts.map +1 -1
  164. package/dest/msg_validators/tx_validator/archive_cache.js +1 -1
  165. package/dest/msg_validators/tx_validator/block_header_validator.d.ts +20 -6
  166. package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
  167. package/dest/msg_validators/tx_validator/block_header_validator.js +4 -3
  168. package/dest/msg_validators/tx_validator/data_validator.d.ts +3 -1
  169. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  170. package/dest/msg_validators/tx_validator/data_validator.js +4 -1
  171. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +15 -4
  172. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
  173. package/dest/msg_validators/tx_validator/double_spend_validator.js +7 -6
  174. package/dest/msg_validators/tx_validator/factory.d.ts +8 -3
  175. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  176. package/dest/msg_validators/tx_validator/factory.js +21 -11
  177. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +10 -0
  178. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -0
  179. package/dest/msg_validators/tx_validator/fee_payer_balance.js +20 -0
  180. package/dest/msg_validators/tx_validator/gas_validator.d.ts +3 -2
  181. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  182. package/dest/msg_validators/tx_validator/gas_validator.js +11 -16
  183. package/dest/msg_validators/tx_validator/index.d.ts +2 -1
  184. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  185. package/dest/msg_validators/tx_validator/index.js +1 -0
  186. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +3 -2
  187. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  188. package/dest/msg_validators/tx_validator/metadata_validator.js +2 -2
  189. package/dest/msg_validators/tx_validator/phases_validator.d.ts +3 -2
  190. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
  191. package/dest/msg_validators/tx_validator/phases_validator.js +3 -3
  192. package/dest/msg_validators/tx_validator/size_validator.d.ts +8 -0
  193. package/dest/msg_validators/tx_validator/size_validator.d.ts.map +1 -0
  194. package/dest/msg_validators/tx_validator/size_validator.js +23 -0
  195. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +22 -5
  196. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
  197. package/dest/msg_validators/tx_validator/timestamp_validator.js +8 -8
  198. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts +3 -2
  199. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts.map +1 -1
  200. package/dest/msg_validators/tx_validator/tx_permitted_validator.js +2 -2
  201. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +3 -2
  202. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
  203. package/dest/msg_validators/tx_validator/tx_proof_validator.js +2 -2
  204. package/dest/services/data_store.d.ts +1 -1
  205. package/dest/services/data_store.d.ts.map +1 -1
  206. package/dest/services/data_store.js +10 -6
  207. package/dest/services/discv5/discV5_service.js +1 -1
  208. package/dest/services/dummy_service.d.ts +28 -3
  209. package/dest/services/dummy_service.d.ts.map +1 -1
  210. package/dest/services/dummy_service.js +51 -0
  211. package/dest/services/encoding.d.ts +2 -2
  212. package/dest/services/encoding.d.ts.map +1 -1
  213. package/dest/services/encoding.js +9 -7
  214. package/dest/services/gossipsub/index.d.ts +3 -0
  215. package/dest/services/gossipsub/index.d.ts.map +1 -0
  216. package/dest/services/gossipsub/index.js +2 -0
  217. package/dest/services/gossipsub/scoring.d.ts +21 -3
  218. package/dest/services/gossipsub/scoring.d.ts.map +1 -1
  219. package/dest/services/gossipsub/scoring.js +24 -7
  220. package/dest/services/gossipsub/topic_score_params.d.ts +173 -0
  221. package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -0
  222. package/dest/services/gossipsub/topic_score_params.js +346 -0
  223. package/dest/services/index.d.ts +2 -1
  224. package/dest/services/index.d.ts.map +1 -1
  225. package/dest/services/index.js +1 -0
  226. package/dest/services/libp2p/instrumentation.d.ts +1 -1
  227. package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
  228. package/dest/services/libp2p/instrumentation.js +30 -72
  229. package/dest/services/libp2p/libp2p_service.d.ts +106 -33
  230. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  231. package/dest/services/libp2p/libp2p_service.js +984 -317
  232. package/dest/services/peer-manager/metrics.d.ts +2 -2
  233. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  234. package/dest/services/peer-manager/metrics.js +21 -26
  235. package/dest/services/peer-manager/peer_manager.d.ts +2 -2
  236. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  237. package/dest/services/peer-manager/peer_manager.js +0 -10
  238. package/dest/services/peer-manager/peer_scoring.d.ts +1 -1
  239. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  240. package/dest/services/peer-manager/peer_scoring.js +32 -6
  241. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +48 -0
  242. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -0
  243. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +562 -0
  244. package/dest/services/reqresp/batch-tx-requester/config.d.ts +17 -0
  245. package/dest/services/reqresp/batch-tx-requester/config.d.ts.map +1 -0
  246. package/dest/services/reqresp/batch-tx-requester/config.js +27 -0
  247. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +46 -0
  248. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -0
  249. package/dest/services/reqresp/batch-tx-requester/interface.js +1 -0
  250. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +34 -0
  251. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -0
  252. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +130 -0
  253. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +54 -0
  254. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -0
  255. package/dest/services/reqresp/batch-tx-requester/peer_collection.js +139 -0
  256. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +20 -0
  257. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -0
  258. package/dest/services/reqresp/batch-tx-requester/tx_validator.js +21 -0
  259. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +22 -3
  260. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +1 -1
  261. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +63 -4
  262. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +2 -1
  263. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -1
  264. package/dest/services/reqresp/connection-sampler/connection_sampler.js +12 -0
  265. package/dest/services/reqresp/constants.d.ts +12 -0
  266. package/dest/services/reqresp/constants.d.ts.map +1 -0
  267. package/dest/services/reqresp/constants.js +7 -0
  268. package/dest/services/reqresp/interface.d.ts +12 -1
  269. package/dest/services/reqresp/interface.d.ts.map +1 -1
  270. package/dest/services/reqresp/interface.js +15 -1
  271. package/dest/services/reqresp/metrics.d.ts +6 -5
  272. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  273. package/dest/services/reqresp/metrics.js +17 -21
  274. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +5 -1
  275. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -1
  276. package/dest/services/reqresp/protocols/block_txs/bitvector.js +12 -0
  277. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +7 -5
  278. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
  279. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +27 -9
  280. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +29 -6
  281. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
  282. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +59 -13
  283. package/dest/services/reqresp/protocols/status.d.ts +1 -1
  284. package/dest/services/reqresp/protocols/status.d.ts.map +1 -1
  285. package/dest/services/reqresp/protocols/status.js +4 -1
  286. package/dest/services/reqresp/protocols/tx.d.ts +7 -1
  287. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  288. package/dest/services/reqresp/protocols/tx.js +20 -0
  289. package/dest/services/reqresp/reqresp.d.ts +6 -1
  290. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  291. package/dest/services/reqresp/reqresp.js +471 -50
  292. package/dest/services/service.d.ts +55 -3
  293. package/dest/services/service.d.ts.map +1 -1
  294. package/dest/services/tx_collection/config.d.ts +22 -1
  295. package/dest/services/tx_collection/config.d.ts.map +1 -1
  296. package/dest/services/tx_collection/config.js +55 -1
  297. package/dest/services/tx_collection/fast_tx_collection.d.ts +7 -4
  298. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
  299. package/dest/services/tx_collection/fast_tx_collection.js +71 -44
  300. package/dest/services/tx_collection/file_store_tx_collection.d.ts +53 -0
  301. package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -0
  302. package/dest/services/tx_collection/file_store_tx_collection.js +167 -0
  303. package/dest/services/tx_collection/file_store_tx_source.d.ts +37 -0
  304. package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -0
  305. package/dest/services/tx_collection/file_store_tx_source.js +90 -0
  306. package/dest/services/tx_collection/index.d.ts +3 -1
  307. package/dest/services/tx_collection/index.d.ts.map +1 -1
  308. package/dest/services/tx_collection/index.js +2 -0
  309. package/dest/services/tx_collection/instrumentation.d.ts +1 -1
  310. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
  311. package/dest/services/tx_collection/instrumentation.js +11 -13
  312. package/dest/services/tx_collection/missing_txs_tracker.d.ts +32 -0
  313. package/dest/services/tx_collection/missing_txs_tracker.d.ts.map +1 -0
  314. package/dest/services/tx_collection/missing_txs_tracker.js +27 -0
  315. package/dest/services/tx_collection/proposal_tx_collector.d.ts +49 -0
  316. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -0
  317. package/dest/services/tx_collection/proposal_tx_collector.js +50 -0
  318. package/dest/services/tx_collection/slow_tx_collection.d.ts +9 -5
  319. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -1
  320. package/dest/services/tx_collection/slow_tx_collection.js +60 -26
  321. package/dest/services/tx_collection/tx_collection.d.ts +29 -16
  322. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  323. package/dest/services/tx_collection/tx_collection.js +79 -7
  324. package/dest/services/tx_collection/tx_collection_sink.d.ts +18 -8
  325. package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -1
  326. package/dest/services/tx_collection/tx_collection_sink.js +26 -29
  327. package/dest/services/tx_collection/tx_source.d.ts +8 -3
  328. package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
  329. package/dest/services/tx_collection/tx_source.js +19 -2
  330. package/dest/services/tx_file_store/config.d.ts +16 -0
  331. package/dest/services/tx_file_store/config.d.ts.map +1 -0
  332. package/dest/services/tx_file_store/config.js +22 -0
  333. package/dest/services/tx_file_store/index.d.ts +4 -0
  334. package/dest/services/tx_file_store/index.d.ts.map +1 -0
  335. package/dest/services/tx_file_store/index.js +3 -0
  336. package/dest/services/tx_file_store/instrumentation.d.ts +15 -0
  337. package/dest/services/tx_file_store/instrumentation.d.ts.map +1 -0
  338. package/dest/services/tx_file_store/instrumentation.js +29 -0
  339. package/dest/services/tx_file_store/tx_file_store.d.ts +48 -0
  340. package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -0
  341. package/dest/services/tx_file_store/tx_file_store.js +152 -0
  342. package/dest/services/tx_provider.d.ts +5 -5
  343. package/dest/services/tx_provider.d.ts.map +1 -1
  344. package/dest/services/tx_provider.js +5 -4
  345. package/dest/services/tx_provider_instrumentation.d.ts +1 -1
  346. package/dest/services/tx_provider_instrumentation.d.ts.map +1 -1
  347. package/dest/services/tx_provider_instrumentation.js +7 -20
  348. package/dest/test-helpers/index.d.ts +3 -1
  349. package/dest/test-helpers/index.d.ts.map +1 -1
  350. package/dest/test-helpers/index.js +2 -0
  351. package/dest/test-helpers/make-test-p2p-clients.d.ts +3 -3
  352. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  353. package/dest/test-helpers/mock-pubsub.d.ts +29 -2
  354. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  355. package/dest/test-helpers/mock-pubsub.js +103 -2
  356. package/dest/test-helpers/reqresp-nodes.d.ts +1 -1
  357. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  358. package/dest/test-helpers/reqresp-nodes.js +2 -1
  359. package/dest/test-helpers/test_tx_provider.d.ts +40 -0
  360. package/dest/test-helpers/test_tx_provider.d.ts.map +1 -0
  361. package/dest/test-helpers/test_tx_provider.js +41 -0
  362. package/dest/test-helpers/testbench-utils.d.ts +163 -0
  363. package/dest/test-helpers/testbench-utils.d.ts.map +1 -0
  364. package/dest/test-helpers/testbench-utils.js +366 -0
  365. package/dest/testbench/p2p_client_testbench_worker.d.ts +28 -2
  366. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  367. package/dest/testbench/p2p_client_testbench_worker.js +221 -127
  368. package/dest/testbench/worker_client_manager.d.ts +51 -6
  369. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  370. package/dest/testbench/worker_client_manager.js +226 -39
  371. package/dest/util.d.ts +2 -2
  372. package/dest/util.d.ts.map +1 -1
  373. package/package.json +16 -16
  374. package/src/bootstrap/bootstrap.ts +7 -4
  375. package/src/client/factory.ts +96 -24
  376. package/src/client/interface.ts +76 -25
  377. package/src/client/p2p_client.ts +269 -290
  378. package/src/client/test/tx_proposal_collector/README.md +227 -0
  379. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +346 -0
  380. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.ts +43 -0
  381. package/src/config.ts +49 -13
  382. package/src/errors/tx-pool.error.ts +12 -0
  383. package/src/index.ts +1 -0
  384. package/src/mem_pools/attestation_pool/attestation_pool.ts +510 -78
  385. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +612 -320
  386. package/src/mem_pools/attestation_pool/index.ts +9 -2
  387. package/src/mem_pools/attestation_pool/mocks.ts +20 -13
  388. package/src/mem_pools/index.ts +4 -1
  389. package/src/mem_pools/instrumentation.ts +10 -18
  390. package/src/mem_pools/interface.ts +4 -4
  391. package/src/mem_pools/tx_pool/README.md +29 -14
  392. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +130 -75
  393. package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +66 -5
  394. package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +119 -4
  395. package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +162 -0
  396. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +3 -3
  397. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +4 -2
  398. package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +75 -0
  399. package/src/mem_pools/tx_pool_v2/README.md +275 -0
  400. package/src/mem_pools/tx_pool_v2/archive/index.ts +1 -0
  401. package/src/mem_pools/tx_pool_v2/archive/tx_archive.ts +120 -0
  402. package/src/mem_pools/tx_pool_v2/deleted_pool.ts +321 -0
  403. package/src/mem_pools/tx_pool_v2/eviction/eviction_manager.ts +160 -0
  404. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +121 -0
  405. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +122 -0
  406. package/src/mem_pools/tx_pool_v2/eviction/index.ts +27 -0
  407. package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +209 -0
  408. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +74 -0
  409. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +101 -0
  410. package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +91 -0
  411. package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +90 -0
  412. package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +31 -0
  413. package/src/mem_pools/tx_pool_v2/index.ts +12 -0
  414. package/src/mem_pools/tx_pool_v2/instrumentation.ts +69 -0
  415. package/src/mem_pools/tx_pool_v2/interfaces.ts +242 -0
  416. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +242 -0
  417. package/src/mem_pools/tx_pool_v2/tx_pool_bench_metrics.ts +77 -0
  418. package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +444 -0
  419. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +223 -0
  420. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +1069 -0
  421. package/src/msg_validators/attestation_validator/attestation_validator.ts +36 -21
  422. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +21 -18
  423. package/src/msg_validators/clock_tolerance.ts +51 -0
  424. package/src/msg_validators/index.ts +1 -1
  425. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +10 -0
  426. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +13 -0
  427. package/src/msg_validators/proposal_validator/index.ts +3 -0
  428. package/src/msg_validators/proposal_validator/proposal_validator.ts +92 -0
  429. package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +230 -0
  430. package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +2 -2
  431. package/src/msg_validators/tx_validator/archive_cache.ts +3 -3
  432. package/src/msg_validators/tx_validator/block_header_validator.ts +21 -8
  433. package/src/msg_validators/tx_validator/data_validator.ts +18 -6
  434. package/src/msg_validators/tx_validator/double_spend_validator.ts +15 -9
  435. package/src/msg_validators/tx_validator/factory.ts +64 -23
  436. package/src/msg_validators/tx_validator/fee_payer_balance.ts +40 -0
  437. package/src/msg_validators/tx_validator/gas_validator.ts +17 -28
  438. package/src/msg_validators/tx_validator/index.ts +1 -0
  439. package/src/msg_validators/tx_validator/metadata_validator.ts +18 -7
  440. package/src/msg_validators/tx_validator/phases_validator.ts +5 -3
  441. package/src/msg_validators/tx_validator/size_validator.ts +22 -0
  442. package/src/msg_validators/tx_validator/timestamp_validator.ts +29 -19
  443. package/src/msg_validators/tx_validator/tx_permitted_validator.ts +8 -3
  444. package/src/msg_validators/tx_validator/tx_proof_validator.ts +8 -3
  445. package/src/services/data_store.ts +10 -7
  446. package/src/services/discv5/discV5_service.ts +1 -1
  447. package/src/services/dummy_service.ts +68 -1
  448. package/src/services/encoding.ts +8 -6
  449. package/src/services/gossipsub/README.md +641 -0
  450. package/src/services/gossipsub/index.ts +2 -0
  451. package/src/services/gossipsub/scoring.ts +29 -5
  452. package/src/services/gossipsub/topic_score_params.ts +487 -0
  453. package/src/services/index.ts +1 -0
  454. package/src/services/libp2p/instrumentation.ts +32 -73
  455. package/src/services/libp2p/libp2p_service.ts +651 -301
  456. package/src/services/peer-manager/metrics.ts +22 -26
  457. package/src/services/peer-manager/peer_manager.ts +1 -2
  458. package/src/services/peer-manager/peer_scoring.ts +28 -4
  459. package/src/services/reqresp/batch-tx-requester/README.md +305 -0
  460. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +706 -0
  461. package/src/services/reqresp/batch-tx-requester/config.ts +40 -0
  462. package/src/services/reqresp/batch-tx-requester/interface.ts +53 -0
  463. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +161 -0
  464. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +205 -0
  465. package/src/services/reqresp/batch-tx-requester/tx_validator.ts +37 -0
  466. package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +65 -4
  467. package/src/services/reqresp/connection-sampler/connection_sampler.ts +19 -1
  468. package/src/services/reqresp/constants.ts +14 -0
  469. package/src/services/reqresp/interface.ts +29 -1
  470. package/src/services/reqresp/metrics.ts +36 -27
  471. package/src/services/reqresp/protocols/block_txs/bitvector.ts +16 -0
  472. package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +35 -12
  473. package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +74 -9
  474. package/src/services/reqresp/protocols/status.ts +7 -4
  475. package/src/services/reqresp/protocols/tx.ts +22 -0
  476. package/src/services/reqresp/reqresp.ts +79 -22
  477. package/src/services/service.ts +72 -4
  478. package/src/services/tx_collection/config.ts +83 -1
  479. package/src/services/tx_collection/fast_tx_collection.ts +93 -47
  480. package/src/services/tx_collection/file_store_tx_collection.ts +202 -0
  481. package/src/services/tx_collection/file_store_tx_source.ts +117 -0
  482. package/src/services/tx_collection/index.ts +6 -0
  483. package/src/services/tx_collection/instrumentation.ts +11 -13
  484. package/src/services/tx_collection/missing_txs_tracker.ts +52 -0
  485. package/src/services/tx_collection/proposal_tx_collector.ts +113 -0
  486. package/src/services/tx_collection/slow_tx_collection.ts +68 -35
  487. package/src/services/tx_collection/tx_collection.ts +121 -24
  488. package/src/services/tx_collection/tx_collection_sink.ts +30 -34
  489. package/src/services/tx_collection/tx_source.ts +22 -3
  490. package/src/services/tx_file_store/config.ts +37 -0
  491. package/src/services/tx_file_store/index.ts +3 -0
  492. package/src/services/tx_file_store/instrumentation.ts +36 -0
  493. package/src/services/tx_file_store/tx_file_store.ts +175 -0
  494. package/src/services/tx_provider.ts +10 -9
  495. package/src/services/tx_provider_instrumentation.ts +13 -20
  496. package/src/test-helpers/index.ts +2 -0
  497. package/src/test-helpers/make-test-p2p-clients.ts +3 -3
  498. package/src/test-helpers/mock-pubsub.ts +143 -3
  499. package/src/test-helpers/reqresp-nodes.ts +2 -1
  500. package/src/test-helpers/test_tx_provider.ts +64 -0
  501. package/src/test-helpers/testbench-utils.ts +430 -0
  502. package/src/testbench/p2p_client_testbench_worker.ts +348 -123
  503. package/src/testbench/worker_client_manager.ts +304 -42
  504. package/src/util.ts +7 -1
  505. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +0 -37
  506. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +0 -1
  507. package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +0 -213
  508. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +0 -30
  509. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +0 -1
  510. package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +0 -219
  511. package/dest/mem_pools/tx_pool/eviction/insufficient_fee_payer_balance_rule.d.ts +0 -15
  512. package/dest/mem_pools/tx_pool/eviction/insufficient_fee_payer_balance_rule.d.ts.map +0 -1
  513. package/dest/mem_pools/tx_pool/eviction/insufficient_fee_payer_balance_rule.js +0 -88
  514. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts +0 -12
  515. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts.map +0 -1
  516. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.js +0 -82
  517. package/dest/msg_validators/block_proposal_validator/index.d.ts +0 -2
  518. package/dest/msg_validators/block_proposal_validator/index.d.ts.map +0 -1
  519. package/dest/msg_validators/block_proposal_validator/index.js +0 -1
  520. package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +0 -298
  521. package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +0 -287
  522. package/src/mem_pools/tx_pool/eviction/insufficient_fee_payer_balance_rule.ts +0 -108
  523. package/src/msg_validators/block_proposal_validator/block_proposal_validator.ts +0 -97
  524. package/src/msg_validators/block_proposal_validator/index.ts +0 -1
@@ -1,82 +0,0 @@
1
- import { NoCommitteeError } from '@aztec/ethereum/contracts';
2
- import { createLogger } from '@aztec/foundation/log';
3
- import { PeerErrorSeverity } from '@aztec/stdlib/p2p';
4
- export class BlockProposalValidator {
5
- epochCache;
6
- logger;
7
- txsPermitted;
8
- constructor(epochCache, opts){
9
- this.epochCache = epochCache;
10
- this.txsPermitted = opts.txsPermitted;
11
- this.logger = createLogger('p2p:block_proposal_validator');
12
- }
13
- async validate(block) {
14
- try {
15
- // Check signature validity first - invalid signatures are a high-severity issue
16
- const proposer = block.getSender();
17
- if (!proposer) {
18
- this.logger.debug(`Penalizing peer for block proposal with invalid signature`);
19
- return PeerErrorSeverity.MidToleranceError;
20
- }
21
- // Check if transactions are permitted when the proposal contains transaction hashes
22
- const embeddedTxCount = block.txs?.length ?? 0;
23
- if (!this.txsPermitted && (block.txHashes.length > 0 || embeddedTxCount > 0)) {
24
- this.logger.debug(`Penalizing peer for block proposal with ${block.txHashes.length} transaction(s) when transactions are not permitted`);
25
- return PeerErrorSeverity.MidToleranceError;
26
- }
27
- // If there are embedded txs, they must be listed in txHashes; if there are no txHashes, there must be no txs
28
- const hashSet = new Set(block.txHashes.map((h)=>h.toString()));
29
- const missingTxHashes = embeddedTxCount > 0 ? block.txs.filter((tx)=>!hashSet.has(tx.getTxHash().toString())).map((tx)=>tx.getTxHash().toString()) : [];
30
- if (embeddedTxCount > 0 && missingTxHashes.length > 0) {
31
- this.logger.warn('Penalizing peer for embedded transaction(s) not included in txHashes', {
32
- embeddedTxCount,
33
- txHashesLength: block.txHashes.length,
34
- missingTxHashes
35
- });
36
- return PeerErrorSeverity.MidToleranceError;
37
- }
38
- const { currentProposer, nextProposer, currentSlot, nextSlot } = await this.epochCache.getProposerAttesterAddressInCurrentOrNextSlot();
39
- // Check that the attestation is for the current or next slot
40
- const slotNumber = block.payload.header.slotNumber;
41
- if (slotNumber !== currentSlot && slotNumber !== nextSlot) {
42
- this.logger.debug(`Penalizing peer for invalid slot number ${slotNumber}`, {
43
- currentSlot,
44
- nextSlot
45
- });
46
- return PeerErrorSeverity.HighToleranceError;
47
- }
48
- // Check that the block proposal is from the current or next proposer
49
- if (slotNumber === currentSlot && currentProposer !== undefined && !proposer.equals(currentProposer)) {
50
- this.logger.debug(`Penalizing peer for invalid proposer for current slot ${slotNumber}`, {
51
- currentProposer,
52
- nextProposer,
53
- proposer: proposer.toString()
54
- });
55
- return PeerErrorSeverity.MidToleranceError;
56
- }
57
- if (slotNumber === nextSlot && nextProposer !== undefined && !proposer.equals(nextProposer)) {
58
- this.logger.debug(`Penalizing peer for invalid proposer for next slot ${slotNumber}`, {
59
- currentProposer,
60
- nextProposer,
61
- proposer: proposer.toString()
62
- });
63
- return PeerErrorSeverity.MidToleranceError;
64
- }
65
- // Validate tx hashes for all txs embedded in the proposal
66
- if (!(await Promise.all(block.txs?.map((tx)=>tx.validateTxHash()) ?? [])).every((v)=>v)) {
67
- this.logger.warn(`Penalizing peer for invalid tx hashes in block proposal`, {
68
- proposer,
69
- slotNumber
70
- });
71
- return PeerErrorSeverity.LowToleranceError;
72
- }
73
- return undefined;
74
- } catch (e) {
75
- // People shouldn't be sending us block proposals if the committee doesn't exist
76
- if (e instanceof NoCommitteeError) {
77
- return PeerErrorSeverity.LowToleranceError;
78
- }
79
- throw e;
80
- }
81
- }
82
- }
@@ -1,2 +0,0 @@
1
- export * from './block_proposal_validator.js';
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tc2dfdmFsaWRhdG9ycy9ibG9ja19wcm9wb3NhbF92YWxpZGF0b3IvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYywrQkFBK0IsQ0FBQyJ9
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/block_proposal_validator/index.ts"],"names":[],"mappings":"AAAA,cAAc,+BAA+B,CAAC"}
@@ -1 +0,0 @@
1
- export * from './block_proposal_validator.js';
@@ -1,298 +0,0 @@
1
- import { SlotNumber } from '@aztec/foundation/branded-types';
2
- import { Fr } from '@aztec/foundation/curves/bn254';
3
- import { toArray } from '@aztec/foundation/iterable';
4
- import { createLogger } from '@aztec/foundation/log';
5
- import type { AztecAsyncKVStore, AztecAsyncMap, AztecAsyncMultiMap } from '@aztec/kv-store';
6
- import { BlockAttestation, BlockProposal } from '@aztec/stdlib/p2p';
7
- import { type TelemetryClient, getTelemetryClient } from '@aztec/telemetry-client';
8
-
9
- import { ProposalSlotCapExceededError } from '../../errors/attestation-pool.error.js';
10
- import { PoolInstrumentation, PoolName, type PoolStatsCallback } from '../instrumentation.js';
11
- import type { AttestationPool } from './attestation_pool.js';
12
-
13
- export const MAX_PROPOSALS_PER_SLOT = 5;
14
- export const ATTESTATION_CAP_BUFFER = 10;
15
-
16
- export class KvAttestationPool implements AttestationPool {
17
- private metrics: PoolInstrumentation<BlockAttestation>;
18
-
19
- private attestations: AztecAsyncMap<string, Buffer>;
20
- private proposals: AztecAsyncMap<
21
- /* proposal.payload.archive */ string,
22
- /* buffer representation of proposal */ Buffer
23
- >;
24
- private proposalsForSlot: AztecAsyncMultiMap<number, string>;
25
- private attestationsForProposal: AztecAsyncMultiMap<string, string>;
26
-
27
- constructor(
28
- private store: AztecAsyncKVStore,
29
- telemetry: TelemetryClient = getTelemetryClient(),
30
- private log = createLogger('aztec:attestation_pool'),
31
- ) {
32
- this.attestations = store.openMap('attestations');
33
- this.proposals = store.openMap('proposals');
34
- this.proposalsForSlot = store.openMultiMap('proposals_for_slot');
35
- this.attestationsForProposal = store.openMultiMap('attestations_for_proposal');
36
-
37
- this.metrics = new PoolInstrumentation(telemetry, PoolName.ATTESTATION_POOL, this.poolStats);
38
- }
39
-
40
- private poolStats: PoolStatsCallback = async () => {
41
- return {
42
- itemCount: await this.attestations.sizeAsync(),
43
- };
44
- };
45
-
46
- public async isEmpty(): Promise<boolean> {
47
- for await (const _ of this.attestations.entriesAsync()) {
48
- return false;
49
- }
50
- return true;
51
- }
52
-
53
- private getProposalKey(slot: number | bigint | Fr | string, proposalId: Fr | string | Buffer): string {
54
- const slotStr = typeof slot === 'string' ? slot : new Fr(slot).toString();
55
- const proposalIdStr =
56
- typeof proposalId === 'string'
57
- ? proposalId
58
- : Buffer.isBuffer(proposalId)
59
- ? Fr.fromBuffer(proposalId).toString()
60
- : proposalId.toString();
61
-
62
- return `${slotStr}-${proposalIdStr}`;
63
- }
64
-
65
- private getAttestationKey(slot: number | bigint | Fr | string, proposalId: Fr | string, address: string): string {
66
- return `${this.getProposalKey(slot, proposalId)}-${address}`;
67
- }
68
-
69
- public async addAttestations(attestations: BlockAttestation[]): Promise<void> {
70
- await this.store.transactionAsync(async () => {
71
- for (const attestation of attestations) {
72
- const slotNumber = attestation.payload.header.slotNumber;
73
- const proposalId = attestation.archive;
74
- const sender = attestation.getSender();
75
-
76
- // Skip attestations with invalid signatures
77
- if (!sender) {
78
- this.log.warn(`Skipping attestation with invalid signature for slot ${slotNumber}`, {
79
- signature: attestation.signature.toString(),
80
- slotNumber,
81
- proposalId,
82
- });
83
- continue;
84
- }
85
-
86
- const address = sender.toString();
87
-
88
- await this.attestations.set(this.getAttestationKey(slotNumber, proposalId, address), attestation.toBuffer());
89
-
90
- await this.proposalsForSlot.set(slotNumber, proposalId.toString());
91
- await this.attestationsForProposal.set(
92
- this.getProposalKey(slotNumber, proposalId),
93
- this.getAttestationKey(slotNumber, proposalId, address),
94
- );
95
-
96
- this.log.verbose(`Added attestation for slot ${slotNumber} from ${address}`, {
97
- signature: attestation.signature.toString(),
98
- slotNumber,
99
- address,
100
- proposalId,
101
- });
102
- }
103
- });
104
- }
105
-
106
- public async getAttestationsForSlot(slot: SlotNumber): Promise<BlockAttestation[]> {
107
- const proposalIds = await toArray(this.proposalsForSlot.getValuesAsync(slot));
108
- const attestations: BlockAttestation[] = [];
109
-
110
- for (const proposalId of proposalIds) {
111
- attestations.push(...(await this.getAttestationsForSlotAndProposal(slot, proposalId)));
112
- }
113
-
114
- return attestations;
115
- }
116
-
117
- public async getAttestationsForSlotAndProposal(slot: SlotNumber, proposalId: string): Promise<BlockAttestation[]> {
118
- const attestationIds = await toArray(
119
- this.attestationsForProposal.getValuesAsync(this.getProposalKey(slot, proposalId)),
120
- );
121
- const attestations: BlockAttestation[] = [];
122
-
123
- // alternatively iterate this.attestaions starting from slot-proposal-EthAddress.zero
124
- for (const id of attestationIds) {
125
- const buf = await this.attestations.getAsync(id);
126
-
127
- if (!buf) {
128
- // this should not happen unless we lost writes
129
- throw new Error('Attestation not found ' + id);
130
- }
131
-
132
- const attestation = BlockAttestation.fromBuffer(buf);
133
- attestations.push(attestation);
134
- }
135
-
136
- return attestations;
137
- }
138
-
139
- public async deleteAttestationsOlderThan(oldestSlot: SlotNumber): Promise<void> {
140
- const olderThan = await toArray(this.proposalsForSlot.keysAsync({ end: oldestSlot }));
141
- for (const oldSlot of olderThan) {
142
- await this.deleteAttestationsForSlot(SlotNumber(oldSlot));
143
- }
144
- }
145
-
146
- public async deleteAttestationsForSlot(slot: SlotNumber): Promise<void> {
147
- let numberOfAttestations = 0;
148
- await this.store.transactionAsync(async () => {
149
- const proposalIds = await toArray(this.proposalsForSlot.getValuesAsync(slot));
150
- for (const proposalId of proposalIds) {
151
- const attestations = await toArray(
152
- this.attestationsForProposal.getValuesAsync(this.getProposalKey(slot, proposalId)),
153
- );
154
-
155
- numberOfAttestations += attestations.length;
156
- for (const attestation of attestations) {
157
- await this.attestations.delete(attestation);
158
- }
159
-
160
- await this.proposals.delete(proposalId);
161
- await this.attestationsForProposal.delete(this.getProposalKey(slot, proposalId));
162
- }
163
-
164
- // Delete from proposalsForSlot
165
- await this.proposalsForSlot.delete(slot);
166
-
167
- this.log.verbose(`Removed ${numberOfAttestations} attestations for slot ${slot}`);
168
- });
169
- }
170
-
171
- public async deleteAttestationsForSlotAndProposal(slot: SlotNumber, proposalId: string): Promise<void> {
172
- let numberOfAttestations = 0;
173
- await this.store.transactionAsync(async () => {
174
- const attestations = await toArray(
175
- this.attestationsForProposal.getValuesAsync(this.getProposalKey(slot, proposalId)),
176
- );
177
-
178
- numberOfAttestations += attestations.length;
179
- for (const attestation of attestations) {
180
- await this.attestations.delete(attestation);
181
- }
182
-
183
- await this.proposals.delete(proposalId);
184
- await this.proposalsForSlot.deleteValue(slot, proposalId);
185
- await this.attestationsForProposal.delete(this.getProposalKey(slot, proposalId));
186
-
187
- this.log.verbose(`Removed ${numberOfAttestations} attestations for slot ${slot} and proposal ${proposalId}`);
188
- });
189
- }
190
-
191
- public async deleteAttestations(attestations: BlockAttestation[]): Promise<void> {
192
- await this.store.transactionAsync(async () => {
193
- for (const attestation of attestations) {
194
- const slotNumber = attestation.payload.header.slotNumber;
195
- const proposalId = attestation.archive;
196
- const sender = attestation.getSender();
197
-
198
- // Skip attestations with invalid signatures
199
- if (!sender) {
200
- this.log.warn(`Skipping deletion of attestation with invalid signature for slot ${slotNumber}`);
201
- continue;
202
- }
203
-
204
- const address = sender.toString();
205
- const key = this.getAttestationKey(slotNumber, proposalId, address);
206
-
207
- if (await this.attestations.hasAsync(key)) {
208
- await this.attestations.delete(key);
209
- }
210
-
211
- await this.attestationsForProposal.deleteValue(
212
- this.getProposalKey(slotNumber, proposalId),
213
- this.getAttestationKey(slotNumber, proposalId, address),
214
- );
215
-
216
- this.log.debug(`Deleted attestation for slot ${slotNumber} from ${address}`);
217
- }
218
- });
219
- }
220
-
221
- public async hasAttestation(attestation: BlockAttestation): Promise<boolean> {
222
- const slotNumber = attestation.payload.header.slotNumber;
223
- const proposalId = attestation.archive;
224
- const sender = attestation.getSender();
225
-
226
- // Attestations with invalid signatures are never in the pool
227
- if (!sender) {
228
- return false;
229
- }
230
-
231
- const address = sender.toString();
232
- const key = this.getAttestationKey(slotNumber, proposalId, address);
233
-
234
- return await this.attestations.hasAsync(key);
235
- }
236
-
237
- public async getBlockProposal(id: string): Promise<BlockProposal | undefined> {
238
- const buffer = await this.proposals.getAsync(id);
239
- try {
240
- if (buffer && buffer.length > 0) {
241
- return BlockProposal.fromBuffer(buffer);
242
- }
243
- } catch {
244
- return Promise.resolve(undefined);
245
- }
246
-
247
- return Promise.resolve(undefined);
248
- }
249
-
250
- public async hasBlockProposal(idOrProposal: string | BlockProposal): Promise<boolean> {
251
- const id = typeof idOrProposal === 'string' ? idOrProposal : idOrProposal.payload.archive.toString();
252
- return await this.proposals.hasAsync(id);
253
- }
254
-
255
- public async addBlockProposal(blockProposal: BlockProposal): Promise<void> {
256
- await this.store.transactionAsync(async () => {
257
- const slotKey = blockProposal.slotNumber;
258
- const proposalId = blockProposal.archive.toString();
259
-
260
- if (!(await this.canAddProposal(blockProposal))) {
261
- throw new ProposalSlotCapExceededError(
262
- `Maximum proposals per slot reached: slot=${slotKey} cap=${MAX_PROPOSALS_PER_SLOT} proposal=${proposalId}`,
263
- );
264
- }
265
-
266
- await this.proposalsForSlot.set(slotKey, proposalId);
267
- // Always update the stored proposal buffer so re-adds overwrite with latest data
268
- await this.proposals.set(proposalId, blockProposal.toBuffer());
269
- });
270
- }
271
-
272
- public async hasReachedProposalCap(slot: SlotNumber): Promise<boolean> {
273
- const uniqueProposalCount = await this.proposalsForSlot.getValueCountAsync(slot);
274
- return uniqueProposalCount >= MAX_PROPOSALS_PER_SLOT;
275
- }
276
-
277
- public async hasReachedAttestationCap(slot: SlotNumber, proposalId: string, committeeSize: number): Promise<boolean> {
278
- const limit = committeeSize + ATTESTATION_CAP_BUFFER;
279
- return (await this.attestationsForProposal.getValueCountAsync(this.getProposalKey(slot, proposalId))) >= limit;
280
- }
281
-
282
- public async canAddProposal(block: BlockProposal): Promise<boolean> {
283
- return (
284
- (await this.proposals.hasAsync(block.archive.toString())) || !(await this.hasReachedProposalCap(block.slotNumber))
285
- );
286
- }
287
-
288
- public async canAddAttestation(attestation: BlockAttestation, committeeSize: number): Promise<boolean> {
289
- return (
290
- (await this.hasAttestation(attestation)) ||
291
- !(await this.hasReachedAttestationCap(
292
- attestation.payload.header.slotNumber,
293
- attestation.archive.toString(),
294
- committeeSize,
295
- ))
296
- );
297
- }
298
- }
@@ -1,287 +0,0 @@
1
- import type { SlotNumber } from '@aztec/foundation/branded-types';
2
- import { createLogger } from '@aztec/foundation/log';
3
- import type { BlockAttestation, BlockProposal } from '@aztec/stdlib/p2p';
4
- import { type TelemetryClient, getTelemetryClient } from '@aztec/telemetry-client';
5
-
6
- import { PoolInstrumentation, PoolName, type PoolStatsCallback } from '../instrumentation.js';
7
- import type { AttestationPool } from './attestation_pool.js';
8
- import { ATTESTATION_CAP_BUFFER, MAX_PROPOSALS_PER_SLOT } from './kv_attestation_pool.js';
9
-
10
- export class InMemoryAttestationPool implements AttestationPool {
11
- private metrics: PoolInstrumentation<BlockAttestation>;
12
-
13
- // eslint-disable-next-line aztec-custom/no-non-primitive-in-collections
14
- private attestations: Map<
15
- /*slot=*/ SlotNumber,
16
- Map</*proposalId*/ string, Map</*address=*/ string, BlockAttestation>>
17
- >;
18
- private proposals: Map<string, BlockProposal>;
19
-
20
- constructor(
21
- telemetry: TelemetryClient = getTelemetryClient(),
22
- private log = createLogger('p2p:attestation_pool'),
23
- ) {
24
- this.attestations = new Map();
25
- this.proposals = new Map();
26
- this.metrics = new PoolInstrumentation(telemetry, PoolName.ATTESTATION_POOL, this.poolStats);
27
- }
28
-
29
- private poolStats: PoolStatsCallback = () => {
30
- return Promise.resolve({
31
- itemCount: this.attestations.size,
32
- });
33
- };
34
-
35
- public isEmpty(): Promise<boolean> {
36
- return Promise.resolve(this.attestations.size === 0);
37
- }
38
-
39
- public getAttestationsForSlot(slot: SlotNumber): Promise<BlockAttestation[]> {
40
- return Promise.resolve(
41
- Array.from(this.attestations.get(slot)?.values() ?? []).flatMap(proposalAttestationMap =>
42
- Array.from(proposalAttestationMap.values()),
43
- ),
44
- );
45
- }
46
-
47
- public getAttestationsForSlotAndProposal(slot: SlotNumber, proposalId: string): Promise<BlockAttestation[]> {
48
- const slotAttestationMap = this.attestations.get(slot);
49
- if (slotAttestationMap) {
50
- const proposalAttestationMap = slotAttestationMap.get(proposalId);
51
- if (proposalAttestationMap) {
52
- return Promise.resolve(Array.from(proposalAttestationMap.values()));
53
- }
54
- }
55
- return Promise.resolve([]);
56
- }
57
-
58
- public addAttestations(attestations: BlockAttestation[]): Promise<void> {
59
- for (const attestation of attestations) {
60
- // Perf: order and group by slot before insertion
61
- const slotNumber = attestation.payload.header.slotNumber;
62
-
63
- const proposalId = attestation.archive.toString();
64
- const sender = attestation.getSender();
65
-
66
- // Skip attestations with invalid signatures
67
- if (!sender) {
68
- this.log.warn(`Skipping attestation with invalid signature for slot ${slotNumber}`, {
69
- signature: attestation.signature.toString(),
70
- slotNumber,
71
- proposalId,
72
- });
73
- continue;
74
- }
75
-
76
- const slotAttestationMap = getSlotOrDefault(this.attestations, slotNumber);
77
- const proposalAttestationMap = getProposalOrDefault(slotAttestationMap, proposalId);
78
- proposalAttestationMap.set(sender.toString(), attestation);
79
-
80
- this.log.verbose(`Added attestation for slot ${slotNumber} from ${sender}`, {
81
- signature: attestation.signature.toString(),
82
- slotNumber,
83
- address: sender,
84
- proposalId,
85
- });
86
- }
87
-
88
- return Promise.resolve();
89
- }
90
-
91
- #getNumberOfAttestationsInSlot(slot: SlotNumber): number {
92
- let total = 0;
93
- const slotAttestationMap = getSlotOrDefault(this.attestations, slot);
94
-
95
- if (slotAttestationMap) {
96
- for (const proposalAttestationMap of slotAttestationMap.values() ?? []) {
97
- total += proposalAttestationMap.size;
98
- }
99
- }
100
- return total;
101
- }
102
-
103
- public async deleteAttestationsOlderThan(oldestSlot: SlotNumber): Promise<void> {
104
- const olderThan = [];
105
-
106
- // Entries are iterated in insertion order, so we can break as soon as we find a slot that is older than the oldestSlot.
107
- // Note: this will only prune correctly if attestations are added in order of rising slot, it is important that we do not allow
108
- // insertion of attestations that are old. #(https://github.com/AztecProtocol/aztec-packages/issues/10322)
109
- const slots = this.attestations.keys();
110
- for (const slot of slots) {
111
- if (slot < oldestSlot) {
112
- olderThan.push(slot);
113
- } else {
114
- break;
115
- }
116
- }
117
-
118
- for (const oldSlot of olderThan) {
119
- await this.deleteAttestationsForSlot(oldSlot);
120
- }
121
- return Promise.resolve();
122
- }
123
-
124
- public deleteAttestationsForSlot(slot: SlotNumber): Promise<void> {
125
- // We count the number of attestations we are removing
126
- const numberOfAttestations = this.#getNumberOfAttestationsInSlot(slot);
127
- const proposalIdsToDelete = this.attestations.get(slot)?.keys();
128
- let proposalIdsToDeleteCount = 0;
129
- proposalIdsToDelete?.forEach(proposalId => {
130
- this.proposals.delete(proposalId);
131
- proposalIdsToDeleteCount++;
132
- });
133
-
134
- this.attestations.delete(slot);
135
- this.log.verbose(
136
- `Removed ${numberOfAttestations} attestations and ${proposalIdsToDeleteCount} proposals for slot ${slot}`,
137
- );
138
-
139
- return Promise.resolve();
140
- }
141
-
142
- public deleteAttestationsForSlotAndProposal(slot: SlotNumber, proposalId: string): Promise<void> {
143
- const slotAttestationMap = getSlotOrDefault(this.attestations, slot);
144
- if (slotAttestationMap) {
145
- if (slotAttestationMap.has(proposalId)) {
146
- const numberOfAttestations = slotAttestationMap.get(proposalId)?.size ?? 0;
147
-
148
- slotAttestationMap.delete(proposalId);
149
-
150
- this.log.verbose(`Removed ${numberOfAttestations} attestations for slot ${slot} and proposal ${proposalId}`);
151
- }
152
- }
153
-
154
- this.proposals.delete(proposalId);
155
- return Promise.resolve();
156
- }
157
-
158
- public deleteAttestations(attestations: BlockAttestation[]): Promise<void> {
159
- for (const attestation of attestations) {
160
- const slotNumber = attestation.payload.header.slotNumber;
161
- const slotAttestationMap = this.attestations.get(slotNumber);
162
- if (slotAttestationMap) {
163
- const proposalId = attestation.archive.toString();
164
- const proposalAttestationMap = getProposalOrDefault(slotAttestationMap, proposalId);
165
- if (proposalAttestationMap) {
166
- const sender = attestation.getSender();
167
-
168
- // Skip attestations with invalid signatures
169
- if (!sender) {
170
- this.log.warn(`Skipping deletion of attestation with invalid signature for slot ${slotNumber}`);
171
- continue;
172
- }
173
-
174
- proposalAttestationMap.delete(sender.toString());
175
- this.log.debug(`Deleted attestation for slot ${slotNumber} from ${sender}`);
176
- }
177
- }
178
- }
179
- return Promise.resolve();
180
- }
181
-
182
- public hasAttestation(attestation: BlockAttestation): Promise<boolean> {
183
- const slotNumber = attestation.payload.header.slotNumber;
184
- const proposalId = attestation.archive.toString();
185
- const sender = attestation.getSender();
186
-
187
- // Attestations with invalid signatures are never in the pool
188
- if (!sender) {
189
- return Promise.resolve(false);
190
- }
191
-
192
- const slotAttestationMap = this.attestations.get(slotNumber);
193
- if (!slotAttestationMap) {
194
- return Promise.resolve(false);
195
- }
196
-
197
- const proposalAttestationMap = slotAttestationMap.get(proposalId);
198
- if (!proposalAttestationMap) {
199
- return Promise.resolve(false);
200
- }
201
-
202
- return Promise.resolve(proposalAttestationMap.has(sender.toString()));
203
- }
204
-
205
- public addBlockProposal(blockProposal: BlockProposal): Promise<void> {
206
- // We initialize slot-proposal mapping if it does not exist
207
- // This is important to ensure we can delete this proposal if there were not attestations for it
208
- const slotProposalMapping = getSlotOrDefault(this.attestations, blockProposal.slotNumber);
209
- slotProposalMapping.set(blockProposal.payload.archive.toString(), new Map<string, BlockAttestation>());
210
-
211
- this.proposals.set(blockProposal.payload.archive.toString(), blockProposal);
212
- return Promise.resolve();
213
- }
214
-
215
- public getBlockProposal(id: string): Promise<BlockProposal | undefined> {
216
- return Promise.resolve(this.proposals.get(id));
217
- }
218
-
219
- public hasBlockProposal(idOrProposal: string | BlockProposal): Promise<boolean> {
220
- const id = typeof idOrProposal === 'string' ? idOrProposal : idOrProposal.payload.archive.toString();
221
- return Promise.resolve(this.proposals.has(id));
222
- }
223
-
224
- public hasReachedProposalCap(slot: SlotNumber): Promise<boolean> {
225
- const slotAttestationMap = this.attestations.get(slot);
226
- const proposalCount = slotAttestationMap?.size ?? 0;
227
- return Promise.resolve(proposalCount >= MAX_PROPOSALS_PER_SLOT);
228
- }
229
-
230
- public hasReachedAttestationCap(slot: SlotNumber, proposalId: string, committeeSize: number): Promise<boolean> {
231
- const limit = committeeSize + ATTESTATION_CAP_BUFFER;
232
- const count = this.attestations.get(slot)?.get(proposalId)?.size ?? 0;
233
- return Promise.resolve(limit <= 0 || count >= limit);
234
- }
235
-
236
- public async canAddProposal(block: BlockProposal): Promise<boolean> {
237
- return this.proposals.has(block.archive.toString()) || !(await this.hasReachedProposalCap(block.slotNumber));
238
- }
239
-
240
- public async canAddAttestation(attestation: BlockAttestation, committeeSize: number): Promise<boolean> {
241
- const sender = attestation.getSender();
242
- const slot = attestation.payload.header.slotNumber;
243
- const pid = attestation.archive.toString();
244
- return (
245
- !!sender &&
246
- ((this.attestations.get(slot)?.get(pid)?.has(sender.toString()) ?? false) ||
247
- !(await this.hasReachedAttestationCap(slot, pid, committeeSize)))
248
- );
249
- }
250
- }
251
-
252
- /**
253
- * Get Slot or Default
254
- *
255
- * Fetch the slot mapping, if it does not exist, then create a mapping and return it
256
- * @param map - The map to fetch from
257
- * @param slot - The slot to fetch
258
- * @returns The slot mapping
259
- */
260
- function getSlotOrDefault(
261
- // eslint-disable-next-line aztec-custom/no-non-primitive-in-collections
262
- map: Map<SlotNumber, Map<string, Map<string, BlockAttestation>>>,
263
- slot: SlotNumber,
264
- ): Map<string, Map<string, BlockAttestation>> {
265
- if (!map.has(slot)) {
266
- map.set(slot, new Map<string, Map<string, BlockAttestation>>());
267
- }
268
- return map.get(slot)!;
269
- }
270
-
271
- /**
272
- * Get Proposal or Default
273
- *
274
- * Fetch the proposal mapping, if it does not exist, then create a mapping and return it
275
- * @param map - The map to fetch from
276
- * @param proposalId - The proposal id to fetch
277
- * @returns The proposal mapping
278
- */
279
- function getProposalOrDefault(
280
- map: Map<string, Map<string, BlockAttestation>>,
281
- proposalId: string,
282
- ): Map<string, BlockAttestation> {
283
- if (!map.has(proposalId)) {
284
- map.set(proposalId, new Map<string, BlockAttestation>());
285
- }
286
- return map.get(proposalId)!;
287
- }