@aztec/p2p 0.0.0-test.1 → 0.0.1-commit.5476d83

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 (385) 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 +14 -4
  5. package/dest/client/factory.d.ts.map +1 -1
  6. package/dest/client/factory.js +60 -24
  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 +157 -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 +72 -187
  14. package/dest/client/p2p_client.d.ts.map +1 -1
  15. package/dest/client/p2p_client.js +373 -177
  16. package/dest/config.d.ts +151 -125
  17. package/dest/config.d.ts.map +1 -1
  18. package/dest/config.js +183 -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 +68 -8
  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 +214 -63
  36. package/dest/mem_pools/attestation_pool/index.d.ts +1 -1
  37. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +21 -6
  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 +126 -25
  40. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +19 -6
  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 +111 -21
  43. package/dest/mem_pools/attestation_pool/mocks.d.ts +225 -5
  44. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  45. package/dest/mem_pools/attestation_pool/mocks.js +9 -15
  46. package/dest/mem_pools/index.d.ts +1 -1
  47. package/dest/mem_pools/instrumentation.d.ts +10 -12
  48. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  49. package/dest/mem_pools/instrumentation.js +35 -38
  50. package/dest/mem_pools/interface.d.ts +1 -1
  51. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +62 -13
  52. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +1 -1
  53. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +469 -97
  54. package/dest/mem_pools/tx_pool/index.d.ts +1 -1
  55. package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts +34 -10
  56. package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts.map +1 -1
  57. package/dest/mem_pools/tx_pool/memory_tx_pool.js +133 -36
  58. package/dest/mem_pools/tx_pool/priority.d.ts +1 -1
  59. package/dest/mem_pools/tx_pool/priority.js +1 -1
  60. package/dest/mem_pools/tx_pool/tx_pool.d.ts +65 -9
  61. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +1 -1
  62. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +1 -1
  63. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +1 -1
  64. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +264 -39
  65. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +4 -2
  66. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  67. package/dest/msg_validators/attestation_validator/attestation_validator.js +45 -9
  68. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +20 -0
  69. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -0
  70. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +67 -0
  71. package/dest/msg_validators/attestation_validator/index.d.ts +2 -1
  72. package/dest/msg_validators/attestation_validator/index.d.ts.map +1 -1
  73. package/dest/msg_validators/attestation_validator/index.js +1 -0
  74. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts +6 -2
  75. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts.map +1 -1
  76. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.js +73 -12
  77. package/dest/msg_validators/block_proposal_validator/index.d.ts +1 -1
  78. package/dest/msg_validators/index.d.ts +1 -1
  79. package/dest/msg_validators/msg_seen_validator/msg_seen_validator.d.ts +10 -0
  80. package/dest/msg_validators/msg_seen_validator/msg_seen_validator.d.ts.map +1 -0
  81. package/dest/msg_validators/msg_seen_validator/msg_seen_validator.js +36 -0
  82. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +1 -1
  83. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  84. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +3 -0
  85. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -0
  86. package/dest/msg_validators/tx_validator/allowed_public_setup.js +27 -0
  87. package/dest/msg_validators/tx_validator/archive_cache.d.ts +14 -0
  88. package/dest/msg_validators/tx_validator/archive_cache.d.ts.map +1 -0
  89. package/dest/msg_validators/tx_validator/archive_cache.js +22 -0
  90. package/dest/msg_validators/tx_validator/block_header_validator.d.ts +1 -1
  91. package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
  92. package/dest/msg_validators/tx_validator/block_header_validator.js +4 -4
  93. package/dest/msg_validators/tx_validator/data_validator.d.ts +1 -1
  94. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  95. package/dest/msg_validators/tx_validator/data_validator.js +56 -86
  96. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +1 -3
  97. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
  98. package/dest/msg_validators/tx_validator/double_spend_validator.js +21 -27
  99. package/dest/msg_validators/tx_validator/factory.d.ts +15 -0
  100. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -0
  101. package/dest/msg_validators/tx_validator/factory.js +74 -0
  102. package/dest/msg_validators/tx_validator/gas_validator.d.ts +11 -0
  103. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -0
  104. package/dest/msg_validators/tx_validator/gas_validator.js +115 -0
  105. package/dest/msg_validators/tx_validator/index.d.ts +8 -1
  106. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  107. package/dest/msg_validators/tx_validator/index.js +7 -0
  108. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +8 -4
  109. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  110. package/dest/msg_validators/tx_validator/metadata_validator.js +39 -20
  111. package/dest/msg_validators/tx_validator/phases_validator.d.ts +14 -0
  112. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -0
  113. package/dest/msg_validators/tx_validator/phases_validator.js +93 -0
  114. package/dest/msg_validators/tx_validator/test_utils.d.ts +17 -0
  115. package/dest/msg_validators/tx_validator/test_utils.d.ts.map +1 -0
  116. package/dest/msg_validators/tx_validator/test_utils.js +22 -0
  117. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +12 -0
  118. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -0
  119. package/dest/msg_validators/tx_validator/timestamp_validator.js +32 -0
  120. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts +8 -0
  121. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts.map +1 -0
  122. package/dest/msg_validators/tx_validator/tx_permitted_validator.js +24 -0
  123. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +1 -1
  124. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
  125. package/dest/msg_validators/tx_validator/tx_proof_validator.js +6 -5
  126. package/dest/services/data_store.d.ts +1 -1
  127. package/dest/services/data_store.d.ts.map +1 -1
  128. package/dest/services/discv5/discV5_service.d.ts +10 -9
  129. package/dest/services/discv5/discV5_service.d.ts.map +1 -1
  130. package/dest/services/discv5/discV5_service.js +63 -36
  131. package/dest/services/dummy_service.d.ts +50 -11
  132. package/dest/services/dummy_service.d.ts.map +1 -1
  133. package/dest/services/dummy_service.js +88 -5
  134. package/dest/services/encoding.d.ts +26 -7
  135. package/dest/services/encoding.d.ts.map +1 -1
  136. package/dest/services/encoding.js +73 -5
  137. package/dest/services/gossipsub/scoring.d.ts +1 -1
  138. package/dest/services/index.d.ts +5 -1
  139. package/dest/services/index.d.ts.map +1 -1
  140. package/dest/services/index.js +4 -0
  141. package/dest/services/libp2p/instrumentation.d.ts +20 -0
  142. package/dest/services/libp2p/instrumentation.d.ts.map +1 -0
  143. package/dest/services/libp2p/instrumentation.js +164 -0
  144. package/dest/services/libp2p/libp2p_service.d.ts +78 -89
  145. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  146. package/dest/services/libp2p/libp2p_service.js +698 -246
  147. package/dest/services/peer-manager/interface.d.ts +23 -0
  148. package/dest/services/peer-manager/interface.d.ts.map +1 -0
  149. package/dest/services/peer-manager/interface.js +1 -0
  150. package/dest/services/peer-manager/metrics.d.ts +6 -2
  151. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  152. package/dest/services/peer-manager/metrics.js +22 -2
  153. package/dest/services/peer-manager/peer_manager.d.ts +102 -22
  154. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  155. package/dest/services/peer-manager/peer_manager.js +549 -72
  156. package/dest/services/peer-manager/peer_scoring.d.ts +7 -2
  157. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  158. package/dest/services/peer-manager/peer_scoring.js +40 -2
  159. package/dest/services/reqresp/config.d.ts +11 -9
  160. package/dest/services/reqresp/config.d.ts.map +1 -1
  161. package/dest/services/reqresp/config.js +18 -4
  162. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +2 -2
  163. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +1 -1
  164. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +10 -6
  165. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +31 -17
  166. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -1
  167. package/dest/services/reqresp/connection-sampler/connection_sampler.js +142 -84
  168. package/dest/services/reqresp/index.d.ts +3 -2
  169. package/dest/services/reqresp/index.d.ts.map +1 -1
  170. package/dest/services/reqresp/index.js +2 -1
  171. package/dest/services/reqresp/interface.d.ts +73 -24
  172. package/dest/services/reqresp/interface.d.ts.map +1 -1
  173. package/dest/services/reqresp/interface.js +45 -26
  174. package/dest/services/reqresp/metrics.d.ts +1 -1
  175. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  176. package/dest/services/reqresp/protocols/auth.d.ts +43 -0
  177. package/dest/services/reqresp/protocols/auth.d.ts.map +1 -0
  178. package/dest/services/reqresp/protocols/auth.js +71 -0
  179. package/dest/services/reqresp/protocols/block.d.ts +6 -1
  180. package/dest/services/reqresp/protocols/block.d.ts.map +1 -1
  181. package/dest/services/reqresp/protocols/block.js +28 -5
  182. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +30 -0
  183. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -0
  184. package/dest/services/reqresp/protocols/block_txs/bitvector.js +75 -0
  185. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +11 -0
  186. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -0
  187. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +39 -0
  188. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +47 -0
  189. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -0
  190. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +75 -0
  191. package/dest/services/reqresp/protocols/block_txs/index.d.ts +4 -0
  192. package/dest/services/reqresp/protocols/block_txs/index.d.ts.map +1 -0
  193. package/dest/services/reqresp/protocols/block_txs/index.js +3 -0
  194. package/dest/services/reqresp/protocols/goodbye.d.ts +3 -5
  195. package/dest/services/reqresp/protocols/goodbye.d.ts.map +1 -1
  196. package/dest/services/reqresp/protocols/goodbye.js +7 -7
  197. package/dest/services/reqresp/protocols/index.d.ts +3 -1
  198. package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
  199. package/dest/services/reqresp/protocols/index.js +2 -0
  200. package/dest/services/reqresp/protocols/ping.d.ts +1 -3
  201. package/dest/services/reqresp/protocols/ping.d.ts.map +1 -1
  202. package/dest/services/reqresp/protocols/status.d.ts +39 -7
  203. package/dest/services/reqresp/protocols/status.d.ts.map +1 -1
  204. package/dest/services/reqresp/protocols/status.js +72 -5
  205. package/dest/services/reqresp/protocols/tx.d.ts +13 -2
  206. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  207. package/dest/services/reqresp/protocols/tx.js +34 -6
  208. package/dest/services/reqresp/rate-limiter/index.d.ts +1 -1
  209. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +6 -4
  210. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
  211. package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -2
  212. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
  213. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
  214. package/dest/services/reqresp/rate-limiter/rate_limits.js +21 -1
  215. package/dest/services/reqresp/reqresp.d.ts +24 -66
  216. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  217. package/dest/services/reqresp/reqresp.js +298 -207
  218. package/dest/services/reqresp/status.d.ts +10 -4
  219. package/dest/services/reqresp/status.d.ts.map +1 -1
  220. package/dest/services/reqresp/status.js +9 -2
  221. package/dest/services/service.d.ts +23 -19
  222. package/dest/services/service.d.ts.map +1 -1
  223. package/dest/services/tx_collection/config.d.ts +25 -0
  224. package/dest/services/tx_collection/config.d.ts.map +1 -0
  225. package/dest/services/tx_collection/config.js +58 -0
  226. package/dest/services/tx_collection/fast_tx_collection.d.ts +50 -0
  227. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -0
  228. package/dest/services/tx_collection/fast_tx_collection.js +300 -0
  229. package/dest/services/tx_collection/index.d.ts +3 -0
  230. package/dest/services/tx_collection/index.d.ts.map +1 -0
  231. package/dest/services/tx_collection/index.js +2 -0
  232. package/dest/services/tx_collection/instrumentation.d.ts +10 -0
  233. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -0
  234. package/dest/services/tx_collection/instrumentation.js +34 -0
  235. package/dest/services/tx_collection/slow_tx_collection.d.ts +52 -0
  236. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -0
  237. package/dest/services/tx_collection/slow_tx_collection.js +177 -0
  238. package/dest/services/tx_collection/tx_collection.d.ts +109 -0
  239. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -0
  240. package/dest/services/tx_collection/tx_collection.js +128 -0
  241. package/dest/services/tx_collection/tx_collection_sink.d.ts +30 -0
  242. package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -0
  243. package/dest/services/tx_collection/tx_collection_sink.js +111 -0
  244. package/dest/services/tx_collection/tx_source.d.ts +18 -0
  245. package/dest/services/tx_collection/tx_source.d.ts.map +1 -0
  246. package/dest/services/tx_collection/tx_source.js +31 -0
  247. package/dest/services/tx_provider.d.ts +49 -0
  248. package/dest/services/tx_provider.d.ts.map +1 -0
  249. package/dest/services/tx_provider.js +210 -0
  250. package/dest/services/tx_provider_instrumentation.d.ts +13 -0
  251. package/dest/services/tx_provider_instrumentation.d.ts.map +1 -0
  252. package/dest/services/tx_provider_instrumentation.js +34 -0
  253. package/dest/test-helpers/generate-peer-id-private-keys.d.ts +1 -1
  254. package/dest/test-helpers/get-ports.d.ts +1 -1
  255. package/dest/test-helpers/get-ports.d.ts.map +1 -1
  256. package/dest/test-helpers/index.d.ts +2 -1
  257. package/dest/test-helpers/index.d.ts.map +1 -1
  258. package/dest/test-helpers/index.js +1 -0
  259. package/dest/test-helpers/make-enrs.d.ts +1 -1
  260. package/dest/test-helpers/make-enrs.d.ts.map +1 -1
  261. package/dest/test-helpers/make-enrs.js +4 -5
  262. package/dest/test-helpers/make-test-p2p-clients.d.ts +33 -5
  263. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  264. package/dest/test-helpers/make-test-p2p-clients.js +86 -16
  265. package/dest/test-helpers/mock-pubsub.d.ts +59 -0
  266. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -0
  267. package/dest/test-helpers/mock-pubsub.js +130 -0
  268. package/dest/test-helpers/mock-tx-helpers.d.ts +12 -0
  269. package/dest/test-helpers/mock-tx-helpers.d.ts.map +1 -0
  270. package/dest/test-helpers/mock-tx-helpers.js +19 -0
  271. package/dest/test-helpers/reqresp-nodes.d.ts +15 -11
  272. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  273. package/dest/test-helpers/reqresp-nodes.js +62 -28
  274. package/dest/testbench/p2p_client_testbench_worker.d.ts +1 -1
  275. package/dest/testbench/p2p_client_testbench_worker.js +103 -29
  276. package/dest/testbench/parse_log_file.d.ts +1 -1
  277. package/dest/testbench/parse_log_file.js +4 -4
  278. package/dest/testbench/testbench.d.ts +1 -1
  279. package/dest/testbench/testbench.js +4 -4
  280. package/dest/testbench/worker_client_manager.d.ts +1 -6
  281. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  282. package/dest/testbench/worker_client_manager.js +11 -19
  283. package/dest/types/index.d.ts +4 -2
  284. package/dest/types/index.d.ts.map +1 -1
  285. package/dest/types/index.js +2 -0
  286. package/dest/util.d.ts +24 -16
  287. package/dest/util.d.ts.map +1 -1
  288. package/dest/util.js +75 -69
  289. package/dest/versioning.d.ts +4 -4
  290. package/dest/versioning.d.ts.map +1 -1
  291. package/dest/versioning.js +8 -3
  292. package/package.json +32 -27
  293. package/src/bootstrap/bootstrap.ts +27 -11
  294. package/src/client/factory.ts +136 -45
  295. package/src/client/index.ts +1 -0
  296. package/src/client/interface.ts +198 -0
  297. package/src/client/p2p_client.ts +469 -330
  298. package/src/config.ts +305 -134
  299. package/src/enr/generate-enr.ts +39 -6
  300. package/src/errors/attestation-pool.error.ts +13 -0
  301. package/src/index.ts +4 -0
  302. package/src/mem_pools/attestation_pool/attestation_pool.ts +75 -7
  303. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +264 -65
  304. package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +173 -34
  305. package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +156 -30
  306. package/src/mem_pools/attestation_pool/mocks.ts +11 -10
  307. package/src/mem_pools/instrumentation.ts +43 -44
  308. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +549 -108
  309. package/src/mem_pools/tx_pool/memory_tx_pool.ts +153 -44
  310. package/src/mem_pools/tx_pool/priority.ts +1 -1
  311. package/src/mem_pools/tx_pool/tx_pool.ts +67 -8
  312. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +217 -34
  313. package/src/msg_validators/attestation_validator/attestation_validator.ts +54 -11
  314. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +91 -0
  315. package/src/msg_validators/attestation_validator/index.ts +1 -0
  316. package/src/msg_validators/block_proposal_validator/block_proposal_validator.ts +82 -14
  317. package/src/msg_validators/msg_seen_validator/msg_seen_validator.ts +36 -0
  318. package/src/msg_validators/tx_validator/allowed_public_setup.ts +35 -0
  319. package/src/msg_validators/tx_validator/archive_cache.ts +28 -0
  320. package/src/msg_validators/tx_validator/block_header_validator.ts +4 -4
  321. package/src/msg_validators/tx_validator/data_validator.ts +81 -69
  322. package/src/msg_validators/tx_validator/double_spend_validator.ts +19 -17
  323. package/src/msg_validators/tx_validator/factory.ts +109 -0
  324. package/src/msg_validators/tx_validator/gas_validator.ts +134 -0
  325. package/src/msg_validators/tx_validator/index.ts +7 -0
  326. package/src/msg_validators/tx_validator/metadata_validator.ts +58 -21
  327. package/src/msg_validators/tx_validator/phases_validator.ts +116 -0
  328. package/src/msg_validators/tx_validator/test_utils.ts +43 -0
  329. package/src/msg_validators/tx_validator/timestamp_validator.ts +46 -0
  330. package/src/msg_validators/tx_validator/tx_permitted_validator.ts +17 -0
  331. package/src/msg_validators/tx_validator/tx_proof_validator.ts +6 -5
  332. package/src/services/discv5/discV5_service.ts +84 -38
  333. package/src/services/dummy_service.ts +147 -9
  334. package/src/services/encoding.ts +80 -5
  335. package/src/services/index.ts +4 -0
  336. package/src/services/libp2p/instrumentation.ts +167 -0
  337. package/src/services/libp2p/libp2p_service.ts +866 -294
  338. package/src/services/peer-manager/interface.ts +29 -0
  339. package/src/services/peer-manager/metrics.ts +26 -1
  340. package/src/services/peer-manager/peer_manager.ts +654 -78
  341. package/src/services/peer-manager/peer_scoring.ts +46 -3
  342. package/src/services/reqresp/config.ts +26 -9
  343. package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +12 -6
  344. package/src/services/reqresp/connection-sampler/connection_sampler.ts +148 -95
  345. package/src/services/reqresp/index.ts +2 -0
  346. package/src/services/reqresp/interface.ts +91 -36
  347. package/src/services/reqresp/metrics.ts +4 -1
  348. package/src/services/reqresp/protocols/auth.ts +83 -0
  349. package/src/services/reqresp/protocols/block.ts +24 -3
  350. package/src/services/reqresp/protocols/block_txs/bitvector.ts +90 -0
  351. package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +53 -0
  352. package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +79 -0
  353. package/src/services/reqresp/protocols/block_txs/index.ts +3 -0
  354. package/src/services/reqresp/protocols/goodbye.ts +9 -7
  355. package/src/services/reqresp/protocols/index.ts +2 -0
  356. package/src/services/reqresp/protocols/status.ts +117 -5
  357. package/src/services/reqresp/protocols/tx.ts +35 -6
  358. package/src/services/reqresp/rate-limiter/rate_limiter.ts +12 -3
  359. package/src/services/reqresp/rate-limiter/rate_limits.ts +21 -1
  360. package/src/services/reqresp/reqresp.ts +387 -256
  361. package/src/services/reqresp/status.ts +12 -3
  362. package/src/services/service.ts +45 -21
  363. package/src/services/tx_collection/config.ts +84 -0
  364. package/src/services/tx_collection/fast_tx_collection.ts +340 -0
  365. package/src/services/tx_collection/index.ts +2 -0
  366. package/src/services/tx_collection/instrumentation.ts +43 -0
  367. package/src/services/tx_collection/slow_tx_collection.ts +233 -0
  368. package/src/services/tx_collection/tx_collection.ts +215 -0
  369. package/src/services/tx_collection/tx_collection_sink.ts +129 -0
  370. package/src/services/tx_collection/tx_source.ts +37 -0
  371. package/src/services/tx_provider.ts +216 -0
  372. package/src/services/tx_provider_instrumentation.ts +44 -0
  373. package/src/test-helpers/index.ts +1 -0
  374. package/src/test-helpers/make-enrs.ts +4 -5
  375. package/src/test-helpers/make-test-p2p-clients.ts +111 -21
  376. package/src/test-helpers/mock-pubsub.ts +188 -0
  377. package/src/test-helpers/mock-tx-helpers.ts +24 -0
  378. package/src/test-helpers/reqresp-nodes.ts +86 -35
  379. package/src/testbench/p2p_client_testbench_worker.ts +151 -25
  380. package/src/testbench/parse_log_file.ts +4 -4
  381. package/src/testbench/testbench.ts +4 -4
  382. package/src/testbench/worker_client_manager.ts +17 -23
  383. package/src/types/index.ts +2 -0
  384. package/src/util.ts +105 -91
  385. package/src/versioning.ts +11 -4
@@ -1,17 +1,39 @@
1
+ import type { EthAddress } from '@aztec/foundation/eth-address';
1
2
  import type { PeerInfo } from '@aztec/stdlib/interfaces/server';
2
- import type { BlockAttestation, BlockProposal, Gossipable } from '@aztec/stdlib/p2p';
3
- import { TxHash } from '@aztec/stdlib/tx';
3
+ import type { Gossipable, PeerErrorSeverity } from '@aztec/stdlib/p2p';
4
+ import { Tx, TxHash } from '@aztec/stdlib/tx';
4
5
 
5
6
  import type { PeerId } from '@libp2p/interface';
7
+ import type { ENR } from '@nethermindeth/enr';
6
8
  import EventEmitter from 'events';
7
9
 
8
- import type { ReqRespSubProtocol, SubProtocolMap } from './reqresp/interface.js';
9
- import { type P2PService, type PeerDiscoveryService, PeerDiscoveryState } from './service.js';
10
+ import type { PeerManagerInterface } from './peer-manager/interface.js';
11
+ import type { P2PReqRespConfig } from './reqresp/config.js';
12
+ import { type AuthRequest, StatusMessage } from './reqresp/index.js';
13
+ import type {
14
+ ReqRespInterface,
15
+ ReqRespResponse,
16
+ ReqRespSubProtocol,
17
+ ReqRespSubProtocolHandler,
18
+ ReqRespSubProtocolHandlers,
19
+ ReqRespSubProtocolValidators,
20
+ SubProtocolMap,
21
+ } from './reqresp/interface.js';
22
+ import type { GoodByeReason } from './reqresp/protocols/goodbye.js';
23
+ import { ReqRespStatus } from './reqresp/status.js';
24
+ import {
25
+ type P2PBlockReceivedCallback,
26
+ type P2PService,
27
+ type PeerDiscoveryService,
28
+ PeerDiscoveryState,
29
+ } from './service.js';
10
30
 
11
31
  /**
12
32
  * A dummy implementation of the P2P Service.
13
33
  */
14
34
  export class DummyP2PService implements P2PService {
35
+ updateConfig(_config: Partial<P2PReqRespConfig>): void {}
36
+
15
37
  /** Returns an empty array for peers. */
16
38
  getPeers(): PeerInfo[] {
17
39
  return [];
@@ -37,7 +59,9 @@ export class DummyP2PService implements P2PService {
37
59
  * Called to have the given message propagated through the P2P network.
38
60
  * @param _ - The message to be propagated.
39
61
  */
40
- public propagate<T extends Gossipable>(_: T) {}
62
+ public propagate<T extends Gossipable>(_: T) {
63
+ return Promise.resolve();
64
+ }
41
65
 
42
66
  /**
43
67
  * Called upon receipt of settled transactions.
@@ -48,7 +72,7 @@ export class DummyP2PService implements P2PService {
48
72
  /**
49
73
  * Register a callback into the validator client for when a block proposal is received
50
74
  */
51
- public registerBlockReceivedCallback(_: (block: BlockProposal) => Promise<BlockAttestation>) {}
75
+ public registerBlockReceivedCallback(_callback: P2PBlockReceivedCallback) {}
52
76
 
53
77
  /**
54
78
  * Sends a request to a peer.
@@ -83,6 +107,25 @@ export class DummyP2PService implements P2PService {
83
107
  public getEnr(): undefined {
84
108
  return undefined;
85
109
  }
110
+
111
+ validate(_txs: Tx[]): Promise<void> {
112
+ return Promise.resolve();
113
+ }
114
+
115
+ addReqRespSubProtocol(
116
+ _subProtocol: ReqRespSubProtocol,
117
+ _handler: ReqRespSubProtocolHandler,
118
+ _validator?: ReqRespSubProtocolValidators[ReqRespSubProtocol],
119
+ ): Promise<void> {
120
+ return Promise.resolve();
121
+ }
122
+
123
+ handleAuthRequestFromPeer(_authRequest: AuthRequest, _peerId: PeerId): Promise<StatusMessage> {
124
+ return Promise.resolve(StatusMessage.random());
125
+ }
126
+
127
+ //this is no-op
128
+ registerThisValidatorAddresses(_address: EthAddress[]): void {}
86
129
  }
87
130
 
88
131
  /**
@@ -90,7 +133,7 @@ export class DummyP2PService implements P2PService {
90
133
  */
91
134
  export class DummyPeerDiscoveryService extends EventEmitter implements PeerDiscoveryService {
92
135
  private currentState = PeerDiscoveryState.STOPPED;
93
- public bootstrapNodes: string[] = [];
136
+ public bootstrapNodeEnrs: ENR[] = [];
94
137
 
95
138
  /**
96
139
  * Starts the dummy implementation.
@@ -110,9 +153,9 @@ export class DummyPeerDiscoveryService extends EventEmitter implements PeerDisco
110
153
  }
111
154
  /**
112
155
  * Called to discover peers in the network.
113
- * @returns An array of discovered peer addresses.
156
+ * @returns An array of Enrs.
114
157
  */
115
- public getAllPeers() {
158
+ public getKadValues() {
116
159
  return [];
117
160
  }
118
161
 
@@ -132,3 +175,98 @@ export class DummyPeerDiscoveryService extends EventEmitter implements PeerDisco
132
175
  return undefined;
133
176
  }
134
177
  }
178
+
179
+ export class DummyPeerManager implements PeerManagerInterface {
180
+ constructor(
181
+ public peerId: PeerId,
182
+ private peersProvider?: { getPeers: () => PeerId[] },
183
+ ) {}
184
+
185
+ public getPeers(_includePending?: boolean): PeerInfo[] {
186
+ if (!this.peersProvider) {
187
+ return [];
188
+ }
189
+ return this.peersProvider
190
+ .getPeers()
191
+ .filter(peer => !peer.equals(this.peerId))
192
+ .map(id => ({
193
+ id: id.toString(),
194
+ status: 'connected',
195
+ score: 0,
196
+ }));
197
+ }
198
+
199
+ public initializePeers(): Promise<void> {
200
+ return Promise.resolve();
201
+ }
202
+ public getPeerScore(_peerId: string): number {
203
+ return 0;
204
+ }
205
+
206
+ public shouldDisableP2PGossip(_peerId: string): boolean {
207
+ return false;
208
+ }
209
+
210
+ public stop(): Promise<void> {
211
+ return Promise.resolve();
212
+ }
213
+ public heartbeat(): Promise<void> {
214
+ return Promise.resolve();
215
+ }
216
+ public addTrustedPeer(_peerId: PeerId): void {}
217
+ public addPrivatePeer(_peerId: PeerId): void {}
218
+ public goodbyeReceived(_peerId: PeerId, _reason: GoodByeReason): void {}
219
+ public penalizePeer(_peerId: PeerId, _penalty: PeerErrorSeverity): void {}
220
+ public addPreferredPeer(_peerId: PeerId): void {}
221
+ public handleAuthRequestFromPeer(_authRequest: AuthRequest, _peerId: PeerId): Promise<StatusMessage> {
222
+ return Promise.resolve(StatusMessage.random());
223
+ }
224
+
225
+ //this is no-op
226
+ registerThisValidatorAddresses(_address: EthAddress[]): void {}
227
+ }
228
+
229
+ export class DummyReqResp implements ReqRespInterface {
230
+ updateConfig(_config: Partial<P2PReqRespConfig>): void {}
231
+ start(
232
+ _subProtocolHandlers: ReqRespSubProtocolHandlers,
233
+ _subProtocolValidators: ReqRespSubProtocolValidators,
234
+ ): Promise<void> {
235
+ return Promise.resolve();
236
+ }
237
+ stop(): Promise<void> {
238
+ return Promise.resolve();
239
+ }
240
+ sendRequest<SubProtocol extends ReqRespSubProtocol>(
241
+ _subProtocol: SubProtocol,
242
+ _request: InstanceType<SubProtocolMap[SubProtocol]['request']>,
243
+ ): Promise<InstanceType<SubProtocolMap[SubProtocol]['response']> | undefined> {
244
+ return Promise.resolve(undefined);
245
+ }
246
+ sendBatchRequest<SubProtocol extends ReqRespSubProtocol>(
247
+ _subProtocol: SubProtocol,
248
+ _requests: InstanceType<SubProtocolMap[SubProtocol]['request']>[],
249
+ _pinnedPeer: PeerId | undefined,
250
+ _timeoutMs?: number,
251
+ _maxPeers?: number,
252
+ _maxRetryAttempts?: number,
253
+ ): Promise<InstanceType<SubProtocolMap[SubProtocol]['response']>[]> {
254
+ return Promise.resolve([]);
255
+ }
256
+ public sendRequestToPeer(
257
+ _peerId: PeerId,
258
+ _subProtocol: ReqRespSubProtocol,
259
+ _payload: Buffer,
260
+ _dialTimeout?: number,
261
+ ): Promise<ReqRespResponse> {
262
+ return Promise.resolve({ status: ReqRespStatus.SUCCESS, data: Buffer.from([]) });
263
+ }
264
+
265
+ addSubProtocol(
266
+ _subProtocol: ReqRespSubProtocol,
267
+ _handler: ReqRespSubProtocolHandler,
268
+ _validator?: ReqRespSubProtocolValidators[ReqRespSubProtocol],
269
+ ): Promise<void> {
270
+ return Promise.resolve();
271
+ }
272
+ }
@@ -1,5 +1,7 @@
1
1
  // Taken from lodestar: https://github.com/ChainSafe/lodestar
2
2
  import { sha256 } from '@aztec/foundation/crypto';
3
+ import { createLogger } from '@aztec/foundation/log';
4
+ import { TopicType, getTopicFromString } from '@aztec/stdlib/p2p';
3
5
 
4
6
  import type { RPC } from '@chainsafe/libp2p-gossipsub/message';
5
7
  import type { DataTransform } from '@chainsafe/libp2p-gossipsub/types';
@@ -49,31 +51,104 @@ export function getMsgIdFn(message: Message) {
49
51
  return sha256(Buffer.concat(vec)).subarray(0, 20);
50
52
  }
51
53
 
54
+ const DefaultMaxSizesKb: Record<TopicType, number> = {
55
+ // Tx effects should not exceed 128kb, so 512kb for the full tx obj should be sufficient
56
+ [TopicType.tx]: 512,
57
+ // An attestation has roughly 30 fields, which is 1kb, so 5x is plenty
58
+ [TopicType.block_attestation]: 5,
59
+ // Proposals may carry some tx objects, so we allow a larger size capped at 10mb
60
+ // Note this may not be enough for carrying all tx objects in a block
61
+ [TopicType.block_proposal]: 1024 * 10,
62
+ };
63
+
52
64
  /**
53
65
  * Snappy transform for libp2p gossipsub
54
66
  */
55
67
  export class SnappyTransform implements DataTransform {
68
+ constructor(
69
+ private maxSizesKb: Record<TopicType, number> = DefaultMaxSizesKb,
70
+ private defaultMaxSizeKb: number = 10 * 1024,
71
+ private logger = createLogger('p2p:snappy-transform'),
72
+ ) {}
73
+
56
74
  // Topic string included to satisfy DataTransform interface
57
- inboundTransform(_topicStr: string, data: Uint8Array): Uint8Array {
58
- return this.inboundTransformNoTopic(Buffer.from(data));
75
+ inboundTransform(topicStr: string, data: Uint8Array): Uint8Array {
76
+ const topic = getTopicFromString(topicStr);
77
+ return this.inboundTransformData(Buffer.from(data), topic);
59
78
  }
60
79
 
61
- public inboundTransformNoTopic(data: Buffer): Buffer {
80
+ public inboundTransformData(data: Buffer, topic?: TopicType): Buffer {
62
81
  if (data.length === 0) {
63
82
  return data;
64
83
  }
84
+ const maxSizeKb = this.maxSizesKb[topic!] ?? this.defaultMaxSizeKb;
85
+ const { decompressedSize } = readSnappyPreamble(data);
86
+ if (decompressedSize > maxSizeKb * 1024) {
87
+ this.logger.warn(`Decompressed size ${decompressedSize} exceeds maximum allowed size of ${maxSizeKb}kb`);
88
+ throw new Error(`Decompressed size ${decompressedSize} exceeds maximum allowed size of ${maxSizeKb}kb`);
89
+ }
90
+
65
91
  return Buffer.from(uncompressSync(data, { asBuffer: true }));
66
92
  }
67
93
 
68
94
  // Topic string included to satisfy DataTransform interface
69
95
  outboundTransform(_topicStr: string, data: Uint8Array): Uint8Array {
70
- return this.outboundTransformNoTopic(Buffer.from(data));
96
+ return this.outboundTransformData(Buffer.from(data));
71
97
  }
72
98
 
73
- public outboundTransformNoTopic(data: Buffer): Buffer {
99
+ public outboundTransformData(data: Buffer): Buffer {
74
100
  if (data.length === 0) {
75
101
  return data;
76
102
  }
77
103
  return Buffer.from(compressSync(data));
78
104
  }
79
105
  }
106
+
107
+ /**
108
+ * Reads the Snappy preamble from compressed data and returns the expected decompressed size.
109
+ *
110
+ * The Snappy format starts with a little-endian varint encoding the uncompressed length.
111
+ * Varints consist of a series of bytes where:
112
+ * - Lower 7 bits contain data
113
+ * - Upper bit (0x80) is set if more bytes follow
114
+ *
115
+ * @param data - The compressed data starting with the Snappy preamble
116
+ * @returns Object containing the decompressed size and the number of bytes read from the preamble
117
+ * @throws Error if the data is too short or the varint is invalid
118
+ */
119
+ export function readSnappyPreamble(data: Uint8Array): { decompressedSize: number; bytesRead: number } {
120
+ if (data.length === 0) {
121
+ throw new Error('Cannot read preamble from empty data');
122
+ }
123
+
124
+ let result = 0;
125
+ let shift = 0;
126
+ let bytesRead = 0;
127
+
128
+ // Maximum varint length for 32-bit value is 5 bytes
129
+ // (7 bits per byte, so 5 bytes = 35 bits, enough for 2^32 - 1)
130
+ const maxBytes = 5;
131
+
132
+ for (let i = 0; i < Math.min(data.length, maxBytes); i++) {
133
+ const byte = data[i];
134
+ bytesRead++;
135
+
136
+ // Extract lower 7 bits and add to result with appropriate shift
137
+ // Use >>> 0 to convert to unsigned 32-bit integer to avoid sign issues
138
+ result = (result | ((byte & 0x7f) << shift)) >>> 0;
139
+
140
+ // If upper bit is not set, we're done
141
+ if ((byte & 0x80) === 0) {
142
+ return { decompressedSize: result, bytesRead };
143
+ }
144
+
145
+ shift += 7;
146
+ }
147
+
148
+ // If we get here, either we ran out of data or the varint is too long
149
+ if (bytesRead >= maxBytes) {
150
+ throw new Error('Varint is too long (max 5 bytes for 32-bit value)');
151
+ }
152
+
153
+ throw new Error('Incomplete varint: data ended before varint termination');
154
+ }
@@ -1,2 +1,6 @@
1
1
  export * from './service.js';
2
2
  export * from './libp2p/libp2p_service.js';
3
+ export * from './tx_provider.js';
4
+ export * from './dummy_service.js';
5
+ export * from './reqresp/index.js';
6
+ export * from './tx_collection/index.js';
@@ -0,0 +1,167 @@
1
+ import type { Timer } from '@aztec/foundation/timer';
2
+ import { TopicType } from '@aztec/stdlib/p2p';
3
+ import {
4
+ Attributes,
5
+ type BatchObservableResult,
6
+ type Histogram,
7
+ Metrics,
8
+ type ObservableGauge,
9
+ type TelemetryClient,
10
+ type UpDownCounter,
11
+ ValueType,
12
+ } from '@aztec/telemetry-client';
13
+
14
+ import { type RecordableHistogram, createHistogram } from 'node:perf_hooks';
15
+
16
+ export class P2PInstrumentation {
17
+ private messageValidationDuration: Histogram;
18
+ private messagePrevalidationCount: UpDownCounter;
19
+ private messageLatency: Histogram;
20
+ private txReceivedCount: UpDownCounter;
21
+
22
+ private aggLatencyHisto = new Map<TopicType, RecordableHistogram>();
23
+ private aggValidationHisto = new Map<TopicType, RecordableHistogram>();
24
+
25
+ private aggLatencyMetrics: Record<'min' | 'max' | 'p50' | 'p90' | 'avg', ObservableGauge>;
26
+ private aggValidationMetrics: Record<'min' | 'max' | 'p50' | 'p90' | 'avg', ObservableGauge>;
27
+
28
+ constructor(client: TelemetryClient, name: string) {
29
+ const meter = client.getMeter(name);
30
+
31
+ this.messageValidationDuration = meter.createHistogram(Metrics.P2P_GOSSIP_MESSAGE_VALIDATION_DURATION, {
32
+ unit: 'ms',
33
+ description: 'How long validating a gossiped message takes',
34
+ valueType: ValueType.INT,
35
+ });
36
+
37
+ this.messagePrevalidationCount = meter.createUpDownCounter(Metrics.P2P_GOSSIP_MESSAGE_PREVALIDATION_COUNT, {
38
+ description: 'How many message pass/fail prevalidation',
39
+ valueType: ValueType.INT,
40
+ });
41
+
42
+ this.messageLatency = meter.createHistogram(Metrics.P2P_GOSSIP_MESSAGE_LATENCY, {
43
+ unit: 'ms',
44
+ description: 'P2P message latency',
45
+ valueType: ValueType.INT,
46
+ });
47
+
48
+ this.txReceivedCount = meter.createUpDownCounter(Metrics.P2P_GOSSIP_TX_RECEIVED_COUNT, {
49
+ description: 'The number of txs received from the p2p network',
50
+ });
51
+
52
+ this.aggLatencyMetrics = {
53
+ avg: meter.createObservableGauge(Metrics.P2P_GOSSIP_AGG_MESSAGE_LATENCY_AVG, {
54
+ valueType: ValueType.DOUBLE,
55
+ description: 'AVG msg latency',
56
+ unit: 'ms',
57
+ }),
58
+ max: meter.createObservableGauge(Metrics.P2P_GOSSIP_AGG_MESSAGE_LATENCY_MAX, {
59
+ valueType: ValueType.DOUBLE,
60
+ description: 'MAX msg latency',
61
+ unit: 'ms',
62
+ }),
63
+ min: meter.createObservableGauge(Metrics.P2P_GOSSIP_AGG_MESSAGE_LATENCY_MIN, {
64
+ valueType: ValueType.DOUBLE,
65
+ description: 'MIN msg latency',
66
+ unit: 'ms',
67
+ }),
68
+ p50: meter.createObservableGauge(Metrics.P2P_GOSSIP_AGG_MESSAGE_LATENCY_P50, {
69
+ valueType: ValueType.DOUBLE,
70
+ description: 'P50 msg latency',
71
+ unit: 'ms',
72
+ }),
73
+ p90: meter.createObservableGauge(Metrics.P2P_GOSSIP_AGG_MESSAGE_LATENCY_P90, {
74
+ valueType: ValueType.DOUBLE,
75
+ description: 'P90 msg latency',
76
+ unit: 'ms',
77
+ }),
78
+ };
79
+
80
+ this.aggValidationMetrics = {
81
+ avg: meter.createObservableGauge(Metrics.P2P_GOSSIP_AGG_MESSAGE_VALIDATION_DURATION_AVG, {
82
+ valueType: ValueType.DOUBLE,
83
+ description: 'AVG msg validation',
84
+ unit: 'ms',
85
+ }),
86
+ max: meter.createObservableGauge(Metrics.P2P_GOSSIP_AGG_MESSAGE_VALIDATION_DURATION_MAX, {
87
+ valueType: ValueType.DOUBLE,
88
+ description: 'MAX msg validation',
89
+ unit: 'ms',
90
+ }),
91
+ min: meter.createObservableGauge(Metrics.P2P_GOSSIP_AGG_MESSAGE_VALIDATION_DURATION_MIN, {
92
+ valueType: ValueType.DOUBLE,
93
+ description: 'MIN msg validation',
94
+ unit: 'ms',
95
+ }),
96
+ p50: meter.createObservableGauge(Metrics.P2P_GOSSIP_AGG_MESSAGE_VALIDATION_DURATION_P50, {
97
+ valueType: ValueType.DOUBLE,
98
+ description: 'P50 msg validation',
99
+ unit: 'ms',
100
+ }),
101
+ p90: meter.createObservableGauge(Metrics.P2P_GOSSIP_AGG_MESSAGE_VALIDATION_DURATION_P90, {
102
+ valueType: ValueType.DOUBLE,
103
+ description: 'P90 msg validation',
104
+ unit: 'ms',
105
+ }),
106
+ };
107
+
108
+ meter.addBatchObservableCallback(this.aggregate, [
109
+ ...Object.values(this.aggValidationMetrics),
110
+ ...Object.values(this.aggLatencyMetrics),
111
+ ]);
112
+ }
113
+
114
+ public recordMessageValidation(topicName: TopicType, timerOrMs: Timer | number) {
115
+ const ms = Math.ceil(typeof timerOrMs === 'number' ? timerOrMs : timerOrMs.ms());
116
+ this.messageValidationDuration.record(ms, { [Attributes.TOPIC_NAME]: topicName });
117
+
118
+ let validationHistogram = this.aggValidationHisto.get(topicName);
119
+ if (!validationHistogram) {
120
+ validationHistogram = createHistogram({ min: 1, max: 5 * 60 * 1000 }); // 5 mins
121
+ this.aggValidationHisto.set(topicName, validationHistogram);
122
+ }
123
+
124
+ validationHistogram.record(Math.max(ms, 1));
125
+ }
126
+
127
+ public incrementTxReceived(count: number) {
128
+ this.txReceivedCount.add(count);
129
+ }
130
+
131
+ public incMessagePrevalidationStatus(passed: boolean, topicName: TopicType | undefined) {
132
+ this.messagePrevalidationCount.add(1, { [Attributes.TOPIC_NAME]: topicName, [Attributes.OK]: passed });
133
+ }
134
+
135
+ public recordMessageLatency(topicName: TopicType, timerOrMs: Timer | number) {
136
+ const ms = Math.ceil(typeof timerOrMs === 'number' ? timerOrMs : timerOrMs.ms());
137
+ this.messageLatency.record(ms, { [Attributes.TOPIC_NAME]: topicName });
138
+
139
+ let latencyHistogram = this.aggLatencyHisto.get(topicName);
140
+ if (!latencyHistogram) {
141
+ latencyHistogram = createHistogram({ min: 1, max: 60 * 1000 }); // Max: 1 minute
142
+ this.aggLatencyHisto.set(topicName, latencyHistogram);
143
+ }
144
+
145
+ latencyHistogram.record(Math.max(ms, 1));
146
+ }
147
+
148
+ private aggregate = (res: BatchObservableResult) => {
149
+ for (const [metrics, histograms] of [
150
+ [this.aggLatencyMetrics, this.aggLatencyHisto],
151
+ [this.aggValidationMetrics, this.aggValidationHisto],
152
+ ] as const) {
153
+ for (const topicName of Object.values(TopicType)) {
154
+ const histogram = histograms.get(topicName);
155
+ if (!histogram || histogram.count === 0) {
156
+ continue;
157
+ }
158
+
159
+ res.observe(metrics.avg, histogram.mean, { [Attributes.TOPIC_NAME]: topicName });
160
+ res.observe(metrics.max, histogram.max, { [Attributes.TOPIC_NAME]: topicName });
161
+ res.observe(metrics.min, histogram.min, { [Attributes.TOPIC_NAME]: topicName });
162
+ res.observe(metrics.p50, histogram.percentile(50), { [Attributes.TOPIC_NAME]: topicName });
163
+ res.observe(metrics.p90, histogram.percentile(90), { [Attributes.TOPIC_NAME]: topicName });
164
+ }
165
+ }
166
+ };
167
+ }