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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (443) hide show
  1. package/dest/bootstrap/bootstrap.d.ts +1 -1
  2. package/dest/bootstrap/bootstrap.d.ts.map +1 -1
  3. package/dest/bootstrap/bootstrap.js +22 -9
  4. package/dest/client/factory.d.ts +15 -5
  5. package/dest/client/factory.d.ts.map +1 -1
  6. package/dest/client/factory.js +60 -25
  7. package/dest/client/index.d.ts +2 -1
  8. package/dest/client/index.d.ts.map +1 -1
  9. package/dest/client/index.js +1 -0
  10. package/dest/client/interface.d.ts +170 -0
  11. package/dest/client/interface.d.ts.map +1 -0
  12. package/dest/client/interface.js +9 -0
  13. package/dest/client/p2p_client.d.ts +75 -193
  14. package/dest/client/p2p_client.d.ts.map +1 -1
  15. package/dest/client/p2p_client.js +757 -228
  16. package/dest/config.d.ts +148 -125
  17. package/dest/config.d.ts.map +1 -1
  18. package/dest/config.js +180 -34
  19. package/dest/enr/generate-enr.d.ts +11 -3
  20. package/dest/enr/generate-enr.d.ts.map +1 -1
  21. package/dest/enr/generate-enr.js +27 -5
  22. package/dest/enr/index.d.ts +1 -1
  23. package/dest/errors/attestation-pool.error.d.ts +7 -0
  24. package/dest/errors/attestation-pool.error.d.ts.map +1 -0
  25. package/dest/errors/attestation-pool.error.js +12 -0
  26. package/dest/errors/reqresp.error.d.ts +1 -1
  27. package/dest/errors/reqresp.error.d.ts.map +1 -1
  28. package/dest/index.d.ts +4 -1
  29. package/dest/index.d.ts.map +1 -1
  30. package/dest/index.js +2 -0
  31. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +104 -25
  32. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  33. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +1 -1
  34. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
  35. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +288 -174
  36. package/dest/mem_pools/attestation_pool/index.d.ts +1 -1
  37. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +29 -11
  38. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +1 -1
  39. package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +168 -62
  40. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +24 -10
  41. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +1 -1
  42. package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +133 -82
  43. package/dest/mem_pools/attestation_pool/mocks.d.ts +232 -11
  44. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  45. package/dest/mem_pools/attestation_pool/mocks.js +15 -20
  46. package/dest/mem_pools/index.d.ts +1 -1
  47. package/dest/mem_pools/instrumentation.d.ts +16 -12
  48. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  49. package/dest/mem_pools/instrumentation.js +55 -40
  50. package/dest/mem_pools/interface.d.ts +3 -4
  51. package/dest/mem_pools/interface.d.ts.map +1 -1
  52. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +70 -16
  53. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +1 -1
  54. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +452 -142
  55. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +18 -0
  56. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +1 -0
  57. package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +56 -0
  58. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +83 -0
  59. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +1 -0
  60. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +5 -0
  61. package/dest/mem_pools/tx_pool/eviction/insufficient_fee_payer_balance_rule.d.ts +15 -0
  62. package/dest/mem_pools/tx_pool/eviction/insufficient_fee_payer_balance_rule.d.ts.map +1 -0
  63. package/dest/mem_pools/tx_pool/eviction/insufficient_fee_payer_balance_rule.js +88 -0
  64. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +17 -0
  65. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -0
  66. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +84 -0
  67. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +19 -0
  68. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -0
  69. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +76 -0
  70. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +26 -0
  71. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +1 -0
  72. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +84 -0
  73. package/dest/mem_pools/tx_pool/index.d.ts +1 -2
  74. package/dest/mem_pools/tx_pool/index.d.ts.map +1 -1
  75. package/dest/mem_pools/tx_pool/index.js +0 -1
  76. package/dest/mem_pools/tx_pool/priority.d.ts +5 -1
  77. package/dest/mem_pools/tx_pool/priority.d.ts.map +1 -1
  78. package/dest/mem_pools/tx_pool/priority.js +7 -2
  79. package/dest/mem_pools/tx_pool/tx_pool.d.ts +72 -11
  80. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +1 -1
  81. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +1 -1
  82. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +1 -1
  83. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +276 -45
  84. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +7 -5
  85. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  86. package/dest/msg_validators/attestation_validator/attestation_validator.js +48 -10
  87. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +20 -0
  88. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -0
  89. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +64 -0
  90. package/dest/msg_validators/attestation_validator/index.d.ts +2 -1
  91. package/dest/msg_validators/attestation_validator/index.d.ts.map +1 -1
  92. package/dest/msg_validators/attestation_validator/index.js +1 -0
  93. package/dest/msg_validators/index.d.ts +2 -2
  94. package/dest/msg_validators/index.d.ts.map +1 -1
  95. package/dest/msg_validators/index.js +1 -1
  96. package/dest/msg_validators/msg_seen_validator/msg_seen_validator.d.ts +10 -0
  97. package/dest/msg_validators/msg_seen_validator/msg_seen_validator.d.ts.map +1 -0
  98. package/dest/msg_validators/msg_seen_validator/msg_seen_validator.js +36 -0
  99. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +9 -0
  100. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -0
  101. package/dest/msg_validators/proposal_validator/block_proposal_validator.js +6 -0
  102. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +9 -0
  103. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -0
  104. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +6 -0
  105. package/dest/msg_validators/proposal_validator/index.d.ts +4 -0
  106. package/dest/msg_validators/proposal_validator/index.d.ts.map +1 -0
  107. package/dest/msg_validators/proposal_validator/index.js +3 -0
  108. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +13 -0
  109. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -0
  110. package/dest/msg_validators/proposal_validator/proposal_validator.js +80 -0
  111. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +23 -0
  112. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +1 -0
  113. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +183 -0
  114. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +1 -1
  115. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  116. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +3 -0
  117. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -0
  118. package/dest/msg_validators/tx_validator/allowed_public_setup.js +27 -0
  119. package/dest/msg_validators/tx_validator/archive_cache.d.ts +14 -0
  120. package/dest/msg_validators/tx_validator/archive_cache.d.ts.map +1 -0
  121. package/dest/msg_validators/tx_validator/archive_cache.js +22 -0
  122. package/dest/msg_validators/tx_validator/block_header_validator.d.ts +2 -2
  123. package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
  124. package/dest/msg_validators/tx_validator/block_header_validator.js +4 -4
  125. package/dest/msg_validators/tx_validator/data_validator.d.ts +1 -1
  126. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  127. package/dest/msg_validators/tx_validator/data_validator.js +56 -86
  128. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +1 -3
  129. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
  130. package/dest/msg_validators/tx_validator/double_spend_validator.js +21 -27
  131. package/dest/msg_validators/tx_validator/factory.d.ts +16 -0
  132. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -0
  133. package/dest/msg_validators/tx_validator/factory.js +74 -0
  134. package/dest/msg_validators/tx_validator/gas_validator.d.ts +11 -0
  135. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -0
  136. package/dest/msg_validators/tx_validator/gas_validator.js +115 -0
  137. package/dest/msg_validators/tx_validator/index.d.ts +8 -1
  138. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  139. package/dest/msg_validators/tx_validator/index.js +7 -0
  140. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +9 -5
  141. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  142. package/dest/msg_validators/tx_validator/metadata_validator.js +39 -20
  143. package/dest/msg_validators/tx_validator/phases_validator.d.ts +14 -0
  144. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -0
  145. package/dest/msg_validators/tx_validator/phases_validator.js +93 -0
  146. package/dest/msg_validators/tx_validator/test_utils.d.ts +17 -0
  147. package/dest/msg_validators/tx_validator/test_utils.d.ts.map +1 -0
  148. package/dest/msg_validators/tx_validator/test_utils.js +22 -0
  149. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +13 -0
  150. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -0
  151. package/dest/msg_validators/tx_validator/timestamp_validator.js +32 -0
  152. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts +8 -0
  153. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts.map +1 -0
  154. package/dest/msg_validators/tx_validator/tx_permitted_validator.js +24 -0
  155. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +1 -1
  156. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
  157. package/dest/msg_validators/tx_validator/tx_proof_validator.js +6 -5
  158. package/dest/services/data_store.d.ts +1 -1
  159. package/dest/services/data_store.d.ts.map +1 -1
  160. package/dest/services/discv5/discV5_service.d.ts +10 -9
  161. package/dest/services/discv5/discV5_service.d.ts.map +1 -1
  162. package/dest/services/discv5/discV5_service.js +63 -36
  163. package/dest/services/dummy_service.d.ts +54 -11
  164. package/dest/services/dummy_service.d.ts.map +1 -1
  165. package/dest/services/dummy_service.js +91 -5
  166. package/dest/services/encoding.d.ts +26 -7
  167. package/dest/services/encoding.d.ts.map +1 -1
  168. package/dest/services/encoding.js +76 -6
  169. package/dest/services/gossipsub/scoring.d.ts +1 -1
  170. package/dest/services/index.d.ts +5 -1
  171. package/dest/services/index.d.ts.map +1 -1
  172. package/dest/services/index.js +4 -0
  173. package/dest/services/libp2p/instrumentation.d.ts +20 -0
  174. package/dest/services/libp2p/instrumentation.d.ts.map +1 -0
  175. package/dest/services/libp2p/instrumentation.js +111 -0
  176. package/dest/services/libp2p/libp2p_service.d.ts +102 -96
  177. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  178. package/dest/services/libp2p/libp2p_service.js +1307 -301
  179. package/dest/services/peer-manager/interface.d.ts +23 -0
  180. package/dest/services/peer-manager/interface.d.ts.map +1 -0
  181. package/dest/services/peer-manager/interface.js +1 -0
  182. package/dest/services/peer-manager/metrics.d.ts +11 -2
  183. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  184. package/dest/services/peer-manager/metrics.js +29 -12
  185. package/dest/services/peer-manager/peer_manager.d.ts +103 -23
  186. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  187. package/dest/services/peer-manager/peer_manager.js +551 -82
  188. package/dest/services/peer-manager/peer_scoring.d.ts +7 -2
  189. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  190. package/dest/services/peer-manager/peer_scoring.js +37 -2
  191. package/dest/services/reqresp/config.d.ts +11 -9
  192. package/dest/services/reqresp/config.d.ts.map +1 -1
  193. package/dest/services/reqresp/config.js +18 -4
  194. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +2 -2
  195. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +1 -1
  196. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +10 -6
  197. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +31 -17
  198. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -1
  199. package/dest/services/reqresp/connection-sampler/connection_sampler.js +142 -84
  200. package/dest/services/reqresp/index.d.ts +3 -2
  201. package/dest/services/reqresp/index.d.ts.map +1 -1
  202. package/dest/services/reqresp/index.js +2 -1
  203. package/dest/services/reqresp/interface.d.ts +73 -24
  204. package/dest/services/reqresp/interface.d.ts.map +1 -1
  205. package/dest/services/reqresp/interface.js +46 -27
  206. package/dest/services/reqresp/metrics.d.ts +1 -1
  207. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  208. package/dest/services/reqresp/metrics.js +5 -21
  209. package/dest/services/reqresp/protocols/auth.d.ts +43 -0
  210. package/dest/services/reqresp/protocols/auth.d.ts.map +1 -0
  211. package/dest/services/reqresp/protocols/auth.js +71 -0
  212. package/dest/services/reqresp/protocols/block.d.ts +6 -1
  213. package/dest/services/reqresp/protocols/block.d.ts.map +1 -1
  214. package/dest/services/reqresp/protocols/block.js +30 -6
  215. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +30 -0
  216. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -0
  217. package/dest/services/reqresp/protocols/block_txs/bitvector.js +75 -0
  218. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +11 -0
  219. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -0
  220. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +39 -0
  221. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +47 -0
  222. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -0
  223. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +75 -0
  224. package/dest/services/reqresp/protocols/block_txs/index.d.ts +4 -0
  225. package/dest/services/reqresp/protocols/block_txs/index.d.ts.map +1 -0
  226. package/dest/services/reqresp/protocols/block_txs/index.js +3 -0
  227. package/dest/services/reqresp/protocols/goodbye.d.ts +3 -5
  228. package/dest/services/reqresp/protocols/goodbye.d.ts.map +1 -1
  229. package/dest/services/reqresp/protocols/goodbye.js +7 -7
  230. package/dest/services/reqresp/protocols/index.d.ts +3 -1
  231. package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
  232. package/dest/services/reqresp/protocols/index.js +2 -0
  233. package/dest/services/reqresp/protocols/ping.d.ts +1 -3
  234. package/dest/services/reqresp/protocols/ping.d.ts.map +1 -1
  235. package/dest/services/reqresp/protocols/status.d.ts +40 -7
  236. package/dest/services/reqresp/protocols/status.d.ts.map +1 -1
  237. package/dest/services/reqresp/protocols/status.js +75 -5
  238. package/dest/services/reqresp/protocols/tx.d.ts +14 -4
  239. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  240. package/dest/services/reqresp/protocols/tx.js +34 -6
  241. package/dest/services/reqresp/rate-limiter/index.d.ts +1 -1
  242. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +6 -4
  243. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
  244. package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -2
  245. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
  246. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
  247. package/dest/services/reqresp/rate-limiter/rate_limits.js +21 -1
  248. package/dest/services/reqresp/reqresp.d.ts +24 -66
  249. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  250. package/dest/services/reqresp/reqresp.js +699 -230
  251. package/dest/services/reqresp/status.d.ts +10 -4
  252. package/dest/services/reqresp/status.d.ts.map +1 -1
  253. package/dest/services/reqresp/status.js +9 -2
  254. package/dest/services/service.d.ts +37 -20
  255. package/dest/services/service.d.ts.map +1 -1
  256. package/dest/services/tx_collection/config.d.ts +25 -0
  257. package/dest/services/tx_collection/config.d.ts.map +1 -0
  258. package/dest/services/tx_collection/config.js +58 -0
  259. package/dest/services/tx_collection/fast_tx_collection.d.ts +51 -0
  260. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -0
  261. package/dest/services/tx_collection/fast_tx_collection.js +300 -0
  262. package/dest/services/tx_collection/index.d.ts +3 -0
  263. package/dest/services/tx_collection/index.d.ts.map +1 -0
  264. package/dest/services/tx_collection/index.js +2 -0
  265. package/dest/services/tx_collection/instrumentation.d.ts +10 -0
  266. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -0
  267. package/dest/services/tx_collection/instrumentation.js +24 -0
  268. package/dest/services/tx_collection/slow_tx_collection.d.ts +53 -0
  269. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -0
  270. package/dest/services/tx_collection/slow_tx_collection.js +177 -0
  271. package/dest/services/tx_collection/tx_collection.d.ts +110 -0
  272. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -0
  273. package/dest/services/tx_collection/tx_collection.js +128 -0
  274. package/dest/services/tx_collection/tx_collection_sink.d.ts +30 -0
  275. package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -0
  276. package/dest/services/tx_collection/tx_collection_sink.js +111 -0
  277. package/dest/services/tx_collection/tx_source.d.ts +18 -0
  278. package/dest/services/tx_collection/tx_source.d.ts.map +1 -0
  279. package/dest/services/tx_collection/tx_source.js +31 -0
  280. package/dest/services/tx_provider.d.ts +51 -0
  281. package/dest/services/tx_provider.d.ts.map +1 -0
  282. package/dest/services/tx_provider.js +219 -0
  283. package/dest/services/tx_provider_instrumentation.d.ts +16 -0
  284. package/dest/services/tx_provider_instrumentation.d.ts.map +1 -0
  285. package/dest/services/tx_provider_instrumentation.js +34 -0
  286. package/dest/test-helpers/generate-peer-id-private-keys.d.ts +1 -1
  287. package/dest/test-helpers/get-ports.d.ts +1 -1
  288. package/dest/test-helpers/get-ports.d.ts.map +1 -1
  289. package/dest/test-helpers/index.d.ts +2 -1
  290. package/dest/test-helpers/index.d.ts.map +1 -1
  291. package/dest/test-helpers/index.js +1 -0
  292. package/dest/test-helpers/make-enrs.d.ts +1 -1
  293. package/dest/test-helpers/make-enrs.d.ts.map +1 -1
  294. package/dest/test-helpers/make-enrs.js +4 -5
  295. package/dest/test-helpers/make-test-p2p-clients.d.ts +33 -5
  296. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  297. package/dest/test-helpers/make-test-p2p-clients.js +86 -16
  298. package/dest/test-helpers/mock-pubsub.d.ts +59 -0
  299. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -0
  300. package/dest/test-helpers/mock-pubsub.js +130 -0
  301. package/dest/test-helpers/mock-tx-helpers.d.ts +12 -0
  302. package/dest/test-helpers/mock-tx-helpers.d.ts.map +1 -0
  303. package/dest/test-helpers/mock-tx-helpers.js +19 -0
  304. package/dest/test-helpers/reqresp-nodes.d.ts +15 -11
  305. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  306. package/dest/test-helpers/reqresp-nodes.js +62 -28
  307. package/dest/testbench/p2p_client_testbench_worker.d.ts +1 -1
  308. package/dest/testbench/p2p_client_testbench_worker.js +124 -35
  309. package/dest/testbench/parse_log_file.d.ts +1 -1
  310. package/dest/testbench/parse_log_file.js +4 -4
  311. package/dest/testbench/testbench.d.ts +1 -1
  312. package/dest/testbench/testbench.js +4 -4
  313. package/dest/testbench/worker_client_manager.d.ts +1 -6
  314. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  315. package/dest/testbench/worker_client_manager.js +17 -20
  316. package/dest/types/index.d.ts +4 -2
  317. package/dest/types/index.d.ts.map +1 -1
  318. package/dest/types/index.js +2 -0
  319. package/dest/util.d.ts +24 -16
  320. package/dest/util.d.ts.map +1 -1
  321. package/dest/util.js +75 -69
  322. package/dest/versioning.d.ts +4 -4
  323. package/dest/versioning.d.ts.map +1 -1
  324. package/dest/versioning.js +8 -3
  325. package/package.json +32 -27
  326. package/src/bootstrap/bootstrap.ts +27 -11
  327. package/src/client/factory.ts +139 -53
  328. package/src/client/index.ts +1 -0
  329. package/src/client/interface.ts +213 -0
  330. package/src/client/p2p_client.ts +471 -385
  331. package/src/config.ts +299 -134
  332. package/src/enr/generate-enr.ts +39 -6
  333. package/src/errors/attestation-pool.error.ts +13 -0
  334. package/src/index.ts +4 -0
  335. package/src/mem_pools/attestation_pool/attestation_pool.ts +119 -24
  336. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +344 -201
  337. package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +233 -72
  338. package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +199 -96
  339. package/src/mem_pools/attestation_pool/mocks.ts +21 -16
  340. package/src/mem_pools/instrumentation.ts +71 -48
  341. package/src/mem_pools/interface.ts +2 -4
  342. package/src/mem_pools/tx_pool/README.md +255 -0
  343. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +537 -155
  344. package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +71 -0
  345. package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +93 -0
  346. package/src/mem_pools/tx_pool/eviction/insufficient_fee_payer_balance_rule.ts +108 -0
  347. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +104 -0
  348. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +91 -0
  349. package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +106 -0
  350. package/src/mem_pools/tx_pool/index.ts +0 -1
  351. package/src/mem_pools/tx_pool/priority.ts +9 -2
  352. package/src/mem_pools/tx_pool/tx_pool.ts +75 -10
  353. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +225 -36
  354. package/src/msg_validators/attestation_validator/attestation_validator.ts +60 -14
  355. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +88 -0
  356. package/src/msg_validators/attestation_validator/index.ts +1 -0
  357. package/src/msg_validators/index.ts +1 -1
  358. package/src/msg_validators/msg_seen_validator/msg_seen_validator.ts +36 -0
  359. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +10 -0
  360. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +13 -0
  361. package/src/msg_validators/proposal_validator/index.ts +3 -0
  362. package/src/msg_validators/proposal_validator/proposal_validator.ts +92 -0
  363. package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +206 -0
  364. package/src/msg_validators/tx_validator/allowed_public_setup.ts +35 -0
  365. package/src/msg_validators/tx_validator/archive_cache.ts +28 -0
  366. package/src/msg_validators/tx_validator/block_header_validator.ts +5 -5
  367. package/src/msg_validators/tx_validator/data_validator.ts +89 -69
  368. package/src/msg_validators/tx_validator/double_spend_validator.ts +19 -17
  369. package/src/msg_validators/tx_validator/factory.ts +110 -0
  370. package/src/msg_validators/tx_validator/gas_validator.ts +134 -0
  371. package/src/msg_validators/tx_validator/index.ts +7 -0
  372. package/src/msg_validators/tx_validator/metadata_validator.ts +67 -22
  373. package/src/msg_validators/tx_validator/phases_validator.ts +116 -0
  374. package/src/msg_validators/tx_validator/test_utils.ts +43 -0
  375. package/src/msg_validators/tx_validator/timestamp_validator.ts +49 -0
  376. package/src/msg_validators/tx_validator/tx_permitted_validator.ts +17 -0
  377. package/src/msg_validators/tx_validator/tx_proof_validator.ts +6 -5
  378. package/src/services/discv5/discV5_service.ts +84 -38
  379. package/src/services/dummy_service.ts +153 -9
  380. package/src/services/encoding.ts +83 -6
  381. package/src/services/index.ts +4 -0
  382. package/src/services/libp2p/instrumentation.ts +113 -0
  383. package/src/services/libp2p/libp2p_service.ts +1120 -329
  384. package/src/services/peer-manager/interface.ts +29 -0
  385. package/src/services/peer-manager/metrics.ts +38 -12
  386. package/src/services/peer-manager/peer_manager.ts +657 -80
  387. package/src/services/peer-manager/peer_scoring.ts +42 -3
  388. package/src/services/reqresp/config.ts +26 -9
  389. package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +12 -6
  390. package/src/services/reqresp/connection-sampler/connection_sampler.ts +150 -95
  391. package/src/services/reqresp/index.ts +2 -0
  392. package/src/services/reqresp/interface.ts +92 -37
  393. package/src/services/reqresp/metrics.ts +11 -24
  394. package/src/services/reqresp/protocols/auth.ts +83 -0
  395. package/src/services/reqresp/protocols/block.ts +26 -4
  396. package/src/services/reqresp/protocols/block_txs/bitvector.ts +90 -0
  397. package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +53 -0
  398. package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +79 -0
  399. package/src/services/reqresp/protocols/block_txs/index.ts +3 -0
  400. package/src/services/reqresp/protocols/goodbye.ts +9 -7
  401. package/src/services/reqresp/protocols/index.ts +2 -0
  402. package/src/services/reqresp/protocols/status.ts +119 -5
  403. package/src/services/reqresp/protocols/tx.ts +36 -8
  404. package/src/services/reqresp/rate-limiter/rate_limiter.ts +12 -3
  405. package/src/services/reqresp/rate-limiter/rate_limits.ts +21 -1
  406. package/src/services/reqresp/reqresp.ts +387 -256
  407. package/src/services/reqresp/status.ts +12 -3
  408. package/src/services/service.ts +61 -22
  409. package/src/services/tx_collection/config.ts +84 -0
  410. package/src/services/tx_collection/fast_tx_collection.ts +341 -0
  411. package/src/services/tx_collection/index.ts +2 -0
  412. package/src/services/tx_collection/instrumentation.ts +26 -0
  413. package/src/services/tx_collection/slow_tx_collection.ts +233 -0
  414. package/src/services/tx_collection/tx_collection.ts +216 -0
  415. package/src/services/tx_collection/tx_collection_sink.ts +129 -0
  416. package/src/services/tx_collection/tx_source.ts +37 -0
  417. package/src/services/tx_provider.ts +232 -0
  418. package/src/services/tx_provider_instrumentation.ts +48 -0
  419. package/src/test-helpers/index.ts +1 -0
  420. package/src/test-helpers/make-enrs.ts +4 -5
  421. package/src/test-helpers/make-test-p2p-clients.ts +111 -21
  422. package/src/test-helpers/mock-pubsub.ts +188 -0
  423. package/src/test-helpers/mock-tx-helpers.ts +24 -0
  424. package/src/test-helpers/reqresp-nodes.ts +87 -36
  425. package/src/testbench/p2p_client_testbench_worker.ts +182 -32
  426. package/src/testbench/parse_log_file.ts +4 -4
  427. package/src/testbench/testbench.ts +4 -4
  428. package/src/testbench/worker_client_manager.ts +23 -24
  429. package/src/types/index.ts +2 -0
  430. package/src/util.ts +105 -91
  431. package/src/versioning.ts +11 -4
  432. package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts +0 -56
  433. package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts.map +0 -1
  434. package/dest/mem_pools/tx_pool/memory_tx_pool.js +0 -141
  435. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts +0 -8
  436. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts.map +0 -1
  437. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.js +0 -21
  438. package/dest/msg_validators/block_proposal_validator/index.d.ts +0 -2
  439. package/dest/msg_validators/block_proposal_validator/index.d.ts.map +0 -1
  440. package/dest/msg_validators/block_proposal_validator/index.js +0 -1
  441. package/src/mem_pools/tx_pool/memory_tx_pool.ts +0 -174
  442. package/src/msg_validators/block_proposal_validator/block_proposal_validator.ts +0 -29
  443. package/src/msg_validators/block_proposal_validator/index.ts +0 -1
@@ -1,70 +1,168 @@
1
+ import type { SlotNumber } from '@aztec/foundation/branded-types';
1
2
  import { createLogger } from '@aztec/foundation/log';
2
- import type { BlockAttestation } from '@aztec/stdlib/p2p';
3
+ import type {
4
+ BlockProposal,
5
+ CheckpointAttestation,
6
+ CheckpointProposal,
7
+ CheckpointProposalCore,
8
+ } from '@aztec/stdlib/p2p';
3
9
  import { type TelemetryClient, getTelemetryClient } from '@aztec/telemetry-client';
4
10
 
5
- import { PoolInstrumentation, PoolName } from '../instrumentation.js';
11
+ import { ProposalSlotCapExceededError } from '../../errors/attestation-pool.error.js';
12
+ import { PoolInstrumentation, PoolName, type PoolStatsCallback } from '../instrumentation.js';
6
13
  import type { AttestationPool } from './attestation_pool.js';
14
+ import { ATTESTATION_CAP_BUFFER, MAX_PROPOSALS_PER_SLOT } from './kv_attestation_pool.js';
7
15
 
8
16
  export class InMemoryAttestationPool implements AttestationPool {
9
- private metrics: PoolInstrumentation<BlockAttestation>;
17
+ private metrics: PoolInstrumentation<CheckpointAttestation>;
10
18
 
11
- private attestations: Map</*slot=*/ bigint, Map</*proposalId*/ string, Map</*address=*/ string, BlockAttestation>>>;
19
+ private proposals: Map<string, BlockProposal>;
12
20
 
13
- constructor(telemetry: TelemetryClient = getTelemetryClient(), private log = createLogger('p2p:attestation_pool')) {
14
- this.attestations = new Map();
15
- this.metrics = new PoolInstrumentation(telemetry, PoolName.ATTESTATION_POOL);
21
+ // Checkpoint attestations
22
+ // eslint-disable-next-line aztec-custom/no-non-primitive-in-collections
23
+ private checkpointAttestations: Map<
24
+ /*slot=*/ SlotNumber,
25
+ Map</*proposalId*/ string, Map</*address=*/ string, CheckpointAttestation>>
26
+ >;
27
+ private checkpointProposals: Map<string, CheckpointProposalCore>;
28
+
29
+ constructor(
30
+ telemetry: TelemetryClient = getTelemetryClient(),
31
+ private log = createLogger('p2p:attestation_pool'),
32
+ ) {
33
+ this.proposals = new Map();
34
+ this.checkpointAttestations = new Map();
35
+ this.checkpointProposals = new Map();
36
+ this.metrics = new PoolInstrumentation(telemetry, PoolName.ATTESTATION_POOL, this.poolStats);
16
37
  }
17
38
 
18
- public getAttestationsForSlot(slot: bigint, proposalId: string): Promise<BlockAttestation[]> {
19
- const slotAttestationMap = this.attestations.get(slot);
20
- if (slotAttestationMap) {
21
- const proposalAttestationMap = slotAttestationMap.get(proposalId);
22
- if (proposalAttestationMap) {
23
- return Promise.resolve(Array.from(proposalAttestationMap.values()));
24
- }
39
+ private poolStats: PoolStatsCallback = () => {
40
+ return Promise.resolve({
41
+ itemCount: this.checkpointAttestations.size,
42
+ });
43
+ };
44
+
45
+ public isEmpty(): Promise<boolean> {
46
+ return Promise.resolve(this.checkpointAttestations.size === 0 && this.proposals.size === 0);
47
+ }
48
+
49
+ public addBlockProposal(blockProposal: BlockProposal): Promise<void> {
50
+ // Strip signedTxs before storing to avoid holding full tx data in memory
51
+ this.proposals.set(blockProposal.archive.toString(), blockProposal.withoutSignedTxs());
52
+ return Promise.resolve();
53
+ }
54
+
55
+ public getBlockProposal(id: string): Promise<BlockProposal | undefined> {
56
+ return Promise.resolve(this.proposals.get(id));
57
+ }
58
+
59
+ public hasBlockProposal(idOrProposal: string | BlockProposal): Promise<boolean> {
60
+ const id = typeof idOrProposal === 'string' ? idOrProposal : idOrProposal.archive.toString();
61
+ return Promise.resolve(this.proposals.has(id));
62
+ }
63
+
64
+ public canAddProposal(_block: BlockProposal): Promise<boolean> {
65
+ // TODO(palla/mbps): See when to allow
66
+ return Promise.resolve(true);
67
+ }
68
+
69
+ // Checkpoint attestation methods
70
+
71
+ public async addCheckpointProposal(proposal: CheckpointProposal): Promise<void> {
72
+ if (!(await this.canAddCheckpointProposal(proposal))) {
73
+ throw new ProposalSlotCapExceededError(
74
+ `Maximum checkpoint proposals per slot reached: slot=${proposal.slotNumber} cap=${MAX_PROPOSALS_PER_SLOT} proposal=${proposal.archive.toString()}`,
75
+ );
25
76
  }
26
- return Promise.resolve([]);
77
+
78
+ // Extract and validate the block proposal if present
79
+ const blockProposal = proposal.getBlockProposal();
80
+ if (blockProposal && !(await this.canAddProposal(blockProposal))) {
81
+ throw new ProposalSlotCapExceededError(
82
+ `Maximum block proposals per slot reached when extracting from checkpoint: slot=${proposal.slotNumber} proposal=${blockProposal.archive.toString()}`,
83
+ );
84
+ }
85
+
86
+ const slotProposalMapping = getCheckpointSlotOrDefault(this.checkpointAttestations, proposal.slotNumber);
87
+ slotProposalMapping.set(proposal.archive.toString(), new Map<string, CheckpointAttestation>());
88
+
89
+ // Store the checkpoint proposal as core (without lastBlock) to avoid duplication
90
+ this.checkpointProposals.set(proposal.archive.toString(), proposal.toCore());
91
+
92
+ // Store the extracted block proposal separately
93
+ if (blockProposal) {
94
+ this.proposals.set(blockProposal.archive.toString(), blockProposal.withoutSignedTxs());
95
+ }
96
+
97
+ return Promise.resolve();
27
98
  }
28
99
 
29
- public async addAttestations(attestations: BlockAttestation[]): Promise<void> {
30
- for (const attestation of attestations) {
31
- // Perf: order and group by slot before insertion
32
- const slotNumber = attestation.payload.header.globalVariables.slotNumber;
100
+ public getCheckpointProposal(id: string): Promise<CheckpointProposalCore | undefined> {
101
+ return Promise.resolve(this.checkpointProposals.get(id));
102
+ }
103
+
104
+ public hasCheckpointProposal(idOrProposal: string | CheckpointProposal): Promise<boolean> {
105
+ const id = typeof idOrProposal === 'string' ? idOrProposal : idOrProposal.archive.toString();
106
+ return Promise.resolve(this.checkpointProposals.has(id));
107
+ }
33
108
 
109
+ public addCheckpointAttestations(attestations: CheckpointAttestation[]): Promise<void> {
110
+ for (const attestation of attestations) {
111
+ const slotNumber = attestation.payload.header.slotNumber;
34
112
  const proposalId = attestation.archive.toString();
35
- const address = await attestation.getSender();
113
+ const sender = attestation.getSender();
114
+
115
+ // Skip attestations with invalid signatures
116
+ if (!sender) {
117
+ this.log.warn(`Skipping checkpoint attestation with invalid signature for slot ${slotNumber}`, {
118
+ signature: attestation.signature.toString(),
119
+ slotNumber,
120
+ proposalId,
121
+ });
122
+ continue;
123
+ }
36
124
 
37
- const slotAttestationMap = getSlotOrDefault(this.attestations, slotNumber.toBigInt());
38
- const proposalAttestationMap = getProposalOrDefault(slotAttestationMap, proposalId);
39
- proposalAttestationMap.set(address.toString(), attestation);
125
+ const slotAttestationMap = getCheckpointSlotOrDefault(this.checkpointAttestations, slotNumber);
126
+ const proposalAttestationMap = getCheckpointProposalOrDefault(slotAttestationMap, proposalId);
127
+ proposalAttestationMap.set(sender.toString(), attestation);
40
128
 
41
- this.log.verbose(`Added attestation for slot ${slotNumber} from ${address}`);
129
+ this.log.verbose(`Added checkpoint attestation for slot ${slotNumber} from ${sender}`, {
130
+ signature: attestation.signature.toString(),
131
+ slotNumber,
132
+ address: sender,
133
+ proposalId,
134
+ });
42
135
  }
43
136
 
44
- // TODO: set these to pending or something ????
45
- this.metrics.recordAddedObjects(attestations.length);
46
137
  return Promise.resolve();
47
138
  }
48
139
 
49
- #getNumberOfAttestationsInSlot(slot: bigint): number {
50
- let total = 0;
51
- const slotAttestationMap = getSlotOrDefault(this.attestations, slot);
140
+ public getCheckpointAttestationsForSlot(slot: SlotNumber): Promise<CheckpointAttestation[]> {
141
+ return Promise.resolve(
142
+ Array.from(this.checkpointAttestations.get(slot)?.values() ?? []).flatMap(proposalAttestationMap =>
143
+ Array.from(proposalAttestationMap.values()),
144
+ ),
145
+ );
146
+ }
52
147
 
148
+ public getCheckpointAttestationsForSlotAndProposal(
149
+ slot: SlotNumber,
150
+ proposalId: string,
151
+ ): Promise<CheckpointAttestation[]> {
152
+ const slotAttestationMap = this.checkpointAttestations.get(slot);
53
153
  if (slotAttestationMap) {
54
- for (const proposalAttestationMap of slotAttestationMap.values() ?? []) {
55
- total += proposalAttestationMap.size;
154
+ const proposalAttestationMap = slotAttestationMap.get(proposalId);
155
+ if (proposalAttestationMap) {
156
+ return Promise.resolve(Array.from(proposalAttestationMap.values()));
56
157
  }
57
158
  }
58
- return total;
159
+ return Promise.resolve([]);
59
160
  }
60
161
 
61
- public async deleteAttestationsOlderThan(oldestSlot: bigint): Promise<void> {
162
+ public deleteCheckpointAttestationsOlderThan(oldestSlot: SlotNumber): Promise<void> {
62
163
  const olderThan = [];
63
164
 
64
- // Entries are iterated in insertion order, so we can break as soon as we find a slot that is older than the oldestSlot.
65
- // Note: this will only prune correctly if attestations are added in order of rising slot, it is important that we do not allow
66
- // insertion of attestations that are old. #(https://github.com/AztecProtocol/aztec-packages/issues/10322)
67
- const slots = this.attestations.keys();
165
+ const slots = this.checkpointAttestations.keys();
68
166
  for (const slot of slots) {
69
167
  if (slot < oldestSlot) {
70
168
  olderThan.push(slot);
@@ -74,88 +172,93 @@ export class InMemoryAttestationPool implements AttestationPool {
74
172
  }
75
173
 
76
174
  for (const oldSlot of olderThan) {
77
- await this.deleteAttestationsForSlot(oldSlot);
175
+ const proposalIds = this.checkpointAttestations.get(oldSlot)?.keys();
176
+ proposalIds?.forEach(proposalId => this.checkpointProposals.delete(proposalId));
177
+ this.checkpointAttestations.delete(oldSlot);
78
178
  }
79
179
  return Promise.resolve();
80
180
  }
81
181
 
82
- public deleteAttestationsForSlot(slot: bigint): Promise<void> {
83
- // We count the number of attestations we are removing
84
- const numberOfAttestations = this.#getNumberOfAttestationsInSlot(slot);
182
+ public hasReachedCheckpointProposalCap(slot: SlotNumber): Promise<boolean> {
183
+ const slotAttestationMap = this.checkpointAttestations.get(slot);
184
+ const proposalCount = slotAttestationMap?.size ?? 0;
185
+ return Promise.resolve(proposalCount >= MAX_PROPOSALS_PER_SLOT);
186
+ }
85
187
 
86
- this.attestations.delete(slot);
87
- this.log.verbose(`Removed ${numberOfAttestations} attestations for slot ${slot}`);
188
+ public hasReachedCheckpointAttestationCap(
189
+ slot: SlotNumber,
190
+ proposalId: string,
191
+ committeeSize: number,
192
+ ): Promise<boolean> {
193
+ const limit = committeeSize + ATTESTATION_CAP_BUFFER;
194
+ const count = this.checkpointAttestations.get(slot)?.get(proposalId)?.size ?? 0;
195
+ return Promise.resolve(limit <= 0 || count >= limit);
196
+ }
88
197
 
89
- this.metrics.recordRemovedObjects(numberOfAttestations);
90
- return Promise.resolve();
198
+ public async canAddCheckpointProposal(proposal: CheckpointProposal): Promise<boolean> {
199
+ return (
200
+ this.checkpointProposals.has(proposal.archive.toString()) ||
201
+ !(await this.hasReachedCheckpointProposalCap(proposal.slotNumber))
202
+ );
91
203
  }
92
204
 
93
- public deleteAttestationsForSlotAndProposal(slot: bigint, proposalId: string): Promise<void> {
94
- const slotAttestationMap = getSlotOrDefault(this.attestations, slot);
95
- if (slotAttestationMap) {
96
- if (slotAttestationMap.has(proposalId)) {
97
- const numberOfAttestations = slotAttestationMap.get(proposalId)?.size ?? 0;
205
+ public async canAddCheckpointAttestation(
206
+ attestation: CheckpointAttestation,
207
+ committeeSize: number,
208
+ ): Promise<boolean> {
209
+ const sender = attestation.getSender();
210
+ const slot = attestation.payload.header.slotNumber;
211
+ const pid = attestation.archive.toString();
212
+ return (
213
+ !!sender &&
214
+ ((this.checkpointAttestations.get(slot)?.get(pid)?.has(sender.toString()) ?? false) ||
215
+ !(await this.hasReachedCheckpointAttestationCap(slot, pid, committeeSize)))
216
+ );
217
+ }
98
218
 
99
- slotAttestationMap.delete(proposalId);
219
+ public hasCheckpointAttestation(attestation: CheckpointAttestation): Promise<boolean> {
220
+ const slotNumber = attestation.payload.header.slotNumber;
221
+ const proposalId = attestation.archive.toString();
222
+ const sender = attestation.getSender();
100
223
 
101
- this.log.verbose(`Removed ${numberOfAttestations} attestations for slot ${slot} and proposal ${proposalId}`);
102
- this.metrics.recordRemovedObjects(numberOfAttestations);
103
- }
224
+ // Attestations with invalid signatures are never in the pool
225
+ if (!sender) {
226
+ return Promise.resolve(false);
104
227
  }
105
- return Promise.resolve();
106
- }
107
228
 
108
- public async deleteAttestations(attestations: BlockAttestation[]): Promise<void> {
109
- for (const attestation of attestations) {
110
- const slotNumber = attestation.payload.header.globalVariables.slotNumber;
111
- const slotAttestationMap = this.attestations.get(slotNumber.toBigInt());
112
- if (slotAttestationMap) {
113
- const proposalId = attestation.archive.toString();
114
- const proposalAttestationMap = getProposalOrDefault(slotAttestationMap, proposalId);
115
- if (proposalAttestationMap) {
116
- const address = await attestation.getSender();
117
- proposalAttestationMap.delete(address.toString());
118
- this.log.debug(`Deleted attestation for slot ${slotNumber} from ${address}`);
119
- }
120
- }
229
+ const slotAttestationMap = this.checkpointAttestations.get(slotNumber);
230
+ if (!slotAttestationMap) {
231
+ return Promise.resolve(false);
121
232
  }
122
- this.metrics.recordRemovedObjects(attestations.length);
123
- return Promise.resolve();
233
+
234
+ const proposalAttestationMap = slotAttestationMap.get(proposalId);
235
+ if (!proposalAttestationMap) {
236
+ return Promise.resolve(false);
237
+ }
238
+
239
+ return Promise.resolve(proposalAttestationMap.has(sender.toString()));
124
240
  }
125
241
  }
126
242
 
127
- /**
128
- * Get Slot or Default
129
- *
130
- * Fetch the slot mapping, if it does not exist, then create a mapping and return it
131
- * @param map - The map to fetch from
132
- * @param slot - The slot to fetch
133
- * @returns The slot mapping
134
- */
135
- function getSlotOrDefault(
136
- map: Map<bigint, Map<string, Map<string, BlockAttestation>>>,
137
- slot: bigint,
138
- ): Map<string, Map<string, BlockAttestation>> {
243
+ // Checkpoint attestation helper functions
244
+
245
+ function getCheckpointSlotOrDefault(
246
+ // eslint-disable-next-line aztec-custom/no-non-primitive-in-collections
247
+ map: Map<SlotNumber, Map<string, Map<string, CheckpointAttestation>>>,
248
+ slot: SlotNumber,
249
+ ): Map<string, Map<string, CheckpointAttestation>> {
139
250
  if (!map.has(slot)) {
140
- map.set(slot, new Map<string, Map<string, BlockAttestation>>());
251
+ map.set(slot, new Map<string, Map<string, CheckpointAttestation>>());
141
252
  }
142
253
  return map.get(slot)!;
143
254
  }
144
255
 
145
- /**
146
- * Get Proposal or Default
147
- *
148
- * Fetch the proposal mapping, if it does not exist, then create a mapping and return it
149
- * @param map - The map to fetch from
150
- * @param proposalId - The proposal id to fetch
151
- * @returns The proposal mapping
152
- */
153
- function getProposalOrDefault(
154
- map: Map<string, Map<string, BlockAttestation>>,
256
+ function getCheckpointProposalOrDefault(
257
+ map: Map<string, Map<string, CheckpointAttestation>>,
155
258
  proposalId: string,
156
- ): Map<string, BlockAttestation> {
259
+ ): Map<string, CheckpointAttestation> {
157
260
  if (!map.has(proposalId)) {
158
- map.set(proposalId, new Map<string, BlockAttestation>());
261
+ map.set(proposalId, new Map<string, CheckpointAttestation>());
159
262
  }
160
263
  return map.get(proposalId)!;
161
264
  }
@@ -1,13 +1,12 @@
1
- import type { Secp256k1Signer } from '@aztec/foundation/crypto';
2
- import { Fr } from '@aztec/foundation/fields';
1
+ import type { Secp256k1Signer } from '@aztec/foundation/crypto/secp256k1-signer';
2
+ import { Fr } from '@aztec/foundation/curves/bn254';
3
3
  import {
4
- BlockAttestation,
4
+ CheckpointAttestation,
5
5
  ConsensusPayload,
6
6
  SignatureDomainSeparator,
7
7
  getHashedSignaturePayloadEthSignedMessage,
8
8
  } from '@aztec/stdlib/p2p';
9
- import { makeHeader } from '@aztec/stdlib/testing';
10
- import { TxHash } from '@aztec/stdlib/tx';
9
+ import { makeL2BlockHeader } from '@aztec/stdlib/testing';
11
10
 
12
11
  import { type LocalAccount, generatePrivateKey, privateKeyToAccount } from 'viem/accounts';
13
12
 
@@ -21,24 +20,30 @@ export const generateAccount = (): LocalAccount => {
21
20
  return privateKeyToAccount(privateKey);
22
21
  };
23
22
 
24
- /** Mock Attestation
23
+ /** Mock Checkpoint Attestation
25
24
  *
26
- * @param signer A viem signer to create a signature
25
+ * @param signer A Secp256k1Signer to create a signature
27
26
  * @param slot The slot number the attestation is for
28
- * @returns A Block Attestation
27
+ * @param archive The archive root (defaults to random)
28
+ * @returns A Checkpoint Attestation
29
29
  */
30
- export const mockAttestation = async (
30
+ export const mockCheckpointAttestation = (
31
31
  signer: Secp256k1Signer,
32
32
  slot: number = 0,
33
33
  archive: Fr = Fr.random(),
34
- txs: TxHash[] = [0, 1, 2, 3, 4, 5].map(() => TxHash.random()),
35
- ): Promise<BlockAttestation> => {
34
+ ): CheckpointAttestation => {
36
35
  // Use arbitrary numbers for all other than slot
37
- const header = makeHeader(1, 2, slot);
38
- const payload = new ConsensusPayload(header, archive, txs);
36
+ const header = makeL2BlockHeader(1, 2, slot);
37
+ const payload = new ConsensusPayload(header.toCheckpointHeader(), archive);
39
38
 
40
- const hash = await getHashedSignaturePayloadEthSignedMessage(payload, SignatureDomainSeparator.blockAttestation);
41
- const signature = signer.sign(hash);
39
+ const attestationHash = getHashedSignaturePayloadEthSignedMessage(
40
+ payload,
41
+ SignatureDomainSeparator.checkpointAttestation,
42
+ );
43
+ const attestationSignature = signer.sign(attestationHash);
42
44
 
43
- return new BlockAttestation(payload, signature);
45
+ const proposalHash = getHashedSignaturePayloadEthSignedMessage(payload, SignatureDomainSeparator.checkpointProposal);
46
+ const proposerSignature = signer.sign(proposalHash);
47
+
48
+ return new CheckpointAttestation(payload, attestationSignature, proposerSignature);
44
49
  };
@@ -1,11 +1,15 @@
1
1
  import type { Gossipable } from '@aztec/stdlib/p2p';
2
+ import type { Tx } from '@aztec/stdlib/tx';
2
3
  import {
3
4
  Attributes,
5
+ type BatchObservableResult,
4
6
  type Histogram,
5
7
  LmdbMetrics,
6
8
  type LmdbStatsCallback,
9
+ type Meter,
10
+ type MetricDefinition,
7
11
  Metrics,
8
- type MetricsType,
12
+ type ObservableGauge,
9
13
  type TelemetryClient,
10
14
  type UpDownCounter,
11
15
  } from '@aztec/telemetry-client';
@@ -16,8 +20,10 @@ export enum PoolName {
16
20
  }
17
21
 
18
22
  type MetricsLabels = {
19
- objectInMempool: MetricsType;
20
- objectSize: MetricsType;
23
+ objectInMempool: MetricDefinition;
24
+ objectSize: MetricDefinition;
25
+ itemsAdded: MetricDefinition;
26
+ itemMinedDelay: MetricDefinition;
21
27
  };
22
28
 
23
29
  /**
@@ -30,97 +36,114 @@ function getMetricsLabels(name: PoolName): MetricsLabels {
30
36
  return {
31
37
  objectInMempool: Metrics.MEMPOOL_TX_COUNT,
32
38
  objectSize: Metrics.MEMPOOL_TX_SIZE,
39
+ itemsAdded: Metrics.MEMPOOL_TX_ADDED_COUNT,
40
+ itemMinedDelay: Metrics.MEMPOOL_TX_MINED_DELAY,
33
41
  };
34
42
  } else if (name === PoolName.ATTESTATION_POOL) {
35
43
  return {
36
44
  objectInMempool: Metrics.MEMPOOL_ATTESTATIONS_COUNT,
37
45
  objectSize: Metrics.MEMPOOL_ATTESTATIONS_SIZE,
46
+ itemsAdded: Metrics.MEMPOOL_ATTESTATIONS_ADDED_COUNT,
47
+ itemMinedDelay: Metrics.MEMPOOL_ATTESTATIONS_MINED_DELAY,
38
48
  };
39
49
  }
40
50
 
41
51
  throw new Error('Invalid pool type');
42
52
  }
43
53
 
54
+ export type PoolStatsCallback = () => Promise<{
55
+ itemCount: number | Record<string, number>;
56
+ }>;
57
+
44
58
  /**
45
59
  * Instrumentation class for the Pools (TxPool, AttestationPool, etc).
46
60
  */
47
61
  export class PoolInstrumentation<PoolObject extends Gossipable> {
48
62
  /** The number of txs in the mempool */
49
- private objectsInMempool: UpDownCounter;
63
+ private objectsInMempool: ObservableGauge;
64
+ private addObjectCounter: UpDownCounter;
50
65
  /** Tracks tx size */
51
66
  private objectSize: Histogram;
67
+ /** Track delay between transaction added and evicted */
68
+ private minedDelay: Histogram;
52
69
 
53
70
  private dbMetrics: LmdbMetrics;
54
71
 
55
72
  private defaultAttributes;
73
+ private meter: Meter;
74
+
75
+ private txAddedTimestamp: Map<bigint, number> = new Map<bigint, number>();
56
76
 
57
- constructor(telemetry: TelemetryClient, name: PoolName, dbStats?: LmdbStatsCallback) {
58
- const meter = telemetry.getMeter(name);
77
+ constructor(
78
+ telemetry: TelemetryClient,
79
+ name: PoolName,
80
+ private poolStats: PoolStatsCallback,
81
+ dbStats?: LmdbStatsCallback,
82
+ ) {
83
+ this.meter = telemetry.getMeter(name);
59
84
  this.defaultAttributes = { [Attributes.POOL_NAME]: name };
60
85
 
61
86
  const metricsLabels = getMetricsLabels(name);
62
87
 
63
- this.objectsInMempool = meter.createUpDownCounter(metricsLabels.objectInMempool, {
64
- description: 'The current number of transactions in the mempool',
65
- });
88
+ this.objectsInMempool = this.meter.createObservableGauge(metricsLabels.objectInMempool);
66
89
 
67
- this.objectSize = meter.createHistogram(metricsLabels.objectSize, {
68
- unit: 'By',
69
- description: 'The size of transactions in the mempool',
70
- });
90
+ this.objectSize = this.meter.createHistogram(metricsLabels.objectSize);
71
91
 
72
92
  this.dbMetrics = new LmdbMetrics(
73
- meter,
93
+ this.meter,
74
94
  {
75
95
  [Attributes.DB_DATA_TYPE]: 'tx-pool',
76
96
  },
77
97
  dbStats,
78
98
  );
99
+
100
+ this.addObjectCounter = this.meter.createUpDownCounter(metricsLabels.itemsAdded);
101
+
102
+ this.minedDelay = this.meter.createHistogram(metricsLabels.itemMinedDelay);
103
+
104
+ this.meter.addBatchObservableCallback(this.observeStats, [this.objectsInMempool]);
79
105
  }
80
106
 
81
107
  public recordSize(poolObject: PoolObject) {
82
108
  this.objectSize.record(poolObject.getSize());
83
109
  }
84
110
 
85
- /**
86
- * Updates the metrics with the new objects.
87
- * @param txs - The objects to record
88
- */
89
- public recordAddedObjects(count = 1, status?: string) {
90
- if (count < 0) {
91
- throw new Error('Count must be positive');
92
- }
93
- if (count === 0) {
94
- return;
95
- }
96
- const attributes = status
97
- ? {
98
- ...this.defaultAttributes,
99
- [Attributes.STATUS]: status,
100
- }
101
- : this.defaultAttributes;
102
-
103
- this.objectsInMempool.add(count, attributes);
111
+ public incrementAddedObjects(count: number) {
112
+ this.addObjectCounter.add(count);
104
113
  }
105
114
 
106
- /**
107
- * Updates the metrics by removing objects from the mempool.
108
- * @param count - The number of objects to remove from the mempool
109
- */
110
- public recordRemovedObjects(count = 1, status?: string) {
111
- if (count < 0) {
112
- throw new Error('Count must be positive');
115
+ public transactionsAdded(transactions: Tx[]) {
116
+ const timestamp = Date.now();
117
+ for (const transaction of transactions) {
118
+ this.txAddedTimestamp.set(transaction.txHash.toBigInt(), timestamp);
113
119
  }
114
- if (count === 0) {
115
- return;
120
+ }
121
+
122
+ public transactionsRemoved(hashes: Iterable<bigint> | Iterable<string>) {
123
+ const timestamp = Date.now();
124
+ for (const hash of hashes) {
125
+ const key = BigInt(hash);
126
+ const addedAt = this.txAddedTimestamp.get(key);
127
+ if (addedAt !== undefined) {
128
+ this.txAddedTimestamp.delete(key);
129
+ if (addedAt < timestamp) {
130
+ this.minedDelay.record(timestamp - addedAt);
131
+ }
132
+ }
116
133
  }
134
+ }
117
135
 
118
- const attributes = status
119
- ? {
136
+ private observeStats = async (observer: BatchObservableResult) => {
137
+ const { itemCount } = await this.poolStats();
138
+ if (typeof itemCount === 'number') {
139
+ observer.observe(this.objectsInMempool, itemCount, this.defaultAttributes);
140
+ } else {
141
+ for (const [status, count] of Object.entries(itemCount)) {
142
+ observer.observe(this.objectsInMempool, count, {
120
143
  ...this.defaultAttributes,
121
144
  [Attributes.STATUS]: status,
122
- }
123
- : this.defaultAttributes;
124
- this.objectsInMempool.add(-1 * count, attributes);
125
- }
145
+ });
146
+ }
147
+ }
148
+ };
126
149
  }
@@ -1,12 +1,10 @@
1
- import type { P2PClientType } from '@aztec/stdlib/p2p';
2
-
3
1
  import type { AttestationPool } from './attestation_pool/attestation_pool.js';
4
2
  import type { TxPool } from './tx_pool/tx_pool.js';
5
3
 
6
4
  /**
7
5
  * A interface the combines all mempools
8
6
  */
9
- export type MemPools<T extends P2PClientType = P2PClientType.Full> = {
7
+ export type MemPools = {
10
8
  txPool: TxPool;
11
- attestationPool?: T extends P2PClientType.Full ? AttestationPool : undefined;
9
+ attestationPool: AttestationPool;
12
10
  };