@aztec/p2p 0.0.1-commit.f295ac2 → 0.0.1-commit.fc805bf

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 (263) 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 +6 -5
  7. package/dest/client/p2p_client.d.ts +1 -1
  8. package/dest/client/p2p_client.d.ts.map +1 -1
  9. package/dest/client/p2p_client.js +9 -2
  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 +8 -2
  17. package/dest/config.d.ts.map +1 -1
  18. package/dest/config.js +2 -0
  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/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +3 -3
  23. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +1 -1
  24. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +3 -2
  25. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +1 -1
  26. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +3 -2
  27. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +1 -1
  28. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +3 -3
  29. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -1
  30. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +8 -1
  31. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +3 -3
  32. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -1
  33. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +2 -0
  34. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +3 -3
  35. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  36. package/dest/msg_validators/attestation_validator/attestation_validator.js +41 -10
  37. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +3 -3
  38. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
  39. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +18 -6
  40. package/dest/msg_validators/clock_tolerance.d.ts +21 -0
  41. package/dest/msg_validators/clock_tolerance.d.ts.map +1 -0
  42. package/dest/msg_validators/clock_tolerance.js +37 -0
  43. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +3 -3
  44. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
  45. package/dest/msg_validators/proposal_validator/proposal_validator.js +55 -31
  46. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +3 -3
  47. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +1 -1
  48. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +93 -64
  49. package/dest/msg_validators/tx_validator/archive_cache.d.ts +3 -3
  50. package/dest/msg_validators/tx_validator/archive_cache.d.ts.map +1 -1
  51. package/dest/msg_validators/tx_validator/archive_cache.js +1 -1
  52. package/dest/msg_validators/tx_validator/block_header_validator.d.ts +5 -4
  53. package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
  54. package/dest/msg_validators/tx_validator/block_header_validator.js +3 -2
  55. package/dest/msg_validators/tx_validator/data_validator.d.ts +3 -1
  56. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  57. package/dest/msg_validators/tx_validator/data_validator.js +4 -1
  58. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +3 -2
  59. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
  60. package/dest/msg_validators/tx_validator/double_spend_validator.js +3 -2
  61. package/dest/msg_validators/tx_validator/factory.d.ts +8 -3
  62. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  63. package/dest/msg_validators/tx_validator/factory.js +21 -11
  64. package/dest/msg_validators/tx_validator/gas_validator.d.ts +3 -2
  65. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  66. package/dest/msg_validators/tx_validator/gas_validator.js +3 -2
  67. package/dest/msg_validators/tx_validator/index.d.ts +2 -1
  68. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  69. package/dest/msg_validators/tx_validator/index.js +1 -0
  70. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +3 -2
  71. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  72. package/dest/msg_validators/tx_validator/metadata_validator.js +2 -2
  73. package/dest/msg_validators/tx_validator/phases_validator.d.ts +3 -2
  74. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
  75. package/dest/msg_validators/tx_validator/phases_validator.js +3 -3
  76. package/dest/msg_validators/tx_validator/size_validator.d.ts +8 -0
  77. package/dest/msg_validators/tx_validator/size_validator.d.ts.map +1 -0
  78. package/dest/msg_validators/tx_validator/size_validator.js +23 -0
  79. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +3 -2
  80. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
  81. package/dest/msg_validators/tx_validator/timestamp_validator.js +2 -2
  82. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts +3 -2
  83. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts.map +1 -1
  84. package/dest/msg_validators/tx_validator/tx_permitted_validator.js +2 -2
  85. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +3 -2
  86. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
  87. package/dest/msg_validators/tx_validator/tx_proof_validator.js +2 -2
  88. package/dest/services/data_store.d.ts +1 -1
  89. package/dest/services/data_store.d.ts.map +1 -1
  90. package/dest/services/data_store.js +10 -6
  91. package/dest/services/discv5/discV5_service.js +1 -1
  92. package/dest/services/dummy_service.d.ts +13 -1
  93. package/dest/services/dummy_service.d.ts.map +1 -1
  94. package/dest/services/dummy_service.js +39 -0
  95. package/dest/services/encoding.d.ts +1 -1
  96. package/dest/services/encoding.d.ts.map +1 -1
  97. package/dest/services/encoding.js +2 -3
  98. package/dest/services/libp2p/instrumentation.d.ts +1 -1
  99. package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
  100. package/dest/services/libp2p/instrumentation.js +14 -3
  101. package/dest/services/libp2p/libp2p_service.d.ts +13 -7
  102. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  103. package/dest/services/libp2p/libp2p_service.js +60 -51
  104. package/dest/services/peer-manager/metrics.d.ts +2 -2
  105. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  106. package/dest/services/peer-manager/metrics.js +20 -5
  107. package/dest/services/peer-manager/peer_scoring.d.ts +1 -1
  108. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  109. package/dest/services/peer-manager/peer_scoring.js +8 -2
  110. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +47 -0
  111. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -0
  112. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +566 -0
  113. package/dest/services/reqresp/batch-tx-requester/config.d.ts +17 -0
  114. package/dest/services/reqresp/batch-tx-requester/config.d.ts.map +1 -0
  115. package/dest/services/reqresp/batch-tx-requester/config.js +27 -0
  116. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +50 -0
  117. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -0
  118. package/dest/services/reqresp/batch-tx-requester/interface.js +1 -0
  119. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +37 -0
  120. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -0
  121. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +151 -0
  122. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +54 -0
  123. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -0
  124. package/dest/services/reqresp/batch-tx-requester/peer_collection.js +139 -0
  125. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +20 -0
  126. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -0
  127. package/dest/services/reqresp/batch-tx-requester/tx_validator.js +21 -0
  128. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +22 -3
  129. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +1 -1
  130. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +63 -4
  131. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +2 -1
  132. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -1
  133. package/dest/services/reqresp/connection-sampler/connection_sampler.js +12 -0
  134. package/dest/services/reqresp/interface.d.ts +5 -3
  135. package/dest/services/reqresp/interface.d.ts.map +1 -1
  136. package/dest/services/reqresp/interface.js +2 -2
  137. package/dest/services/reqresp/metrics.d.ts +6 -5
  138. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  139. package/dest/services/reqresp/metrics.js +17 -5
  140. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +5 -1
  141. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -1
  142. package/dest/services/reqresp/protocols/block_txs/bitvector.js +5 -0
  143. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +1 -1
  144. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
  145. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +16 -3
  146. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +18 -6
  147. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
  148. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +43 -13
  149. package/dest/services/reqresp/reqresp.d.ts +6 -1
  150. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  151. package/dest/services/reqresp/reqresp.js +58 -22
  152. package/dest/services/service.d.ts +4 -1
  153. package/dest/services/service.d.ts.map +1 -1
  154. package/dest/services/tx_collection/config.d.ts +4 -1
  155. package/dest/services/tx_collection/config.d.ts.map +1 -1
  156. package/dest/services/tx_collection/config.js +9 -1
  157. package/dest/services/tx_collection/fast_tx_collection.d.ts +6 -4
  158. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
  159. package/dest/services/tx_collection/fast_tx_collection.js +16 -5
  160. package/dest/services/tx_collection/index.d.ts +2 -1
  161. package/dest/services/tx_collection/index.d.ts.map +1 -1
  162. package/dest/services/tx_collection/index.js +1 -0
  163. package/dest/services/tx_collection/instrumentation.d.ts +1 -1
  164. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
  165. package/dest/services/tx_collection/instrumentation.js +9 -2
  166. package/dest/services/tx_collection/proposal_tx_collector.d.ts +48 -0
  167. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -0
  168. package/dest/services/tx_collection/proposal_tx_collector.js +50 -0
  169. package/dest/services/tx_collection/slow_tx_collection.d.ts +3 -3
  170. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -1
  171. package/dest/services/tx_collection/tx_collection.d.ts +8 -8
  172. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  173. package/dest/services/tx_collection/tx_collection.js +5 -5
  174. package/dest/services/tx_provider.d.ts +3 -3
  175. package/dest/services/tx_provider.d.ts.map +1 -1
  176. package/dest/services/tx_provider_instrumentation.d.ts +1 -1
  177. package/dest/services/tx_provider_instrumentation.d.ts.map +1 -1
  178. package/dest/services/tx_provider_instrumentation.js +5 -5
  179. package/dest/test-helpers/index.d.ts +3 -1
  180. package/dest/test-helpers/index.d.ts.map +1 -1
  181. package/dest/test-helpers/index.js +2 -0
  182. package/dest/test-helpers/test_tx_provider.d.ts +40 -0
  183. package/dest/test-helpers/test_tx_provider.d.ts.map +1 -0
  184. package/dest/test-helpers/test_tx_provider.js +41 -0
  185. package/dest/test-helpers/testbench-utils.d.ts +158 -0
  186. package/dest/test-helpers/testbench-utils.d.ts.map +1 -0
  187. package/dest/test-helpers/testbench-utils.js +297 -0
  188. package/dest/testbench/p2p_client_testbench_worker.d.ts +28 -2
  189. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  190. package/dest/testbench/p2p_client_testbench_worker.js +212 -133
  191. package/dest/testbench/worker_client_manager.d.ts +51 -6
  192. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  193. package/dest/testbench/worker_client_manager.js +226 -44
  194. package/package.json +14 -14
  195. package/src/bootstrap/bootstrap.ts +7 -4
  196. package/src/client/factory.ts +6 -10
  197. package/src/client/p2p_client.ts +14 -7
  198. package/src/client/test/tx_proposal_collector/README.md +227 -0
  199. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +336 -0
  200. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.ts +43 -0
  201. package/src/config.ts +6 -1
  202. package/src/mem_pools/instrumentation.ts +2 -1
  203. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +2 -2
  204. package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +2 -1
  205. package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +2 -1
  206. package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +10 -7
  207. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +4 -2
  208. package/src/msg_validators/attestation_validator/attestation_validator.ts +26 -14
  209. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +14 -8
  210. package/src/msg_validators/clock_tolerance.ts +51 -0
  211. package/src/msg_validators/proposal_validator/proposal_validator.ts +31 -31
  212. package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +91 -67
  213. package/src/msg_validators/tx_validator/archive_cache.ts +3 -3
  214. package/src/msg_validators/tx_validator/block_header_validator.ts +6 -5
  215. package/src/msg_validators/tx_validator/data_validator.ts +6 -2
  216. package/src/msg_validators/tx_validator/double_spend_validator.ts +4 -3
  217. package/src/msg_validators/tx_validator/factory.ts +64 -23
  218. package/src/msg_validators/tx_validator/gas_validator.ts +9 -3
  219. package/src/msg_validators/tx_validator/index.ts +1 -0
  220. package/src/msg_validators/tx_validator/metadata_validator.ts +6 -3
  221. package/src/msg_validators/tx_validator/phases_validator.ts +5 -3
  222. package/src/msg_validators/tx_validator/size_validator.ts +22 -0
  223. package/src/msg_validators/tx_validator/timestamp_validator.ts +6 -3
  224. package/src/msg_validators/tx_validator/tx_permitted_validator.ts +8 -3
  225. package/src/msg_validators/tx_validator/tx_proof_validator.ts +8 -3
  226. package/src/services/data_store.ts +10 -7
  227. package/src/services/discv5/discV5_service.ts +1 -1
  228. package/src/services/dummy_service.ts +45 -0
  229. package/src/services/encoding.ts +2 -3
  230. package/src/services/libp2p/instrumentation.ts +15 -2
  231. package/src/services/libp2p/libp2p_service.ts +99 -73
  232. package/src/services/peer-manager/metrics.ts +21 -4
  233. package/src/services/peer-manager/peer_scoring.ts +4 -1
  234. package/src/services/reqresp/batch-tx-requester/README.md +305 -0
  235. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +706 -0
  236. package/src/services/reqresp/batch-tx-requester/config.ts +40 -0
  237. package/src/services/reqresp/batch-tx-requester/interface.ts +57 -0
  238. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +209 -0
  239. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +205 -0
  240. package/src/services/reqresp/batch-tx-requester/tx_validator.ts +37 -0
  241. package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +65 -4
  242. package/src/services/reqresp/connection-sampler/connection_sampler.ts +16 -0
  243. package/src/services/reqresp/interface.ts +5 -2
  244. package/src/services/reqresp/metrics.ts +34 -9
  245. package/src/services/reqresp/protocols/block_txs/bitvector.ts +7 -0
  246. package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +18 -4
  247. package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +51 -9
  248. package/src/services/reqresp/reqresp.ts +66 -19
  249. package/src/services/service.ts +4 -0
  250. package/src/services/tx_collection/config.ts +15 -1
  251. package/src/services/tx_collection/fast_tx_collection.ts +36 -13
  252. package/src/services/tx_collection/index.ts +5 -0
  253. package/src/services/tx_collection/instrumentation.ts +11 -2
  254. package/src/services/tx_collection/proposal_tx_collector.ts +114 -0
  255. package/src/services/tx_collection/slow_tx_collection.ts +2 -2
  256. package/src/services/tx_collection/tx_collection.ts +8 -8
  257. package/src/services/tx_provider.ts +2 -2
  258. package/src/services/tx_provider_instrumentation.ts +11 -5
  259. package/src/test-helpers/index.ts +2 -0
  260. package/src/test-helpers/test_tx_provider.ts +64 -0
  261. package/src/test-helpers/testbench-utils.ts +374 -0
  262. package/src/testbench/p2p_client_testbench_worker.ts +321 -126
  263. package/src/testbench/worker_client_manager.ts +304 -47
@@ -1,130 +1,97 @@
1
1
  /**
2
2
  * A testbench worker that creates a p2p client and listens for commands from the parent.
3
3
  *
4
- * Used when running testbench commands
4
+ * Used when running testbench commands.
5
5
  */
6
6
  import { MockL2BlockSource } from '@aztec/archiver/test';
7
7
  import type { EpochCacheInterface } from '@aztec/epoch-cache';
8
- import { EpochNumber, SlotNumber } from '@aztec/foundation/branded-types';
8
+ import { BlockNumber } from '@aztec/foundation/branded-types';
9
9
  import { SecretValue } from '@aztec/foundation/config';
10
- import { EthAddress } from '@aztec/foundation/eth-address';
11
- import { createLogger } from '@aztec/foundation/log';
10
+ import { Secp256k1Signer } from '@aztec/foundation/crypto/secp256k1-signer';
11
+ import { Fr } from '@aztec/foundation/curves/bn254';
12
+ import { type Logger, createLogger } from '@aztec/foundation/log';
12
13
  import { sleep } from '@aztec/foundation/sleep';
14
+ import { DateProvider, Timer } from '@aztec/foundation/timer';
13
15
  import type { DataStoreConfig } from '@aztec/kv-store/config';
14
16
  import { openTmpStore } from '@aztec/kv-store/lmdb-v2';
17
+ import { getVKTreeRoot } from '@aztec/noir-protocol-circuits-types/vk-tree';
18
+ import { protocolContractsHash } from '@aztec/protocol-contracts';
15
19
  import type { L2BlockSource } from '@aztec/stdlib/block';
16
20
  import type { ContractDataSource } from '@aztec/stdlib/contract';
17
21
  import type { ClientProtocolCircuitVerifier, WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
18
- import { P2PClientType, P2PMessage } from '@aztec/stdlib/p2p';
19
- import { Tx, TxStatus } from '@aztec/stdlib/tx';
22
+ import { type BlockProposal, P2PClientType, P2PMessage } from '@aztec/stdlib/p2p';
23
+ import { ChonkProof } from '@aztec/stdlib/proofs';
24
+ import { makeAztecAddress, makeBlockHeader, makeBlockProposal, mockTx } from '@aztec/stdlib/testing';
25
+ import { Tx, TxHash, type TxValidationResult } from '@aztec/stdlib/tx';
20
26
  import { type TelemetryClient, getTelemetryClient } from '@aztec/telemetry-client';
21
27
 
22
28
  import type { Message, PeerId } from '@libp2p/interface';
23
29
  import { TopicValidatorResult } from '@libp2p/interface';
24
- import EventEmitter from 'events';
30
+ import { peerIdFromString } from '@libp2p/peer-id';
25
31
 
32
+ import type { P2PClient } from '../client/p2p_client.js';
26
33
  import type { P2PConfig } from '../config.js';
27
34
  import { createP2PClient } from '../index.js';
28
- import type { AttestationPool } from '../mem_pools/attestation_pool/attestation_pool.js';
29
35
  import type { MemPools } from '../mem_pools/interface.js';
30
- import type { TxPool } from '../mem_pools/tx_pool/index.js';
31
36
  import { LibP2PService } from '../services/libp2p/libp2p_service.js';
32
37
  import type { PeerManager } from '../services/peer-manager/peer_manager.js';
38
+ import type { BatchTxRequesterLibP2PService } from '../services/reqresp/batch-tx-requester/interface.js';
39
+ import type { IBatchRequestTxValidator } from '../services/reqresp/batch-tx-requester/tx_validator.js';
40
+ import { RateLimitStatus } from '../services/reqresp/rate-limiter/rate_limiter.js';
33
41
  import type { ReqResp } from '../services/reqresp/reqresp.js';
34
42
  import type { PeerDiscoveryService } from '../services/service.js';
43
+ import {
44
+ BatchTxRequesterCollector,
45
+ SendBatchRequestCollector,
46
+ } from '../services/tx_collection/proposal_tx_collector.js';
35
47
  import { AlwaysTrueCircuitVerifier } from '../test-helpers/reqresp-nodes.js';
48
+ import {
49
+ BENCHMARK_CONSTANTS,
50
+ type CollectorType,
51
+ type DistributionPattern,
52
+ InMemoryAttestationPool,
53
+ InMemoryTxPool,
54
+ UNLIMITED_RATE_LIMIT_QUOTA,
55
+ createMockEpochCache,
56
+ createMockWorldStateSynchronizer,
57
+ filterTxsByDistribution,
58
+ } from '../test-helpers/testbench-utils.js';
36
59
  import type { PubSubLibp2p } from '../util.js';
37
60
 
38
- // Simple mock implementation
39
- function mockTxPool(): TxPool {
40
- // Mock all methods
41
- const pool: Omit<TxPool, keyof EventEmitter> = {
42
- isEmpty: () => Promise.resolve(false),
43
- addTxs: () => Promise.resolve(1),
44
- getTxByHash: () => Promise.resolve(undefined),
45
- getArchivedTxByHash: () => Promise.resolve(undefined),
46
- markAsMined: () => Promise.resolve(),
47
- markMinedAsPending: () => Promise.resolve(),
48
- deleteTxs: () => Promise.resolve(),
49
- getAllTxs: () => Promise.resolve([]),
50
- getAllTxHashes: () => Promise.resolve([]),
51
- getPendingTxHashes: () => Promise.resolve([]),
52
- getPendingTxCount: () => Promise.resolve(0),
53
- getMinedTxHashes: () => Promise.resolve([]),
54
- getTxStatus: () => Promise.resolve(TxStatus.PENDING),
55
- getTxsByHash: () => Promise.resolve([]),
56
- hasTxs: () => Promise.resolve([]),
57
- hasTx: () => Promise.resolve(false),
58
- updateConfig: () => {},
59
- markTxsAsNonEvictable: () => Promise.resolve(),
60
- clearNonEvictableTxs: () => Promise.resolve(),
61
- cleanupDeletedMinedTxs: () => Promise.resolve(0),
62
- };
63
- return Object.assign(new EventEmitter(), pool);
64
- }
61
+ export type { DistributionPattern, CollectorType } from '../test-helpers/testbench-utils.js';
62
+ export { COLLECTOR_DISPLAY_NAMES } from '../test-helpers/testbench-utils.js';
65
63
 
66
- function mockAttestationPool(): AttestationPool {
67
- return {
68
- isEmpty: () => Promise.resolve(false),
69
- addBlockProposal: () => Promise.resolve(),
70
- getBlockProposal: () => Promise.resolve(undefined),
71
- hasBlockProposal: () => Promise.resolve(false),
72
- canAddProposal: () => Promise.resolve(true),
73
- // Checkpoint attestation methods
74
- addCheckpointProposal: () => Promise.resolve(),
75
- getCheckpointProposal: () => Promise.resolve(undefined),
76
- hasCheckpointProposal: () => Promise.resolve(false),
77
- addCheckpointAttestations: () => Promise.resolve(),
78
- getCheckpointAttestationsForSlot: () => Promise.resolve([]),
79
- getCheckpointAttestationsForSlotAndProposal: () => Promise.resolve([]),
80
- deleteCheckpointAttestationsOlderThan: () => Promise.resolve(),
81
- hasReachedCheckpointProposalCap: () => Promise.resolve(false),
82
- hasReachedCheckpointAttestationCap: () => Promise.resolve(false),
83
- canAddCheckpointProposal: () => Promise.resolve(true),
84
- canAddCheckpointAttestation: () => Promise.resolve(true),
85
- hasCheckpointAttestation: () => Promise.resolve(false),
86
- };
64
+ export interface BenchReqRespCommand {
65
+ type: 'BENCH_REQRESP';
66
+ txCount: number;
67
+ peerCount: number;
68
+ distribution: DistributionPattern;
69
+ collectorType: CollectorType;
70
+ timeoutMs: number;
71
+ isAggregator: boolean;
72
+ peerIndex: number;
73
+ pinnedPeerIndex?: number;
74
+ pinnedPeerId?: string;
75
+ blockNumber: number;
76
+ seed: number;
87
77
  }
88
78
 
89
- function mockEpochCache(): EpochCacheInterface {
90
- return {
91
- getCommittee: () => Promise.resolve({ committee: [], seed: 1n, epoch: EpochNumber.ZERO, isEscapeHatchOpen: false }),
92
- getProposerIndexEncoding: () => '0x' as `0x${string}`,
93
- getEpochAndSlotNow: () => ({ epoch: EpochNumber.ZERO, slot: SlotNumber.ZERO, ts: 0n }),
94
- computeProposerIndex: () => 0n,
95
- getProposerAttesterAddressInCurrentOrNextSlot: () =>
96
- Promise.resolve({
97
- currentProposer: EthAddress.ZERO,
98
- nextProposer: EthAddress.ZERO,
99
- currentSlot: SlotNumber.ZERO,
100
- nextSlot: SlotNumber.ZERO,
101
- }),
102
- getProposerAttesterAddressInSlot: () => Promise.resolve(undefined),
103
- getEpochAndSlotInNextL1Slot: () => ({ epoch: EpochNumber.ZERO, slot: SlotNumber.ZERO, ts: 0n, now: 0n }),
104
- isInCommittee: () => Promise.resolve(false),
105
- getRegisteredValidators: () => Promise.resolve([]),
106
- filterInCommittee: () => Promise.resolve([]),
107
- };
79
+ export interface BenchResultMessage {
80
+ type: 'BENCH_RESULT';
81
+ durationMs: number;
82
+ fetchedCount: number;
83
+ success: boolean;
84
+ error?: string;
108
85
  }
109
86
 
110
- function mockWorldStateSynchronizer(): WorldStateSynchronizer {
111
- return {
112
- status: () =>
113
- Promise.resolve({
114
- syncSummary: {
115
- latestBlockNumber: 0,
116
- latestBlockHash: '',
117
- finalizedBlockNumber: 0,
118
- treesAreSynched: false,
119
- oldestHistoricBlockNumber: 0,
120
- },
121
- }),
122
- } as WorldStateSynchronizer;
87
+ export interface BenchReadyMessage {
88
+ type: 'BENCH_READY';
123
89
  }
90
+ const txCache = new Map<number, Tx[]>();
124
91
 
125
92
  class TestLibP2PService<T extends P2PClientType = P2PClientType.Full> extends LibP2PService<T> {
126
93
  private disableTxValidation: boolean;
127
- private gossipMessageCount: number = 0;
94
+ private gossipMessageCount = 0;
128
95
 
129
96
  constructor(
130
97
  clientType: T,
@@ -193,10 +160,166 @@ class TestLibP2PService<T extends P2PClientType = P2PClientType.Full> extends Li
193
160
  }
194
161
  }
195
162
 
163
+ async function generateDeterministicTxs(txCount: number, seed: number, config: P2PConfig): Promise<Tx[]> {
164
+ const cached = txCache.get(seed) ?? [];
165
+ if (cached.length >= txCount) {
166
+ return cached.slice(0, txCount);
167
+ }
168
+
169
+ const includeByTimestampBase = BigInt(seed);
170
+ for (let i = cached.length; i < txCount; i++) {
171
+ const txSeed = seed * 10000 + i;
172
+ const tx = await mockTx(txSeed, {
173
+ chainId: new Fr(config.l1ChainId),
174
+ version: new Fr(config.rollupVersion),
175
+ vkTreeRoot: getVKTreeRoot(),
176
+ protocolContractsHash,
177
+ feePayer: makeAztecAddress(txSeed + 1),
178
+ chonkProof: ChonkProof.empty(),
179
+ numberOfNonRevertiblePublicCallRequests: 0,
180
+ numberOfRevertiblePublicCallRequests: 0,
181
+ numberOfRevertibleNullifiers: 0,
182
+ hasPublicTeardownCallRequest: false,
183
+ publicCalldataSize: 0,
184
+ });
185
+ tx.data.includeByTimestamp = includeByTimestampBase + BigInt(i);
186
+ await tx.recomputeHash();
187
+ cached.push(tx);
188
+ }
189
+
190
+ txCache.set(seed, cached);
191
+ return cached.slice(0, txCount);
192
+ }
193
+
194
+ async function createBlockProposal(blockNumber: number, txHashes: TxHash[], seed: number): Promise<BlockProposal> {
195
+ const archiveRoot = new Fr(BigInt(seed) * 1000000n + BigInt(blockNumber));
196
+ return await makeBlockProposal({
197
+ signer: Secp256k1Signer.random(),
198
+ blockHeader: makeBlockHeader(1, { blockNumber: BlockNumber(blockNumber) }),
199
+ archiveRoot,
200
+ txHashes,
201
+ });
202
+ }
203
+
204
+ function installUnlimitedRateLimits(client: P2PClient): void {
205
+ const reqResp = (client as any).p2pService.reqresp as any;
206
+ const rateLimiter = reqResp.rateLimiter as any;
207
+
208
+ rateLimiter.getRateLimits = () => UNLIMITED_RATE_LIMIT_QUOTA;
209
+ rateLimiter.allow = () => RateLimitStatus.Allowed;
210
+ }
211
+
212
+ async function runAggregatorBenchmark(
213
+ client: P2PClient,
214
+ blockProposal: BlockProposal,
215
+ collectorType: CollectorType,
216
+ timeoutMs: number,
217
+ pinnedPeerId: string | undefined,
218
+ pinnedPeerIndex: number | undefined,
219
+ logger: Logger,
220
+ expectedPeerCount: number,
221
+ ): Promise<BenchResultMessage> {
222
+ let timer = new Timer();
223
+ try {
224
+ installUnlimitedRateLimits(client);
225
+
226
+ const txHashes = blockProposal.txHashes;
227
+ logger.info(`[BENCH] Using block proposal with archive ${blockProposal.archive.toString().slice(0, 10)}...`);
228
+
229
+ const p2pService = (client as any).p2pService;
230
+ const batchTxRequesterService: BatchTxRequesterLibP2PService = p2pService.getBatchTxRequesterService();
231
+
232
+ const minPeersRequired = Math.max(1, expectedPeerCount - 1);
233
+ const maxWaitMs = BENCHMARK_CONSTANTS.MAX_PEER_WAIT_MS;
234
+ const waitInterval = BENCHMARK_CONSTANTS.PEER_CHECK_INTERVAL_MS;
235
+ let waited = 0;
236
+
237
+ while (waited < maxWaitMs) {
238
+ const connectedPeers = batchTxRequesterService.connectionSampler.getPeerListSortedByConnectionCountAsc();
239
+ if (connectedPeers.length >= minPeersRequired) {
240
+ logger.info(`[BENCH] Aggregator has ${connectedPeers.length} connected peers, starting benchmark`);
241
+ break;
242
+ }
243
+ logger.debug(`[BENCH] Waiting for peers: ${connectedPeers.length}/${minPeersRequired} (waited ${waited}ms)`);
244
+ await sleep(waitInterval);
245
+ waited += waitInterval;
246
+ }
247
+
248
+ const connectedPeers = batchTxRequesterService.connectionSampler.getPeerListSortedByConnectionCountAsc();
249
+ logger.info(`[BENCH] Aggregator has ${connectedPeers.length} connected peers`);
250
+ logger.info(
251
+ `[BENCH] Requesting ${txHashes.length} tx hashes: ${txHashes
252
+ .slice(0, 3)
253
+ .map(h => h.toString())
254
+ .join(', ')}...`,
255
+ );
256
+
257
+ let pinnedPeer: PeerId | undefined;
258
+ if (pinnedPeerId) {
259
+ pinnedPeer = peerIdFromString(pinnedPeerId);
260
+ } else if (pinnedPeerIndex !== undefined) {
261
+ if (pinnedPeerIndex > 0 && pinnedPeerIndex <= connectedPeers.length) {
262
+ pinnedPeer = connectedPeers[pinnedPeerIndex - 1];
263
+ }
264
+ }
265
+
266
+ const noopTxValidator: IBatchRequestTxValidator = {
267
+ validateRequestedTx: (_tx: Tx): Promise<TxValidationResult> => Promise.resolve({ result: 'valid' }),
268
+ validateRequestedTxs: (txs: Tx[]): Promise<TxValidationResult[]> =>
269
+ Promise.resolve(txs.map(() => ({ result: 'valid' }))),
270
+ };
271
+
272
+ timer = new Timer();
273
+ if (collectorType === 'batch-requester') {
274
+ const collector = new BatchTxRequesterCollector(
275
+ batchTxRequesterService,
276
+ logger,
277
+ new DateProvider(),
278
+ noopTxValidator,
279
+ );
280
+ const fetchedTxs = await collector.collectTxs(txHashes, blockProposal, pinnedPeer, timeoutMs);
281
+ const durationMs = timer.ms();
282
+ return {
283
+ type: 'BENCH_RESULT',
284
+ durationMs,
285
+ fetchedCount: fetchedTxs.length,
286
+ success: fetchedTxs.length === txHashes.length,
287
+ };
288
+ }
289
+
290
+ const collector = new SendBatchRequestCollector(
291
+ batchTxRequesterService,
292
+ BENCHMARK_CONSTANTS.FIXED_MAX_PEERS,
293
+ BENCHMARK_CONSTANTS.FIXED_MAX_RETRY_ATTEMPTS,
294
+ );
295
+ const fetchedTxs = await collector.collectTxs(txHashes, blockProposal, pinnedPeer, timeoutMs);
296
+ const durationMs = timer.ms();
297
+ return {
298
+ type: 'BENCH_RESULT',
299
+ durationMs,
300
+ fetchedCount: fetchedTxs.length,
301
+ success: fetchedTxs.length === txHashes.length,
302
+ };
303
+ } catch (err: any) {
304
+ return {
305
+ type: 'BENCH_RESULT',
306
+ durationMs: timer.ms(),
307
+ fetchedCount: 0,
308
+ success: false,
309
+ error: err?.message ?? String(err),
310
+ };
311
+ }
312
+ }
313
+
314
+ let workerClient: P2PClient | null = null;
315
+ let workerTxPool: InMemoryTxPool | null = null;
316
+ let workerAttestationPool: InMemoryAttestationPool | null = null;
317
+ let workerConfig: P2PConfig | null = null;
318
+ let workerLogger: Logger | null = null;
319
+ let kvStore: Awaited<ReturnType<typeof openTmpStore>> | null = null;
320
+
196
321
  // eslint-disable-next-line @typescript-eslint/no-misused-promises
197
322
  process.on('message', async msg => {
198
- // Note: peerIdPrivateKey comes as a raw string (not SecretValue) because
199
- // SecretValue's private fields can't be serialized via IPC
200
323
  const {
201
324
  type,
202
325
  config: rawConfig,
@@ -206,47 +329,47 @@ process.on('message', async msg => {
206
329
  config: Omit<P2PConfig, 'peerIdPrivateKey'> & { peerIdPrivateKey?: string };
207
330
  clientIndex: number;
208
331
  };
332
+
209
333
  try {
210
334
  if (type === 'START') {
211
- // Re-wrap the peerIdPrivateKey with SecretValue
212
335
  const config: P2PConfig = {
213
336
  ...rawConfig,
214
337
  peerIdPrivateKey: rawConfig.peerIdPrivateKey ? new SecretValue(rawConfig.peerIdPrivateKey) : undefined,
215
338
  } as P2PConfig;
216
339
 
217
- const txPool = mockTxPool();
218
- const attestationPool = mockAttestationPool();
219
- const epochCache = mockEpochCache();
220
- const worldState = mockWorldStateSynchronizer();
340
+ workerConfig = config;
341
+ workerTxPool = new InMemoryTxPool();
342
+ workerAttestationPool = new InMemoryAttestationPool();
343
+ const epochCache = createMockEpochCache();
344
+ const worldState = createMockWorldStateSynchronizer();
221
345
  const l2BlockSource = new MockL2BlockSource();
222
346
 
223
347
  const proofVerifier = new AlwaysTrueCircuitVerifier();
224
- const kvStore = await openTmpStore(`test-${clientIndex}`);
225
- const logger = createLogger(`p2p:${clientIndex}`);
348
+ kvStore = await openTmpStore(`test-${clientIndex}`, true, BENCHMARK_CONSTANTS.KV_STORE_MAP_SIZE_KB);
349
+ workerLogger = createLogger(`p2p:${clientIndex}`);
350
+ workerTxPool.setLogger(workerLogger);
226
351
  const telemetry = getTelemetryClient();
227
352
 
228
353
  const deps = {
229
- txPool,
230
- attestationPool,
354
+ txPool: workerTxPool,
355
+ attestationPool: workerAttestationPool,
231
356
  store: kvStore,
232
- logger,
357
+ logger: workerLogger,
233
358
  };
234
359
 
235
360
  const client = await createP2PClient(
236
361
  P2PClientType.Full,
237
362
  config as P2PConfig & DataStoreConfig,
238
363
  l2BlockSource,
239
- proofVerifier,
364
+ proofVerifier as ClientProtocolCircuitVerifier,
240
365
  worldState,
241
366
  epochCache,
242
367
  'test-p2p-bench-worker',
243
368
  undefined,
244
- telemetry,
369
+ telemetry as TelemetryClient,
245
370
  deps,
246
371
  );
247
372
 
248
- // Create test service with validation disabled
249
- // Note: Parameter order must match LibP2PService constructor
250
373
  const testService = new TestLibP2PService(
251
374
  P2PClientType.Full,
252
375
  config,
@@ -259,41 +382,113 @@ process.on('message', async msg => {
259
382
  epochCache,
260
383
  proofVerifier,
261
384
  worldState,
262
- telemetry,
263
- logger,
264
- true, // disable validation
385
+ telemetry as TelemetryClient,
386
+ workerLogger,
387
+ true,
265
388
  );
266
389
 
267
- // Replace the existing p2pService with our test version
268
390
  (client as any).p2pService = testService;
269
391
 
270
392
  await client.start();
271
- // Wait until the client is ready
272
393
  for (let i = 0; i < 100; i++) {
273
394
  const isReady = client.isReady();
274
- logger.debug(`Client ${clientIndex} isReady: ${isReady}`);
395
+ workerLogger.debug(`Client ${clientIndex} isReady: ${isReady}`);
275
396
  if (isReady) {
276
397
  break;
277
398
  }
278
399
  await sleep(1000);
279
400
  }
280
401
 
281
- // Listen for commands from parent
282
- // eslint-disable-next-line @typescript-eslint/no-misused-promises
283
- process.on('message', async (cmd: any) => {
284
- switch (cmd.type) {
285
- case 'STOP':
286
- await client.stop();
287
- process.exit(0);
288
- break;
289
- case 'SEND_TX':
290
- await client.sendTx(Tx.fromBuffer(Buffer.from(cmd.tx)));
291
- process.send!({ type: 'TX_SENT' });
292
- break;
402
+ workerClient = client;
403
+ const peerId = (client as any).p2pService.node.peerId.toString();
404
+ process.send!({ type: 'READY', peerId });
405
+ return;
406
+ }
407
+
408
+ const cmd = msg as any;
409
+ switch (cmd.type) {
410
+ case 'STOP':
411
+ if (workerClient) {
412
+ await workerClient.stop();
413
+ }
414
+ if (kvStore?.close) {
415
+ await kvStore.close();
416
+ }
417
+ process.exit(0);
418
+ break;
419
+
420
+ case 'SEND_TX':
421
+ if (workerClient) {
422
+ await workerClient.sendTx(Tx.fromBuffer(Buffer.from(cmd.tx)));
423
+ process.send!({ type: 'TX_SENT' });
424
+ }
425
+ break;
426
+
427
+ case 'BENCH_REQRESP': {
428
+ const benchCmd = cmd as BenchReqRespCommand;
429
+ if (!workerClient || !workerTxPool || !workerAttestationPool || !workerConfig || !workerLogger) {
430
+ process.send!({
431
+ type: 'BENCH_RESULT',
432
+ durationMs: 0,
433
+ fetchedCount: 0,
434
+ success: false,
435
+ error: 'Worker not initialized',
436
+ } as BenchResultMessage);
437
+ break;
293
438
  }
294
- });
295
439
 
296
- process.send!({ type: 'READY' });
440
+ // Reset state before each benchmark run to avoid cross-run contamination
441
+ workerTxPool.resetState();
442
+ workerAttestationPool.resetState();
443
+
444
+ installUnlimitedRateLimits(workerClient);
445
+
446
+ const allTxs = await generateDeterministicTxs(benchCmd.txCount, benchCmd.seed, workerConfig);
447
+ const txHashes = allTxs.map(tx => tx.getTxHash());
448
+ const blockProposal = await createBlockProposal(benchCmd.blockNumber, txHashes, benchCmd.seed);
449
+
450
+ await workerAttestationPool.addBlockProposal(blockProposal);
451
+ workerLogger.debug(
452
+ `[BENCH] Added block proposal with archive ${blockProposal.archive.toString().slice(0, 10)}...`,
453
+ );
454
+
455
+ if (benchCmd.isAggregator) {
456
+ workerTxPool.clearTxs();
457
+
458
+ workerLogger.info(
459
+ `[BENCH] Aggregator starting benchmark: txCount=${benchCmd.txCount}, collector=${benchCmd.collectorType}, distribution=${benchCmd.distribution}`,
460
+ );
461
+
462
+ const result = await runAggregatorBenchmark(
463
+ workerClient,
464
+ blockProposal,
465
+ benchCmd.collectorType,
466
+ benchCmd.timeoutMs,
467
+ benchCmd.pinnedPeerId,
468
+ benchCmd.pinnedPeerIndex,
469
+ workerLogger,
470
+ benchCmd.peerCount,
471
+ );
472
+
473
+ process.send!(result);
474
+ } else {
475
+ const myTxs = filterTxsByDistribution(
476
+ allTxs,
477
+ benchCmd.peerIndex,
478
+ benchCmd.peerCount,
479
+ benchCmd.distribution,
480
+ benchCmd.pinnedPeerIndex,
481
+ );
482
+ workerTxPool.setTxs(myTxs);
483
+
484
+ workerLogger.info(
485
+ `[BENCH] Peer ${benchCmd.peerIndex} populated tx pool with ${myTxs.length}/${benchCmd.txCount} txs (${benchCmd.distribution})`,
486
+ );
487
+
488
+ process.send!({ type: 'BENCH_READY' } as BenchReadyMessage);
489
+ }
490
+ break;
491
+ }
297
492
  }
298
493
  } catch (err: any) {
299
494
  process.send!({ type: 'ERROR', error: err.message });