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

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 (217) 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/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/proposal_validator/proposal_validator.js +5 -5
  26. package/dest/msg_validators/tx_validator/archive_cache.d.ts +3 -3
  27. package/dest/msg_validators/tx_validator/archive_cache.d.ts.map +1 -1
  28. package/dest/msg_validators/tx_validator/archive_cache.js +1 -1
  29. package/dest/msg_validators/tx_validator/block_header_validator.d.ts +5 -4
  30. package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
  31. package/dest/msg_validators/tx_validator/block_header_validator.js +3 -2
  32. package/dest/msg_validators/tx_validator/data_validator.d.ts +3 -1
  33. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  34. package/dest/msg_validators/tx_validator/data_validator.js +4 -1
  35. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +3 -2
  36. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
  37. package/dest/msg_validators/tx_validator/double_spend_validator.js +3 -2
  38. package/dest/msg_validators/tx_validator/factory.d.ts +8 -3
  39. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  40. package/dest/msg_validators/tx_validator/factory.js +21 -11
  41. package/dest/msg_validators/tx_validator/gas_validator.d.ts +3 -2
  42. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  43. package/dest/msg_validators/tx_validator/gas_validator.js +3 -2
  44. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +3 -2
  45. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  46. package/dest/msg_validators/tx_validator/metadata_validator.js +2 -2
  47. package/dest/msg_validators/tx_validator/phases_validator.d.ts +3 -2
  48. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
  49. package/dest/msg_validators/tx_validator/phases_validator.js +3 -3
  50. package/dest/msg_validators/tx_validator/size_validator.d.ts +3 -1
  51. package/dest/msg_validators/tx_validator/size_validator.d.ts.map +1 -1
  52. package/dest/msg_validators/tx_validator/size_validator.js +4 -1
  53. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +3 -2
  54. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
  55. package/dest/msg_validators/tx_validator/timestamp_validator.js +2 -2
  56. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts +3 -2
  57. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts.map +1 -1
  58. package/dest/msg_validators/tx_validator/tx_permitted_validator.js +2 -2
  59. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +3 -2
  60. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
  61. package/dest/msg_validators/tx_validator/tx_proof_validator.js +2 -2
  62. package/dest/services/data_store.d.ts +1 -1
  63. package/dest/services/data_store.d.ts.map +1 -1
  64. package/dest/services/data_store.js +10 -6
  65. package/dest/services/discv5/discV5_service.js +1 -1
  66. package/dest/services/dummy_service.d.ts +13 -1
  67. package/dest/services/dummy_service.d.ts.map +1 -1
  68. package/dest/services/dummy_service.js +39 -0
  69. package/dest/services/libp2p/instrumentation.d.ts +1 -1
  70. package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
  71. package/dest/services/libp2p/instrumentation.js +14 -3
  72. package/dest/services/libp2p/libp2p_service.d.ts +9 -3
  73. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  74. package/dest/services/libp2p/libp2p_service.js +37 -28
  75. package/dest/services/peer-manager/metrics.d.ts +2 -2
  76. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  77. package/dest/services/peer-manager/metrics.js +20 -5
  78. package/dest/services/peer-manager/peer_scoring.d.ts +1 -1
  79. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  80. package/dest/services/peer-manager/peer_scoring.js +8 -2
  81. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +47 -0
  82. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -0
  83. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +566 -0
  84. package/dest/services/reqresp/batch-tx-requester/config.d.ts +17 -0
  85. package/dest/services/reqresp/batch-tx-requester/config.d.ts.map +1 -0
  86. package/dest/services/reqresp/batch-tx-requester/config.js +27 -0
  87. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +50 -0
  88. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -0
  89. package/dest/services/reqresp/batch-tx-requester/interface.js +1 -0
  90. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +37 -0
  91. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -0
  92. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +151 -0
  93. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +54 -0
  94. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -0
  95. package/dest/services/reqresp/batch-tx-requester/peer_collection.js +139 -0
  96. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +20 -0
  97. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -0
  98. package/dest/services/reqresp/batch-tx-requester/tx_validator.js +21 -0
  99. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +22 -3
  100. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +1 -1
  101. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +63 -4
  102. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +2 -1
  103. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -1
  104. package/dest/services/reqresp/connection-sampler/connection_sampler.js +12 -0
  105. package/dest/services/reqresp/interface.d.ts +3 -1
  106. package/dest/services/reqresp/interface.d.ts.map +1 -1
  107. package/dest/services/reqresp/metrics.d.ts +6 -5
  108. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  109. package/dest/services/reqresp/metrics.js +17 -5
  110. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +5 -1
  111. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -1
  112. package/dest/services/reqresp/protocols/block_txs/bitvector.js +5 -0
  113. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +1 -1
  114. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
  115. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +16 -3
  116. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +18 -6
  117. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
  118. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +43 -13
  119. package/dest/services/reqresp/reqresp.d.ts +6 -1
  120. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  121. package/dest/services/reqresp/reqresp.js +58 -22
  122. package/dest/services/service.d.ts +4 -1
  123. package/dest/services/service.d.ts.map +1 -1
  124. package/dest/services/tx_collection/config.d.ts +4 -1
  125. package/dest/services/tx_collection/config.d.ts.map +1 -1
  126. package/dest/services/tx_collection/config.js +9 -1
  127. package/dest/services/tx_collection/fast_tx_collection.d.ts +6 -4
  128. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
  129. package/dest/services/tx_collection/fast_tx_collection.js +16 -5
  130. package/dest/services/tx_collection/index.d.ts +2 -1
  131. package/dest/services/tx_collection/index.d.ts.map +1 -1
  132. package/dest/services/tx_collection/index.js +1 -0
  133. package/dest/services/tx_collection/instrumentation.d.ts +1 -1
  134. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
  135. package/dest/services/tx_collection/instrumentation.js +9 -2
  136. package/dest/services/tx_collection/proposal_tx_collector.d.ts +48 -0
  137. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -0
  138. package/dest/services/tx_collection/proposal_tx_collector.js +50 -0
  139. package/dest/services/tx_collection/tx_collection.d.ts +4 -4
  140. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  141. package/dest/services/tx_collection/tx_collection.js +5 -5
  142. package/dest/services/tx_provider_instrumentation.d.ts +1 -1
  143. package/dest/services/tx_provider_instrumentation.d.ts.map +1 -1
  144. package/dest/services/tx_provider_instrumentation.js +5 -5
  145. package/dest/test-helpers/index.d.ts +3 -1
  146. package/dest/test-helpers/index.d.ts.map +1 -1
  147. package/dest/test-helpers/index.js +2 -0
  148. package/dest/test-helpers/test_tx_provider.d.ts +40 -0
  149. package/dest/test-helpers/test_tx_provider.d.ts.map +1 -0
  150. package/dest/test-helpers/test_tx_provider.js +41 -0
  151. package/dest/test-helpers/testbench-utils.d.ts +158 -0
  152. package/dest/test-helpers/testbench-utils.d.ts.map +1 -0
  153. package/dest/test-helpers/testbench-utils.js +297 -0
  154. package/dest/testbench/p2p_client_testbench_worker.d.ts +28 -2
  155. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  156. package/dest/testbench/p2p_client_testbench_worker.js +212 -131
  157. package/dest/testbench/worker_client_manager.d.ts +51 -6
  158. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  159. package/dest/testbench/worker_client_manager.js +226 -44
  160. package/package.json +14 -14
  161. package/src/bootstrap/bootstrap.ts +7 -4
  162. package/src/client/factory.ts +6 -10
  163. package/src/client/p2p_client.ts +9 -2
  164. package/src/client/test/tx_proposal_collector/README.md +227 -0
  165. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +336 -0
  166. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.ts +43 -0
  167. package/src/config.ts +6 -1
  168. package/src/mem_pools/instrumentation.ts +2 -1
  169. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +8 -2
  170. package/src/msg_validators/proposal_validator/proposal_validator.ts +5 -5
  171. package/src/msg_validators/tx_validator/archive_cache.ts +3 -3
  172. package/src/msg_validators/tx_validator/block_header_validator.ts +6 -5
  173. package/src/msg_validators/tx_validator/data_validator.ts +6 -2
  174. package/src/msg_validators/tx_validator/double_spend_validator.ts +4 -3
  175. package/src/msg_validators/tx_validator/factory.ts +64 -23
  176. package/src/msg_validators/tx_validator/gas_validator.ts +9 -3
  177. package/src/msg_validators/tx_validator/metadata_validator.ts +6 -3
  178. package/src/msg_validators/tx_validator/phases_validator.ts +5 -3
  179. package/src/msg_validators/tx_validator/size_validator.ts +6 -2
  180. package/src/msg_validators/tx_validator/timestamp_validator.ts +6 -3
  181. package/src/msg_validators/tx_validator/tx_permitted_validator.ts +8 -3
  182. package/src/msg_validators/tx_validator/tx_proof_validator.ts +8 -3
  183. package/src/services/data_store.ts +10 -7
  184. package/src/services/discv5/discV5_service.ts +1 -1
  185. package/src/services/dummy_service.ts +45 -0
  186. package/src/services/libp2p/instrumentation.ts +15 -2
  187. package/src/services/libp2p/libp2p_service.ts +60 -46
  188. package/src/services/peer-manager/metrics.ts +21 -4
  189. package/src/services/peer-manager/peer_scoring.ts +4 -1
  190. package/src/services/reqresp/batch-tx-requester/README.md +305 -0
  191. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +706 -0
  192. package/src/services/reqresp/batch-tx-requester/config.ts +40 -0
  193. package/src/services/reqresp/batch-tx-requester/interface.ts +57 -0
  194. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +209 -0
  195. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +205 -0
  196. package/src/services/reqresp/batch-tx-requester/tx_validator.ts +37 -0
  197. package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +65 -4
  198. package/src/services/reqresp/connection-sampler/connection_sampler.ts +16 -0
  199. package/src/services/reqresp/interface.ts +3 -0
  200. package/src/services/reqresp/metrics.ts +34 -9
  201. package/src/services/reqresp/protocols/block_txs/bitvector.ts +7 -0
  202. package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +18 -4
  203. package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +51 -9
  204. package/src/services/reqresp/reqresp.ts +66 -19
  205. package/src/services/service.ts +4 -0
  206. package/src/services/tx_collection/config.ts +15 -1
  207. package/src/services/tx_collection/fast_tx_collection.ts +36 -13
  208. package/src/services/tx_collection/index.ts +5 -0
  209. package/src/services/tx_collection/instrumentation.ts +11 -2
  210. package/src/services/tx_collection/proposal_tx_collector.ts +114 -0
  211. package/src/services/tx_collection/tx_collection.ts +4 -4
  212. package/src/services/tx_provider_instrumentation.ts +11 -5
  213. package/src/test-helpers/index.ts +2 -0
  214. package/src/test-helpers/test_tx_provider.ts +64 -0
  215. package/src/test-helpers/testbench-utils.ts +374 -0
  216. package/src/testbench/p2p_client_testbench_worker.ts +321 -122
  217. package/src/testbench/worker_client_manager.ts +304 -47
@@ -1,126 +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 { 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';
11
13
  import { sleep } from '@aztec/foundation/sleep';
14
+ import { DateProvider, Timer } from '@aztec/foundation/timer';
12
15
  import type { DataStoreConfig } from '@aztec/kv-store/config';
13
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';
14
19
  import type { L2BlockSource } from '@aztec/stdlib/block';
15
20
  import type { ContractDataSource } from '@aztec/stdlib/contract';
16
21
  import type { ClientProtocolCircuitVerifier, WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
17
- import { P2PClientType, P2PMessage } from '@aztec/stdlib/p2p';
18
- 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';
19
26
  import { type TelemetryClient, getTelemetryClient } from '@aztec/telemetry-client';
20
27
 
21
28
  import type { Message, PeerId } from '@libp2p/interface';
22
29
  import { TopicValidatorResult } from '@libp2p/interface';
23
- import EventEmitter from 'events';
30
+ import { peerIdFromString } from '@libp2p/peer-id';
24
31
 
32
+ import type { P2PClient } from '../client/p2p_client.js';
25
33
  import type { P2PConfig } from '../config.js';
26
34
  import { createP2PClient } from '../index.js';
27
- import type { AttestationPool } from '../mem_pools/attestation_pool/attestation_pool.js';
28
35
  import type { MemPools } from '../mem_pools/interface.js';
29
- import type { TxPool } from '../mem_pools/tx_pool/index.js';
30
36
  import { LibP2PService } from '../services/libp2p/libp2p_service.js';
31
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';
32
41
  import type { ReqResp } from '../services/reqresp/reqresp.js';
33
42
  import type { PeerDiscoveryService } from '../services/service.js';
43
+ import {
44
+ BatchTxRequesterCollector,
45
+ SendBatchRequestCollector,
46
+ } from '../services/tx_collection/proposal_tx_collector.js';
34
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';
35
59
  import type { PubSubLibp2p } from '../util.js';
36
60
 
37
- // Simple mock implementation
38
- function mockTxPool(): TxPool {
39
- // Mock all methods
40
- const pool: Omit<TxPool, keyof EventEmitter> = {
41
- isEmpty: () => Promise.resolve(false),
42
- addTxs: () => Promise.resolve(1),
43
- getTxByHash: () => Promise.resolve(undefined),
44
- getArchivedTxByHash: () => Promise.resolve(undefined),
45
- markAsMined: () => Promise.resolve(),
46
- markMinedAsPending: () => Promise.resolve(),
47
- deleteTxs: () => Promise.resolve(),
48
- getAllTxs: () => Promise.resolve([]),
49
- getAllTxHashes: () => Promise.resolve([]),
50
- getPendingTxHashes: () => Promise.resolve([]),
51
- getPendingTxCount: () => Promise.resolve(0),
52
- getMinedTxHashes: () => Promise.resolve([]),
53
- getTxStatus: () => Promise.resolve(TxStatus.PENDING),
54
- getTxsByHash: () => Promise.resolve([]),
55
- hasTxs: () => Promise.resolve([]),
56
- hasTx: () => Promise.resolve(false),
57
- updateConfig: () => {},
58
- markTxsAsNonEvictable: () => Promise.resolve(),
59
- clearNonEvictableTxs: () => Promise.resolve(),
60
- cleanupDeletedMinedTxs: () => Promise.resolve(0),
61
- };
62
- return Object.assign(new EventEmitter(), pool);
63
- }
61
+ export type { DistributionPattern, CollectorType } from '../test-helpers/testbench-utils.js';
62
+ export { COLLECTOR_DISPLAY_NAMES } from '../test-helpers/testbench-utils.js';
64
63
 
65
- function mockAttestationPool(): AttestationPool {
66
- return {
67
- isEmpty: () => Promise.resolve(false),
68
- addBlockProposal: () => Promise.resolve(),
69
- getBlockProposal: () => Promise.resolve(undefined),
70
- hasBlockProposal: () => Promise.resolve(false),
71
- canAddProposal: () => Promise.resolve(true),
72
- // Checkpoint attestation methods
73
- addCheckpointProposal: () => Promise.resolve(),
74
- getCheckpointProposal: () => Promise.resolve(undefined),
75
- hasCheckpointProposal: () => Promise.resolve(false),
76
- addCheckpointAttestations: () => Promise.resolve(),
77
- getCheckpointAttestationsForSlot: () => Promise.resolve([]),
78
- getCheckpointAttestationsForSlotAndProposal: () => Promise.resolve([]),
79
- deleteCheckpointAttestationsOlderThan: () => Promise.resolve(),
80
- hasReachedCheckpointProposalCap: () => Promise.resolve(false),
81
- hasReachedCheckpointAttestationCap: () => Promise.resolve(false),
82
- canAddCheckpointProposal: () => Promise.resolve(true),
83
- canAddCheckpointAttestation: () => Promise.resolve(true),
84
- hasCheckpointAttestation: () => Promise.resolve(false),
85
- };
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;
86
77
  }
87
78
 
88
- function mockEpochCache(): EpochCacheInterface {
89
- return {
90
- getCommittee: () => Promise.resolve({ committee: [], seed: 1n, epoch: EpochNumber.ZERO, isEscapeHatchOpen: false }),
91
- getProposerIndexEncoding: () => '0x' as `0x${string}`,
92
- getEpochAndSlotNow: () => ({ epoch: EpochNumber.ZERO, slot: SlotNumber.ZERO, ts: 0n, nowMs: 0n }),
93
- computeProposerIndex: () => 0n,
94
- getCurrentAndNextSlot: () => ({
95
- currentSlot: SlotNumber.ZERO,
96
- nextSlot: SlotNumber.ZERO,
97
- }),
98
- getProposerAttesterAddressInSlot: () => Promise.resolve(undefined),
99
- getEpochAndSlotInNextL1Slot: () => ({ epoch: EpochNumber.ZERO, slot: SlotNumber.ZERO, ts: 0n, now: 0n }),
100
- isInCommittee: () => Promise.resolve(false),
101
- getRegisteredValidators: () => Promise.resolve([]),
102
- filterInCommittee: () => Promise.resolve([]),
103
- };
79
+ export interface BenchResultMessage {
80
+ type: 'BENCH_RESULT';
81
+ durationMs: number;
82
+ fetchedCount: number;
83
+ success: boolean;
84
+ error?: string;
104
85
  }
105
86
 
106
- function mockWorldStateSynchronizer(): WorldStateSynchronizer {
107
- return {
108
- status: () =>
109
- Promise.resolve({
110
- syncSummary: {
111
- latestBlockNumber: 0,
112
- latestBlockHash: '',
113
- finalizedBlockNumber: 0,
114
- treesAreSynched: false,
115
- oldestHistoricBlockNumber: 0,
116
- },
117
- }),
118
- } as WorldStateSynchronizer;
87
+ export interface BenchReadyMessage {
88
+ type: 'BENCH_READY';
119
89
  }
90
+ const txCache = new Map<number, Tx[]>();
120
91
 
121
92
  class TestLibP2PService<T extends P2PClientType = P2PClientType.Full> extends LibP2PService<T> {
122
93
  private disableTxValidation: boolean;
123
- private gossipMessageCount: number = 0;
94
+ private gossipMessageCount = 0;
124
95
 
125
96
  constructor(
126
97
  clientType: T,
@@ -189,10 +160,166 @@ class TestLibP2PService<T extends P2PClientType = P2PClientType.Full> extends Li
189
160
  }
190
161
  }
191
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
+
192
321
  // eslint-disable-next-line @typescript-eslint/no-misused-promises
193
322
  process.on('message', async msg => {
194
- // Note: peerIdPrivateKey comes as a raw string (not SecretValue) because
195
- // SecretValue's private fields can't be serialized via IPC
196
323
  const {
197
324
  type,
198
325
  config: rawConfig,
@@ -202,47 +329,47 @@ process.on('message', async msg => {
202
329
  config: Omit<P2PConfig, 'peerIdPrivateKey'> & { peerIdPrivateKey?: string };
203
330
  clientIndex: number;
204
331
  };
332
+
205
333
  try {
206
334
  if (type === 'START') {
207
- // Re-wrap the peerIdPrivateKey with SecretValue
208
335
  const config: P2PConfig = {
209
336
  ...rawConfig,
210
337
  peerIdPrivateKey: rawConfig.peerIdPrivateKey ? new SecretValue(rawConfig.peerIdPrivateKey) : undefined,
211
338
  } as P2PConfig;
212
339
 
213
- const txPool = mockTxPool();
214
- const attestationPool = mockAttestationPool();
215
- const epochCache = mockEpochCache();
216
- const worldState = mockWorldStateSynchronizer();
340
+ workerConfig = config;
341
+ workerTxPool = new InMemoryTxPool();
342
+ workerAttestationPool = new InMemoryAttestationPool();
343
+ const epochCache = createMockEpochCache();
344
+ const worldState = createMockWorldStateSynchronizer();
217
345
  const l2BlockSource = new MockL2BlockSource();
218
346
 
219
347
  const proofVerifier = new AlwaysTrueCircuitVerifier();
220
- const kvStore = await openTmpStore(`test-${clientIndex}`);
221
- 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);
222
351
  const telemetry = getTelemetryClient();
223
352
 
224
353
  const deps = {
225
- txPool,
226
- attestationPool,
354
+ txPool: workerTxPool,
355
+ attestationPool: workerAttestationPool,
227
356
  store: kvStore,
228
- logger,
357
+ logger: workerLogger,
229
358
  };
230
359
 
231
360
  const client = await createP2PClient(
232
361
  P2PClientType.Full,
233
362
  config as P2PConfig & DataStoreConfig,
234
363
  l2BlockSource,
235
- proofVerifier,
364
+ proofVerifier as ClientProtocolCircuitVerifier,
236
365
  worldState,
237
366
  epochCache,
238
367
  'test-p2p-bench-worker',
239
368
  undefined,
240
- telemetry,
369
+ telemetry as TelemetryClient,
241
370
  deps,
242
371
  );
243
372
 
244
- // Create test service with validation disabled
245
- // Note: Parameter order must match LibP2PService constructor
246
373
  const testService = new TestLibP2PService(
247
374
  P2PClientType.Full,
248
375
  config,
@@ -255,41 +382,113 @@ process.on('message', async msg => {
255
382
  epochCache,
256
383
  proofVerifier,
257
384
  worldState,
258
- telemetry,
259
- logger,
260
- true, // disable validation
385
+ telemetry as TelemetryClient,
386
+ workerLogger,
387
+ true,
261
388
  );
262
389
 
263
- // Replace the existing p2pService with our test version
264
390
  (client as any).p2pService = testService;
265
391
 
266
392
  await client.start();
267
- // Wait until the client is ready
268
393
  for (let i = 0; i < 100; i++) {
269
394
  const isReady = client.isReady();
270
- logger.debug(`Client ${clientIndex} isReady: ${isReady}`);
395
+ workerLogger.debug(`Client ${clientIndex} isReady: ${isReady}`);
271
396
  if (isReady) {
272
397
  break;
273
398
  }
274
399
  await sleep(1000);
275
400
  }
276
401
 
277
- // Listen for commands from parent
278
- // eslint-disable-next-line @typescript-eslint/no-misused-promises
279
- process.on('message', async (cmd: any) => {
280
- switch (cmd.type) {
281
- case 'STOP':
282
- await client.stop();
283
- process.exit(0);
284
- break;
285
- case 'SEND_TX':
286
- await client.sendTx(Tx.fromBuffer(Buffer.from(cmd.tx)));
287
- process.send!({ type: 'TX_SENT' });
288
- 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;
289
438
  }
290
- });
291
439
 
292
- 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
+ }
293
492
  }
294
493
  } catch (err: any) {
295
494
  process.send!({ type: 'ERROR', error: err.message });