@aztec/p2p 0.0.1-commit.d3ec352c → 0.0.1-commit.e6bd8901

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 (274) hide show
  1. package/dest/client/factory.d.ts +2 -2
  2. package/dest/client/factory.d.ts.map +1 -1
  3. package/dest/client/factory.js +2 -3
  4. package/dest/client/interface.d.ts +18 -5
  5. package/dest/client/interface.d.ts.map +1 -1
  6. package/dest/client/p2p_client.d.ts +11 -14
  7. package/dest/client/p2p_client.d.ts.map +1 -1
  8. package/dest/client/p2p_client.js +456 -124
  9. package/dest/config.d.ts +4 -7
  10. package/dest/config.d.ts.map +1 -1
  11. package/dest/config.js +10 -13
  12. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +61 -42
  13. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  14. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +1 -1
  15. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
  16. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +239 -265
  17. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +21 -18
  18. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +1 -1
  19. package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +114 -109
  20. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +17 -16
  21. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +1 -1
  22. package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +89 -128
  23. package/dest/mem_pools/attestation_pool/mocks.d.ts +11 -8
  24. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  25. package/dest/mem_pools/attestation_pool/mocks.js +17 -13
  26. package/dest/mem_pools/instrumentation.d.ts +7 -1
  27. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  28. package/dest/mem_pools/instrumentation.js +30 -12
  29. package/dest/mem_pools/interface.d.ts +3 -4
  30. package/dest/mem_pools/interface.d.ts.map +1 -1
  31. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +35 -26
  32. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +1 -1
  33. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +314 -335
  34. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +32 -0
  35. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +1 -0
  36. package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +112 -0
  37. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +157 -0
  38. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +1 -0
  39. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +52 -0
  40. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +16 -0
  41. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -0
  42. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +122 -0
  43. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +17 -0
  44. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -0
  45. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +84 -0
  46. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +19 -0
  47. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -0
  48. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +78 -0
  49. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +26 -0
  50. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +1 -0
  51. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +84 -0
  52. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +25 -0
  53. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +1 -0
  54. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +57 -0
  55. package/dest/mem_pools/tx_pool/index.d.ts +1 -2
  56. package/dest/mem_pools/tx_pool/index.d.ts.map +1 -1
  57. package/dest/mem_pools/tx_pool/index.js +0 -1
  58. package/dest/mem_pools/tx_pool/priority.d.ts +5 -1
  59. package/dest/mem_pools/tx_pool/priority.d.ts.map +1 -1
  60. package/dest/mem_pools/tx_pool/priority.js +6 -1
  61. package/dest/mem_pools/tx_pool/tx_pool.d.ts +8 -4
  62. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +1 -1
  63. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +1 -1
  64. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +1 -1
  65. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +25 -20
  66. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +4 -4
  67. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  68. package/dest/msg_validators/attestation_validator/attestation_validator.js +52 -19
  69. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +5 -5
  70. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
  71. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +18 -14
  72. package/dest/msg_validators/clock_tolerance.d.ts +21 -0
  73. package/dest/msg_validators/clock_tolerance.d.ts.map +1 -0
  74. package/dest/msg_validators/clock_tolerance.js +37 -0
  75. package/dest/msg_validators/index.d.ts +2 -2
  76. package/dest/msg_validators/index.d.ts.map +1 -1
  77. package/dest/msg_validators/index.js +1 -1
  78. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +9 -0
  79. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -0
  80. package/dest/msg_validators/proposal_validator/block_proposal_validator.js +6 -0
  81. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +9 -0
  82. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -0
  83. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +6 -0
  84. package/dest/msg_validators/proposal_validator/index.d.ts +4 -0
  85. package/dest/msg_validators/proposal_validator/index.d.ts.map +1 -0
  86. package/dest/msg_validators/proposal_validator/index.js +3 -0
  87. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +13 -0
  88. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -0
  89. package/dest/msg_validators/proposal_validator/proposal_validator.js +104 -0
  90. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +23 -0
  91. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +1 -0
  92. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +212 -0
  93. package/dest/msg_validators/tx_validator/archive_cache.d.ts +2 -2
  94. package/dest/msg_validators/tx_validator/archive_cache.d.ts.map +1 -1
  95. package/dest/msg_validators/tx_validator/block_header_validator.d.ts +2 -2
  96. package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
  97. package/dest/msg_validators/tx_validator/data_validator.d.ts +1 -1
  98. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  99. package/dest/msg_validators/tx_validator/factory.d.ts +2 -2
  100. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  101. package/dest/msg_validators/tx_validator/factory.js +1 -1
  102. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +10 -0
  103. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -0
  104. package/dest/msg_validators/tx_validator/fee_payer_balance.js +20 -0
  105. package/dest/msg_validators/tx_validator/gas_validator.d.ts +1 -1
  106. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  107. package/dest/msg_validators/tx_validator/gas_validator.js +8 -14
  108. package/dest/msg_validators/tx_validator/index.d.ts +2 -1
  109. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  110. package/dest/msg_validators/tx_validator/index.js +1 -0
  111. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +2 -2
  112. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  113. package/dest/msg_validators/tx_validator/size_validator.d.ts +6 -0
  114. package/dest/msg_validators/tx_validator/size_validator.d.ts.map +1 -0
  115. package/dest/msg_validators/tx_validator/size_validator.js +20 -0
  116. package/dest/msg_validators/tx_validator/test_utils.d.ts +2 -2
  117. package/dest/msg_validators/tx_validator/test_utils.d.ts.map +1 -1
  118. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +1 -1
  119. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
  120. package/dest/services/dummy_service.d.ts +6 -2
  121. package/dest/services/dummy_service.d.ts.map +1 -1
  122. package/dest/services/dummy_service.js +3 -0
  123. package/dest/services/encoding.d.ts +1 -1
  124. package/dest/services/encoding.d.ts.map +1 -1
  125. package/dest/services/encoding.js +7 -6
  126. package/dest/services/libp2p/instrumentation.d.ts +1 -1
  127. package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
  128. package/dest/services/libp2p/instrumentation.js +20 -73
  129. package/dest/services/libp2p/libp2p_service.d.ts +31 -14
  130. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  131. package/dest/services/libp2p/libp2p_service.js +718 -164
  132. package/dest/services/peer-manager/metrics.d.ts +6 -1
  133. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  134. package/dest/services/peer-manager/metrics.js +18 -21
  135. package/dest/services/peer-manager/peer_manager.d.ts +2 -2
  136. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  137. package/dest/services/peer-manager/peer_manager.js +4 -12
  138. package/dest/services/peer-manager/peer_scoring.d.ts +1 -1
  139. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  140. package/dest/services/peer-manager/peer_scoring.js +2 -5
  141. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +1 -1
  142. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -1
  143. package/dest/services/reqresp/constants.d.ts +12 -0
  144. package/dest/services/reqresp/constants.d.ts.map +1 -0
  145. package/dest/services/reqresp/constants.js +7 -0
  146. package/dest/services/reqresp/interface.d.ts +2 -2
  147. package/dest/services/reqresp/interface.d.ts.map +1 -1
  148. package/dest/services/reqresp/interface.js +1 -1
  149. package/dest/services/reqresp/metrics.d.ts +1 -1
  150. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  151. package/dest/services/reqresp/metrics.js +5 -21
  152. package/dest/services/reqresp/protocols/auth.d.ts +2 -2
  153. package/dest/services/reqresp/protocols/auth.d.ts.map +1 -1
  154. package/dest/services/reqresp/protocols/auth.js +2 -2
  155. package/dest/services/reqresp/protocols/block.js +1 -1
  156. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +1 -1
  157. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -1
  158. package/dest/services/reqresp/protocols/block_txs/bitvector.js +7 -0
  159. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +2 -2
  160. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
  161. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +1 -1
  162. package/dest/services/reqresp/protocols/status.d.ts +1 -1
  163. package/dest/services/reqresp/protocols/status.d.ts.map +1 -1
  164. package/dest/services/reqresp/protocols/status.js +4 -1
  165. package/dest/services/reqresp/protocols/tx.d.ts +2 -3
  166. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  167. package/dest/services/reqresp/reqresp.js +402 -24
  168. package/dest/services/service.d.ts +16 -3
  169. package/dest/services/service.d.ts.map +1 -1
  170. package/dest/services/tx_collection/config.js +1 -1
  171. package/dest/services/tx_collection/instrumentation.d.ts +1 -1
  172. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
  173. package/dest/services/tx_collection/instrumentation.js +4 -14
  174. package/dest/services/tx_collection/tx_collection.d.ts +3 -3
  175. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  176. package/dest/services/tx_collection/tx_collection.js +1 -1
  177. package/dest/services/tx_provider.d.ts +4 -3
  178. package/dest/services/tx_provider.d.ts.map +1 -1
  179. package/dest/services/tx_provider.js +11 -2
  180. package/dest/services/tx_provider_instrumentation.d.ts +5 -2
  181. package/dest/services/tx_provider_instrumentation.d.ts.map +1 -1
  182. package/dest/services/tx_provider_instrumentation.js +13 -13
  183. package/dest/test-helpers/mock-tx-helpers.js +1 -1
  184. package/dest/test-helpers/reqresp-nodes.d.ts +2 -2
  185. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  186. package/dest/testbench/p2p_client_testbench_worker.js +31 -17
  187. package/dest/testbench/worker_client_manager.d.ts +1 -1
  188. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  189. package/dest/testbench/worker_client_manager.js +6 -1
  190. package/package.json +16 -16
  191. package/src/client/factory.ts +5 -10
  192. package/src/client/interface.ts +19 -4
  193. package/src/client/p2p_client.ts +89 -144
  194. package/src/config.ts +12 -18
  195. package/src/mem_pools/attestation_pool/attestation_pool.ts +68 -41
  196. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +241 -289
  197. package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +163 -141
  198. package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +141 -164
  199. package/src/mem_pools/attestation_pool/mocks.ts +21 -15
  200. package/src/mem_pools/instrumentation.ts +38 -14
  201. package/src/mem_pools/interface.ts +2 -4
  202. package/src/mem_pools/tx_pool/README.md +270 -0
  203. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +362 -367
  204. package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +132 -0
  205. package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +208 -0
  206. package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +162 -0
  207. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +104 -0
  208. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +93 -0
  209. package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +106 -0
  210. package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +75 -0
  211. package/src/mem_pools/tx_pool/index.ts +0 -1
  212. package/src/mem_pools/tx_pool/priority.ts +8 -1
  213. package/src/mem_pools/tx_pool/tx_pool.ts +8 -3
  214. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +18 -13
  215. package/src/msg_validators/attestation_validator/attestation_validator.ts +37 -22
  216. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +13 -16
  217. package/src/msg_validators/clock_tolerance.ts +51 -0
  218. package/src/msg_validators/index.ts +1 -1
  219. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +10 -0
  220. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +13 -0
  221. package/src/msg_validators/proposal_validator/index.ts +3 -0
  222. package/src/msg_validators/proposal_validator/proposal_validator.ts +92 -0
  223. package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +230 -0
  224. package/src/msg_validators/tx_validator/archive_cache.ts +1 -1
  225. package/src/msg_validators/tx_validator/block_header_validator.ts +1 -1
  226. package/src/msg_validators/tx_validator/data_validator.ts +12 -4
  227. package/src/msg_validators/tx_validator/factory.ts +1 -1
  228. package/src/msg_validators/tx_validator/fee_payer_balance.ts +40 -0
  229. package/src/msg_validators/tx_validator/gas_validator.ts +8 -25
  230. package/src/msg_validators/tx_validator/index.ts +1 -0
  231. package/src/msg_validators/tx_validator/metadata_validator.ts +13 -5
  232. package/src/msg_validators/tx_validator/size_validator.ts +18 -0
  233. package/src/msg_validators/tx_validator/test_utils.ts +1 -1
  234. package/src/msg_validators/tx_validator/timestamp_validator.ts +3 -1
  235. package/src/services/dummy_service.ts +6 -0
  236. package/src/services/encoding.ts +6 -5
  237. package/src/services/libp2p/instrumentation.ts +19 -73
  238. package/src/services/libp2p/libp2p_service.ts +361 -130
  239. package/src/services/peer-manager/metrics.ts +22 -21
  240. package/src/services/peer-manager/peer_manager.ts +5 -4
  241. package/src/services/peer-manager/peer_scoring.ts +1 -5
  242. package/src/services/reqresp/connection-sampler/connection_sampler.ts +3 -1
  243. package/src/services/reqresp/constants.ts +14 -0
  244. package/src/services/reqresp/interface.ts +1 -1
  245. package/src/services/reqresp/metrics.ts +7 -23
  246. package/src/services/reqresp/protocols/auth.ts +2 -2
  247. package/src/services/reqresp/protocols/block.ts +1 -1
  248. package/src/services/reqresp/protocols/block_txs/bitvector.ts +9 -0
  249. package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +1 -1
  250. package/src/services/reqresp/protocols/status.ts +7 -4
  251. package/src/services/reqresp/protocols/tx.ts +1 -2
  252. package/src/services/service.ts +19 -4
  253. package/src/services/tx_collection/config.ts +1 -1
  254. package/src/services/tx_collection/instrumentation.ts +4 -21
  255. package/src/services/tx_collection/tx_collection.ts +3 -3
  256. package/src/services/tx_provider.ts +19 -4
  257. package/src/services/tx_provider_instrumentation.ts +18 -14
  258. package/src/test-helpers/mock-pubsub.ts +1 -1
  259. package/src/test-helpers/mock-tx-helpers.ts +1 -1
  260. package/src/test-helpers/reqresp-nodes.ts +1 -1
  261. package/src/testbench/p2p_client_testbench_worker.ts +42 -22
  262. package/src/testbench/worker_client_manager.ts +6 -1
  263. package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts +0 -81
  264. package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts.map +0 -1
  265. package/dest/mem_pools/tx_pool/memory_tx_pool.js +0 -239
  266. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts +0 -12
  267. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts.map +0 -1
  268. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.js +0 -82
  269. package/dest/msg_validators/block_proposal_validator/index.d.ts +0 -2
  270. package/dest/msg_validators/block_proposal_validator/index.d.ts.map +0 -1
  271. package/dest/msg_validators/block_proposal_validator/index.js +0 -1
  272. package/src/mem_pools/tx_pool/memory_tx_pool.ts +0 -285
  273. package/src/msg_validators/block_proposal_validator/block_proposal_validator.ts +0 -97
  274. package/src/msg_validators/block_proposal_validator/index.ts +0 -1
@@ -1,14 +1,16 @@
1
1
  import {
2
2
  Attributes,
3
3
  type Gauge,
4
+ type Histogram,
4
5
  Metrics,
5
6
  type TelemetryClient,
6
7
  type Tracer,
7
8
  type UpDownCounter,
8
- ValueType,
9
9
  getTelemetryClient,
10
10
  } from '@aztec/telemetry-client';
11
11
 
12
+ import type { PeerId } from '@libp2p/interface';
13
+
12
14
  import { type GoodByeReason, prettyGoodbyeReason } from '../reqresp/protocols/index.js';
13
15
 
14
16
  export class PeerManagerMetrics {
@@ -16,6 +18,9 @@ export class PeerManagerMetrics {
16
18
  private receivedGoodbyes: UpDownCounter;
17
19
  private peerCount: Gauge;
18
20
  private lowScoreDisconnects: UpDownCounter;
21
+ private peerConnectionDuration: Histogram;
22
+
23
+ private peerConnectedAt: Map<string, number> = new Map<string, number>();
19
24
 
20
25
  public readonly tracer: Tracer;
21
26
 
@@ -26,26 +31,11 @@ export class PeerManagerMetrics {
26
31
  this.tracer = telemetryClient.getTracer(name);
27
32
 
28
33
  const meter = telemetryClient.getMeter(name);
29
- this.sentGoodbyes = meter.createUpDownCounter(Metrics.PEER_MANAGER_GOODBYES_SENT, {
30
- description: 'Number of goodbyes sent to peers',
31
- unit: 'peers',
32
- valueType: ValueType.INT,
33
- });
34
- this.receivedGoodbyes = meter.createUpDownCounter(Metrics.PEER_MANAGER_GOODBYES_RECEIVED, {
35
- description: 'Number of goodbyes received from peers',
36
- unit: 'peers',
37
- valueType: ValueType.INT,
38
- });
39
- this.peerCount = meter.createGauge(Metrics.PEER_MANAGER_PEER_COUNT, {
40
- description: 'Number of peers',
41
- unit: 'peers',
42
- valueType: ValueType.INT,
43
- });
44
- this.lowScoreDisconnects = meter.createUpDownCounter(Metrics.PEER_MANAGER_LOW_SCORE_DISCONNECTS, {
45
- description: 'Number of peers disconnected due to low score',
46
- unit: 'peers',
47
- valueType: ValueType.INT,
48
- });
34
+ this.sentGoodbyes = meter.createUpDownCounter(Metrics.PEER_MANAGER_GOODBYES_SENT);
35
+ this.receivedGoodbyes = meter.createUpDownCounter(Metrics.PEER_MANAGER_GOODBYES_RECEIVED);
36
+ this.peerCount = meter.createGauge(Metrics.PEER_MANAGER_PEER_COUNT);
37
+ this.lowScoreDisconnects = meter.createUpDownCounter(Metrics.PEER_MANAGER_LOW_SCORE_DISCONNECTS);
38
+ this.peerConnectionDuration = meter.createHistogram(Metrics.PEER_MANAGER_PEER_CONNECTION_DURATION);
49
39
  }
50
40
 
51
41
  public recordGoodbyeSent(reason: GoodByeReason) {
@@ -63,4 +53,15 @@ export class PeerManagerMetrics {
63
53
  public recordLowScoreDisconnect(scoreState: 'Banned' | 'Disconnect') {
64
54
  this.lowScoreDisconnects.add(1, { [Attributes.P2P_PEER_SCORE_STATE]: scoreState });
65
55
  }
56
+
57
+ public peerConnected(id: PeerId) {
58
+ this.peerConnectedAt.set(id.toString(), Date.now());
59
+ }
60
+
61
+ public peerDisconnected(id: PeerId) {
62
+ const connectedAt = this.peerConnectedAt.get(id.toString());
63
+ if (connectedAt) {
64
+ this.peerConnectionDuration.record(Date.now() - connectedAt);
65
+ }
66
+ }
66
67
  }
@@ -1,13 +1,13 @@
1
1
  import type { EpochCacheInterface } from '@aztec/epoch-cache';
2
- import { makeEthSignDigest, tryRecoverAddress } from '@aztec/foundation/crypto';
2
+ import { makeEthSignDigest, tryRecoverAddress } from '@aztec/foundation/crypto/secp256k1-signer';
3
+ import { Fr } from '@aztec/foundation/curves/bn254';
3
4
  import type { EthAddress } from '@aztec/foundation/eth-address';
4
- import { Fr } from '@aztec/foundation/fields';
5
5
  import { createLogger } from '@aztec/foundation/log';
6
6
  import { bufferToHex } from '@aztec/foundation/string';
7
7
  import { DateProvider } from '@aztec/foundation/timer';
8
8
  import type { PeerInfo, WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
9
9
  import type { PeerErrorSeverity } from '@aztec/stdlib/p2p';
10
- import { type TelemetryClient, trackSpan } from '@aztec/telemetry-client';
10
+ import type { TelemetryClient } from '@aztec/telemetry-client';
11
11
 
12
12
  import type { Connection, PeerId } from '@libp2p/interface';
13
13
  import { peerIdFromString } from '@libp2p/peer-id';
@@ -161,7 +161,6 @@ export class PeerManager implements PeerManagerInterface {
161
161
  return this.metrics.tracer;
162
162
  }
163
163
 
164
- @trackSpan('PeerManager.heartbeat')
165
164
  public async heartbeat() {
166
165
  this.heartbeatCounter++;
167
166
  this.peerScoring.decayAllScores();
@@ -278,6 +277,7 @@ export class PeerManager implements PeerManagerInterface {
278
277
  private handleConnectedPeerEvent(e: CustomEvent<PeerId>) {
279
278
  const peerId = e.detail;
280
279
  this.logger.verbose(`Connected to peer ${peerId.toString()}`);
280
+ this.metrics.peerConnected(peerId);
281
281
  if (this.config.p2pDisableStatusHandshake) {
282
282
  return;
283
283
  }
@@ -303,6 +303,7 @@ export class PeerManager implements PeerManagerInterface {
303
303
  */
304
304
  private handleDisconnectedPeerEvent(e: CustomEvent<PeerId>) {
305
305
  const peerId = e.detail;
306
+ this.metrics.peerDisconnected(peerId);
306
307
  this.logger.verbose(`Disconnected from peer ${peerId.toString()}`);
307
308
  const validatorAddress = this.authenticatedPeerIdToValidatorAddress.get(peerId.toString());
308
309
  if (validatorAddress !== undefined) {
@@ -6,7 +6,6 @@ import {
6
6
  Metrics,
7
7
  type TelemetryClient,
8
8
  type UpDownCounter,
9
- ValueType,
10
9
  getTelemetryClient,
11
10
  } from '@aztec/telemetry-client';
12
11
 
@@ -53,10 +52,7 @@ export class PeerScoring {
53
52
 
54
53
  const meter = telemetry.getMeter('PeerScoring');
55
54
 
56
- this.peerStateCounter = meter.createUpDownCounter(Metrics.P2P_PEER_STATE_COUNT, {
57
- description: 'Count of peers by state (Healthy, Disconnect, Banned)',
58
- valueType: ValueType.INT,
59
- });
55
+ this.peerStateCounter = meter.createUpDownCounter(Metrics.P2P_PEER_STATE_COUNT);
60
56
  }
61
57
 
62
58
  public penalizePeer(peerId: PeerId, penalty: PeerErrorSeverity) {
@@ -261,7 +261,9 @@ export class ConnectionSampler {
261
261
  }
262
262
  } catch (error) {
263
263
  this.logger.error(
264
- `Error cleaning up stale connection to peer ${stream.metadata.peerId?.toString() ?? 'unknown'} stream ${stream.id}`,
264
+ `Error cleaning up stale connection to peer ${stream.metadata.peerId?.toString() ?? 'unknown'} stream ${
265
+ stream.id
266
+ }`,
265
267
  { error },
266
268
  );
267
269
  }
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Constants for P2P message deserialization bounds checking.
3
+ * These constants define maximum allowed sizes during deserialization
4
+ * to prevent DoS attacks via maliciously crafted messages.
5
+ */
6
+
7
+ /** Max transactions per block for deserialization validation (~300x default of 32) */
8
+ export { MAX_TXS_PER_BLOCK } from '@aztec/stdlib/deserialization';
9
+
10
+ /** Max version string length (e.g., "1.0.0-alpha.123") */
11
+ export const MAX_VERSION_STRING_LENGTH = 64;
12
+
13
+ /** Max block hash string length (hex: 0x + 64 chars, with generous headroom) */
14
+ export const MAX_BLOCK_HASH_STRING_LENGTH = 128;
@@ -1,4 +1,4 @@
1
- import { Fr } from '@aztec/foundation/fields';
1
+ import { Fr } from '@aztec/foundation/curves/bn254';
2
2
  import { L2Block } from '@aztec/stdlib/block';
3
3
  import { TxArray, TxHashArray } from '@aztec/stdlib/tx';
4
4
 
@@ -1,5 +1,5 @@
1
1
  // Request response metrics
2
- import { Attributes, Metrics, ValueType } from '@aztec/telemetry-client';
2
+ import { Attributes, Metrics } from '@aztec/telemetry-client';
3
3
  import type { TelemetryClient, Tracer, UpDownCounter } from '@aztec/telemetry-client';
4
4
 
5
5
  export class ReqRespMetrics {
@@ -18,28 +18,12 @@ export class ReqRespMetrics {
18
18
  this.tracer = telemetryClient.getTracer(name);
19
19
 
20
20
  const meter = telemetryClient.getMeter(name);
21
- this.sentRequests = meter.createUpDownCounter(Metrics.P2P_REQ_RESP_SENT_REQUESTS, {
22
- description: 'Number of requests sent to peers',
23
- unit: 'requests',
24
- valueType: ValueType.INT,
25
- });
26
- this.receivedRequests = meter.createUpDownCounter(Metrics.P2P_REQ_RESP_RECEIVED_REQUESTS, {
27
- description: 'Number of requests received from peers',
28
- unit: 'requests',
29
- valueType: ValueType.INT,
30
- });
31
-
32
- this.failedOutboundRequests = meter.createUpDownCounter(Metrics.P2P_REQ_RESP_FAILED_OUTBOUND_REQUESTS, {
33
- description: 'Number of failed outbound requests - nodes not getting valid responses',
34
- unit: 'requests',
35
- valueType: ValueType.INT,
36
- });
37
-
38
- this.failedInboundRequests = meter.createUpDownCounter(Metrics.P2P_REQ_RESP_FAILED_INBOUND_REQUESTS, {
39
- description: 'Number of failed inbound requests - node failing to respond to requests',
40
- unit: 'requests',
41
- valueType: ValueType.INT,
42
- });
21
+ this.sentRequests = meter.createUpDownCounter(Metrics.P2P_REQ_RESP_SENT_REQUESTS);
22
+ this.receivedRequests = meter.createUpDownCounter(Metrics.P2P_REQ_RESP_RECEIVED_REQUESTS);
23
+
24
+ this.failedOutboundRequests = meter.createUpDownCounter(Metrics.P2P_REQ_RESP_FAILED_OUTBOUND_REQUESTS);
25
+
26
+ this.failedInboundRequests = meter.createUpDownCounter(Metrics.P2P_REQ_RESP_FAILED_INBOUND_REQUESTS);
43
27
  }
44
28
 
45
29
  public recordRequestSent(protocol: string) {
@@ -1,7 +1,7 @@
1
1
  import { Buffer32 } from '@aztec/foundation/buffer';
2
- import { keccak256 } from '@aztec/foundation/crypto';
2
+ import { keccak256 } from '@aztec/foundation/crypto/keccak';
3
+ import { Fr } from '@aztec/foundation/curves/bn254';
3
4
  import { Signature } from '@aztec/foundation/eth-signature';
4
- import { Fr } from '@aztec/foundation/fields';
5
5
  import { BufferReader, serializeToBuffer } from '@aztec/foundation/serialize';
6
6
 
7
7
  import { StatusMessage } from './status.js';
@@ -1,5 +1,5 @@
1
1
  import { BlockNumber } from '@aztec/foundation/branded-types';
2
- import { Fr } from '@aztec/foundation/fields';
2
+ import { Fr } from '@aztec/foundation/curves/bn254';
3
3
  import type { L2BlockSource } from '@aztec/stdlib/block';
4
4
 
5
5
  import type { PeerId } from '@libp2p/interface';
@@ -1,5 +1,7 @@
1
1
  import { BufferReader, serializeToBuffer } from '@aztec/foundation/serialize';
2
2
 
3
+ import { MAX_TXS_PER_BLOCK } from '../../constants.js';
4
+
3
5
  /**
4
6
  * BitVector helper class for representing and serializing bit vectors
5
7
  */
@@ -80,6 +82,13 @@ export class BitVector {
80
82
  const reader = BufferReader.asReader(buffer);
81
83
  const length = reader.readNumber();
82
84
 
85
+ if (length < 0) {
86
+ throw new Error(`BitVector length ${length} cannot be negative`);
87
+ }
88
+ if (length > MAX_TXS_PER_BLOCK) {
89
+ throw new Error(`BitVector length ${length} exceeds maximum ${MAX_TXS_PER_BLOCK}`);
90
+ }
91
+
83
92
  const bitBuffer = reader.readBytes(BitVector.byteLength(length));
84
93
  return new BitVector(bitBuffer, length);
85
94
  }
@@ -1,4 +1,4 @@
1
- import { Fr } from '@aztec/foundation/fields';
1
+ import { Fr } from '@aztec/foundation/curves/bn254';
2
2
  import { BufferReader, serializeToBuffer } from '@aztec/foundation/serialize';
3
3
  import { TxArray } from '@aztec/stdlib/tx';
4
4
 
@@ -7,6 +7,8 @@ import type { WorldStateSyncStatus, WorldStateSynchronizer } from '@aztec/stdlib
7
7
 
8
8
  import type { PeerId } from '@libp2p/interface';
9
9
 
10
+ import { MAX_BLOCK_HASH_STRING_LENGTH, MAX_VERSION_STRING_LENGTH } from '../constants.js';
11
+
10
12
  /*
11
13
  * P2P Status Message
12
14
  * It is used to establish Status handshake between to peers
@@ -19,9 +21,10 @@ export class StatusMessage {
19
21
  readonly latestBlockNumber: BlockNumber,
20
22
  readonly latestBlockHash: string,
21
23
  readonly finalizedBlockNumber: BlockNumber,
24
+ ) {
22
25
  //TODO: add finalizedBlockHash
23
26
  //readonly finalizedBlockHash: string,
24
- ) {}
27
+ }
25
28
 
26
29
  /**
27
30
  * Deserializes the StatusMessage object from a Buffer.
@@ -31,12 +34,12 @@ export class StatusMessage {
31
34
  static fromBuffer(buffer: Buffer | BufferReader): StatusMessage {
32
35
  const reader = BufferReader.asReader(buffer);
33
36
  return new StatusMessage(
34
- reader.readString(), // compressedComponentsVersion
37
+ reader.readString(MAX_VERSION_STRING_LENGTH), // compressedComponentsVersion
35
38
  BlockNumber(reader.readNumber()), // latestBlockNumber
36
- reader.readString(), // latestBlockHash
39
+ reader.readString(MAX_BLOCK_HASH_STRING_LENGTH), // latestBlockHash
37
40
  BlockNumber(reader.readNumber()), // finalizedBlockNumber
38
41
  //TODO: add finalizedBlockHash
39
- //reader.readString(), // finalizedBlockHash
42
+ //reader.readString(MAX_BLOCK_HASH_STRING_LENGTH), // finalizedBlockHash
40
43
  );
41
44
  }
42
45
 
@@ -1,5 +1,4 @@
1
1
  import { chunk } from '@aztec/foundation/collection';
2
- import type { P2PClientType } from '@aztec/stdlib/p2p';
3
2
  import { TxArray, TxHash, TxHashArray } from '@aztec/stdlib/tx';
4
3
 
5
4
  import type { PeerId } from '@libp2p/interface';
@@ -16,7 +15,7 @@ import { ReqRespStatus, ReqRespStatusError } from '../status.js';
16
15
  * @param mempools - the mempools
17
16
  * @returns the Tx request handler
18
17
  */
19
- export function reqRespTxHandler<T extends P2PClientType>(mempools: MemPools<T>): ReqRespSubProtocolHandler {
18
+ export function reqRespTxHandler(mempools: MemPools): ReqRespSubProtocolHandler {
20
19
  /**
21
20
  * Handler for tx requests
22
21
  * @param msg - the tx request message
@@ -1,6 +1,6 @@
1
1
  import type { EthAddress } from '@aztec/foundation/eth-address';
2
2
  import type { PeerInfo } from '@aztec/stdlib/interfaces/server';
3
- import type { BlockAttestation, BlockProposal, Gossipable } from '@aztec/stdlib/p2p';
3
+ import type { BlockProposal, CheckpointAttestation, CheckpointProposalCore, Gossipable } from '@aztec/stdlib/p2p';
4
4
  import type { Tx } from '@aztec/stdlib/tx';
5
5
 
6
6
  import type { PeerId } from '@libp2p/interface';
@@ -22,10 +22,23 @@ export enum PeerDiscoveryState {
22
22
  STOPPED = 'stopped',
23
23
  }
24
24
 
25
- export type P2PBlockReceivedCallback = (
26
- block: BlockProposal,
25
+ /**
26
+ * Callback for when a block proposal is received.
27
+ * Validators validate but DO NOT attest to individual blocks - attestations are only for checkpoints.
28
+ * @returns true if the proposal is valid, false otherwise
29
+ */
30
+ export type P2PBlockReceivedCallback = (block: BlockProposal, sender: PeerId) => Promise<boolean>;
31
+
32
+ /**
33
+ * Callback for when a checkpoint proposal is received.
34
+ * The checkpoint proposal is passed as CheckpointProposalCore (without lastBlock) since
35
+ * the lastBlock is extracted and stored separately as a BlockProposal, and the block
36
+ * callback is invoked and awaited before this checkpoint callback.
37
+ */
38
+ export type P2PCheckpointReceivedCallback = (
39
+ checkpoint: CheckpointProposalCore,
27
40
  sender: PeerId,
28
- ) => Promise<BlockAttestation[] | undefined>;
41
+ ) => Promise<CheckpointAttestation[] | undefined>;
29
42
 
30
43
  export type AuthReceivedCallback = (peerId: PeerId, authRequest: AuthRequest) => Promise<AuthResponse | undefined>;
31
44
 
@@ -70,6 +83,8 @@ export interface P2PService {
70
83
  // Leaky abstraction: fix https://github.com/AztecProtocol/aztec-packages/issues/7963
71
84
  registerBlockReceivedCallback(callback: P2PBlockReceivedCallback): void;
72
85
 
86
+ registerCheckpointReceivedCallback(callback: P2PCheckpointReceivedCallback): void;
87
+
73
88
  getEnr(): ENR | undefined;
74
89
 
75
90
  getPeers(includePending?: boolean): PeerInfo[];
@@ -1,5 +1,5 @@
1
1
  import { type ConfigMappingsType, booleanConfigHelper, numberConfigHelper } from '@aztec/foundation/config';
2
- import { MAX_RPC_TXS_LEN } from '@aztec/stdlib/interfaces/server';
2
+ import { MAX_RPC_TXS_LEN } from '@aztec/stdlib/interfaces/api-limit';
3
3
 
4
4
  export type TxCollectionConfig = {
5
5
  /** How long to wait before starting reqresp for fast collection */
@@ -1,11 +1,4 @@
1
- import {
2
- Attributes,
3
- type Histogram,
4
- Metrics,
5
- type TelemetryClient,
6
- type UpDownCounter,
7
- ValueType,
8
- } from '@aztec/telemetry-client';
1
+ import { Attributes, type Histogram, Metrics, type TelemetryClient, type UpDownCounter } from '@aztec/telemetry-client';
9
2
 
10
3
  import type { CollectionMethod } from './tx_collection.js';
11
4
 
@@ -17,21 +10,11 @@ export class TxCollectionInstrumentation {
17
10
  constructor(client: TelemetryClient, name: string) {
18
11
  const meter = client.getMeter(name);
19
12
 
20
- this.txsCollected = meter.createUpDownCounter(Metrics.TX_COLLECTOR_COUNT, {
21
- description: 'The number of txs collected',
22
- });
13
+ this.txsCollected = meter.createUpDownCounter(Metrics.TX_COLLECTOR_COUNT);
23
14
 
24
- this.collectionDurationPerTx = meter.createHistogram(Metrics.TX_COLLECTOR_DURATION_PER_TX, {
25
- unit: 'ms',
26
- description: 'Average duration per tx of an individual tx collection request',
27
- valueType: ValueType.INT,
28
- });
15
+ this.collectionDurationPerTx = meter.createHistogram(Metrics.TX_COLLECTOR_DURATION_PER_TX);
29
16
 
30
- this.collectionDurationPerRequest = meter.createHistogram(Metrics.TX_COLLECTOR_DURATION_PER_REQUEST, {
31
- unit: 'ms',
32
- description: 'Total duration of an individual tx collection request',
33
- valueType: ValueType.INT,
34
- });
17
+ this.collectionDurationPerRequest = meter.createHistogram(Metrics.TX_COLLECTOR_DURATION_PER_REQUEST);
35
18
  }
36
19
 
37
20
  increaseTxsFor(what: CollectionMethod, count: number, duration: number) {
@@ -3,7 +3,7 @@ import { compactArray } from '@aztec/foundation/collection';
3
3
  import { type Logger, createLogger } from '@aztec/foundation/log';
4
4
  import { type PromiseWithResolvers, RunningPromise } from '@aztec/foundation/promise';
5
5
  import { DateProvider } from '@aztec/foundation/timer';
6
- import type { L2Block, L2BlockInfo, L2BlockNew } from '@aztec/stdlib/block';
6
+ import type { L2Block, L2BlockInfo } from '@aztec/stdlib/block';
7
7
  import type { L1RollupConstants } from '@aztec/stdlib/epoch-helpers';
8
8
  import type { BlockProposal } from '@aztec/stdlib/p2p';
9
9
  import { Tx, TxHash } from '@aztec/stdlib/tx';
@@ -25,7 +25,7 @@ export type CollectionMethod = 'fast-req-resp' | 'fast-node-rpc' | 'slow-req-res
25
25
  export type MissingTxInfo = { blockNumber: BlockNumber; deadline: Date; readyForReqResp: boolean };
26
26
 
27
27
  export type FastCollectionRequestInput =
28
- | { type: 'block'; block: L2BlockNew }
28
+ | { type: 'block'; block: L2Block }
29
29
  | { type: 'proposal'; blockProposal: BlockProposal; blockNumber: BlockNumber };
30
30
 
31
31
  export type FastCollectionRequest = FastCollectionRequestInput & {
@@ -166,7 +166,7 @@ export class TxCollection {
166
166
  txHashes: TxHash[] | string[],
167
167
  opts: { deadline: Date; pinnedPeer?: PeerId },
168
168
  ) {
169
- return this.collectFastFor({ type: 'block', block: block.toL2Block() }, txHashes, opts);
169
+ return this.collectFastFor({ type: 'block', block }, txHashes, opts);
170
170
  }
171
171
 
172
172
  /** Collects the set of txs for the given proposal or block as fast as possible */
@@ -2,7 +2,7 @@ import { BlockNumber } from '@aztec/foundation/branded-types';
2
2
  import { compactArray } from '@aztec/foundation/collection';
3
3
  import { type Logger, createLogger } from '@aztec/foundation/log';
4
4
  import { elapsed } from '@aztec/foundation/timer';
5
- import type { L2BlockInfo, L2BlockNew } from '@aztec/stdlib/block';
5
+ import type { L2Block, L2BlockInfo } from '@aztec/stdlib/block';
6
6
  import type { ITxProvider } from '@aztec/stdlib/interfaces/server';
7
7
  import type { BlockProposal } from '@aztec/stdlib/p2p';
8
8
  import { Tx, TxHash } from '@aztec/stdlib/tx';
@@ -68,7 +68,7 @@ export class TxProvider implements ITxProvider {
68
68
  }
69
69
 
70
70
  /** Gathers txs from the tx pool, remote rpc nodes, and reqresp. */
71
- public getTxsForBlock(block: L2BlockNew, opts: { deadline: Date }): Promise<{ txs: Tx[]; missingTxs: TxHash[] }> {
71
+ public getTxsForBlock(block: L2Block, opts: { deadline: Date }): Promise<{ txs: Tx[]; missingTxs: TxHash[] }> {
72
72
  return this.getOrderedTxsFromAllSources(
73
73
  { type: 'block', block },
74
74
  block.toBlockInfo(),
@@ -137,6 +137,7 @@ export class TxProvider implements ITxProvider {
137
137
  );
138
138
 
139
139
  if (missingTxHashes.size === 0) {
140
+ this.instrumentation.incTxsFromP2P(0, txHashes.length);
140
141
  return { txsFromMempool };
141
142
  }
142
143
 
@@ -155,24 +156,26 @@ export class TxProvider implements ITxProvider {
155
156
 
156
157
  if (missingTxHashes.size === 0) {
157
158
  await this.processProposalTxs(txsFromProposal);
159
+ this.instrumentation.incTxsFromP2P(0, txHashes.length);
158
160
  return { txsFromMempool, txsFromProposal };
159
161
  }
160
162
 
161
163
  // Start tx collection from the network if needed, while we validate the txs taken from the proposal in parallel
162
164
  const [txsFromNetwork] = await Promise.all([
163
- this.txCollection.collectFastFor(request, [...missingTxHashes], opts),
165
+ this.collectFromP2P(request, [...missingTxHashes], opts),
164
166
  this.processProposalTxs(txsFromProposal),
165
167
  ] as const);
166
168
 
167
169
  if (txsFromNetwork.length > 0) {
168
170
  txsFromNetwork.forEach(tx => missingTxHashes.delete(tx.txHash.toString()));
169
- this.instrumentation.incTxsFromP2P(txsFromNetwork.length);
170
171
  this.log.debug(
171
172
  `Retrieved ${txsFromNetwork.length} txs from network for block proposal (${missingTxHashes.size} pending)`,
172
173
  { ...blockInfo, missingTxHashes: [...missingTxHashes] },
173
174
  );
174
175
  }
175
176
 
177
+ this.instrumentation.incTxsFromP2P(txsFromNetwork.length, txHashes.length);
178
+
176
179
  if (missingTxHashes.size === 0) {
177
180
  return { txsFromNetwork, txsFromMempool, txsFromProposal };
178
181
  }
@@ -200,6 +203,18 @@ export class TxProvider implements ITxProvider {
200
203
  };
201
204
  }
202
205
 
206
+ private async collectFromP2P(
207
+ input: FastCollectionRequestInput,
208
+ txHashes: TxHash[] | string[],
209
+ opts: { deadline: Date; pinnedPeer?: PeerId },
210
+ ): Promise<Tx[]> {
211
+ const requestedAt = Date.now();
212
+ const result = await this.txCollection.collectFastFor(input, txHashes, opts);
213
+ const requestProcessedAt = Date.now();
214
+ this.instrumentation.recordTxsRequestDelay(requestProcessedAt - requestedAt);
215
+ return result;
216
+ }
217
+
203
218
  private extractFromProposal(proposal: BlockProposal | undefined, missingTxHashes: string[]): Tx[] {
204
219
  if (!proposal) {
205
220
  return [];
@@ -1,4 +1,4 @@
1
- import { Metrics, type TelemetryClient, type UpDownCounter } from '@aztec/telemetry-client';
1
+ import { type Histogram, Metrics, type TelemetryClient, type UpDownCounter } from '@aztec/telemetry-client';
2
2
 
3
3
  export class TxProviderInstrumentation {
4
4
  private txFromProposalCount: UpDownCounter;
@@ -6,24 +6,23 @@ export class TxProviderInstrumentation {
6
6
  private txFromP2PCount: UpDownCounter;
7
7
  private missingTxsCount: UpDownCounter;
8
8
 
9
+ private fractionOfTxsRequestedFromP2P: Histogram;
10
+ private txsRequestDelay: Histogram;
11
+
9
12
  constructor(client: TelemetryClient, name: string) {
10
13
  const meter = client.getMeter(name);
11
14
 
12
- this.txFromProposalCount = meter.createUpDownCounter(Metrics.TX_PROVIDER_TXS_FROM_PROPOSALS_COUNT, {
13
- description: 'The number of txs taken from block proposals',
14
- });
15
+ this.txFromProposalCount = meter.createUpDownCounter(Metrics.TX_PROVIDER_TXS_FROM_PROPOSALS_COUNT);
16
+
17
+ this.txFromMempoolCount = meter.createUpDownCounter(Metrics.TX_PROVIDER_TXS_FROM_MEMPOOL_COUNT);
18
+
19
+ this.txFromP2PCount = meter.createUpDownCounter(Metrics.TX_PROVIDER_TXS_FROM_P2P_COUNT);
15
20
 
16
- this.txFromMempoolCount = meter.createUpDownCounter(Metrics.TX_PROVIDER_TXS_FROM_MEMPOOL_COUNT, {
17
- description: 'The number of txs taken from the local mempool',
18
- });
21
+ this.missingTxsCount = meter.createUpDownCounter(Metrics.TX_PROVIDER_MISSING_TXS_COUNT);
19
22
 
20
- this.txFromP2PCount = meter.createUpDownCounter(Metrics.TX_PROVIDER_TXS_FROM_P2P_COUNT, {
21
- description: 'The number of txs taken from the p2p network',
22
- });
23
+ this.fractionOfTxsRequestedFromP2P = meter.createHistogram(Metrics.TX_PROVIDER_P2P_TXS_REQUESTED_FRACTION);
23
24
 
24
- this.missingTxsCount = meter.createUpDownCounter(Metrics.TX_PROVIDER_MISSING_TXS_COUNT, {
25
- description: 'The number of txs not found anywhere',
26
- });
25
+ this.txsRequestDelay = meter.createHistogram(Metrics.TX_PROVIDER_P2P_TXS_REQUEST_DELAY);
27
26
  }
28
27
 
29
28
  incTxsFromProposals(count: number) {
@@ -34,8 +33,13 @@ export class TxProviderInstrumentation {
34
33
  this.txFromMempoolCount.add(count);
35
34
  }
36
35
 
37
- incTxsFromP2P(count: number) {
36
+ incTxsFromP2P(count: number, total: number) {
38
37
  this.txFromP2PCount.add(count);
38
+ this.fractionOfTxsRequestedFromP2P.record(count / total);
39
+ }
40
+
41
+ recordTxsRequestDelay(delay: number) {
42
+ this.txsRequestDelay.record(delay);
39
43
  }
40
44
 
41
45
  incMissingTxs(count: number) {
@@ -39,7 +39,7 @@ export function getMockPubSubP2PServiceFactory<T extends P2PClientType>(
39
39
  peerId: PeerId,
40
40
  deps: {
41
41
  packageVersion: string;
42
- mempools: MemPools<T>;
42
+ mempools: MemPools;
43
43
  l2BlockSource: L2BlockSource & ContractDataSource;
44
44
  epochCache: EpochCacheInterface;
45
45
  proofVerifier: ClientProtocolCircuitVerifier;
@@ -1,4 +1,4 @@
1
- import { Fr } from '@aztec/foundation/fields';
1
+ import { Fr } from '@aztec/foundation/curves/bn254';
2
2
  import { getVKTreeRoot } from '@aztec/noir-protocol-circuits-types/vk-tree';
3
3
  import { protocolContractsHash } from '@aztec/protocol-contracts';
4
4
  import { mockTx } from '@aztec/stdlib/testing';
@@ -112,7 +112,7 @@ export async function createTestLibP2PService<T extends P2PClientType>(
112
112
  archiver: L2BlockSource & ContractDataSource,
113
113
  worldStateSynchronizer: WorldStateSynchronizer,
114
114
  epochCache: EpochCache,
115
- mempools: MemPools<T>,
115
+ mempools: MemPools,
116
116
  telemetry: TelemetryClient,
117
117
  port: number = 0,
118
118
  peerId?: PeerId,