@aztec/p2p 0.0.1-commit.59e663cd → 0.0.1-commit.5cf06de3

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 (231) hide show
  1. package/dest/bootstrap/bootstrap.d.ts +4 -3
  2. package/dest/bootstrap/bootstrap.d.ts.map +1 -1
  3. package/dest/bootstrap/bootstrap.js +4 -4
  4. package/dest/client/factory.d.ts +1 -1
  5. package/dest/client/factory.d.ts.map +1 -1
  6. package/dest/client/factory.js +9 -6
  7. package/dest/client/p2p_client.d.ts +4 -2
  8. package/dest/client/p2p_client.d.ts.map +1 -1
  9. package/dest/client/p2p_client.js +15 -4
  10. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts +2 -0
  11. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts.map +1 -0
  12. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +305 -0
  13. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts +73 -0
  14. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts.map +1 -0
  15. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.js +8 -0
  16. package/dest/config.d.ts +14 -2
  17. package/dest/config.d.ts.map +1 -1
  18. package/dest/config.js +5 -1
  19. package/dest/mem_pools/instrumentation.d.ts +1 -1
  20. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  21. package/dest/mem_pools/instrumentation.js +2 -2
  22. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +1 -1
  23. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
  24. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +7 -2
  25. package/dest/msg_validators/tx_validator/archive_cache.d.ts +3 -3
  26. package/dest/msg_validators/tx_validator/archive_cache.d.ts.map +1 -1
  27. package/dest/msg_validators/tx_validator/archive_cache.js +1 -1
  28. package/dest/msg_validators/tx_validator/block_header_validator.d.ts +5 -4
  29. package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
  30. package/dest/msg_validators/tx_validator/block_header_validator.js +4 -3
  31. package/dest/msg_validators/tx_validator/data_validator.d.ts +3 -1
  32. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  33. package/dest/msg_validators/tx_validator/data_validator.js +4 -1
  34. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +3 -2
  35. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
  36. package/dest/msg_validators/tx_validator/double_spend_validator.js +3 -2
  37. package/dest/msg_validators/tx_validator/factory.d.ts +8 -3
  38. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  39. package/dest/msg_validators/tx_validator/factory.js +21 -11
  40. package/dest/msg_validators/tx_validator/gas_validator.d.ts +3 -2
  41. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  42. package/dest/msg_validators/tx_validator/gas_validator.js +3 -2
  43. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +3 -2
  44. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  45. package/dest/msg_validators/tx_validator/metadata_validator.js +2 -2
  46. package/dest/msg_validators/tx_validator/phases_validator.d.ts +3 -2
  47. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
  48. package/dest/msg_validators/tx_validator/phases_validator.js +3 -3
  49. package/dest/msg_validators/tx_validator/size_validator.d.ts +3 -1
  50. package/dest/msg_validators/tx_validator/size_validator.d.ts.map +1 -1
  51. package/dest/msg_validators/tx_validator/size_validator.js +4 -1
  52. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +3 -2
  53. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
  54. package/dest/msg_validators/tx_validator/timestamp_validator.js +2 -2
  55. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts +3 -2
  56. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts.map +1 -1
  57. package/dest/msg_validators/tx_validator/tx_permitted_validator.js +2 -2
  58. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +3 -2
  59. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
  60. package/dest/msg_validators/tx_validator/tx_proof_validator.js +2 -2
  61. package/dest/services/data_store.d.ts +1 -1
  62. package/dest/services/data_store.d.ts.map +1 -1
  63. package/dest/services/data_store.js +10 -6
  64. package/dest/services/discv5/discV5_service.js +1 -1
  65. package/dest/services/dummy_service.d.ts +13 -1
  66. package/dest/services/dummy_service.d.ts.map +1 -1
  67. package/dest/services/dummy_service.js +39 -0
  68. package/dest/services/index.d.ts +2 -1
  69. package/dest/services/index.d.ts.map +1 -1
  70. package/dest/services/index.js +1 -0
  71. package/dest/services/libp2p/instrumentation.d.ts +1 -1
  72. package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
  73. package/dest/services/libp2p/instrumentation.js +14 -3
  74. package/dest/services/libp2p/libp2p_service.d.ts +9 -3
  75. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  76. package/dest/services/libp2p/libp2p_service.js +37 -28
  77. package/dest/services/peer-manager/metrics.d.ts +2 -2
  78. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  79. package/dest/services/peer-manager/metrics.js +20 -5
  80. package/dest/services/peer-manager/peer_scoring.d.ts +1 -1
  81. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  82. package/dest/services/peer-manager/peer_scoring.js +8 -2
  83. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +47 -0
  84. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -0
  85. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +566 -0
  86. package/dest/services/reqresp/batch-tx-requester/config.d.ts +17 -0
  87. package/dest/services/reqresp/batch-tx-requester/config.d.ts.map +1 -0
  88. package/dest/services/reqresp/batch-tx-requester/config.js +27 -0
  89. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +50 -0
  90. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -0
  91. package/dest/services/reqresp/batch-tx-requester/interface.js +1 -0
  92. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +37 -0
  93. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -0
  94. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +151 -0
  95. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +54 -0
  96. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -0
  97. package/dest/services/reqresp/batch-tx-requester/peer_collection.js +139 -0
  98. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +20 -0
  99. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -0
  100. package/dest/services/reqresp/batch-tx-requester/tx_validator.js +21 -0
  101. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +22 -3
  102. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +1 -1
  103. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +63 -4
  104. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +2 -1
  105. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -1
  106. package/dest/services/reqresp/connection-sampler/connection_sampler.js +12 -0
  107. package/dest/services/reqresp/interface.d.ts +3 -1
  108. package/dest/services/reqresp/interface.d.ts.map +1 -1
  109. package/dest/services/reqresp/metrics.d.ts +6 -5
  110. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  111. package/dest/services/reqresp/metrics.js +17 -5
  112. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +5 -1
  113. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -1
  114. package/dest/services/reqresp/protocols/block_txs/bitvector.js +5 -0
  115. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +1 -1
  116. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
  117. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +16 -3
  118. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +18 -6
  119. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
  120. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +43 -13
  121. package/dest/services/reqresp/reqresp.d.ts +6 -1
  122. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  123. package/dest/services/reqresp/reqresp.js +58 -22
  124. package/dest/services/service.d.ts +4 -1
  125. package/dest/services/service.d.ts.map +1 -1
  126. package/dest/services/tx_collection/config.d.ts +4 -1
  127. package/dest/services/tx_collection/config.d.ts.map +1 -1
  128. package/dest/services/tx_collection/config.js +9 -1
  129. package/dest/services/tx_collection/fast_tx_collection.d.ts +6 -4
  130. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
  131. package/dest/services/tx_collection/fast_tx_collection.js +16 -5
  132. package/dest/services/tx_collection/index.d.ts +2 -1
  133. package/dest/services/tx_collection/index.d.ts.map +1 -1
  134. package/dest/services/tx_collection/index.js +1 -0
  135. package/dest/services/tx_collection/instrumentation.d.ts +1 -1
  136. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
  137. package/dest/services/tx_collection/instrumentation.js +9 -2
  138. package/dest/services/tx_collection/proposal_tx_collector.d.ts +48 -0
  139. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -0
  140. package/dest/services/tx_collection/proposal_tx_collector.js +50 -0
  141. package/dest/services/tx_collection/tx_collection.d.ts +4 -4
  142. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  143. package/dest/services/tx_collection/tx_collection.js +5 -5
  144. package/dest/services/tx_file_store/config.d.ts +18 -0
  145. package/dest/services/tx_file_store/config.d.ts.map +1 -0
  146. package/dest/services/tx_file_store/config.js +26 -0
  147. package/dest/services/tx_file_store/index.d.ts +4 -0
  148. package/dest/services/tx_file_store/index.d.ts.map +1 -0
  149. package/dest/services/tx_file_store/index.js +3 -0
  150. package/dest/services/tx_file_store/instrumentation.d.ts +15 -0
  151. package/dest/services/tx_file_store/instrumentation.d.ts.map +1 -0
  152. package/dest/services/tx_file_store/instrumentation.js +29 -0
  153. package/dest/services/tx_file_store/tx_file_store.d.ts +47 -0
  154. package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -0
  155. package/dest/services/tx_file_store/tx_file_store.js +149 -0
  156. package/dest/services/tx_provider_instrumentation.d.ts +1 -1
  157. package/dest/services/tx_provider_instrumentation.d.ts.map +1 -1
  158. package/dest/services/tx_provider_instrumentation.js +5 -5
  159. package/dest/test-helpers/index.d.ts +2 -1
  160. package/dest/test-helpers/index.d.ts.map +1 -1
  161. package/dest/test-helpers/index.js +1 -0
  162. package/dest/test-helpers/testbench-utils.d.ts +158 -0
  163. package/dest/test-helpers/testbench-utils.d.ts.map +1 -0
  164. package/dest/test-helpers/testbench-utils.js +297 -0
  165. package/dest/testbench/p2p_client_testbench_worker.d.ts +28 -2
  166. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  167. package/dest/testbench/p2p_client_testbench_worker.js +212 -131
  168. package/dest/testbench/worker_client_manager.d.ts +51 -6
  169. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  170. package/dest/testbench/worker_client_manager.js +226 -44
  171. package/package.json +14 -14
  172. package/src/bootstrap/bootstrap.ts +7 -4
  173. package/src/client/factory.ts +10 -10
  174. package/src/client/p2p_client.ts +14 -2
  175. package/src/client/test/tx_proposal_collector/README.md +227 -0
  176. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +336 -0
  177. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.ts +43 -0
  178. package/src/config.ts +13 -1
  179. package/src/mem_pools/instrumentation.ts +2 -1
  180. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +8 -2
  181. package/src/msg_validators/tx_validator/archive_cache.ts +3 -3
  182. package/src/msg_validators/tx_validator/block_header_validator.ts +7 -8
  183. package/src/msg_validators/tx_validator/data_validator.ts +6 -2
  184. package/src/msg_validators/tx_validator/double_spend_validator.ts +4 -3
  185. package/src/msg_validators/tx_validator/factory.ts +64 -23
  186. package/src/msg_validators/tx_validator/gas_validator.ts +9 -3
  187. package/src/msg_validators/tx_validator/metadata_validator.ts +6 -3
  188. package/src/msg_validators/tx_validator/phases_validator.ts +5 -3
  189. package/src/msg_validators/tx_validator/size_validator.ts +6 -2
  190. package/src/msg_validators/tx_validator/timestamp_validator.ts +6 -3
  191. package/src/msg_validators/tx_validator/tx_permitted_validator.ts +8 -3
  192. package/src/msg_validators/tx_validator/tx_proof_validator.ts +8 -3
  193. package/src/services/data_store.ts +10 -7
  194. package/src/services/discv5/discV5_service.ts +1 -1
  195. package/src/services/dummy_service.ts +45 -0
  196. package/src/services/index.ts +1 -0
  197. package/src/services/libp2p/instrumentation.ts +15 -2
  198. package/src/services/libp2p/libp2p_service.ts +60 -46
  199. package/src/services/peer-manager/metrics.ts +21 -4
  200. package/src/services/peer-manager/peer_scoring.ts +4 -1
  201. package/src/services/reqresp/batch-tx-requester/README.md +305 -0
  202. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +706 -0
  203. package/src/services/reqresp/batch-tx-requester/config.ts +40 -0
  204. package/src/services/reqresp/batch-tx-requester/interface.ts +57 -0
  205. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +209 -0
  206. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +205 -0
  207. package/src/services/reqresp/batch-tx-requester/tx_validator.ts +37 -0
  208. package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +65 -4
  209. package/src/services/reqresp/connection-sampler/connection_sampler.ts +16 -0
  210. package/src/services/reqresp/interface.ts +3 -0
  211. package/src/services/reqresp/metrics.ts +34 -9
  212. package/src/services/reqresp/protocols/block_txs/bitvector.ts +7 -0
  213. package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +18 -4
  214. package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +51 -9
  215. package/src/services/reqresp/reqresp.ts +66 -19
  216. package/src/services/service.ts +4 -0
  217. package/src/services/tx_collection/config.ts +15 -1
  218. package/src/services/tx_collection/fast_tx_collection.ts +36 -13
  219. package/src/services/tx_collection/index.ts +5 -0
  220. package/src/services/tx_collection/instrumentation.ts +11 -2
  221. package/src/services/tx_collection/proposal_tx_collector.ts +114 -0
  222. package/src/services/tx_collection/tx_collection.ts +4 -4
  223. package/src/services/tx_file_store/config.ts +43 -0
  224. package/src/services/tx_file_store/index.ts +3 -0
  225. package/src/services/tx_file_store/instrumentation.ts +36 -0
  226. package/src/services/tx_file_store/tx_file_store.ts +173 -0
  227. package/src/services/tx_provider_instrumentation.ts +11 -5
  228. package/src/test-helpers/index.ts +1 -0
  229. package/src/test-helpers/testbench-utils.ts +374 -0
  230. package/src/testbench/p2p_client_testbench_worker.ts +321 -122
  231. package/src/testbench/worker_client_manager.ts +304 -47
@@ -0,0 +1,47 @@
1
+ import { type Logger } from '@aztec/foundation/log';
2
+ import { type FileStore } from '@aztec/stdlib/file-store';
3
+ import { type TelemetryClient } from '@aztec/telemetry-client';
4
+ import type { TxPool } from '../../mem_pools/tx_pool/index.js';
5
+ import type { TxFileStoreConfig } from './config.js';
6
+ /**
7
+ * Uploads validated transactions to a file store as a fallback retrieval mechanism.
8
+ * Listens to TxPool txs-added events and uploads txs asynchronously with bounded concurrency.
9
+ */
10
+ export declare class TxFileStore {
11
+ private readonly fileStore;
12
+ private readonly txPool;
13
+ private readonly config;
14
+ private readonly instrumentation;
15
+ private readonly log;
16
+ private uploadQueue;
17
+ private activeUploads;
18
+ private readonly queueProcessor;
19
+ private readonly handleTxsAdded;
20
+ /** Recently uploaded tx hashes for deduplication. */
21
+ private recentUploads;
22
+ private recentUploadsOrder;
23
+ private readonly maxRecentUploads;
24
+ private constructor();
25
+ /**
26
+ * Creates and initializes the file store.
27
+ * @param txPool - The transaction pool to listen to.
28
+ * @param config - The file store configuration.
29
+ * @param log - Optional logger.
30
+ * @param telemetry - Optional telemetry client.
31
+ * @param fileStoreOverride - Optional FileStore for testing (bypasses createFileStore).
32
+ * @returns The file store instance, or undefined if not configured/enabled.
33
+ */
34
+ static create(txPool: TxPool, config: TxFileStoreConfig, log?: Logger, telemetry?: TelemetryClient, fileStoreOverride?: FileStore): Promise<TxFileStore | undefined>;
35
+ /** Starts listening to TxPool events and uploading txs. */
36
+ start(): void;
37
+ /** Stops listening and waits for pending uploads to complete. */
38
+ stop(): Promise<void>;
39
+ private enqueueTxs;
40
+ private processQueueBatch;
41
+ private uploadTx;
42
+ /** Waits for all queued and in-flight uploads to complete. For testing. */
43
+ flush(): Promise<void>;
44
+ /** Returns the number of pending uploads (queued + in-flight). */
45
+ getPendingUploadCount(): number;
46
+ }
47
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhfZmlsZV9zdG9yZS5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NlcnZpY2VzL3R4X2ZpbGVfc3RvcmUvdHhfZmlsZV9zdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsS0FBSyxNQUFNLEVBQWdCLE1BQU0sdUJBQXVCLENBQUM7QUFJbEUsT0FBTyxFQUFFLEtBQUssU0FBUyxFQUFtQixNQUFNLDBCQUEwQixDQUFDO0FBRTNFLE9BQU8sRUFBRSxLQUFLLGVBQWUsRUFBc0IsTUFBTSx5QkFBeUIsQ0FBQztBQUVuRixPQUFPLEtBQUssRUFBRSxNQUFNLEVBQWdCLE1BQU0sa0NBQWtDLENBQUM7QUFDN0UsT0FBTyxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFHckQ7OztHQUdHO0FBQ0gscUJBQWEsV0FBVztJQVlwQixPQUFPLENBQUMsUUFBUSxDQUFDLFNBQVM7SUFDMUIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNO0lBQ3ZCLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTTtJQUN2QixPQUFPLENBQUMsUUFBUSxDQUFDLGVBQWU7SUFDaEMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHO0lBZnRCLE9BQU8sQ0FBQyxXQUFXLENBQVk7SUFDL0IsT0FBTyxDQUFDLGFBQWEsQ0FBSztJQUMxQixPQUFPLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBaUI7SUFDaEQsT0FBTyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQTRCO0lBRTNELHFEQUFxRDtJQUNyRCxPQUFPLENBQUMsYUFBYSxDQUEwQjtJQUMvQyxPQUFPLENBQUMsa0JBQWtCLENBQWdCO0lBQzFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQVE7SUFFekMsT0FBTyxlQVdOO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCxPQUFhLE1BQU0sQ0FDakIsTUFBTSxFQUFFLE1BQU0sRUFDZCxNQUFNLEVBQUUsaUJBQWlCLEVBQ3pCLEdBQUcsR0FBRSxNQUEwQyxFQUMvQyxTQUFTLEdBQUUsZUFBc0MsRUFDakQsaUJBQWlCLENBQUMsRUFBRSxTQUFTLEdBQzVCLE9BQU8sQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFDLENBb0JsQztJQUVELDJEQUEyRDtJQUNwRCxLQUFLLElBQUksSUFBSSxDQU9uQjtJQUVELGlFQUFpRTtJQUNwRCxJQUFJLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxDQUlqQztJQUVELE9BQU8sQ0FBQyxVQUFVO1lBZ0JKLGlCQUFpQjtZQVlqQixRQUFRO0lBdUN0QiwyRUFBMkU7SUFDOUQsS0FBSyxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FJbEM7SUFFRCxrRUFBa0U7SUFDM0QscUJBQXFCLElBQUksTUFBTSxDQUVyQztDQUNGIn0=
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tx_file_store.d.ts","sourceRoot":"","sources":["../../../src/services/tx_file_store/tx_file_store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAIlE,OAAO,EAAE,KAAK,SAAS,EAAmB,MAAM,0BAA0B,CAAC;AAE3E,OAAO,EAAE,KAAK,eAAe,EAAsB,MAAM,yBAAyB,CAAC;AAEnF,OAAO,KAAK,EAAE,MAAM,EAAgB,MAAM,kCAAkC,CAAC;AAC7E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAGrD;;;GAGG;AACH,qBAAa,WAAW;IAYpB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,eAAe;IAChC,OAAO,CAAC,QAAQ,CAAC,GAAG;IAftB,OAAO,CAAC,WAAW,CAAY;IAC/B,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAChD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA4B;IAE3D,qDAAqD;IACrD,OAAO,CAAC,aAAa,CAA0B;IAC/C,OAAO,CAAC,kBAAkB,CAAgB;IAC1C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAQ;IAEzC,OAAO,eAWN;IAED;;;;;;;;OAQG;IACH,OAAa,MAAM,CACjB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,iBAAiB,EACzB,GAAG,GAAE,MAA0C,EAC/C,SAAS,GAAE,eAAsC,EACjD,iBAAiB,CAAC,EAAE,SAAS,GAC5B,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAoBlC;IAED,2DAA2D;IACpD,KAAK,IAAI,IAAI,CAOnB;IAED,iEAAiE;IACpD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAIjC;IAED,OAAO,CAAC,UAAU;YAgBJ,iBAAiB;YAYjB,QAAQ;IAuCtB,2EAA2E;IAC9D,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAIlC;IAED,kEAAkE;IAC3D,qBAAqB,IAAI,MAAM,CAErC;CACF"}
@@ -0,0 +1,149 @@
1
+ import { createLogger } from '@aztec/foundation/log';
2
+ import { RunningPromise } from '@aztec/foundation/promise';
3
+ import { makeBackoff, retry } from '@aztec/foundation/retry';
4
+ import { Timer } from '@aztec/foundation/timer';
5
+ import { createFileStore } from '@aztec/stdlib/file-store';
6
+ import { getTelemetryClient } from '@aztec/telemetry-client';
7
+ import { TxFileStoreInstrumentation } from './instrumentation.js';
8
+ /**
9
+ * Uploads validated transactions to a file store as a fallback retrieval mechanism.
10
+ * Listens to TxPool txs-added events and uploads txs asynchronously with bounded concurrency.
11
+ */ export class TxFileStore {
12
+ fileStore;
13
+ txPool;
14
+ config;
15
+ instrumentation;
16
+ log;
17
+ uploadQueue;
18
+ activeUploads;
19
+ queueProcessor;
20
+ handleTxsAdded;
21
+ /** Recently uploaded tx hashes for deduplication. */ recentUploads;
22
+ recentUploadsOrder;
23
+ maxRecentUploads;
24
+ constructor(fileStore, txPool, config, instrumentation, log){
25
+ this.fileStore = fileStore;
26
+ this.txPool = txPool;
27
+ this.config = config;
28
+ this.instrumentation = instrumentation;
29
+ this.log = log;
30
+ this.uploadQueue = [];
31
+ this.activeUploads = 0;
32
+ this.recentUploads = new Set();
33
+ this.recentUploadsOrder = [];
34
+ this.maxRecentUploads = 1000;
35
+ this.handleTxsAdded = (args)=>{
36
+ this.enqueueTxs(args.txs);
37
+ };
38
+ this.queueProcessor = new RunningPromise(()=>this.processQueueBatch(), this.log, 100);
39
+ }
40
+ /**
41
+ * Creates and initializes the file store.
42
+ * @param txPool - The transaction pool to listen to.
43
+ * @param config - The file store configuration.
44
+ * @param log - Optional logger.
45
+ * @param telemetry - Optional telemetry client.
46
+ * @param fileStoreOverride - Optional FileStore for testing (bypasses createFileStore).
47
+ * @returns The file store instance, or undefined if not configured/enabled.
48
+ */ static async create(txPool, config, log = createLogger('p2p:tx_file_store'), telemetry = getTelemetryClient(), fileStoreOverride) {
49
+ if (!config.txFileStoreEnabled) {
50
+ log.debug('Tx file store is disabled');
51
+ return undefined;
52
+ }
53
+ if (!config.txFileStoreUrl) {
54
+ log.warn('Tx file store is enabled but URL is not configured');
55
+ return undefined;
56
+ }
57
+ const fileStore = fileStoreOverride ?? await createFileStore(config.txFileStoreUrl, log);
58
+ if (!fileStore) {
59
+ log.warn('Failed to create file store for tx file store');
60
+ return undefined;
61
+ }
62
+ const instrumentation = new TxFileStoreInstrumentation(telemetry, 'TxFileStore');
63
+ log.info('Created tx file store', {
64
+ url: config.txFileStoreUrl
65
+ });
66
+ return new TxFileStore(fileStore, txPool, config, instrumentation, log);
67
+ }
68
+ /** Starts listening to TxPool events and uploading txs. */ start() {
69
+ this.queueProcessor.start();
70
+ this.txPool.on('txs-added', this.handleTxsAdded);
71
+ this.log.info('Started tx file store', {
72
+ concurrency: this.config.txFileStoreUploadConcurrency,
73
+ maxQueueSize: this.config.txFileStoreMaxQueueSize
74
+ });
75
+ }
76
+ /** Stops listening and waits for pending uploads to complete. */ async stop() {
77
+ this.txPool.removeListener('txs-added', this.handleTxsAdded);
78
+ await this.queueProcessor.stop();
79
+ this.log.info('Stopped tx file store');
80
+ }
81
+ enqueueTxs(txs) {
82
+ this.uploadQueue.push(...txs);
83
+ // Enforce max queue size by dropping oldest entries
84
+ const overflow = this.uploadQueue.length - this.config.txFileStoreMaxQueueSize;
85
+ if (overflow > 0) {
86
+ this.log.warn(`Upload queue overflow, dropping ${overflow} oldest txs`);
87
+ this.uploadQueue.splice(0, overflow);
88
+ }
89
+ this.instrumentation.recordQueueSize(this.uploadQueue.length);
90
+ // Immediately start uploading txs
91
+ void this.queueProcessor.trigger();
92
+ }
93
+ async processQueueBatch() {
94
+ const batch = this.uploadQueue.splice(0, this.config.txFileStoreUploadConcurrency);
95
+ this.instrumentation.recordQueueSize(this.uploadQueue.length);
96
+ this.activeUploads += batch.length;
97
+ try {
98
+ await Promise.all(batch.map((tx)=>this.uploadTx(tx)));
99
+ } finally{
100
+ this.activeUploads -= batch.length;
101
+ }
102
+ }
103
+ async uploadTx(tx) {
104
+ const txHash = tx.getTxHash().toString();
105
+ const path = `txs/${txHash}.bin`;
106
+ const timer = new Timer();
107
+ if (this.recentUploads.has(txHash)) {
108
+ return;
109
+ }
110
+ try {
111
+ this.recentUploads.add(txHash);
112
+ this.recentUploadsOrder.push(txHash);
113
+ if (this.recentUploadsOrder.length > this.maxRecentUploads) {
114
+ // delete old entries in recentUploads
115
+ for (const txHashToRemove of this.recentUploadsOrder.splice(0, this.recentUploadsOrder.length - this.maxRecentUploads)){
116
+ this.recentUploads.delete(txHashToRemove);
117
+ }
118
+ }
119
+ await retry(()=>this.fileStore.save(path, tx.toBuffer(), {
120
+ compress: false
121
+ }), `Uploading tx ${txHash}`, makeBackoff([
122
+ 0.1,
123
+ 0.5,
124
+ 2
125
+ ]), this.log, true);
126
+ const durationMs = Math.trunc(timer.ms());
127
+ this.log.debug(`Uploaded tx to file store`, {
128
+ txHash,
129
+ path,
130
+ durationMs
131
+ });
132
+ this.instrumentation.recordUploadSuccess(durationMs);
133
+ } catch (err) {
134
+ this.log.warn(`Failed to upload tx to file store after retries`, {
135
+ txHash,
136
+ error: err
137
+ });
138
+ this.instrumentation.recordUploadFailed();
139
+ }
140
+ }
141
+ /** Waits for all queued and in-flight uploads to complete. For testing. */ async flush() {
142
+ while(this.uploadQueue.length > 0 || this.activeUploads > 0){
143
+ await this.queueProcessor.trigger();
144
+ }
145
+ }
146
+ /** Returns the number of pending uploads (queued + in-flight). */ getPendingUploadCount() {
147
+ return this.uploadQueue.length + this.activeUploads;
148
+ }
149
+ }
@@ -13,4 +13,4 @@ export declare class TxProviderInstrumentation {
13
13
  recordTxsRequestDelay(delay: number): void;
14
14
  incMissingTxs(count: number): void;
15
15
  }
16
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhfcHJvdmlkZXJfaW5zdHJ1bWVudGF0aW9uLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvdHhfcHJvdmlkZXJfaW5zdHJ1bWVudGF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBMkIsS0FBSyxlQUFlLEVBQXNCLE1BQU0seUJBQXlCLENBQUM7QUFFNUcscUJBQWEseUJBQXlCO0lBQ3BDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBZ0I7SUFDM0MsT0FBTyxDQUFDLGtCQUFrQixDQUFnQjtJQUMxQyxPQUFPLENBQUMsY0FBYyxDQUFnQjtJQUN0QyxPQUFPLENBQUMsZUFBZSxDQUFnQjtJQUV2QyxPQUFPLENBQUMsNkJBQTZCLENBQVk7SUFDakQsT0FBTyxDQUFDLGVBQWUsQ0FBWTtJQUVuQyxZQUFZLE1BQU0sRUFBRSxlQUFlLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFjaEQ7SUFFRCxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsTUFBTSxRQUVoQztJQUVELGlCQUFpQixDQUFDLEtBQUssRUFBRSxNQUFNLFFBRTlCO0lBRUQsYUFBYSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sUUFHekM7SUFFRCxxQkFBcUIsQ0FBQyxLQUFLLEVBQUUsTUFBTSxRQUVsQztJQUVELGFBQWEsQ0FBQyxLQUFLLEVBQUUsTUFBTSxRQUUxQjtDQUNGIn0=
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhfcHJvdmlkZXJfaW5zdHJ1bWVudGF0aW9uLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvdHhfcHJvdmlkZXJfaW5zdHJ1bWVudGF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFHTCxLQUFLLGVBQWUsRUFHckIsTUFBTSx5QkFBeUIsQ0FBQztBQUVqQyxxQkFBYSx5QkFBeUI7SUFDcEMsT0FBTyxDQUFDLG1CQUFtQixDQUFnQjtJQUMzQyxPQUFPLENBQUMsa0JBQWtCLENBQWdCO0lBQzFDLE9BQU8sQ0FBQyxjQUFjLENBQWdCO0lBQ3RDLE9BQU8sQ0FBQyxlQUFlLENBQWdCO0lBRXZDLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBWTtJQUNqRCxPQUFPLENBQUMsZUFBZSxDQUFZO0lBRW5DLFlBQVksTUFBTSxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQWNoRDtJQUVELG1CQUFtQixDQUFDLEtBQUssRUFBRSxNQUFNLFFBRWhDO0lBRUQsaUJBQWlCLENBQUMsS0FBSyxFQUFFLE1BQU0sUUFFOUI7SUFFRCxhQUFhLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxRQUd6QztJQUVELHFCQUFxQixDQUFDLEtBQUssRUFBRSxNQUFNLFFBRWxDO0lBRUQsYUFBYSxDQUFDLEtBQUssRUFBRSxNQUFNLFFBRTFCO0NBQ0YifQ==
@@ -1 +1 @@
1
- {"version":3,"file":"tx_provider_instrumentation.d.ts","sourceRoot":"","sources":["../../src/services/tx_provider_instrumentation.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2B,KAAK,eAAe,EAAsB,MAAM,yBAAyB,CAAC;AAE5G,qBAAa,yBAAyB;IACpC,OAAO,CAAC,mBAAmB,CAAgB;IAC3C,OAAO,CAAC,kBAAkB,CAAgB;IAC1C,OAAO,CAAC,cAAc,CAAgB;IACtC,OAAO,CAAC,eAAe,CAAgB;IAEvC,OAAO,CAAC,6BAA6B,CAAY;IACjD,OAAO,CAAC,eAAe,CAAY;IAEnC,YAAY,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,EAchD;IAED,mBAAmB,CAAC,KAAK,EAAE,MAAM,QAEhC;IAED,iBAAiB,CAAC,KAAK,EAAE,MAAM,QAE9B;IAED,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAGzC;IAED,qBAAqB,CAAC,KAAK,EAAE,MAAM,QAElC;IAED,aAAa,CAAC,KAAK,EAAE,MAAM,QAE1B;CACF"}
1
+ {"version":3,"file":"tx_provider_instrumentation.d.ts","sourceRoot":"","sources":["../../src/services/tx_provider_instrumentation.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,eAAe,EAGrB,MAAM,yBAAyB,CAAC;AAEjC,qBAAa,yBAAyB;IACpC,OAAO,CAAC,mBAAmB,CAAgB;IAC3C,OAAO,CAAC,kBAAkB,CAAgB;IAC1C,OAAO,CAAC,cAAc,CAAgB;IACtC,OAAO,CAAC,eAAe,CAAgB;IAEvC,OAAO,CAAC,6BAA6B,CAAY;IACjD,OAAO,CAAC,eAAe,CAAY;IAEnC,YAAY,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,EAchD;IAED,mBAAmB,CAAC,KAAK,EAAE,MAAM,QAEhC;IAED,iBAAiB,CAAC,KAAK,EAAE,MAAM,QAE9B;IAED,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAGzC;IAED,qBAAqB,CAAC,KAAK,EAAE,MAAM,QAElC;IAED,aAAa,CAAC,KAAK,EAAE,MAAM,QAE1B;CACF"}
@@ -1,4 +1,4 @@
1
- import { Metrics } from '@aztec/telemetry-client';
1
+ import { Metrics, createUpDownCounterWithDefault } from '@aztec/telemetry-client';
2
2
  export class TxProviderInstrumentation {
3
3
  txFromProposalCount;
4
4
  txFromMempoolCount;
@@ -8,10 +8,10 @@ export class TxProviderInstrumentation {
8
8
  txsRequestDelay;
9
9
  constructor(client, name){
10
10
  const meter = client.getMeter(name);
11
- this.txFromProposalCount = meter.createUpDownCounter(Metrics.TX_PROVIDER_TXS_FROM_PROPOSALS_COUNT);
12
- this.txFromMempoolCount = meter.createUpDownCounter(Metrics.TX_PROVIDER_TXS_FROM_MEMPOOL_COUNT);
13
- this.txFromP2PCount = meter.createUpDownCounter(Metrics.TX_PROVIDER_TXS_FROM_P2P_COUNT);
14
- this.missingTxsCount = meter.createUpDownCounter(Metrics.TX_PROVIDER_MISSING_TXS_COUNT);
11
+ this.txFromProposalCount = createUpDownCounterWithDefault(meter, Metrics.TX_PROVIDER_TXS_FROM_PROPOSALS_COUNT);
12
+ this.txFromMempoolCount = createUpDownCounterWithDefault(meter, Metrics.TX_PROVIDER_TXS_FROM_MEMPOOL_COUNT);
13
+ this.txFromP2PCount = createUpDownCounterWithDefault(meter, Metrics.TX_PROVIDER_TXS_FROM_P2P_COUNT);
14
+ this.missingTxsCount = createUpDownCounterWithDefault(meter, Metrics.TX_PROVIDER_MISSING_TXS_COUNT);
15
15
  this.fractionOfTxsRequestedFromP2P = meter.createHistogram(Metrics.TX_PROVIDER_P2P_TXS_REQUESTED_FRACTION);
16
16
  this.txsRequestDelay = meter.createHistogram(Metrics.TX_PROVIDER_P2P_TXS_REQUEST_DELAY);
17
17
  }
@@ -5,4 +5,5 @@ export * from './make-test-p2p-clients.js';
5
5
  export * from './reqresp-nodes.js';
6
6
  export * from './mock-pubsub.js';
7
7
  export * from './test_tx_provider.js';
8
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0LWhlbHBlcnMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxvQ0FBb0MsQ0FBQztBQUNuRCxjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxjQUFjLG9CQUFvQixDQUFDO0FBQ25DLGNBQWMsa0JBQWtCLENBQUM7QUFDakMsY0FBYyx1QkFBdUIsQ0FBQyJ9
8
+ export * from './testbench-utils.js';
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0LWhlbHBlcnMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxvQ0FBb0MsQ0FBQztBQUNuRCxjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxjQUFjLG9CQUFvQixDQUFDO0FBQ25DLGNBQWMsa0JBQWtCLENBQUM7QUFDakMsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLHNCQUFzQixDQUFDIn0=
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/test-helpers/index.ts"],"names":[],"mappings":"AAAA,cAAc,oCAAoC,CAAC;AACnD,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/test-helpers/index.ts"],"names":[],"mappings":"AAAA,cAAc,oCAAoC,CAAC;AACnD,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC"}
@@ -5,3 +5,4 @@ export * from './make-test-p2p-clients.js';
5
5
  export * from './reqresp-nodes.js';
6
6
  export * from './mock-pubsub.js';
7
7
  export * from './test_tx_provider.js';
8
+ export * from './testbench-utils.js';
@@ -0,0 +1,158 @@
1
+ import type { EpochCacheInterface } from '@aztec/epoch-cache';
2
+ import { type BlockNumber, SlotNumber } from '@aztec/foundation/branded-types';
3
+ import type { Logger } from '@aztec/foundation/log';
4
+ import type { WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
5
+ import type { BlockProposal, CheckpointAttestation, CheckpointProposal, CheckpointProposalCore } from '@aztec/stdlib/p2p';
6
+ import { type BlockHeader, Tx, TxHash } from '@aztec/stdlib/tx';
7
+ import EventEmitter from 'events';
8
+ import type { AttestationPool } from '../mem_pools/attestation_pool/attestation_pool.js';
9
+ import type { TxPool } from '../mem_pools/tx_pool/index.js';
10
+ /**
11
+ * In-memory TxPool implementation for testing.
12
+ * Provides basic tx storage without persistence.
13
+ */
14
+ export declare class InMemoryTxPool extends EventEmitter implements TxPool {
15
+ private txsByHash;
16
+ private logger;
17
+ setLogger(logger: Logger): void;
18
+ setTxs(txs: Tx[]): number;
19
+ appendTxs(txs: Tx[]): number;
20
+ clearTxs(): void;
21
+ resetState(): void;
22
+ addTxs(txs: Tx[], opts?: {
23
+ source?: string;
24
+ }): Promise<number>;
25
+ getTxByHash(hash: TxHash): Promise<Tx | undefined>;
26
+ getTxsByHash(hashes: TxHash[]): Promise<(Tx | undefined)[]>;
27
+ hasTxs(hashes: TxHash[]): Promise<boolean[]>;
28
+ hasTx(hash: TxHash): Promise<boolean>;
29
+ getArchivedTxByHash(_hash: TxHash): Promise<Tx | undefined>;
30
+ markAsMined(_txHashes: TxHash[], _blockHeader: BlockHeader): Promise<void>;
31
+ markMinedAsPending(_txHashes: TxHash[], _latestBlock: BlockNumber): Promise<void>;
32
+ deleteTxs(txHashes: TxHash[], _opts?: {
33
+ permanently?: boolean;
34
+ }): Promise<void>;
35
+ getAllTxs(): Promise<Tx[]>;
36
+ getAllTxHashes(): Promise<TxHash[]>;
37
+ getPendingTxHashes(): Promise<TxHash[]>;
38
+ getPendingTxCount(): Promise<number>;
39
+ getMinedTxHashes(): Promise<[tx: TxHash, blockNumber: BlockNumber][]>;
40
+ getTxStatus(hash: TxHash): Promise<'pending' | 'mined' | 'deleted' | undefined>;
41
+ updateConfig(_config: {
42
+ maxPendingTxCount?: number;
43
+ archivedTxLimit?: number;
44
+ }): void;
45
+ isEmpty(): Promise<boolean>;
46
+ markTxsAsNonEvictable(_txHashes: TxHash[]): Promise<void>;
47
+ clearNonEvictableTxs(): Promise<void>;
48
+ cleanupDeletedMinedTxs(_blockNumber: BlockNumber): Promise<number>;
49
+ }
50
+ /**
51
+ * In-memory AttestationPool implementation for testing.
52
+ */
53
+ export declare class InMemoryAttestationPool implements AttestationPool {
54
+ private proposals;
55
+ addBlockProposal(blockProposal: BlockProposal): Promise<void>;
56
+ getBlockProposal(id: string): Promise<BlockProposal | undefined>;
57
+ hasBlockProposal(idOrProposal: string | BlockProposal): Promise<boolean>;
58
+ canAddProposal(_block: BlockProposal): Promise<boolean>;
59
+ addCheckpointProposal(_proposal: CheckpointProposal): Promise<void>;
60
+ getCheckpointProposal(_id: string): Promise<CheckpointProposalCore | undefined>;
61
+ hasCheckpointProposal(_idOrProposal: string | CheckpointProposal): Promise<boolean>;
62
+ addCheckpointAttestations(_attestations: CheckpointAttestation[]): Promise<void>;
63
+ deleteCheckpointAttestationsOlderThan(_slot: SlotNumber): Promise<void>;
64
+ getCheckpointAttestationsForSlot(_slot: SlotNumber): Promise<CheckpointAttestation[]>;
65
+ getCheckpointAttestationsForSlotAndProposal(_slot: SlotNumber, _proposalId: string): Promise<CheckpointAttestation[]>;
66
+ hasCheckpointAttestation(_attestation: CheckpointAttestation): Promise<boolean>;
67
+ canAddCheckpointProposal(_proposal: CheckpointProposal): Promise<boolean>;
68
+ canAddCheckpointAttestation(_attestation: CheckpointAttestation, _committeeSize: number): Promise<boolean>;
69
+ hasReachedCheckpointProposalCap(_slot: SlotNumber): Promise<boolean>;
70
+ hasReachedCheckpointAttestationCap(_slot: SlotNumber, _proposalId: string, _committeeSize: number): Promise<boolean>;
71
+ isEmpty(): Promise<boolean>;
72
+ resetState(): void;
73
+ }
74
+ /**
75
+ * Creates a mock EpochCache for testing.
76
+ */
77
+ export declare function createMockEpochCache(): EpochCacheInterface;
78
+ /**
79
+ * Creates a mock WorldStateSynchronizer for testing.
80
+ */
81
+ export declare function createMockWorldStateSynchronizer(): WorldStateSynchronizer;
82
+ /**
83
+ * Unlimited rate limit configuration for benchmarks.
84
+ */
85
+ export declare const UNLIMITED_RATE_LIMIT_QUOTA: {
86
+ peerLimit: {
87
+ quotaTimeMs: number;
88
+ quotaCount: number;
89
+ };
90
+ globalLimit: {
91
+ quotaTimeMs: number;
92
+ quotaCount: number;
93
+ };
94
+ };
95
+ /**
96
+ * Installs unlimited rate limits on a ReqResp instance.
97
+ * Used in benchmarks to avoid rate limiting affecting results.
98
+ *
99
+ * Note: Uses `as any` because rateLimiter is private. This is acceptable
100
+ * in test code where we need to override internal behavior.
101
+ */
102
+ export declare function installUnlimitedRateLimitsOnReqResp(reqResp: any): void;
103
+ /**
104
+ * Distribution patterns for benchmark transaction distribution.
105
+ */
106
+ export type DistributionPattern = 'uniform' | 'sparse' | 'pinned-only';
107
+ /**
108
+ * Collector implementation types for benchmarking.
109
+ */
110
+ export type CollectorType = 'batch-requester' | 'send-batch-request';
111
+ /**
112
+ * Display names for collector types (for output/logging only).
113
+ */
114
+ export declare const COLLECTOR_DISPLAY_NAMES: Record<CollectorType, string>;
115
+ /**
116
+ * Benchmark timing constants.
117
+ */
118
+ export declare const BENCHMARK_CONSTANTS: {
119
+ /** Time to wait for peers to connect before starting benchmark */
120
+ readonly PEER_DISCOVERY_WAIT_MS: 10000;
121
+ /** Maximum time to wait for peer connections */
122
+ readonly MAX_PEER_WAIT_MS: 60000;
123
+ /** Interval between peer connection checks */
124
+ readonly PEER_CHECK_INTERVAL_MS: 500;
125
+ /** Default worker ready timeout */
126
+ readonly WORKER_READY_TIMEOUT_MS: 30000;
127
+ /** Graceful shutdown timeout before force kill */
128
+ readonly GRACEFUL_SHUTDOWN_TIMEOUT_MS: 5000;
129
+ /** Overall cleanup timeout */
130
+ readonly CLEANUP_TIMEOUT_MS: 10000;
131
+ /** Buffer time for internal timeout to ensure we return before outer timeout */
132
+ readonly TIMEOUT_BUFFER_MS: 5000;
133
+ /** Minimum internal timeout regardless of buffer */
134
+ readonly MIN_INTERNAL_TIMEOUT_MS: 1000;
135
+ /** Fixed max peers for fair benchmarking */
136
+ readonly FIXED_MAX_PEERS: 10;
137
+ /** Fixed max retry attempts for fair benchmarking */
138
+ readonly FIXED_MAX_RETRY_ATTEMPTS: 3;
139
+ /** LMDB map size for temp stores used in benchmarks (in KB). */
140
+ readonly KV_STORE_MAP_SIZE_KB: number;
141
+ };
142
+ /**
143
+ * Filters transactions based on distribution pattern for benchmark responders.
144
+ *
145
+ * @param allTxs - All transactions to filter
146
+ * @param peerIndex - Index of the current peer (0 = aggregator)
147
+ * @param peerCount - Total number of peers
148
+ * @param distribution - Distribution pattern to apply
149
+ * @param pinnedPeerIndex - Index of the pinned peer (for pinned-only distribution)
150
+ * @returns Filtered transactions for this peer
151
+ */
152
+ export declare function filterTxsByDistribution(allTxs: Tx[], peerIndex: number, peerCount: number, distribution: DistributionPattern, pinnedPeerIndex?: number): Tx[];
153
+ /**
154
+ * Calculates the internal timeout for collector operations.
155
+ * Ensures we return before the outer timeout while maintaining a minimum.
156
+ */
157
+ export declare function calculateInternalTimeout(timeoutMs: number): number;
158
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdGJlbmNoLXV0aWxzLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdC1oZWxwZXJzL3Rlc3RiZW5jaC11dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzlELE9BQU8sRUFBRSxLQUFLLFdBQVcsRUFBZSxVQUFVLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUM1RixPQUFPLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNwRCxPQUFPLEtBQUssRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzlFLE9BQU8sS0FBSyxFQUNWLGFBQWEsRUFDYixxQkFBcUIsRUFDckIsa0JBQWtCLEVBQ2xCLHNCQUFzQixFQUN2QixNQUFNLG1CQUFtQixDQUFDO0FBQzNCLE9BQU8sRUFBRSxLQUFLLFdBQVcsRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFaEUsT0FBTyxZQUFZLE1BQU0sUUFBUSxDQUFDO0FBRWxDLE9BQU8sS0FBSyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1EQUFtRCxDQUFDO0FBQ3pGLE9BQU8sS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBRzVEOzs7R0FHRztBQUNILHFCQUFhLGNBQWUsU0FBUSxZQUFhLFlBQVcsTUFBTTtJQUNoRSxPQUFPLENBQUMsU0FBUyxDQUF5QjtJQUMxQyxPQUFPLENBQUMsTUFBTSxDQUF1QjtJQUVyQyxTQUFTLENBQUMsTUFBTSxFQUFFLE1BQU0sR0FBRyxJQUFJLENBRTlCO0lBRUQsTUFBTSxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxNQUFNLENBR3hCO0lBRUQsU0FBUyxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxNQUFNLENBVTNCO0lBRUQsUUFBUSxJQUFJLElBQUksQ0FF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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testbench-utils.d.ts","sourceRoot":"","sources":["../../src/test-helpers/testbench-utils.ts"],"names":[],"mappings":"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"}