@aztec/p2p 0.0.0-test.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.
- package/README.md +7 -0
- package/dest/bootstrap/bootstrap.d.ts +38 -0
- package/dest/bootstrap/bootstrap.d.ts.map +1 -0
- package/dest/bootstrap/bootstrap.js +123 -0
- package/dest/client/factory.d.ts +21 -0
- package/dest/client/factory.d.ts.map +1 -0
- package/dest/client/factory.js +37 -0
- package/dest/client/index.d.ts +3 -0
- package/dest/client/index.d.ts.map +1 -0
- package/dest/client/index.js +2 -0
- package/dest/client/p2p_client.d.ts +314 -0
- package/dest/client/p2p_client.d.ts.map +1 -0
- package/dest/client/p2p_client.js +505 -0
- package/dest/config.d.ts +180 -0
- package/dest/config.d.ts.map +1 -0
- package/dest/config.js +193 -0
- package/dest/enr/generate-enr.d.ts +9 -0
- package/dest/enr/generate-enr.d.ts.map +1 -0
- package/dest/enr/generate-enr.js +30 -0
- package/dest/enr/index.d.ts +2 -0
- package/dest/enr/index.d.ts.map +1 -0
- package/dest/enr/index.js +1 -0
- package/dest/errors/reqresp.error.d.ts +28 -0
- package/dest/errors/reqresp.error.d.ts.map +1 -0
- package/dest/errors/reqresp.error.js +30 -0
- package/dest/index.d.ts +8 -0
- package/dest/index.d.ts.map +1 -0
- package/dest/index.js +7 -0
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +57 -0
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -0
- package/dest/mem_pools/attestation_pool/attestation_pool.js +6 -0
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +3 -0
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -0
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +195 -0
- package/dest/mem_pools/attestation_pool/index.d.ts +3 -0
- package/dest/mem_pools/attestation_pool/index.d.ts.map +1 -0
- package/dest/mem_pools/attestation_pool/index.js +2 -0
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +22 -0
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +1 -0
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +112 -0
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +17 -0
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +1 -0
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +129 -0
- package/dest/mem_pools/attestation_pool/mocks.d.ts +19 -0
- package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -0
- package/dest/mem_pools/attestation_pool/mocks.js +33 -0
- package/dest/mem_pools/index.d.ts +4 -0
- package/dest/mem_pools/index.d.ts.map +1 -0
- package/dest/mem_pools/index.js +1 -0
- package/dest/mem_pools/instrumentation.d.ts +30 -0
- package/dest/mem_pools/instrumentation.d.ts.map +1 -0
- package/dest/mem_pools/instrumentation.js +84 -0
- package/dest/mem_pools/interface.d.ts +11 -0
- package/dest/mem_pools/interface.d.ts.map +1 -0
- package/dest/mem_pools/interface.js +3 -0
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +66 -0
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +245 -0
- package/dest/mem_pools/tx_pool/index.d.ts +4 -0
- package/dest/mem_pools/tx_pool/index.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/index.js +3 -0
- package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts +56 -0
- package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/memory_tx_pool.js +141 -0
- package/dest/mem_pools/tx_pool/priority.d.ts +8 -0
- package/dest/mem_pools/tx_pool/priority.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/priority.js +10 -0
- package/dest/mem_pools/tx_pool/tx_pool.d.ts +66 -0
- package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/tx_pool.js +3 -0
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +7 -0
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +169 -0
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +8 -0
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -0
- package/dest/msg_validators/attestation_validator/attestation_validator.js +19 -0
- package/dest/msg_validators/attestation_validator/index.d.ts +2 -0
- package/dest/msg_validators/attestation_validator/index.d.ts.map +1 -0
- package/dest/msg_validators/attestation_validator/index.js +1 -0
- package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts +8 -0
- package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts.map +1 -0
- package/dest/msg_validators/block_proposal_validator/block_proposal_validator.js +21 -0
- package/dest/msg_validators/block_proposal_validator/index.d.ts +2 -0
- package/dest/msg_validators/block_proposal_validator/index.d.ts.map +1 -0
- package/dest/msg_validators/block_proposal_validator/index.js +1 -0
- package/dest/msg_validators/index.d.ts +4 -0
- package/dest/msg_validators/index.d.ts.map +1 -0
- package/dest/msg_validators/index.js +3 -0
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +7 -0
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +31 -0
- package/dest/msg_validators/tx_validator/block_header_validator.d.ts +11 -0
- package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/block_header_validator.js +26 -0
- package/dest/msg_validators/tx_validator/data_validator.d.ts +6 -0
- package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/data_validator.js +107 -0
- package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +12 -0
- package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/double_spend_validator.js +41 -0
- package/dest/msg_validators/tx_validator/index.d.ts +7 -0
- package/dest/msg_validators/tx_validator/index.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/index.js +6 -0
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts +10 -0
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/metadata_validator.js +44 -0
- package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +9 -0
- package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/tx_proof_validator.js +25 -0
- package/dest/services/data_store.d.ts +27 -0
- package/dest/services/data_store.d.ts.map +1 -0
- package/dest/services/data_store.js +188 -0
- package/dest/services/discv5/discV5_service.d.ts +42 -0
- package/dest/services/discv5/discV5_service.d.ts.map +1 -0
- package/dest/services/discv5/discV5_service.js +214 -0
- package/dest/services/dummy_service.d.ts +85 -0
- package/dest/services/dummy_service.d.ts.map +1 -0
- package/dest/services/dummy_service.js +92 -0
- package/dest/services/encoding.d.ts +31 -0
- package/dest/services/encoding.d.ts.map +1 -0
- package/dest/services/encoding.js +66 -0
- package/dest/services/gossipsub/scoring.d.ts +7 -0
- package/dest/services/gossipsub/scoring.d.ts.map +1 -0
- package/dest/services/gossipsub/scoring.js +10 -0
- package/dest/services/index.d.ts +3 -0
- package/dest/services/index.d.ts.map +1 -0
- package/dest/services/index.js +2 -0
- package/dest/services/libp2p/libp2p_service.d.ts +186 -0
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -0
- package/dest/services/libp2p/libp2p_service.js +712 -0
- package/dest/services/peer-manager/metrics.d.ts +12 -0
- package/dest/services/peer-manager/metrics.d.ts.map +1 -0
- package/dest/services/peer-manager/metrics.js +33 -0
- package/dest/services/peer-manager/peer_manager.d.ts +94 -0
- package/dest/services/peer-manager/peer_manager.d.ts.map +1 -0
- package/dest/services/peer-manager/peer_manager.js +445 -0
- package/dest/services/peer-manager/peer_scoring.d.ts +28 -0
- package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -0
- package/dest/services/peer-manager/peer_scoring.js +86 -0
- package/dest/services/reqresp/config.d.ts +16 -0
- package/dest/services/reqresp/config.d.ts.map +1 -0
- package/dest/services/reqresp/config.js +20 -0
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +45 -0
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +1 -0
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +88 -0
- package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +61 -0
- package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -0
- package/dest/services/reqresp/connection-sampler/connection_sampler.js +181 -0
- package/dest/services/reqresp/index.d.ts +6 -0
- package/dest/services/reqresp/index.d.ts.map +1 -0
- package/dest/services/reqresp/index.js +4 -0
- package/dest/services/reqresp/interface.d.ts +116 -0
- package/dest/services/reqresp/interface.d.ts.map +1 -0
- package/dest/services/reqresp/interface.js +84 -0
- package/dest/services/reqresp/metrics.d.ts +15 -0
- package/dest/services/reqresp/metrics.d.ts.map +1 -0
- package/dest/services/reqresp/metrics.js +55 -0
- package/dest/services/reqresp/protocols/block.d.ts +4 -0
- package/dest/services/reqresp/protocols/block.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/block.js +8 -0
- package/dest/services/reqresp/protocols/goodbye.d.ts +51 -0
- package/dest/services/reqresp/protocols/goodbye.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/goodbye.js +87 -0
- package/dest/services/reqresp/protocols/index.d.ts +9 -0
- package/dest/services/reqresp/protocols/index.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/index.js +7 -0
- package/dest/services/reqresp/protocols/ping.d.ts +9 -0
- package/dest/services/reqresp/protocols/ping.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/ping.js +7 -0
- package/dest/services/reqresp/protocols/status.d.ts +9 -0
- package/dest/services/reqresp/protocols/status.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/status.js +7 -0
- package/dest/services/reqresp/protocols/tx.d.ts +13 -0
- package/dest/services/reqresp/protocols/tx.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/tx.js +20 -0
- package/dest/services/reqresp/rate-limiter/index.d.ts +2 -0
- package/dest/services/reqresp/rate-limiter/index.d.ts.map +1 -0
- package/dest/services/reqresp/rate-limiter/index.js +1 -0
- package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +102 -0
- package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -0
- package/dest/services/reqresp/rate-limiter/rate_limiter.js +184 -0
- package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +3 -0
- package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -0
- package/dest/services/reqresp/rate-limiter/rate_limits.js +54 -0
- package/dest/services/reqresp/reqresp.d.ts +166 -0
- package/dest/services/reqresp/reqresp.d.ts.map +1 -0
- package/dest/services/reqresp/reqresp.js +516 -0
- package/dest/services/reqresp/status.d.ts +31 -0
- package/dest/services/reqresp/status.d.ts.map +1 -0
- package/dest/services/reqresp/status.js +51 -0
- package/dest/services/service.d.ts +87 -0
- package/dest/services/service.d.ts.map +1 -0
- package/dest/services/service.js +5 -0
- package/dest/test-helpers/generate-peer-id-private-keys.d.ts +7 -0
- package/dest/test-helpers/generate-peer-id-private-keys.d.ts.map +1 -0
- package/dest/test-helpers/generate-peer-id-private-keys.js +13 -0
- package/dest/test-helpers/get-ports.d.ts +7 -0
- package/dest/test-helpers/get-ports.d.ts.map +1 -0
- package/dest/test-helpers/get-ports.js +8 -0
- package/dest/test-helpers/index.d.ts +6 -0
- package/dest/test-helpers/index.d.ts.map +1 -0
- package/dest/test-helpers/index.js +5 -0
- package/dest/test-helpers/make-enrs.d.ts +16 -0
- package/dest/test-helpers/make-enrs.d.ts.map +1 -0
- package/dest/test-helpers/make-enrs.js +32 -0
- package/dest/test-helpers/make-test-p2p-clients.d.ts +36 -0
- package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -0
- package/dest/test-helpers/make-test-p2p-clients.js +68 -0
- package/dest/test-helpers/reqresp-nodes.d.ts +66 -0
- package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -0
- package/dest/test-helpers/reqresp-nodes.js +207 -0
- package/dest/testbench/p2p_client_testbench_worker.d.ts +2 -0
- package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -0
- package/dest/testbench/p2p_client_testbench_worker.js +132 -0
- package/dest/testbench/parse_log_file.d.ts +2 -0
- package/dest/testbench/parse_log_file.d.ts.map +1 -0
- package/dest/testbench/parse_log_file.js +131 -0
- package/dest/testbench/testbench.d.ts +2 -0
- package/dest/testbench/testbench.d.ts.map +1 -0
- package/dest/testbench/testbench.js +61 -0
- package/dest/testbench/worker_client_manager.d.ts +56 -0
- package/dest/testbench/worker_client_manager.d.ts.map +1 -0
- package/dest/testbench/worker_client_manager.js +266 -0
- package/dest/types/index.d.ts +32 -0
- package/dest/types/index.d.ts.map +1 -0
- package/dest/types/index.js +28 -0
- package/dest/util.d.ts +53 -0
- package/dest/util.d.ts.map +1 -0
- package/dest/util.js +140 -0
- package/dest/versioning.d.ts +12 -0
- package/dest/versioning.d.ts.map +1 -0
- package/dest/versioning.js +33 -0
- package/package.json +127 -0
- package/src/bootstrap/bootstrap.ts +146 -0
- package/src/client/factory.ts +89 -0
- package/src/client/index.ts +2 -0
- package/src/client/p2p_client.ts +754 -0
- package/src/config.ts +371 -0
- package/src/enr/generate-enr.ts +39 -0
- package/src/enr/index.ts +1 -0
- package/src/errors/reqresp.error.ts +35 -0
- package/src/index.ts +7 -0
- package/src/mem_pools/attestation_pool/attestation_pool.ts +62 -0
- package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +230 -0
- package/src/mem_pools/attestation_pool/index.ts +2 -0
- package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +159 -0
- package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +161 -0
- package/src/mem_pools/attestation_pool/mocks.ts +44 -0
- package/src/mem_pools/index.ts +3 -0
- package/src/mem_pools/instrumentation.ts +126 -0
- package/src/mem_pools/interface.ts +12 -0
- package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +309 -0
- package/src/mem_pools/tx_pool/index.ts +3 -0
- package/src/mem_pools/tx_pool/memory_tx_pool.ts +174 -0
- package/src/mem_pools/tx_pool/priority.ts +13 -0
- package/src/mem_pools/tx_pool/tx_pool.ts +76 -0
- package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +130 -0
- package/src/msg_validators/attestation_validator/attestation_validator.ts +26 -0
- package/src/msg_validators/attestation_validator/index.ts +1 -0
- package/src/msg_validators/block_proposal_validator/block_proposal_validator.ts +29 -0
- package/src/msg_validators/block_proposal_validator/index.ts +1 -0
- package/src/msg_validators/index.ts +3 -0
- package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +32 -0
- package/src/msg_validators/tx_validator/block_header_validator.ts +25 -0
- package/src/msg_validators/tx_validator/data_validator.ts +106 -0
- package/src/msg_validators/tx_validator/double_spend_validator.ts +38 -0
- package/src/msg_validators/tx_validator/index.ts +6 -0
- package/src/msg_validators/tx_validator/metadata_validator.ts +48 -0
- package/src/msg_validators/tx_validator/tx_proof_validator.ts +18 -0
- package/src/services/data_store.ts +235 -0
- package/src/services/discv5/discV5_service.ts +256 -0
- package/src/services/dummy_service.ts +134 -0
- package/src/services/encoding.ts +79 -0
- package/src/services/gossipsub/scoring.ts +13 -0
- package/src/services/index.ts +2 -0
- package/src/services/libp2p/libp2p_service.ts +871 -0
- package/src/services/peer-manager/metrics.ts +41 -0
- package/src/services/peer-manager/peer_manager.ts +530 -0
- package/src/services/peer-manager/peer_scoring.ts +105 -0
- package/src/services/reqresp/config.ts +35 -0
- package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +94 -0
- package/src/services/reqresp/connection-sampler/connection_sampler.ts +217 -0
- package/src/services/reqresp/index.ts +4 -0
- package/src/services/reqresp/interface.ts +185 -0
- package/src/services/reqresp/metrics.ts +57 -0
- package/src/services/reqresp/protocols/block.ts +15 -0
- package/src/services/reqresp/protocols/goodbye.ts +101 -0
- package/src/services/reqresp/protocols/index.ts +8 -0
- package/src/services/reqresp/protocols/ping.ts +8 -0
- package/src/services/reqresp/protocols/status.ts +8 -0
- package/src/services/reqresp/protocols/tx.ts +29 -0
- package/src/services/reqresp/rate-limiter/index.ts +1 -0
- package/src/services/reqresp/rate-limiter/rate_limiter.ts +228 -0
- package/src/services/reqresp/rate-limiter/rate_limits.ts +55 -0
- package/src/services/reqresp/reqresp.ts +661 -0
- package/src/services/reqresp/status.ts +59 -0
- package/src/services/service.ts +112 -0
- package/src/test-helpers/generate-peer-id-private-keys.ts +15 -0
- package/src/test-helpers/get-ports.ts +8 -0
- package/src/test-helpers/index.ts +5 -0
- package/src/test-helpers/make-enrs.ts +44 -0
- package/src/test-helpers/make-test-p2p-clients.ts +122 -0
- package/src/test-helpers/reqresp-nodes.ts +289 -0
- package/src/testbench/README.md +20 -0
- package/src/testbench/p2p_client_testbench_worker.ts +152 -0
- package/src/testbench/parse_log_file.ts +175 -0
- package/src/testbench/testbench.ts +66 -0
- package/src/testbench/worker_client_manager.ts +318 -0
- package/src/types/index.ts +36 -0
- package/src/util.ts +196 -0
- package/src/versioning.ts +50 -0
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
2
|
+
import type { Logger } from '@aztec/foundation/log';
|
|
3
|
+
import { sleep } from '@aztec/foundation/sleep';
|
|
4
|
+
import type { ChainConfig } from '@aztec/stdlib/config';
|
|
5
|
+
|
|
6
|
+
import { type ChildProcess, fork } from 'child_process';
|
|
7
|
+
import path from 'path';
|
|
8
|
+
import { fileURLToPath } from 'url';
|
|
9
|
+
|
|
10
|
+
import { type P2PConfig, getP2PDefaultConfig } from '../config.js';
|
|
11
|
+
import { generatePeerIdPrivateKeys } from '../test-helpers/generate-peer-id-private-keys.js';
|
|
12
|
+
import { getPorts } from '../test-helpers/get-ports.js';
|
|
13
|
+
import { makeEnr, makeEnrs } from '../test-helpers/make-enrs.js';
|
|
14
|
+
|
|
15
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
16
|
+
const workerPath = path.join(__dirname, '../../dest/testbench/p2p_client_testbench_worker.js');
|
|
17
|
+
|
|
18
|
+
const testChainConfig: ChainConfig = {
|
|
19
|
+
l1ChainId: 31337,
|
|
20
|
+
version: 1,
|
|
21
|
+
l1Contracts: {
|
|
22
|
+
rollupAddress: EthAddress.random(),
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
class WorkerClientManager {
|
|
27
|
+
public processes: ChildProcess[] = [];
|
|
28
|
+
public peerIdPrivateKeys: string[] = [];
|
|
29
|
+
public peerEnrs: string[] = [];
|
|
30
|
+
public ports: number[] = [];
|
|
31
|
+
private p2pConfig: Partial<P2PConfig>;
|
|
32
|
+
private logger: Logger;
|
|
33
|
+
private messageReceivedByClient: number[] = [];
|
|
34
|
+
|
|
35
|
+
constructor(logger: Logger, p2pConfig: Partial<P2PConfig>) {
|
|
36
|
+
this.logger = logger;
|
|
37
|
+
this.p2pConfig = p2pConfig;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
destroy() {
|
|
41
|
+
this.cleanup().catch((error: Error) => {
|
|
42
|
+
this.logger.error('Failed to cleanup worker client manager', error);
|
|
43
|
+
process.exit(1);
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Creates address strings from a port
|
|
49
|
+
*/
|
|
50
|
+
private getAddresses(port: number) {
|
|
51
|
+
return {
|
|
52
|
+
addr: `127.0.0.1:${port}`,
|
|
53
|
+
listenAddr: `0.0.0.0:${port}`,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Creates a client configuration object
|
|
59
|
+
*/
|
|
60
|
+
private createClientConfig(clientIndex: number, port: number, otherNodes: string[]) {
|
|
61
|
+
const { addr, listenAddr } = this.getAddresses(port);
|
|
62
|
+
|
|
63
|
+
return {
|
|
64
|
+
...getP2PDefaultConfig(),
|
|
65
|
+
p2pEnabled: true,
|
|
66
|
+
peerIdPrivateKey: this.peerIdPrivateKeys[clientIndex],
|
|
67
|
+
tcpListenAddress: listenAddr,
|
|
68
|
+
udpListenAddress: listenAddr,
|
|
69
|
+
tcpAnnounceAddress: addr,
|
|
70
|
+
udpAnnounceAddress: addr,
|
|
71
|
+
bootstrapNodes: [...otherNodes],
|
|
72
|
+
...this.p2pConfig,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Spawns a worker process and returns a promise that resolves when the worker is ready
|
|
78
|
+
*/
|
|
79
|
+
private spawnWorkerProcess(
|
|
80
|
+
config: P2PConfig & Partial<ChainConfig>,
|
|
81
|
+
clientIndex: number,
|
|
82
|
+
): [ChildProcess, Promise<void>] {
|
|
83
|
+
const childProcess = fork(workerPath);
|
|
84
|
+
childProcess.send({ type: 'START', config, clientIndex });
|
|
85
|
+
|
|
86
|
+
// Handle unexpected child process exit
|
|
87
|
+
childProcess.on('exit', (code, signal) => {
|
|
88
|
+
if (code !== 0) {
|
|
89
|
+
this.logger.warn(`Worker ${clientIndex} exited unexpectedly with code ${code} and signal ${signal}`);
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
childProcess.on('message', (msg: any) => {
|
|
94
|
+
if (msg.type === 'GOSSIP_RECEIVED') {
|
|
95
|
+
this.messageReceivedByClient[clientIndex] = msg.count;
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
// Create ready signal promise
|
|
100
|
+
const readySignal = new Promise<void>((resolve, reject) => {
|
|
101
|
+
// Set a timeout to avoid hanging indefinitely
|
|
102
|
+
const timeout = setTimeout(() => {
|
|
103
|
+
reject(new Error(`Timeout waiting for worker ${clientIndex} to be ready`));
|
|
104
|
+
}, 30000); // 30 second timeout
|
|
105
|
+
|
|
106
|
+
childProcess.once('message', (msg: any) => {
|
|
107
|
+
clearTimeout(timeout);
|
|
108
|
+
if (msg.type === 'READY') {
|
|
109
|
+
resolve();
|
|
110
|
+
}
|
|
111
|
+
// For future use
|
|
112
|
+
if (msg.type === 'ERROR') {
|
|
113
|
+
reject(new Error(msg.error));
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
// Also resolve/reject if process exits before sending message
|
|
118
|
+
childProcess.once('exit', code => {
|
|
119
|
+
clearTimeout(timeout);
|
|
120
|
+
if (code === 0) {
|
|
121
|
+
resolve();
|
|
122
|
+
} else {
|
|
123
|
+
reject(new Error(`Worker ${clientIndex} exited with code ${code} before becoming ready`));
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
return [childProcess, readySignal];
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Creates a number of worker clients in separate processes
|
|
133
|
+
* All are configured to connect to each other and overrided with the test specific config
|
|
134
|
+
*
|
|
135
|
+
* @param numberOfClients - The number of clients to create
|
|
136
|
+
* @returns The ENRs of the created clients
|
|
137
|
+
*/
|
|
138
|
+
async makeWorkerClients(numberOfClients: number) {
|
|
139
|
+
try {
|
|
140
|
+
this.messageReceivedByClient = new Array(numberOfClients).fill(0);
|
|
141
|
+
this.peerIdPrivateKeys = generatePeerIdPrivateKeys(numberOfClients);
|
|
142
|
+
this.ports = await getPorts(numberOfClients);
|
|
143
|
+
this.peerEnrs = await makeEnrs(this.peerIdPrivateKeys, this.ports, testChainConfig);
|
|
144
|
+
|
|
145
|
+
this.processes = [];
|
|
146
|
+
const readySignals: Promise<void>[] = [];
|
|
147
|
+
|
|
148
|
+
for (let i = 0; i < numberOfClients; i++) {
|
|
149
|
+
this.logger.info(`Creating client ${i}`);
|
|
150
|
+
|
|
151
|
+
// Maximum seed with 10 other peers to allow peer discovery to connect them at a smoother rate
|
|
152
|
+
const otherNodes = this.peerEnrs.filter((_, ind) => ind < Math.min(i, 10));
|
|
153
|
+
|
|
154
|
+
const config = this.createClientConfig(i, this.ports[i], otherNodes);
|
|
155
|
+
const [childProcess, readySignal] = this.spawnWorkerProcess(config, i);
|
|
156
|
+
|
|
157
|
+
readySignals.push(readySignal);
|
|
158
|
+
this.processes.push(childProcess);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
// Wait for peers to all connect with each other
|
|
162
|
+
await sleep(10000);
|
|
163
|
+
|
|
164
|
+
// Wait for all peers to be booted up with timeout
|
|
165
|
+
await Promise.race([
|
|
166
|
+
Promise.all(readySignals),
|
|
167
|
+
new Promise((_, reject) =>
|
|
168
|
+
setTimeout(() => reject(new Error('Timeout waiting for all workers to be ready')), 30000),
|
|
169
|
+
),
|
|
170
|
+
]);
|
|
171
|
+
|
|
172
|
+
return this.peerEnrs;
|
|
173
|
+
} catch (error) {
|
|
174
|
+
// Clean up any processes that were created if there's an error
|
|
175
|
+
this.logger.error('Error during makeWorkerClients:', error);
|
|
176
|
+
await this.cleanup();
|
|
177
|
+
throw error;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
purgeMessageReceivedByClient() {
|
|
182
|
+
this.messageReceivedByClient = new Array(this.processes.length).fill(0);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
numberOfClientsThatReceivedMessage() {
|
|
186
|
+
return this.messageReceivedByClient.filter(count => count > 0).length;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* Changes the port for a specific client
|
|
191
|
+
*
|
|
192
|
+
* @param clientIndex - The index of the client to change port for
|
|
193
|
+
* @param newPort - The new port to use
|
|
194
|
+
*/
|
|
195
|
+
async changePort(clientIndex: number, newPort: number) {
|
|
196
|
+
try {
|
|
197
|
+
if (clientIndex < 0 || clientIndex >= this.processes.length) {
|
|
198
|
+
throw new Error(`Invalid client index: ${clientIndex}`);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
this.processes[clientIndex].send({ type: 'STOP' });
|
|
202
|
+
|
|
203
|
+
// Wait for the process to be ready with a timeout
|
|
204
|
+
await sleep(10000);
|
|
205
|
+
|
|
206
|
+
this.logger.info(`Changing port for client ${clientIndex} to ${newPort}`);
|
|
207
|
+
|
|
208
|
+
// Update the port in the ports array
|
|
209
|
+
this.ports[clientIndex] = newPort;
|
|
210
|
+
|
|
211
|
+
// Update the port in the peerEnrs array
|
|
212
|
+
this.peerEnrs[clientIndex] = await makeEnr(this.peerIdPrivateKeys[clientIndex], newPort, testChainConfig);
|
|
213
|
+
|
|
214
|
+
// Maximum seed with 10 other peers to allow peer discovery to connect them at a smoother rate
|
|
215
|
+
const otherNodes = this.peerEnrs.filter(
|
|
216
|
+
(_, ind) => ind !== clientIndex && ind < Math.min(this.peerEnrs.length, 10),
|
|
217
|
+
);
|
|
218
|
+
|
|
219
|
+
const config = this.createClientConfig(clientIndex, newPort, otherNodes);
|
|
220
|
+
const [childProcess, readySignal] = this.spawnWorkerProcess(config, clientIndex);
|
|
221
|
+
|
|
222
|
+
this.processes[clientIndex] = childProcess;
|
|
223
|
+
|
|
224
|
+
// Wait for the process to be ready with a timeout
|
|
225
|
+
await Promise.race([
|
|
226
|
+
readySignal,
|
|
227
|
+
new Promise((_, reject) =>
|
|
228
|
+
setTimeout(() => reject(new Error(`Timeout waiting for client ${clientIndex} to be ready`)), 30000),
|
|
229
|
+
),
|
|
230
|
+
]);
|
|
231
|
+
} catch (error) {
|
|
232
|
+
this.logger.error(`Error during changePort for client ${clientIndex}:`, error);
|
|
233
|
+
// Only clean up the specific process that had an issue
|
|
234
|
+
await this.terminateProcess(this.processes[clientIndex], clientIndex);
|
|
235
|
+
throw error;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
/**
|
|
240
|
+
* Terminate a single process with timeout and force kill if needed
|
|
241
|
+
*/
|
|
242
|
+
private terminateProcess(process: ChildProcess, index: number): Promise<void> {
|
|
243
|
+
if (!process || process.killed) {
|
|
244
|
+
return Promise.resolve();
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
return new Promise<void>(resolve => {
|
|
248
|
+
// Set a timeout for the graceful exit
|
|
249
|
+
const forceKillTimeout = setTimeout(() => {
|
|
250
|
+
this.logger.warn(`Process ${index} didn't exit gracefully, force killing...`);
|
|
251
|
+
try {
|
|
252
|
+
process.kill('SIGKILL'); // Force kill
|
|
253
|
+
} catch (e) {
|
|
254
|
+
this.logger.error(`Error force killing process ${index}:`, e);
|
|
255
|
+
}
|
|
256
|
+
}, 10000); // 10 second timeout for graceful exit
|
|
257
|
+
|
|
258
|
+
// Listen for process exit
|
|
259
|
+
process.once('exit', () => {
|
|
260
|
+
clearTimeout(forceKillTimeout);
|
|
261
|
+
resolve();
|
|
262
|
+
});
|
|
263
|
+
|
|
264
|
+
// Try to gracefully stop the process
|
|
265
|
+
try {
|
|
266
|
+
process.send({ type: 'STOP' });
|
|
267
|
+
} catch (e) {
|
|
268
|
+
// If sending the message fails, force kill immediately
|
|
269
|
+
clearTimeout(forceKillTimeout);
|
|
270
|
+
try {
|
|
271
|
+
process.kill('SIGKILL');
|
|
272
|
+
} catch (killError) {
|
|
273
|
+
this.logger.error(`Error force killing process ${index}:`, killError);
|
|
274
|
+
}
|
|
275
|
+
resolve();
|
|
276
|
+
}
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/**
|
|
281
|
+
* Cleans up all worker processes with timeout and force kill if needed
|
|
282
|
+
*/
|
|
283
|
+
async cleanup() {
|
|
284
|
+
this.logger.info(`Cleaning up ${this.processes.length} worker processes`);
|
|
285
|
+
|
|
286
|
+
// Create array of promises for each process termination
|
|
287
|
+
const terminationPromises = this.processes.map((process, index) => this.terminateProcess(process, index));
|
|
288
|
+
|
|
289
|
+
// Wait for all processes to terminate with a timeout
|
|
290
|
+
try {
|
|
291
|
+
await Promise.race([
|
|
292
|
+
Promise.all(terminationPromises),
|
|
293
|
+
new Promise<void>(resolve => {
|
|
294
|
+
setTimeout(() => {
|
|
295
|
+
this.logger.warn('Some processes did not terminate in time, force killing all remaining...');
|
|
296
|
+
this.processes.forEach(p => {
|
|
297
|
+
try {
|
|
298
|
+
if (!p.killed) {
|
|
299
|
+
p.kill('SIGKILL');
|
|
300
|
+
}
|
|
301
|
+
} catch (e) {
|
|
302
|
+
// Ignore errors when force killing
|
|
303
|
+
}
|
|
304
|
+
});
|
|
305
|
+
resolve();
|
|
306
|
+
}, 30000); // 30 second timeout for all processes
|
|
307
|
+
}),
|
|
308
|
+
]);
|
|
309
|
+
} catch (error) {
|
|
310
|
+
this.logger.error('Error during cleanup:', error);
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
this.processes = [];
|
|
314
|
+
this.logger.info('All worker processes cleaned up');
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
export { WorkerClientManager, testChainConfig };
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/***************************************************
|
|
2
|
+
* Events
|
|
3
|
+
***************************************************/
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Events emitted from the libp2p node.
|
|
7
|
+
*/
|
|
8
|
+
export enum PeerEvent {
|
|
9
|
+
DISCOVERED = 'peer:discovered',
|
|
10
|
+
CONNECTED = 'peer:connect',
|
|
11
|
+
DISCONNECTED = 'peer:disconnect',
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Events emitted from the Discv5 service.
|
|
16
|
+
*/
|
|
17
|
+
export enum Discv5Event {
|
|
18
|
+
DISCOVERED = 'discovered',
|
|
19
|
+
ENR_ADDED = 'enrAdded',
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Events emitted from the GossipSub protocol.
|
|
24
|
+
*/
|
|
25
|
+
export enum GossipSubEvent {
|
|
26
|
+
MESSAGE = 'gossipsub:message',
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/***************************************************
|
|
30
|
+
* Types
|
|
31
|
+
***************************************************/
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Aztec network specific types
|
|
35
|
+
*/
|
|
36
|
+
export const AZTEC_ENR_KEY = 'aztec';
|
package/src/util.ts
ADDED
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import type { AztecAsyncKVStore } from '@aztec/kv-store';
|
|
2
|
+
import type { DataStoreConfig } from '@aztec/kv-store/config';
|
|
3
|
+
|
|
4
|
+
import type { GossipSub } from '@chainsafe/libp2p-gossipsub';
|
|
5
|
+
import { generateKeyPair, marshalPrivateKey, unmarshalPrivateKey } from '@libp2p/crypto/keys';
|
|
6
|
+
import type { PeerId, PrivateKey } from '@libp2p/interface';
|
|
7
|
+
import type { ConnectionManager } from '@libp2p/interface-internal';
|
|
8
|
+
import { createFromPrivKey } from '@libp2p/peer-id-factory';
|
|
9
|
+
import { resolve } from 'dns/promises';
|
|
10
|
+
import type { Libp2p } from 'libp2p';
|
|
11
|
+
|
|
12
|
+
import type { P2PConfig } from './config.js';
|
|
13
|
+
|
|
14
|
+
export interface PubSubLibp2p extends Libp2p {
|
|
15
|
+
services: {
|
|
16
|
+
pubsub: GossipSub;
|
|
17
|
+
components: {
|
|
18
|
+
connectionManager: ConnectionManager;
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Converts an address string to a multiaddr string.
|
|
25
|
+
* Example usage:
|
|
26
|
+
* const tcpAddr = '123.456.7.8:80' -> /ip4/123.456.7.8/tcp/80
|
|
27
|
+
* const udpAddr = '[2001:db8::1]:8080' -> /ip6/2001:db8::1/udp/8080
|
|
28
|
+
* @param address - The address string to convert. Has to be in the format <addr>:<port>.
|
|
29
|
+
* @param protocol - The protocol to use in the multiaddr string.
|
|
30
|
+
* @returns A multiaddr compliant string. */
|
|
31
|
+
export function convertToMultiaddr(address: string, protocol: 'tcp' | 'udp'): string {
|
|
32
|
+
const [addr, port] = splitAddressPort(address, false);
|
|
33
|
+
|
|
34
|
+
const multiaddrPrefix = addressToMultiAddressType(addr);
|
|
35
|
+
if (multiaddrPrefix === 'dns') {
|
|
36
|
+
throw new Error('Invalid address format. Expected an IPv4 or IPv6 address.');
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
return `/${multiaddrPrefix}/${addr}/${protocol}/${port}`;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Splits an <address>:<port> string into its components.
|
|
44
|
+
* @returns The ip6 or ip4 address & port separately
|
|
45
|
+
*/
|
|
46
|
+
export function splitAddressPort(address: string, allowEmptyAddress: boolean): [string, string] {
|
|
47
|
+
let addr: string;
|
|
48
|
+
let port: string;
|
|
49
|
+
|
|
50
|
+
if (address.startsWith('[')) {
|
|
51
|
+
// IPv6 address enclosed in square brackets
|
|
52
|
+
const match = address.match(/^\[([^\]]+)\]:(\d+)$/);
|
|
53
|
+
if (!match) {
|
|
54
|
+
throw new Error(`Invalid IPv6 address format:${address}. Expected format: [<addr>]:<port>`);
|
|
55
|
+
}
|
|
56
|
+
[, addr, port] = match;
|
|
57
|
+
} else {
|
|
58
|
+
// IPv4 address
|
|
59
|
+
[addr, port] = address.split(':');
|
|
60
|
+
if ((!addr && !allowEmptyAddress) || !port) {
|
|
61
|
+
throw new Error(`Invalid address format: ${address}. Expected format: <addr>:<port>`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
return [addr, port];
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Queries the public IP address of the machine.
|
|
70
|
+
*/
|
|
71
|
+
export async function getPublicIp(): Promise<string> {
|
|
72
|
+
const resp = await fetch('http://checkip.amazonaws.com/');
|
|
73
|
+
const text = await resp.text();
|
|
74
|
+
return text.trim();
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export async function resolveAddressIfNecessary(address: string): Promise<string> {
|
|
78
|
+
const [addr, port] = splitAddressPort(address, false);
|
|
79
|
+
const multiaddrPrefix = addressToMultiAddressType(addr);
|
|
80
|
+
if (multiaddrPrefix === 'dns') {
|
|
81
|
+
const resolvedAddresses = await resolve(addr);
|
|
82
|
+
if (resolvedAddresses.length === 0) {
|
|
83
|
+
throw new Error(`Could not resolve address: ${addr}`);
|
|
84
|
+
}
|
|
85
|
+
return `${resolvedAddresses[0]}:${port}`;
|
|
86
|
+
} else {
|
|
87
|
+
return address;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// Not public because it is not used outside of this file.
|
|
92
|
+
// Plus, it relies on `splitAddressPort` being called on the address first.
|
|
93
|
+
function addressToMultiAddressType(address: string): 'ip4' | 'ip6' | 'dns' {
|
|
94
|
+
if (address.includes(':')) {
|
|
95
|
+
return 'ip6';
|
|
96
|
+
} else if (address.match(/^[\d.]+$/)) {
|
|
97
|
+
return 'ip4';
|
|
98
|
+
} else {
|
|
99
|
+
return 'dns';
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
export async function configureP2PClientAddresses(
|
|
104
|
+
_config: P2PConfig & DataStoreConfig,
|
|
105
|
+
): Promise<P2PConfig & DataStoreConfig> {
|
|
106
|
+
const config = { ..._config };
|
|
107
|
+
const {
|
|
108
|
+
tcpAnnounceAddress: configTcpAnnounceAddress,
|
|
109
|
+
udpAnnounceAddress: configUdpAnnounceAddress,
|
|
110
|
+
queryForIp,
|
|
111
|
+
} = config;
|
|
112
|
+
|
|
113
|
+
config.tcpAnnounceAddress = configTcpAnnounceAddress
|
|
114
|
+
? await resolveAddressIfNecessary(configTcpAnnounceAddress)
|
|
115
|
+
: undefined;
|
|
116
|
+
config.udpAnnounceAddress = configUdpAnnounceAddress
|
|
117
|
+
? await resolveAddressIfNecessary(configUdpAnnounceAddress)
|
|
118
|
+
: undefined;
|
|
119
|
+
|
|
120
|
+
// create variable for re-use if needed
|
|
121
|
+
let publicIp;
|
|
122
|
+
|
|
123
|
+
// check if no announce IP was provided
|
|
124
|
+
const splitTcpAnnounceAddress = splitAddressPort(configTcpAnnounceAddress || '', true);
|
|
125
|
+
if (splitTcpAnnounceAddress.length == 2 && splitTcpAnnounceAddress[0] === '') {
|
|
126
|
+
if (queryForIp) {
|
|
127
|
+
publicIp = await getPublicIp();
|
|
128
|
+
const tcpAnnounceAddress = `${publicIp}:${splitTcpAnnounceAddress[1]}`;
|
|
129
|
+
config.tcpAnnounceAddress = tcpAnnounceAddress;
|
|
130
|
+
} else {
|
|
131
|
+
throw new Error(
|
|
132
|
+
`Invalid announceTcpAddress provided: ${configTcpAnnounceAddress}. Expected format: <addr>:<port>`,
|
|
133
|
+
);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
const splitUdpAnnounceAddress = splitAddressPort(configUdpAnnounceAddress || '', true);
|
|
138
|
+
if (splitUdpAnnounceAddress.length == 2 && splitUdpAnnounceAddress[0] === '') {
|
|
139
|
+
// If announceUdpAddress is not provided, use announceTcpAddress
|
|
140
|
+
if (!queryForIp && config.tcpAnnounceAddress) {
|
|
141
|
+
config.udpAnnounceAddress = config.tcpAnnounceAddress;
|
|
142
|
+
} else if (queryForIp) {
|
|
143
|
+
const udpPublicIp = publicIp || (await getPublicIp());
|
|
144
|
+
const udpAnnounceAddress = `${udpPublicIp}:${splitUdpAnnounceAddress[1]}`;
|
|
145
|
+
config.udpAnnounceAddress = udpAnnounceAddress;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
return config;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Get the peer id private key
|
|
154
|
+
*
|
|
155
|
+
* 1. Check if we have a peer id private key in the config
|
|
156
|
+
* 2. If not, check we have a peer id private key persisted in the node
|
|
157
|
+
* 3. If not, create a new one, then persist it in the node
|
|
158
|
+
*
|
|
159
|
+
*/
|
|
160
|
+
export async function getPeerIdPrivateKey(
|
|
161
|
+
config: { peerIdPrivateKey?: string },
|
|
162
|
+
store: AztecAsyncKVStore,
|
|
163
|
+
): Promise<string> {
|
|
164
|
+
const peerIdPrivateKeySingleton = store.openSingleton<string>('peerIdPrivateKey');
|
|
165
|
+
if (config.peerIdPrivateKey) {
|
|
166
|
+
await peerIdPrivateKeySingleton.set(config.peerIdPrivateKey);
|
|
167
|
+
return config.peerIdPrivateKey;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
const storedPeerIdPrivateKey = await peerIdPrivateKeySingleton.getAsync();
|
|
171
|
+
if (storedPeerIdPrivateKey) {
|
|
172
|
+
return storedPeerIdPrivateKey;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
const newPeerIdPrivateKey = await generateKeyPair('secp256k1');
|
|
176
|
+
const privateKeyString = Buffer.from(marshalPrivateKey(newPeerIdPrivateKey)).toString('hex');
|
|
177
|
+
|
|
178
|
+
await peerIdPrivateKeySingleton.set(privateKeyString);
|
|
179
|
+
return privateKeyString;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Create a libp2p peer ID from the private key.
|
|
184
|
+
* @param privateKey - peer ID private key as hex string
|
|
185
|
+
* @returns The peer ID.
|
|
186
|
+
*/
|
|
187
|
+
export async function createLibP2PPeerIdFromPrivateKey(privateKey: string): Promise<PeerId> {
|
|
188
|
+
if (!privateKey?.length) {
|
|
189
|
+
throw new Error('No peer private key provided');
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
const asLibp2pPrivateKey: PrivateKey<'secp256k1'> = await unmarshalPrivateKey(
|
|
193
|
+
new Uint8Array(Buffer.from(privateKey, 'hex')),
|
|
194
|
+
);
|
|
195
|
+
return await createFromPrivKey(asLibp2pPrivateKey);
|
|
196
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { toBufferBE } from '@aztec/foundation/bigint-buffer';
|
|
2
|
+
import { getVKTreeRoot } from '@aztec/noir-protocol-circuits-types/vk-tree';
|
|
3
|
+
import { protocolContractTreeRoot } from '@aztec/protocol-contracts';
|
|
4
|
+
import type { ChainConfig } from '@aztec/stdlib/config';
|
|
5
|
+
import {
|
|
6
|
+
type ComponentsVersions,
|
|
7
|
+
checkCompressedComponentVersion,
|
|
8
|
+
compressComponentVersions,
|
|
9
|
+
getComponentsVersionsFromConfig,
|
|
10
|
+
} from '@aztec/stdlib/versioning';
|
|
11
|
+
|
|
12
|
+
import type { SignableENR } from '@chainsafe/enr';
|
|
13
|
+
import xxhashFactory from 'xxhash-wasm';
|
|
14
|
+
|
|
15
|
+
import { AZTEC_ENR_KEY } from './types/index.js';
|
|
16
|
+
|
|
17
|
+
const USE_XX_HASH = false; // Enable to reduce the size of the ENR record for production
|
|
18
|
+
const XX_HASH_LEN = 8;
|
|
19
|
+
const xxhash = await xxhashFactory();
|
|
20
|
+
|
|
21
|
+
/** Returns the component versions based on config and this build. */
|
|
22
|
+
export function getVersions(config: ChainConfig) {
|
|
23
|
+
return getComponentsVersionsFromConfig(config, protocolContractTreeRoot, getVKTreeRoot());
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/** Sets the aztec key on the ENR record with versioning info. */
|
|
27
|
+
export function setAztecEnrKey(enr: SignableENR, config: ChainConfig, useXxHash = USE_XX_HASH) {
|
|
28
|
+
const versions = getVersions(config);
|
|
29
|
+
const value = versionsToEnrValue(versions, useXxHash);
|
|
30
|
+
enr.set(AZTEC_ENR_KEY, value);
|
|
31
|
+
return versions;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/** Checks the given value from an ENR record against the expected versions. */
|
|
35
|
+
export function checkAztecEnrVersion(enrValue: Buffer, expectedVersions: ComponentsVersions) {
|
|
36
|
+
if (enrValue.length === XX_HASH_LEN) {
|
|
37
|
+
const expected = versionsToEnrValue(expectedVersions, true);
|
|
38
|
+
if (!Buffer.from(enrValue).equals(expected)) {
|
|
39
|
+
throw new Error(`Expected ENR version ${expected.toString('hex')} but received ${enrValue.toString('hex')}`);
|
|
40
|
+
}
|
|
41
|
+
} else {
|
|
42
|
+
const actual = Buffer.from(enrValue).toString();
|
|
43
|
+
checkCompressedComponentVersion(actual, expectedVersions);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function versionsToEnrValue(versions: ComponentsVersions, useXxHash: boolean) {
|
|
48
|
+
const compressed = compressComponentVersions(versions);
|
|
49
|
+
return useXxHash ? toBufferBE(xxhash.h64(compressed), XX_HASH_LEN) : Buffer.from(compressed);
|
|
50
|
+
}
|