@aztec/p2p 0.75.0 → 0.76.0

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 (102) hide show
  1. package/dest/bootstrap/bootstrap.d.ts.map +1 -1
  2. package/dest/bootstrap/bootstrap.js +9 -4
  3. package/dest/client/factory.d.ts +4 -2
  4. package/dest/client/factory.d.ts.map +1 -1
  5. package/dest/client/factory.js +4 -4
  6. package/dest/config.d.ts +30 -14
  7. package/dest/config.d.ts.map +1 -1
  8. package/dest/config.js +30 -14
  9. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +2 -2
  10. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  11. package/dest/msg_validators/attestation_validator/attestation_validator.js +1 -1
  12. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts +2 -2
  13. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts.map +1 -1
  14. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.js +1 -1
  15. package/dest/msg_validators/epoch_proof_quote_validator/epoch_proof_quote_validator.d.ts +2 -2
  16. package/dest/msg_validators/epoch_proof_quote_validator/epoch_proof_quote_validator.d.ts.map +1 -1
  17. package/dest/msg_validators/epoch_proof_quote_validator/epoch_proof_quote_validator.js +1 -1
  18. package/dest/services/discv5/discV5_service.d.ts +5 -1
  19. package/dest/services/discv5/discV5_service.d.ts.map +1 -1
  20. package/dest/services/discv5/discV5_service.js +65 -18
  21. package/dest/services/dummy_service.d.ts +1 -0
  22. package/dest/services/dummy_service.d.ts.map +1 -1
  23. package/dest/services/dummy_service.js +2 -1
  24. package/dest/services/libp2p/libp2p_logger.d.ts +7 -0
  25. package/dest/services/libp2p/libp2p_logger.d.ts.map +1 -0
  26. package/dest/services/libp2p/libp2p_logger.js +67 -0
  27. package/dest/services/libp2p/libp2p_service.d.ts +3 -3
  28. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  29. package/dest/services/libp2p/libp2p_service.js +42 -10
  30. package/dest/services/reqresp/interface.d.ts +9 -0
  31. package/dest/services/reqresp/interface.d.ts.map +1 -1
  32. package/dest/services/reqresp/interface.js +1 -1
  33. package/dest/services/reqresp/protocols/goodbye.js +2 -2
  34. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
  35. package/dest/services/reqresp/rate-limiter/rate_limiter.js +4 -2
  36. package/dest/services/reqresp/rate-limiter/rate_limits.js +3 -3
  37. package/dest/services/reqresp/reqresp.d.ts +7 -2
  38. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  39. package/dest/services/reqresp/reqresp.js +90 -21
  40. package/dest/services/reqresp/status.d.ts +31 -0
  41. package/dest/services/reqresp/status.d.ts.map +1 -0
  42. package/dest/services/reqresp/status.js +52 -0
  43. package/dest/services/service.d.ts +1 -0
  44. package/dest/services/service.d.ts.map +1 -1
  45. package/dest/services/types.d.ts +1 -7
  46. package/dest/services/types.d.ts.map +1 -1
  47. package/dest/services/types.js +2 -10
  48. package/dest/test-helpers/generate-peer-id-private-keys.d.ts +7 -0
  49. package/dest/test-helpers/generate-peer-id-private-keys.d.ts.map +1 -0
  50. package/dest/test-helpers/generate-peer-id-private-keys.js +15 -0
  51. package/dest/test-helpers/get-ports.d.ts +7 -0
  52. package/dest/test-helpers/get-ports.d.ts.map +1 -0
  53. package/dest/test-helpers/get-ports.js +8 -0
  54. package/dest/test-helpers/index.d.ts +6 -0
  55. package/dest/test-helpers/index.d.ts.map +1 -0
  56. package/dest/test-helpers/index.js +6 -0
  57. package/dest/test-helpers/make-enrs.d.ts +16 -0
  58. package/dest/test-helpers/make-enrs.d.ts.map +1 -0
  59. package/dest/test-helpers/make-enrs.js +35 -0
  60. package/dest/test-helpers/make-test-p2p-clients.d.ts +37 -0
  61. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -0
  62. package/dest/test-helpers/make-test-p2p-clients.js +71 -0
  63. package/dest/{mocks/index.d.ts → test-helpers/reqresp-nodes.d.ts} +6 -5
  64. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -0
  65. package/dest/test-helpers/reqresp-nodes.js +183 -0
  66. package/dest/testbench/p2p_client_testbench_worker.d.ts +2 -0
  67. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -0
  68. package/dest/testbench/p2p_client_testbench_worker.js +125 -0
  69. package/dest/versioning.d.ts +12 -0
  70. package/dest/versioning.d.ts.map +1 -0
  71. package/dest/versioning.js +38 -0
  72. package/package.json +10 -8
  73. package/src/bootstrap/bootstrap.ts +9 -3
  74. package/src/client/factory.ts +12 -5
  75. package/src/config.ts +56 -29
  76. package/src/msg_validators/attestation_validator/attestation_validator.ts +3 -3
  77. package/src/msg_validators/block_proposal_validator/block_proposal_validator.ts +3 -3
  78. package/src/msg_validators/epoch_proof_quote_validator/epoch_proof_quote_validator.ts +3 -3
  79. package/src/services/discv5/discV5_service.ts +67 -18
  80. package/src/services/dummy_service.ts +2 -0
  81. package/src/services/libp2p/libp2p_logger.ts +78 -0
  82. package/src/services/libp2p/libp2p_service.ts +47 -10
  83. package/src/services/reqresp/interface.ts +11 -0
  84. package/src/services/reqresp/protocols/goodbye.ts +1 -1
  85. package/src/services/reqresp/rate-limiter/rate_limiter.ts +3 -1
  86. package/src/services/reqresp/rate-limiter/rate_limits.ts +2 -2
  87. package/src/services/reqresp/reqresp.ts +120 -25
  88. package/src/services/reqresp/status.ts +59 -0
  89. package/src/services/service.ts +2 -0
  90. package/src/services/types.ts +2 -10
  91. package/src/test-helpers/generate-peer-id-private-keys.ts +15 -0
  92. package/src/test-helpers/get-ports.ts +8 -0
  93. package/src/test-helpers/index.ts +5 -0
  94. package/src/test-helpers/make-enrs.ts +44 -0
  95. package/src/test-helpers/make-test-p2p-clients.ts +124 -0
  96. package/src/{mocks/index.ts → test-helpers/reqresp-nodes.ts} +10 -5
  97. package/src/testbench/README.md +20 -0
  98. package/src/testbench/p2p_client_testbench_worker.ts +156 -0
  99. package/src/testbench/scripts/run_testbench.sh +7 -0
  100. package/src/versioning.ts +50 -0
  101. package/dest/mocks/index.d.ts.map +0 -1
  102. package/dest/mocks/index.js +0 -181
@@ -0,0 +1,71 @@
1
+ import { MockL2BlockSource } from '@aztec/archiver/test';
2
+ import { P2PClientType } from '@aztec/circuit-types';
3
+ import { createLogger } from '@aztec/foundation/log';
4
+ import { openTmpStore } from '@aztec/kv-store/lmdb-v2';
5
+ import { createP2PClient } from '../client/index.js';
6
+ import { generatePeerIdPrivateKeys } from '../test-helpers/generate-peer-id-private-keys.js';
7
+ import { getPorts } from './get-ports.js';
8
+ import { makeEnrs } from './make-enrs.js';
9
+ import { AlwaysFalseCircuitVerifier, AlwaysTrueCircuitVerifier } from './reqresp-nodes.js';
10
+ /**
11
+ * Creates a single P2P client for testing purposes.
12
+ * @param peerIdPrivateKey - The private key of the peer.
13
+ * @param port - The port to run the client on.
14
+ * @param peers - The peers to connect to.
15
+ * @param options - The options for the client.
16
+ * @returns The created client.
17
+ */
18
+ export async function makeTestP2PClient(peerIdPrivateKey, port, peers, { alwaysTrueVerifier = true, p2pBaseConfig, p2pConfigOverrides = {}, mockAttestationPool, mockEpochProofQuotePool, mockTxPool, mockEpochCache, mockWorldState, logger = createLogger('p2p-test-client'), }) {
19
+ const addr = `127.0.0.1:${port}`;
20
+ const listenAddr = `0.0.0.0:${port}`;
21
+ // Filter nodes so that we only dial active peers
22
+ const config = {
23
+ ...p2pBaseConfig,
24
+ p2pEnabled: true,
25
+ peerIdPrivateKey,
26
+ tcpListenAddress: listenAddr, // run on port 0
27
+ udpListenAddress: listenAddr,
28
+ tcpAnnounceAddress: addr,
29
+ udpAnnounceAddress: addr,
30
+ bootstrapNodes: peers,
31
+ peerCheckIntervalMS: 1000,
32
+ maxPeerCount: 10,
33
+ ...p2pConfigOverrides,
34
+ };
35
+ const l2BlockSource = new MockL2BlockSource();
36
+ await l2BlockSource.createBlocks(100);
37
+ const proofVerifier = alwaysTrueVerifier ? new AlwaysTrueCircuitVerifier() : new AlwaysFalseCircuitVerifier();
38
+ const kvStore = await openTmpStore('test');
39
+ const deps = {
40
+ txPool: mockTxPool,
41
+ attestationPool: mockAttestationPool,
42
+ epochProofQuotePool: mockEpochProofQuotePool,
43
+ store: kvStore,
44
+ logger,
45
+ };
46
+ const client = await createP2PClient(P2PClientType.Full, config, l2BlockSource, proofVerifier, mockWorldState, mockEpochCache, undefined, deps);
47
+ await client.start();
48
+ return client;
49
+ }
50
+ /**
51
+ * Creates a number of P2P clients for testing purposes.
52
+ * @param numberOfPeers - The number of clients to create.
53
+ * @param options - The options for the clients.
54
+ * @returns The created clients.
55
+ */
56
+ export async function makeTestP2PClients(numberOfPeers, testConfig) {
57
+ const clients = [];
58
+ const peerIdPrivateKeys = generatePeerIdPrivateKeys(numberOfPeers);
59
+ const ports = await getPorts(numberOfPeers);
60
+ const peerEnrs = await makeEnrs(peerIdPrivateKeys, ports, testConfig.p2pBaseConfig);
61
+ for (let i = 0; i < numberOfPeers; i++) {
62
+ const client = await makeTestP2PClient(peerIdPrivateKeys[i], ports[i], peerEnrs, {
63
+ ...testConfig,
64
+ logger: createLogger(`p2p:${i}`),
65
+ });
66
+ clients.push(client);
67
+ }
68
+ await Promise.all(clients.map(client => client.isReady()));
69
+ return clients;
70
+ }
71
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFrZS10ZXN0LXAycC1jbGllbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rlc3QtaGVscGVycy9tYWtlLXRlc3QtcDJwLWNsaWVudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDekQsT0FBTyxFQUFFLGFBQWEsRUFBK0IsTUFBTSxzQkFBc0IsQ0FBQztBQUVsRixPQUFPLEVBQWUsWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFbEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRXZELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQU1yRCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxrREFBa0QsQ0FBQztBQUM3RixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzFDLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSx5QkFBeUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBYzNGOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGlCQUFpQixDQUNyQyxnQkFBd0IsRUFDeEIsSUFBWSxFQUNaLEtBQWUsRUFDZixFQUNFLGtCQUFrQixHQUFHLElBQUksRUFDekIsYUFBYSxFQUNiLGtCQUFrQixHQUFHLEVBQUUsRUFDdkIsbUJBQW1CLEVBQ25CLHVCQUF1QixFQUN2QixVQUFVLEVBQ1YsY0FBYyxFQUNkLGNBQWMsRUFDZCxNQUFNLEdBQUcsWUFBWSxDQUFDLGlCQUFpQixDQUFDLEdBQ2Y7SUFFM0IsTUFBTSxJQUFJLEdBQUcsYUFBYSxJQUFJLEVBQUUsQ0FBQztJQUNqQyxNQUFNLFVBQVUsR0FBRyxXQUFXLElBQUksRUFBRSxDQUFDO0lBRXJDLGlEQUFpRDtJQUVqRCxNQUFNLE1BQU0sR0FBZ0M7UUFDMUMsR0FBRyxhQUFhO1FBQ2hCLFVBQVUsRUFBRSxJQUFJO1FBQ2hCLGdCQUFnQjtRQUNoQixnQkFBZ0IsRUFBRSxVQUFVLEVBQUUsZ0JBQWdCO1FBQzlDLGdCQUFnQixFQUFFLFVBQVU7UUFDNUIsa0JBQWtCLEVBQUUsSUFBSTtRQUN4QixrQkFBa0IsRUFBRSxJQUFJO1FBQ3hCLGNBQWMsRUFBRSxLQUFLO1FBQ3JCLG1CQUFtQixFQUFFLElBQUk7UUFDekIsWUFBWSxFQUFFLEVBQUU7UUFDaEIsR0FBRyxrQkFBa0I7S0FDUyxDQUFDO0lBRWpDLE1BQU0sYUFBYSxHQUFHLElBQUksaUJBQWlCLEVBQUUsQ0FBQztJQUM5QyxNQUFNLGFBQWEsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFdEMsTUFBTSxhQUFhLEdBQUcsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLElBQUkseUJBQXlCLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSwwQkFBMEIsRUFBRSxDQUFDO0lBQzlHLE1BQU0sT0FBTyxHQUFHLE1BQU0sWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzNDLE1BQU0sSUFBSSxHQUFHO1FBQ1gsTUFBTSxFQUFFLFVBQStCO1FBQ3ZDLGVBQWUsRUFBRSxtQkFBaUQ7UUFDbEUsbUJBQW1CLEVBQUUsdUJBQXlEO1FBQzlFLEtBQUssRUFBRSxPQUFPO1FBQ2QsTUFBTTtLQUNQLENBQUM7SUFDRixNQUFNLE1BQU0sR0FBRyxNQUFNLGVBQWUsQ0FDbEMsYUFBYSxDQUFDLElBQUksRUFDbEIsTUFBTSxFQUNOLGFBQWEsRUFDYixhQUFhLEVBQ2IsY0FBYyxFQUNkLGNBQWMsRUFDZCxTQUFTLEVBQ1QsSUFBSSxDQUNMLENBQUM7SUFDRixNQUFNLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUVyQixPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGtCQUFrQixDQUFDLGFBQXFCLEVBQUUsVUFBb0M7SUFDbEcsTUFBTSxPQUFPLEdBQWdCLEVBQUUsQ0FBQztJQUNoQyxNQUFNLGlCQUFpQixHQUFHLHlCQUF5QixDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBRW5FLE1BQU0sS0FBSyxHQUFHLE1BQU0sUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQzVDLE1BQU0sUUFBUSxHQUFHLE1BQU0sUUFBUSxDQUFDLGlCQUFpQixFQUFFLEtBQUssRUFBRSxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUM7SUFFcEYsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGFBQWEsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ3ZDLE1BQU0sTUFBTSxHQUFHLE1BQU0saUJBQWlCLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRTtZQUMvRSxHQUFHLFVBQVU7WUFDYixNQUFNLEVBQUUsWUFBWSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7U0FDakMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN2QixDQUFDO0lBRUQsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzNELE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUMifQ==
@@ -1,4 +1,5 @@
1
1
  import { type ClientProtocolCircuitVerifier, type L2BlockSource, type P2PClientType, type Tx, type WorldStateSynchronizer } from '@aztec/circuit-types';
2
+ import { type ChainConfig } from '@aztec/circuit-types/config';
2
3
  import { type EpochCache } from '@aztec/epoch-cache';
3
4
  import { type TelemetryClient } from '@aztec/telemetry-client';
4
5
  import { type PeerId } from '@libp2p/interface';
@@ -22,7 +23,7 @@ export declare function createLibp2pNode(boostrapAddrs?: string[], peerId?: Peer
22
23
  *
23
24
  *
24
25
  */
25
- export declare function createTestLibP2PService<T extends P2PClientType>(clientType: T, boostrapAddrs: string[] | undefined, l2BlockSource: L2BlockSource, worldStateSynchronizer: WorldStateSynchronizer, epochCache: EpochCache, mempools: MemPools<T>, telemetry: TelemetryClient, port?: number, peerId?: PeerId): Promise<LibP2PService<T>>;
26
+ export declare function createTestLibP2PService<T extends P2PClientType>(clientType: T, boostrapAddrs: string[] | undefined, l2BlockSource: L2BlockSource, worldStateSynchronizer: WorldStateSynchronizer, epochCache: EpochCache, mempools: MemPools<T>, telemetry: TelemetryClient, port?: number, peerId?: PeerId, chainConfig?: ChainConfig): Promise<LibP2PService<T>>;
26
27
  /**
27
28
  * A p2p / req resp node pairing the req node will always contain the p2p node.
28
29
  * they are provided as a pair to allow access the p2p node directly
@@ -48,7 +49,7 @@ export declare class AlwaysTrueCircuitVerifier implements ClientProtocolCircuitV
48
49
  export declare class AlwaysFalseCircuitVerifier implements ClientProtocolCircuitVerifier {
49
50
  verifyProof(_tx: Tx): Promise<boolean>;
50
51
  }
51
- export declare function createBootstrapNodeConfig(privateKey: string, port: number): BootnodeConfig;
52
- export declare function createBootstrapNodeFromPrivateKey(privateKey: string, port: number, telemetry?: TelemetryClient): Promise<BootstrapNode>;
53
- export declare function createBootstrapNode(port: number, telemetry?: TelemetryClient): Promise<BootstrapNode>;
54
- //# sourceMappingURL=index.d.ts.map
52
+ export declare function createBootstrapNodeConfig(privateKey: string, port: number, chainConfig: ChainConfig): BootnodeConfig;
53
+ export declare function createBootstrapNodeFromPrivateKey(privateKey: string, port: number, telemetry?: TelemetryClient, chainConfig?: ChainConfig): Promise<BootstrapNode>;
54
+ export declare function createBootstrapNode(port: number, telemetry?: TelemetryClient, chainConfig?: ChainConfig): Promise<BootstrapNode>;
55
+ //# sourceMappingURL=reqresp-nodes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reqresp-nodes.d.ts","sourceRoot":"","sources":["../../src/test-helpers/reqresp-nodes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,183 @@
1
+ import { emptyChainConfig } from '@aztec/circuit-types/config';
2
+ import { timesParallel } from '@aztec/foundation/collection';
3
+ import { openTmpStore } from '@aztec/kv-store/lmdb-v2';
4
+ import { getTelemetryClient } from '@aztec/telemetry-client';
5
+ import { gossipsub } from '@chainsafe/libp2p-gossipsub';
6
+ import { noise } from '@chainsafe/libp2p-noise';
7
+ import { yamux } from '@chainsafe/libp2p-yamux';
8
+ import { bootstrap } from '@libp2p/bootstrap';
9
+ import { identify } from '@libp2p/identify';
10
+ import { createSecp256k1PeerId } from '@libp2p/peer-id-factory';
11
+ import { tcp } from '@libp2p/tcp';
12
+ import getPort from 'get-port';
13
+ import { createLibp2p } from 'libp2p';
14
+ import { BootstrapNode } from '../bootstrap/bootstrap.js';
15
+ import { DiscV5Service } from '../services/discv5/discV5_service.js';
16
+ import { LibP2PService } from '../services/libp2p/libp2p_service.js';
17
+ import { ReqRespSubProtocol, noopValidator, } from '../services/reqresp/interface.js';
18
+ import { pingHandler, statusHandler } from '../services/reqresp/protocols/index.js';
19
+ import { ReqResp } from '../services/reqresp/reqresp.js';
20
+ /**
21
+ * Creates a libp2p node, pre configured.
22
+ * @param boostrapAddrs - an optional list of bootstrap addresses
23
+ * @returns Lip2p node
24
+ */
25
+ export async function createLibp2pNode(boostrapAddrs = [], peerId, port, enableGossipSub = false, start = true) {
26
+ port = port ?? (await getPort());
27
+ const options = {
28
+ start,
29
+ addresses: {
30
+ listen: [`/ip4/0.0.0.0/tcp/${port}`],
31
+ announce: [`/ip4/0.0.0.0/tcp/${port}`],
32
+ },
33
+ connectionEncryption: [noise()],
34
+ streamMuxers: [yamux()],
35
+ transports: [tcp()],
36
+ services: {
37
+ identify: identify({
38
+ protocolPrefix: 'aztec',
39
+ }),
40
+ },
41
+ };
42
+ if (boostrapAddrs.length > 0) {
43
+ options.peerDiscovery = [
44
+ bootstrap({
45
+ list: boostrapAddrs,
46
+ }),
47
+ ];
48
+ }
49
+ if (peerId) {
50
+ options.peerId = peerId;
51
+ }
52
+ if (enableGossipSub) {
53
+ options.services.pubsub = gossipsub({
54
+ allowPublishToZeroTopicPeers: true,
55
+ });
56
+ }
57
+ return await createLibp2p(options);
58
+ }
59
+ /**
60
+ * Test Libp2p service
61
+ * P2P functionality is operational, however everything else is default
62
+ *
63
+ *
64
+ */
65
+ export async function createTestLibP2PService(clientType, boostrapAddrs = [], l2BlockSource, worldStateSynchronizer, epochCache, mempools, telemetry, port = 0, peerId, chainConfig = emptyChainConfig) {
66
+ peerId = peerId ?? (await createSecp256k1PeerId());
67
+ const config = {
68
+ tcpAnnounceAddress: `127.0.0.1:${port}`,
69
+ udpAnnounceAddress: `127.0.0.1:${port}`,
70
+ tcpListenAddress: `0.0.0.0:${port}`,
71
+ udpListenAddress: `0.0.0.0:${port}`,
72
+ bootstrapNodes: boostrapAddrs,
73
+ peerCheckIntervalMS: 1000,
74
+ maxPeerCount: 5,
75
+ p2pEnabled: true,
76
+ peerIdPrivateKey: Buffer.from(peerId.privateKey).toString('hex'),
77
+ bootstrapNodeEnrVersionCheck: false,
78
+ ...chainConfig,
79
+ };
80
+ const discoveryService = new DiscV5Service(peerId, config, telemetry);
81
+ const proofVerifier = new AlwaysTrueCircuitVerifier();
82
+ // No bootstrap nodes provided as the libp2p service will register them in the constructor
83
+ const p2pNode = await createLibp2pNode([], peerId, port, /*enable gossip */ true, /**start */ false);
84
+ return new LibP2PService(clientType, config, p2pNode, discoveryService, mempools, l2BlockSource, epochCache, proofVerifier, worldStateSynchronizer, telemetry);
85
+ }
86
+ // Mock sub protocol handlers
87
+ export const MOCK_SUB_PROTOCOL_HANDLERS = {
88
+ [ReqRespSubProtocol.PING]: pingHandler,
89
+ [ReqRespSubProtocol.STATUS]: statusHandler,
90
+ [ReqRespSubProtocol.TX]: (_msg) => Promise.resolve(Buffer.from('tx')),
91
+ [ReqRespSubProtocol.GOODBYE]: (_msg) => Promise.resolve(Buffer.from('goodbye')),
92
+ [ReqRespSubProtocol.BLOCK]: (_msg) => Promise.resolve(Buffer.from('block')),
93
+ };
94
+ // By default, all requests are valid
95
+ // If you want to test an invalid response, you can override the validator
96
+ export const MOCK_SUB_PROTOCOL_VALIDATORS = {
97
+ [ReqRespSubProtocol.PING]: noopValidator,
98
+ [ReqRespSubProtocol.STATUS]: noopValidator,
99
+ [ReqRespSubProtocol.TX]: noopValidator,
100
+ [ReqRespSubProtocol.GOODBYE]: noopValidator,
101
+ [ReqRespSubProtocol.BLOCK]: noopValidator,
102
+ };
103
+ /**
104
+ * @param numberOfNodes - the number of nodes to create
105
+ * @returns An array of the created nodes
106
+ */
107
+ export const createNodes = (peerScoring, numberOfNodes) => {
108
+ return timesParallel(numberOfNodes, () => createReqResp(peerScoring));
109
+ };
110
+ export const startNodes = async (nodes, subProtocolHandlers = MOCK_SUB_PROTOCOL_HANDLERS, subProtocolValidators = MOCK_SUB_PROTOCOL_VALIDATORS) => {
111
+ for (const node of nodes) {
112
+ await node.req.start(subProtocolHandlers, subProtocolValidators);
113
+ }
114
+ };
115
+ export const stopNodes = async (nodes) => {
116
+ const stopPromises = nodes.flatMap(node => [node.req.stop(), node.p2p.stop()]);
117
+ await Promise.all(stopPromises);
118
+ };
119
+ // Create a req resp node, exposing the underlying p2p node
120
+ export const createReqResp = async (peerScoring) => {
121
+ const p2p = await createLibp2pNode();
122
+ const config = {
123
+ overallRequestTimeoutMs: 4000,
124
+ individualRequestTimeoutMs: 2000,
125
+ };
126
+ const req = new ReqResp(config, p2p, peerScoring);
127
+ return {
128
+ p2p,
129
+ req,
130
+ };
131
+ };
132
+ // Given a node list; hand shake all of the nodes with each other
133
+ export const connectToPeers = async (nodes) => {
134
+ for (const node of nodes) {
135
+ for (const otherNode of nodes) {
136
+ if (node === otherNode) {
137
+ continue;
138
+ }
139
+ const addr = otherNode.p2p.getMultiaddrs()[0];
140
+ await node.p2p.dial(addr);
141
+ }
142
+ }
143
+ };
144
+ // Mock circuit verifier for testing - reimplementation from bb to avoid dependency
145
+ export class AlwaysTrueCircuitVerifier {
146
+ verifyProof(_tx) {
147
+ return Promise.resolve(true);
148
+ }
149
+ }
150
+ export class AlwaysFalseCircuitVerifier {
151
+ verifyProof(_tx) {
152
+ return Promise.resolve(false);
153
+ }
154
+ }
155
+ // Bootnodes
156
+ export function createBootstrapNodeConfig(privateKey, port, chainConfig) {
157
+ return {
158
+ udpListenAddress: `0.0.0.0:${port}`,
159
+ udpAnnounceAddress: `127.0.0.1:${port}`,
160
+ peerIdPrivateKey: privateKey,
161
+ maxPeerCount: 100,
162
+ dataDirectory: undefined,
163
+ dataStoreMapSizeKB: 0,
164
+ ...chainConfig,
165
+ };
166
+ }
167
+ export function createBootstrapNodeFromPrivateKey(privateKey, port, telemetry = getTelemetryClient(), chainConfig = emptyChainConfig) {
168
+ const config = createBootstrapNodeConfig(privateKey, port, chainConfig);
169
+ return startBootstrapNode(config, telemetry);
170
+ }
171
+ export async function createBootstrapNode(port, telemetry = getTelemetryClient(), chainConfig = emptyChainConfig) {
172
+ const peerId = await createSecp256k1PeerId();
173
+ const config = createBootstrapNodeConfig(Buffer.from(peerId.privateKey).toString('hex'), port, chainConfig);
174
+ return startBootstrapNode(config, telemetry);
175
+ }
176
+ async function startBootstrapNode(config, telemetry) {
177
+ // Open an ephemeral store that will only exist in memory
178
+ const store = await openTmpStore('bootstrap-node', true);
179
+ const bootstrapNode = new BootstrapNode(store, telemetry);
180
+ await bootstrapNode.start(config);
181
+ return bootstrapNode;
182
+ }
183
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxcmVzcC1ub2Rlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0LWhlbHBlcnMvcmVxcmVzcC1ub2Rlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFPQSxPQUFPLEVBQW9CLGdCQUFnQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFakYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRTdELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN2RCxPQUFPLEVBQXdCLGtCQUFrQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFbkYsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3hELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNoRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUU1QyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2xDLE9BQU8sT0FBTyxNQUFNLFVBQVUsQ0FBQztBQUMvQixPQUFPLEVBQW1DLFlBQVksRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUV2RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFHMUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUdyRSxPQUFPLEVBQ0wsa0JBQWtCLEVBR2xCLGFBQWEsR0FDZCxNQUFNLGtDQUFrQyxDQUFDO0FBQzFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsYUFBYSxF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
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=p2p_client_testbench_worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"p2p_client_testbench_worker.d.ts","sourceRoot":"","sources":["../../src/testbench/p2p_client_testbench_worker.ts"],"names":[],"mappings":""}
@@ -0,0 +1,125 @@
1
+ /**
2
+ * A testbench worker that creates a p2p client and listens for commands from the parent.
3
+ *
4
+ * Used when running testbench commands
5
+ */
6
+ import { MockL2BlockSource } from '@aztec/archiver/test';
7
+ import { P2PClientType, Tx, TxStatus } from '@aztec/circuit-types';
8
+ import { EthAddress } from '@aztec/foundation/eth-address';
9
+ import { createLogger } from '@aztec/foundation/log';
10
+ import { sleep } from '@aztec/foundation/sleep';
11
+ import { openTmpStore } from '@aztec/kv-store/lmdb-v2';
12
+ import { createP2PClient } from '../index.js';
13
+ import { AlwaysTrueCircuitVerifier } from '../test-helpers/reqresp-nodes.js';
14
+ // Simple mock implementation
15
+ function mockTxPool() {
16
+ // Mock all methods
17
+ return {
18
+ addTxs: () => Promise.resolve(),
19
+ getTxByHash: () => Promise.resolve(undefined),
20
+ getArchivedTxByHash: () => Promise.resolve(undefined),
21
+ markAsMined: () => Promise.resolve(),
22
+ markMinedAsPending: () => Promise.resolve(),
23
+ deleteTxs: () => Promise.resolve(),
24
+ getAllTxs: () => Promise.resolve([]),
25
+ getAllTxHashes: () => Promise.resolve([]),
26
+ getPendingTxHashes: () => Promise.resolve([]),
27
+ getMinedTxHashes: () => Promise.resolve([]),
28
+ getTxStatus: () => Promise.resolve(TxStatus.PENDING),
29
+ };
30
+ }
31
+ function mockAttestationPool() {
32
+ return {
33
+ addAttestations: () => Promise.resolve(),
34
+ deleteAttestations: () => Promise.resolve(),
35
+ deleteAttestationsOlderThan: () => Promise.resolve(),
36
+ deleteAttestationsForSlot: () => Promise.resolve(),
37
+ deleteAttestationsForSlotAndProposal: () => Promise.resolve(),
38
+ getAttestationsForSlot: () => Promise.resolve([]),
39
+ };
40
+ }
41
+ function mockEpochProofQuotePool() {
42
+ return {
43
+ addQuote: () => { },
44
+ getQuotes: () => [],
45
+ deleteQuotesToEpoch: () => { },
46
+ };
47
+ }
48
+ function mockEpochCache() {
49
+ return {
50
+ getCommittee: () => Promise.resolve([]),
51
+ getProposerIndexEncoding: () => '0x',
52
+ getEpochAndSlotNow: () => ({ epoch: 0n, slot: 0n, ts: 0n }),
53
+ computeProposerIndex: () => 0n,
54
+ getProposerInCurrentOrNextSlot: () => Promise.resolve({
55
+ currentProposer: EthAddress.ZERO,
56
+ nextProposer: EthAddress.ZERO,
57
+ currentSlot: 0n,
58
+ nextSlot: 0n,
59
+ }),
60
+ isInCommittee: () => Promise.resolve(false),
61
+ };
62
+ }
63
+ // eslint-disable-next-line @typescript-eslint/no-misused-promises
64
+ process.on('message', async (msg) => {
65
+ const { type, config, clientIndex } = msg;
66
+ try {
67
+ if (type === 'START') {
68
+ const txPool = mockTxPool();
69
+ const attestationPool = mockAttestationPool();
70
+ const epochProofQuotePool = mockEpochProofQuotePool();
71
+ const epochCache = mockEpochCache();
72
+ const worldState = {};
73
+ const l2BlockSource = new MockL2BlockSource();
74
+ await l2BlockSource.createBlocks(100);
75
+ const proofVerifier = new AlwaysTrueCircuitVerifier();
76
+ const kvStore = await openTmpStore(`test-${clientIndex}`);
77
+ const logger = createLogger(`p2p:${clientIndex}`);
78
+ const deps = {
79
+ txPool,
80
+ attestationPool,
81
+ epochProofQuotePool,
82
+ store: kvStore,
83
+ logger,
84
+ };
85
+ const client = await createP2PClient(P2PClientType.Full, config, l2BlockSource, proofVerifier, worldState, epochCache, undefined, deps);
86
+ // Create spy for gossip messages
87
+ let gossipMessageCount = 0;
88
+ client.p2pService.handleNewGossipMessage = (...args) => {
89
+ gossipMessageCount++;
90
+ process.send({ type: 'GOSSIP_RECEIVED', count: gossipMessageCount });
91
+ return client.p2pService.constructor.prototype.handleNewGossipMessage.apply(client.p2pService, args);
92
+ };
93
+ await client.start();
94
+ // Wait until the client is ready
95
+ for (let i = 0; i < 100; i++) {
96
+ const isReady = client.isReady();
97
+ logger.debug(`Client ${clientIndex} isReady: ${isReady}`);
98
+ if (isReady) {
99
+ break;
100
+ }
101
+ await sleep(1000);
102
+ }
103
+ // Listen for commands from parent
104
+ // eslint-disable-next-line @typescript-eslint/no-misused-promises
105
+ process.on('message', async (cmd) => {
106
+ switch (cmd.type) {
107
+ case 'STOP':
108
+ await client.stop();
109
+ process.exit(0);
110
+ break;
111
+ case 'SEND_TX':
112
+ await client.sendTx(Tx.fromBuffer(Buffer.from(cmd.tx)));
113
+ process.send({ type: 'TX_SENT' });
114
+ break;
115
+ }
116
+ });
117
+ process.send({ type: 'READY' });
118
+ }
119
+ }
120
+ catch (err) {
121
+ process.send({ type: 'ERROR', error: err.message });
122
+ process.exit(1);
123
+ }
124
+ });
125
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicDJwX2NsaWVudF90ZXN0YmVuY2hfd29ya2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rlc3RiZW5jaC9wMnBfY2xpZW50X3Rlc3RiZW5jaF93b3JrZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUNILE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxhQUFhLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBK0IsTUFBTSxzQkFBc0IsQ0FBQztBQUVoRyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDM0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUVoRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHdkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUk5QyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUU3RSw2QkFBNkI7QUFDN0IsU0FBUyxVQUFVO0lBQ2pCLG1CQUFtQjtJQUNuQixPQUFPO1FBQ0wsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUU7UUFDL0IsV0FBVyxFQUFFLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDO1FBQzdDLG1CQUFtQixFQUFFLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDO1FBQ3JELFdBQVcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFO1FBQ3BDLGtCQUFrQixFQUFFLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUU7UUFDM0MsU0FBUyxFQUFFLEdBQUcsRUFBRSxDQUFDLE9B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
@@ -0,0 +1,12 @@
1
+ /// <reference types="node" resolution-mode="require"/>
2
+ /// <reference types="node" resolution-mode="require"/>
3
+ import { type ComponentsVersions } from '@aztec/circuit-types';
4
+ import { type ChainConfig } from '@aztec/circuit-types/config';
5
+ import { type SignableENR } from '@chainsafe/enr';
6
+ /** Returns the component versions based on config and this build. */
7
+ export declare function getVersions(config: ChainConfig): ComponentsVersions;
8
+ /** Sets the aztec key on the ENR record with versioning info. */
9
+ export declare function setAztecEnrKey(enr: SignableENR, config: ChainConfig, useXxHash?: boolean): ComponentsVersions;
10
+ /** Checks the given value from an ENR record against the expected versions. */
11
+ export declare function checkAztecEnrVersion(enrValue: Buffer, expectedVersions: ComponentsVersions): void;
12
+ //# sourceMappingURL=versioning.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"versioning.d.ts","sourceRoot":"","sources":["../src/versioning.ts"],"names":[],"mappings":";;AAAA,OAAO,EACL,KAAK,kBAAkB,EAIxB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAK/D,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAC;AASlD,qEAAqE;AACrE,wBAAgB,WAAW,CAAC,MAAM,EAAE,WAAW,sBAE9C;AAED,iEAAiE;AACjE,wBAAgB,cAAc,CAAC,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,UAAc,sBAK5F;AAED,+EAA+E;AAC/E,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,gBAAgB,EAAE,kBAAkB,QAU1F"}
@@ -0,0 +1,38 @@
1
+ import { checkCompressedComponentVersion, compressComponentVersions, getComponentsVersionsFromConfig, } from '@aztec/circuit-types';
2
+ import { toBufferBE } from '@aztec/foundation/bigint-buffer';
3
+ import { getVKTreeRoot } from '@aztec/noir-protocol-circuits-types/vks';
4
+ import { protocolContractTreeRoot } from '@aztec/protocol-contracts';
5
+ import xxhashFactory from 'xxhash-wasm';
6
+ import { AZTEC_ENR_KEY } from './services/types.js';
7
+ const USE_XX_HASH = false; // Enable to reduce the size of the ENR record for production
8
+ const XX_HASH_LEN = 8;
9
+ const xxhash = await xxhashFactory();
10
+ /** Returns the component versions based on config and this build. */
11
+ export function getVersions(config) {
12
+ return getComponentsVersionsFromConfig(config, protocolContractTreeRoot, getVKTreeRoot());
13
+ }
14
+ /** Sets the aztec key on the ENR record with versioning info. */
15
+ export function setAztecEnrKey(enr, config, useXxHash = USE_XX_HASH) {
16
+ const versions = getVersions(config);
17
+ const value = versionsToEnrValue(versions, useXxHash);
18
+ enr.set(AZTEC_ENR_KEY, value);
19
+ return versions;
20
+ }
21
+ /** Checks the given value from an ENR record against the expected versions. */
22
+ export function checkAztecEnrVersion(enrValue, expectedVersions) {
23
+ if (enrValue.length === XX_HASH_LEN) {
24
+ const expected = versionsToEnrValue(expectedVersions, true);
25
+ if (!Buffer.from(enrValue).equals(expected)) {
26
+ throw new Error(`Expected ENR version ${expected.toString('hex')} but received ${enrValue.toString('hex')}`);
27
+ }
28
+ }
29
+ else {
30
+ const actual = Buffer.from(enrValue).toString();
31
+ checkCompressedComponentVersion(actual, expectedVersions);
32
+ }
33
+ }
34
+ function versionsToEnrValue(versions, useXxHash) {
35
+ const compressed = compressComponentVersions(versions);
36
+ return useXxHash ? toBufferBE(xxhash.h64(compressed), XX_HASH_LEN) : Buffer.from(compressed);
37
+ }
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbmluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy92ZXJzaW9uaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCwrQkFBK0IsRUFDL0IseUJBQXlCLEVBQ3pCLCtCQUErQixHQUNoQyxNQUFNLHNCQUFzQixDQUFDO0FBRTlCLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUM3RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDeEUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFHckUsT0FBTyxhQUFhLE1BQU0sYUFBYSxDQUFDO0FBRXhDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUVwRCxNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsQ0FBQyw2REFBNkQ7QUFDeEYsTUFBTSxXQUFXLEdBQUcsQ0FBQyxDQUFDO0FBQ3RCLE1BQU0sTUFBTSxHQUFHLE1BQU0sYUFBYSxFQUFFLENBQUM7QUFFckMscUVBQXFFO0FBQ3JFLE1BQU0sVUFBVSxXQUFXLENBQUMsTUFBbUI7SUFDN0MsT0FBTywrQkFBK0IsQ0FBQyxNQUFNLEVBQUUsd0JBQXdCLEVBQUUsYUFBYSxFQUFFLENBQUMsQ0FBQztBQUM1RixDQUFDO0FBRUQsaUVBQWlFO0FBQ2pFLE1BQU0sVUFBVSxjQUFjLENBQUMsR0FBZ0IsRUFBRSxNQUFtQixFQUFFLFNBQVMsR0FBRyxXQUFXO0lBQzNGLE1BQU0sUUFBUSxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNyQyxNQUFNLEtBQUssR0FBRyxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDdEQsR0FBRyxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDOUIsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQztBQUVELCtFQUErRTtBQUMvRSxNQUFNLFVBQVUsb0JBQW9CLENBQUMsUUFBZ0IsRUFBRSxnQkFBb0M7SUFDekYsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLFdBQVcsRUFBRSxDQUFDO1FBQ3BDLE1BQU0sUUFBUSxHQUFHLGtCQUFrQixDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzVELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQzVDLE1BQU0sSUFBSSxLQUFLLENBQUMsd0JBQXdCLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLGlCQUFpQixRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMvRyxDQUFDO0lBQ0gsQ0FBQztTQUFNLENBQUM7UUFDTixNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2hELCtCQUErQixDQUFDLE1BQU0sRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO0lBQzVELENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBUyxrQkFBa0IsQ0FBQyxRQUE0QixFQUFFLFNBQWtCO0lBQzFFLE1BQU0sVUFBVSxHQUFHLHlCQUF5QixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3ZELE9BQU8sU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUMvRixDQUFDIn0=
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@aztec/p2p",
3
- "version": "0.75.0",
3
+ "version": "0.76.0",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": "./dest/index.js",
7
- "./mocks": "./dest/mocks/index.js",
7
+ "./test-helpers": "./dest/test-helpers/index.js",
8
8
  "./bootstrap": "./dest/bootstrap/bootstrap.js",
9
9
  "./config": "./dest/config.js",
10
10
  "./msg_validators": "./dest/msg_validators/index.js"
@@ -63,12 +63,14 @@
63
63
  ]
64
64
  },
65
65
  "dependencies": {
66
- "@aztec/circuit-types": "0.75.0",
67
- "@aztec/circuits.js": "0.75.0",
68
- "@aztec/epoch-cache": "0.75.0",
69
- "@aztec/foundation": "0.75.0",
70
- "@aztec/kv-store": "0.75.0",
71
- "@aztec/telemetry-client": "0.75.0",
66
+ "@aztec/circuit-types": "0.76.0",
67
+ "@aztec/circuits.js": "0.76.0",
68
+ "@aztec/epoch-cache": "0.76.0",
69
+ "@aztec/foundation": "0.76.0",
70
+ "@aztec/kv-store": "0.76.0",
71
+ "@aztec/noir-protocol-circuits-types": "0.76.0",
72
+ "@aztec/protocol-contracts": "0.76.0",
73
+ "@aztec/telemetry-client": "0.76.0",
72
74
  "@chainsafe/discv5": "9.0.0",
73
75
  "@chainsafe/enr": "3.0.0",
74
76
  "@chainsafe/libp2p-gossipsub": "13.0.0",
@@ -9,8 +9,8 @@ import type { PeerId } from '@libp2p/interface';
9
9
  import { type Multiaddr, multiaddr } from '@multiformats/multiaddr';
10
10
 
11
11
  import type { BootnodeConfig } from '../config.js';
12
- import { AZTEC_ENR_KEY, AZTEC_NET } from '../services/types.js';
13
12
  import { convertToMultiaddr, createLibP2PPeerIdFromPrivateKey, getPeerIdPrivateKey } from '../util.js';
13
+ import { setAztecEnrKey } from '../versioning.js';
14
14
 
15
15
  /**
16
16
  * Encapsulates a 'Bootstrap' node, used for the purpose of assisting new joiners in acquiring peers.
@@ -46,7 +46,8 @@ export class BootstrapNode implements P2PBootstrapApi {
46
46
 
47
47
  const publicAddr = multiaddr(convertToMultiaddr(udpAnnounceAddress, 'udp'));
48
48
  enr.setLocationMultiaddr(publicAddr);
49
- enr.set(AZTEC_ENR_KEY, Uint8Array.from([AZTEC_NET]));
49
+
50
+ const versions = setAztecEnrKey(enr, config);
50
51
 
51
52
  this.logger.debug(`Starting bootstrap node ${peerId} listening on ${listenAddrUdp.toString()}`);
52
53
 
@@ -72,7 +73,12 @@ export class BootstrapNode implements P2PBootstrapApi {
72
73
 
73
74
  try {
74
75
  await this.node.start();
75
- this.logger.info('Bootstrap node started', { peerId, enr: enr.encodeTxt(), addr: listenAddrUdp.toString() });
76
+ this.logger.info('Bootstrap node started', {
77
+ peerId,
78
+ enr: enr.encodeTxt(),
79
+ addr: listenAddrUdp.toString(),
80
+ versions,
81
+ });
76
82
  } catch (e) {
77
83
  this.logger.error('Error starting Discv5', e);
78
84
  }
@@ -4,8 +4,8 @@ import {
4
4
  P2PClientType,
5
5
  type WorldStateSynchronizer,
6
6
  } from '@aztec/circuit-types';
7
- import { type EpochCache } from '@aztec/epoch-cache';
8
- import { createLogger } from '@aztec/foundation/log';
7
+ import { type EpochCacheInterface } from '@aztec/epoch-cache';
8
+ import { type Logger, createLogger } from '@aztec/foundation/log';
9
9
  import { type AztecAsyncKVStore } from '@aztec/kv-store';
10
10
  import { type DataStoreConfig } from '@aztec/kv-store/config';
11
11
  import { createStore } from '@aztec/kv-store/lmdb-v2';
@@ -29,6 +29,7 @@ type P2PClientDeps<T extends P2PClientType> = {
29
29
  store?: AztecAsyncKVStore;
30
30
  attestationPool?: T extends P2PClientType.Full ? AttestationPool : undefined;
31
31
  epochProofQuotePool?: EpochProofQuotePool;
32
+ logger?: Logger;
32
33
  };
33
34
 
34
35
  export const createP2PClient = async <T extends P2PClientType>(
@@ -37,12 +38,12 @@ export const createP2PClient = async <T extends P2PClientType>(
37
38
  l2BlockSource: L2BlockSource,
38
39
  proofVerifier: ClientProtocolCircuitVerifier,
39
40
  worldStateSynchronizer: WorldStateSynchronizer,
40
- epochCache: EpochCache,
41
+ epochCache: EpochCacheInterface,
41
42
  telemetry: TelemetryClient = getTelemetryClient(),
42
43
  deps: P2PClientDeps<T> = {},
43
44
  ) => {
44
45
  let config = { ..._config };
45
- const logger = createLogger('p2p');
46
+ const logger = deps.logger ?? createLogger('p2p');
46
47
  const store = deps.store ?? (await createStore('p2p', config, createLogger('p2p:lmdb-v2')));
47
48
  const archive = await createStore('p2p-archive', config, createLogger('p2p-archive:lmdb-v2'));
48
49
 
@@ -66,7 +67,12 @@ export const createP2PClient = async <T extends P2PClientType>(
66
67
  // Create peer discovery service
67
68
  const peerIdPrivateKey = await getPeerIdPrivateKey(config, store);
68
69
  const peerId = await createLibP2PPeerIdFromPrivateKey(peerIdPrivateKey);
69
- const discoveryService = new DiscV5Service(peerId, config, telemetry);
70
+ const discoveryService = new DiscV5Service(
71
+ peerId,
72
+ config,
73
+ telemetry,
74
+ createLogger(`${logger.module}:discv5_service`),
75
+ );
70
76
 
71
77
  p2pService = await LibP2PService.new<T>(
72
78
  clientType,
@@ -80,6 +86,7 @@ export const createP2PClient = async <T extends P2PClientType>(
80
86
  worldStateSynchronizer,
81
87
  store,
82
88
  telemetry,
89
+ createLogger(`${logger.module}:libp2p_service`),
83
90
  );
84
91
  } else {
85
92
  logger.verbose('P2P is disabled. Using dummy P2P service');