@aztec/p2p 0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2 → 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.
- package/dest/bootstrap/bootstrap.d.ts +38 -0
- package/dest/bootstrap/bootstrap.d.ts.map +1 -0
- package/dest/bootstrap/bootstrap.js +31 -38
- package/dest/client/factory.d.ts +21 -0
- package/dest/client/factory.d.ts.map +1 -0
- package/dest/client/factory.js +13 -11
- package/dest/client/index.d.ts +3 -0
- package/dest/client/index.d.ts.map +1 -0
- package/dest/client/index.js +1 -0
- package/dest/client/p2p_client.d.ts +332 -0
- package/dest/client/p2p_client.d.ts.map +1 -0
- package/dest/client/p2p_client.js +535 -513
- package/dest/config.d.ts +187 -0
- package/dest/config.d.ts.map +1 -0
- package/dest/config.js +64 -53
- 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 +10 -6
- package/dest/index.d.ts +9 -0
- package/dest/index.d.ts.map +1 -0
- package/dest/index.js +1 -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 +2 -6
- 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 +32 -64
- 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 +1 -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 +19 -22
- 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 +26 -22
- package/dest/mem_pools/attestation_pool/mocks.d.ts +18 -0
- package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -0
- package/dest/mem_pools/attestation_pool/mocks.js +6 -10
- package/dest/mem_pools/epoch_proof_quote_pool/epoch_proof_quote_pool.d.ts +7 -0
- package/dest/mem_pools/epoch_proof_quote_pool/epoch_proof_quote_pool.d.ts.map +1 -0
- package/dest/mem_pools/epoch_proof_quote_pool/epoch_proof_quote_pool.js +2 -1
- package/dest/mem_pools/epoch_proof_quote_pool/index.d.ts +4 -0
- package/dest/mem_pools/epoch_proof_quote_pool/index.d.ts.map +1 -0
- package/dest/mem_pools/epoch_proof_quote_pool/index.js +1 -0
- package/dest/mem_pools/epoch_proof_quote_pool/memory_epoch_proof_quote_pool.d.ts +12 -0
- package/dest/mem_pools/epoch_proof_quote_pool/memory_epoch_proof_quote_pool.d.ts.map +1 -0
- package/dest/mem_pools/epoch_proof_quote_pool/memory_epoch_proof_quote_pool.js +4 -5
- package/dest/mem_pools/epoch_proof_quote_pool/test_utils.d.ts +8 -0
- package/dest/mem_pools/epoch_proof_quote_pool/test_utils.d.ts.map +1 -0
- package/dest/mem_pools/epoch_proof_quote_pool/test_utils.js +3 -2
- package/dest/mem_pools/index.d.ts +5 -0
- package/dest/mem_pools/index.d.ts.map +1 -0
- package/dest/mem_pools/index.js +2 -1
- package/dest/mem_pools/instrumentation.d.ts +31 -0
- package/dest/mem_pools/instrumentation.d.ts.map +1 -0
- package/dest/mem_pools/instrumentation.js +42 -37
- package/dest/mem_pools/interface.d.ts +13 -0
- package/dest/mem_pools/interface.d.ts.map +1 -0
- package/dest/mem_pools/interface.js +2 -3
- 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 +134 -127
- 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 +1 -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 +43 -45
- 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 +3 -1
- 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 +2 -3
- 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 +37 -107
- 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 +3 -3
- 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 +2 -2
- 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/epoch_proof_quote_validator/epoch_proof_quote_validator.d.ts +8 -0
- package/dest/msg_validators/epoch_proof_quote_validator/epoch_proof_quote_validator.d.ts.map +1 -0
- package/dest/msg_validators/epoch_proof_quote_validator/epoch_proof_quote_validator.js +2 -2
- package/dest/msg_validators/epoch_proof_quote_validator/index.d.ts +2 -0
- package/dest/msg_validators/epoch_proof_quote_validator/index.d.ts.map +1 -0
- package/dest/msg_validators/epoch_proof_quote_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 +1 -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 +11 -9
- 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 +12 -17
- 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 +32 -41
- 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 +14 -22
- 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 +1 -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 +26 -29
- package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +8 -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 +12 -17
- 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 +57 -57
- package/dest/services/discv5/discV5_service.d.ts +40 -0
- package/dest/services/discv5/discV5_service.d.ts.map +1 -0
- package/dest/services/discv5/discV5_service.js +82 -43
- package/dest/services/dummy_service.d.ts +83 -0
- package/dest/services/dummy_service.d.ts.map +1 -0
- package/dest/services/dummy_service.js +59 -40
- package/dest/services/encoding.d.ts +31 -0
- package/dest/services/encoding.d.ts.map +1 -0
- package/dest/services/encoding.js +9 -10
- package/dest/services/index.d.ts +3 -0
- package/dest/services/index.d.ts.map +1 -0
- package/dest/services/index.js +1 -0
- package/dest/services/libp2p/libp2p_logger.d.ts +7 -0
- package/dest/services/libp2p/libp2p_logger.d.ts.map +1 -0
- package/dest/services/libp2p/libp2p_logger.js +67 -0
- package/dest/services/libp2p/libp2p_service.d.ts +225 -0
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -0
- package/dest/services/libp2p/libp2p_service.js +727 -709
- 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 +7 -14
- package/dest/services/peer-manager/peer_manager.d.ts +76 -0
- package/dest/services/peer-manager/peer_manager.d.ts.map +1 -0
- package/dest/services/peer-manager/peer_manager.js +342 -340
- 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 +18 -20
- 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 +5 -4
- 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 +28 -35
- 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 +59 -60
- 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 +3 -1
- 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 +30 -25
- 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 +10 -23
- 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 +2 -1
- 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 +41 -36
- 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 +3 -1
- 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 +3 -1
- 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 +3 -1
- 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 +8 -5
- 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 +35 -39
- 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 +17 -16
- 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 +463 -460
- 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 +17 -16
- package/dest/services/service.d.ts +86 -0
- package/dest/services/service.d.ts.map +1 -0
- package/dest/services/service.js +4 -3
- package/dest/services/types.d.ts +32 -0
- package/dest/services/types.d.ts.map +1 -0
- package/dest/services/types.js +19 -20
- 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 +15 -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 +6 -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 +35 -0
- package/dest/test-helpers/make-test-p2p-clients.d.ts +37 -0
- package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -0
- package/dest/test-helpers/make-test-p2p-clients.js +71 -0
- package/dest/test-helpers/reqresp-nodes.d.ts +55 -0
- package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -0
- package/dest/test-helpers/reqresp-nodes.js +183 -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 +125 -0
- package/dest/util.d.ts +53 -0
- package/dest/util.d.ts.map +1 -0
- package/dest/util.js +34 -23
- package/dest/versioning.d.ts +12 -0
- package/dest/versioning.d.ts.map +1 -0
- package/dest/versioning.js +38 -0
- package/package.json +11 -9
- package/src/bootstrap/bootstrap.ts +9 -3
- package/src/client/factory.ts +12 -5
- package/src/config.ts +56 -29
- package/src/mem_pools/index.ts +3 -3
- package/src/mem_pools/instrumentation.ts +2 -3
- package/src/msg_validators/attestation_validator/attestation_validator.ts +3 -3
- package/src/msg_validators/block_proposal_validator/block_proposal_validator.ts +3 -3
- package/src/msg_validators/epoch_proof_quote_validator/epoch_proof_quote_validator.ts +3 -3
- package/src/services/discv5/discV5_service.ts +67 -18
- package/src/services/dummy_service.ts +2 -0
- package/src/services/libp2p/libp2p_logger.ts +78 -0
- package/src/services/libp2p/libp2p_service.ts +47 -10
- package/src/services/reqresp/protocols/goodbye.ts +1 -1
- package/src/services/reqresp/reqresp.ts +9 -1
- package/src/services/service.ts +2 -0
- package/src/services/types.ts +2 -10
- 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 +124 -0
- package/src/{mocks/index.ts → test-helpers/reqresp-nodes.ts} +10 -5
- package/src/testbench/README.md +20 -0
- package/src/testbench/p2p_client_testbench_worker.ts +156 -0
- package/src/testbench/scripts/run_testbench.sh +7 -0
- package/src/versioning.ts +50 -0
- package/dest/mocks/index.js +0 -190
|
@@ -19,7 +19,7 @@ import {
|
|
|
19
19
|
metricsTopicStrToLabels,
|
|
20
20
|
} from '@aztec/circuit-types';
|
|
21
21
|
import { Fr } from '@aztec/circuits.js';
|
|
22
|
-
import { type
|
|
22
|
+
import { type EpochCacheInterface } from '@aztec/epoch-cache';
|
|
23
23
|
import { createLogger } from '@aztec/foundation/log';
|
|
24
24
|
import { SerialQueue } from '@aztec/foundation/queue';
|
|
25
25
|
import { RunningPromise } from '@aztec/foundation/running-promise';
|
|
@@ -34,8 +34,10 @@ import {
|
|
|
34
34
|
gossipsub,
|
|
35
35
|
} from '@chainsafe/libp2p-gossipsub';
|
|
36
36
|
import { createPeerScoreParams, createTopicScoreParams } from '@chainsafe/libp2p-gossipsub/score';
|
|
37
|
+
import { SignaturePolicy } from '@chainsafe/libp2p-gossipsub/types';
|
|
37
38
|
import { noise } from '@chainsafe/libp2p-noise';
|
|
38
39
|
import { yamux } from '@chainsafe/libp2p-yamux';
|
|
40
|
+
import { bootstrap } from '@libp2p/bootstrap';
|
|
39
41
|
import { identify } from '@libp2p/identify';
|
|
40
42
|
import { type Message, type PeerId, TopicValidatorResult } from '@libp2p/interface';
|
|
41
43
|
import { type ConnectionManager } from '@libp2p/interface-internal';
|
|
@@ -65,6 +67,7 @@ import { pingHandler, reqRespBlockHandler, reqRespTxHandler, statusHandler } fro
|
|
|
65
67
|
import { ReqResp } from '../reqresp/reqresp.js';
|
|
66
68
|
import type { P2PService, PeerDiscoveryService } from '../service.js';
|
|
67
69
|
import { GossipSubEvent } from '../types.js';
|
|
70
|
+
import { createLibp2pComponentLogger } from './libp2p_logger.js';
|
|
68
71
|
|
|
69
72
|
interface MessageValidator {
|
|
70
73
|
validator: {
|
|
@@ -111,7 +114,7 @@ export class LibP2PService<T extends P2PClientType> extends WithTracer implement
|
|
|
111
114
|
private peerDiscoveryService: PeerDiscoveryService,
|
|
112
115
|
private mempools: MemPools<T>,
|
|
113
116
|
private l2BlockSource: L2BlockSource,
|
|
114
|
-
epochCache:
|
|
117
|
+
epochCache: EpochCacheInterface,
|
|
115
118
|
private proofVerifier: ClientProtocolCircuitVerifier,
|
|
116
119
|
private worldStateSynchronizer: WorldStateSynchronizer,
|
|
117
120
|
telemetry: TelemetryClient,
|
|
@@ -127,7 +130,7 @@ export class LibP2PService<T extends P2PClientType> extends WithTracer implement
|
|
|
127
130
|
peerDiscoveryService,
|
|
128
131
|
config,
|
|
129
132
|
telemetry,
|
|
130
|
-
logger,
|
|
133
|
+
createLogger(`${logger.module}:peer_manager`),
|
|
131
134
|
peerScoring,
|
|
132
135
|
this.reqresp,
|
|
133
136
|
);
|
|
@@ -164,13 +167,14 @@ export class LibP2PService<T extends P2PClientType> extends WithTracer implement
|
|
|
164
167
|
peerId: PeerId,
|
|
165
168
|
mempools: MemPools<T>,
|
|
166
169
|
l2BlockSource: L2BlockSource,
|
|
167
|
-
epochCache:
|
|
170
|
+
epochCache: EpochCacheInterface,
|
|
168
171
|
proofVerifier: ClientProtocolCircuitVerifier,
|
|
169
172
|
worldStateSynchronizer: WorldStateSynchronizer,
|
|
170
173
|
store: AztecAsyncKVStore,
|
|
171
174
|
telemetry: TelemetryClient,
|
|
175
|
+
logger = createLogger('p2p:libp2p_service'),
|
|
172
176
|
) {
|
|
173
|
-
const { tcpListenAddress, tcpAnnounceAddress,
|
|
177
|
+
const { tcpListenAddress, tcpAnnounceAddress, maxPeerCount } = config;
|
|
174
178
|
const bindAddrTcp = convertToMultiaddr(tcpListenAddress, 'tcp');
|
|
175
179
|
// We know tcpAnnounceAddress cannot be null here because we set it or throw when setting up the service.
|
|
176
180
|
const announceAddrTcp = convertToMultiaddr(tcpAnnounceAddress!, 'tcp');
|
|
@@ -179,6 +183,12 @@ export class LibP2PService<T extends P2PClientType> extends WithTracer implement
|
|
|
179
183
|
|
|
180
184
|
const otelMetricsAdapter = new OtelMetricsAdapter(telemetry);
|
|
181
185
|
|
|
186
|
+
// If bootstrap nodes are provided, also provide them to the p2p service
|
|
187
|
+
const peerDiscovery = [];
|
|
188
|
+
if (peerDiscoveryService.bootstrapNodes.length > 0) {
|
|
189
|
+
peerDiscovery.push(bootstrap({ list: peerDiscoveryService.bootstrapNodes }));
|
|
190
|
+
}
|
|
191
|
+
|
|
182
192
|
const node = await createLibp2p({
|
|
183
193
|
start: false,
|
|
184
194
|
peerId,
|
|
@@ -200,24 +210,35 @@ export class LibP2PService<T extends P2PClientType> extends WithTracer implement
|
|
|
200
210
|
}),
|
|
201
211
|
],
|
|
202
212
|
datastore,
|
|
203
|
-
|
|
213
|
+
peerDiscovery,
|
|
214
|
+
streamMuxers: [mplex(), yamux()],
|
|
204
215
|
connectionEncryption: [noise()],
|
|
205
216
|
connectionManager: {
|
|
206
|
-
minConnections:
|
|
217
|
+
minConnections: 0,
|
|
207
218
|
maxConnections: maxPeerCount,
|
|
219
|
+
|
|
220
|
+
maxParallelDials: 100,
|
|
221
|
+
maxPeerAddrsToDial: 5,
|
|
222
|
+
maxIncomingPendingConnections: 5,
|
|
208
223
|
},
|
|
209
224
|
services: {
|
|
210
225
|
identify: identify({
|
|
211
226
|
protocolPrefix: 'aztec',
|
|
212
227
|
}),
|
|
213
228
|
pubsub: gossipsub({
|
|
229
|
+
debugName: 'gossipsub',
|
|
230
|
+
globalSignaturePolicy: SignaturePolicy.StrictNoSign,
|
|
214
231
|
allowPublishToZeroTopicPeers: true,
|
|
232
|
+
floodPublish: config.gossipsubFloodPublish,
|
|
215
233
|
D: config.gossipsubD,
|
|
216
234
|
Dlo: config.gossipsubDlo,
|
|
217
235
|
Dhi: config.gossipsubDhi,
|
|
236
|
+
Dlazy: config.gossipsubDLazy,
|
|
218
237
|
heartbeatInterval: config.gossipsubInterval,
|
|
219
238
|
mcacheLength: config.gossipsubMcacheLength,
|
|
220
239
|
mcacheGossip: config.gossipsubMcacheGossip,
|
|
240
|
+
// Increased from default 3s to give time for input lag: configuration and rationale from lodestar
|
|
241
|
+
gossipsubIWantFollowupMs: 12 * 1000,
|
|
221
242
|
msgIdFn: getMsgIdFn,
|
|
222
243
|
msgIdToStrFn: msgIdToStrFn,
|
|
223
244
|
fastMsgIdFn: fastMsgIdFn,
|
|
@@ -226,6 +247,8 @@ export class LibP2PService<T extends P2PClientType> extends WithTracer implement
|
|
|
226
247
|
metricsTopicStrToLabel: metricsTopicStrToLabels(),
|
|
227
248
|
asyncValidation: true,
|
|
228
249
|
scoreParams: createPeerScoreParams({
|
|
250
|
+
// IPColocation factor can be disabled for local testing - default to -5
|
|
251
|
+
IPColocationFactorWeight: config.debugDisableColocationPenalty ? 0 : -5.0,
|
|
229
252
|
topics: {
|
|
230
253
|
[Tx.p2pTopic]: createTopicScoreParams({
|
|
231
254
|
topicWeight: 1,
|
|
@@ -254,6 +277,8 @@ export class LibP2PService<T extends P2PClientType> extends WithTracer implement
|
|
|
254
277
|
connectionManager: components.connectionManager,
|
|
255
278
|
}),
|
|
256
279
|
},
|
|
280
|
+
// Fix the peer id in libp2p logs so we can see the source of the log
|
|
281
|
+
logger: createLibp2pComponentLogger(logger.module, { sourcePeerId: peerId }),
|
|
257
282
|
});
|
|
258
283
|
|
|
259
284
|
return new LibP2PService(
|
|
@@ -267,6 +292,7 @@ export class LibP2PService<T extends P2PClientType> extends WithTracer implement
|
|
|
267
292
|
proofVerifier,
|
|
268
293
|
worldStateSynchronizer,
|
|
269
294
|
telemetry,
|
|
295
|
+
logger,
|
|
270
296
|
);
|
|
271
297
|
}
|
|
272
298
|
|
|
@@ -319,8 +345,16 @@ export class LibP2PService<T extends P2PClientType> extends WithTracer implement
|
|
|
319
345
|
[BlockProposal.p2pTopic]: this.validatePropagatedBlockFromMessage.bind(this),
|
|
320
346
|
[EpochProofQuote.p2pTopic]: this.validatePropagatedEpochProofQuoteFromMessage.bind(this),
|
|
321
347
|
};
|
|
322
|
-
|
|
323
|
-
|
|
348
|
+
// When running bandwidth benchmarks, we use send blobs of data we do not want to validate
|
|
349
|
+
// NEVER switch this off in production
|
|
350
|
+
if (!this.config.debugDisableMessageValidation) {
|
|
351
|
+
for (const [topic, validator] of Object.entries(topicValidators)) {
|
|
352
|
+
this.node.services.pubsub.topicValidators.set(topic, validator);
|
|
353
|
+
}
|
|
354
|
+
} else {
|
|
355
|
+
this.logger.warn(
|
|
356
|
+
'MESSAGE VALIDATION DISABLED - IF YOU SEE THIS LOG AND ARE NOT DEBUGGING AND ARE RUNNING IN A PRODUCTION ENVIRONMENT, PLEASE RE-ENABLE MESSAGE VALIDATION',
|
|
357
|
+
);
|
|
324
358
|
}
|
|
325
359
|
|
|
326
360
|
// add GossipSub listener
|
|
@@ -904,7 +938,10 @@ export class LibP2PService<T extends P2PClientType> extends WithTracer implement
|
|
|
904
938
|
this.logger.trace(`Sending message ${identifier}`, { p2pMessageIdentifier: identifier });
|
|
905
939
|
|
|
906
940
|
const recipientsNum = await this.publishToTopic(parent.p2pTopic, message.toBuffer());
|
|
907
|
-
this.logger.debug(`Sent message ${identifier} to ${recipientsNum} peers`, {
|
|
941
|
+
this.logger.debug(`Sent message ${identifier} to ${recipientsNum} peers`, {
|
|
942
|
+
p2pMessageIdentifier: identifier,
|
|
943
|
+
sourcePeer: this.node.peerId.toString(),
|
|
944
|
+
});
|
|
908
945
|
}
|
|
909
946
|
|
|
910
947
|
// Libp2p seems to hang sometimes if new peers are initiating connections.
|
|
@@ -95,7 +95,7 @@ export function reqGoodbyeHandler(peerManager: PeerManager): ReqRespSubProtocolH
|
|
|
95
95
|
|
|
96
96
|
peerManager.goodbyeReceived(peerId, reason);
|
|
97
97
|
|
|
98
|
-
// Return a buffer of length 1 as an acknowledgement
|
|
98
|
+
// Return a buffer of length 1 as an acknowledgement: this is allowed to fail
|
|
99
99
|
return Promise.resolve(Buffer.from([0x0]));
|
|
100
100
|
};
|
|
101
101
|
}
|
|
@@ -598,6 +598,8 @@ export class ReqResp {
|
|
|
598
598
|
const handler = this.subProtocolHandlers[protocol];
|
|
599
599
|
const transform = this.snappyTransform;
|
|
600
600
|
|
|
601
|
+
this.logger.info(`Stream handler for ${protocol}`);
|
|
602
|
+
|
|
601
603
|
await pipe(
|
|
602
604
|
stream,
|
|
603
605
|
async function* (source: any) {
|
|
@@ -605,6 +607,12 @@ export class ReqResp {
|
|
|
605
607
|
const msg = Buffer.from(chunkList.subarray());
|
|
606
608
|
const response = await handler(connection.remotePeer, msg);
|
|
607
609
|
|
|
610
|
+
if (protocol === ReqRespSubProtocol.GOODBYE) {
|
|
611
|
+
// Don't respond
|
|
612
|
+
await stream.close();
|
|
613
|
+
return;
|
|
614
|
+
}
|
|
615
|
+
|
|
608
616
|
// Send success code first, then the response
|
|
609
617
|
const successChunk = Buffer.from([ReqRespStatus.SUCCESS]);
|
|
610
618
|
yield new Uint8Array(successChunk);
|
|
@@ -615,7 +623,7 @@ export class ReqResp {
|
|
|
615
623
|
stream,
|
|
616
624
|
);
|
|
617
625
|
} catch (e: any) {
|
|
618
|
-
this.logger.warn(e);
|
|
626
|
+
this.logger.warn('Reqresp Response error: ', e);
|
|
619
627
|
this.metrics.recordResponseError(protocol);
|
|
620
628
|
|
|
621
629
|
// If we receive a known error, we use the error status in the response chunk, otherwise we categorize as unknown
|
package/src/services/service.ts
CHANGED
package/src/services/types.ts
CHANGED
|
@@ -29,16 +29,8 @@ export enum GossipSubEvent {
|
|
|
29
29
|
/***************************************************
|
|
30
30
|
* Types
|
|
31
31
|
***************************************************/
|
|
32
|
+
|
|
32
33
|
/**
|
|
33
34
|
* Aztec network specific types
|
|
34
35
|
*/
|
|
35
|
-
export const AZTEC_ENR_KEY = '
|
|
36
|
-
|
|
37
|
-
export enum AztecENR {
|
|
38
|
-
devnet = 0x01,
|
|
39
|
-
testnet = 0x02,
|
|
40
|
-
mainnet = 0x03,
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
// TODO: Make this an env var
|
|
44
|
-
export const AZTEC_NET = AztecENR.devnet;
|
|
36
|
+
export const AZTEC_ENR_KEY = 'aztec';
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { generatePrivateKey } from 'viem/accounts';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Generate a list of peer id private keys
|
|
5
|
+
* @param numberOfPeers - The number of peer id private keys to generate
|
|
6
|
+
* @returns A list of peer id private keys
|
|
7
|
+
*/
|
|
8
|
+
export function generatePeerIdPrivateKeys(numberOfPeers: number): string[] {
|
|
9
|
+
const peerIdPrivateKeys: string[] = [];
|
|
10
|
+
for (let i = 0; i < numberOfPeers; i++) {
|
|
11
|
+
// magic number is multiaddr prefix: https://multiformats.io/multiaddr/
|
|
12
|
+
peerIdPrivateKeys.push('08021220' + generatePrivateKey().slice(2, 68));
|
|
13
|
+
}
|
|
14
|
+
return peerIdPrivateKeys;
|
|
15
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import getPort from 'get-port';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Get a list of ports for a given number of peers
|
|
5
|
+
* @param numberOfPeers - The number of peers to get ports for
|
|
6
|
+
* @returns A list of ports
|
|
7
|
+
*/
|
|
8
|
+
export const getPorts = (numberOfPeers: number) => Promise.all(Array.from({ length: numberOfPeers }, () => getPort()));
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { type ChainConfig } from '@aztec/circuit-types/config';
|
|
2
|
+
|
|
3
|
+
import { SignableENR } from '@chainsafe/enr';
|
|
4
|
+
import { multiaddr } from '@multiformats/multiaddr';
|
|
5
|
+
|
|
6
|
+
import { convertToMultiaddr, createLibP2PPeerIdFromPrivateKey } from '../util.js';
|
|
7
|
+
import { setAztecEnrKey } from '../versioning.js';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Make a list of ENRs for a given list of p2p private keys and ports
|
|
11
|
+
* @param p2pPrivateKeys - The private keys of the p2p nodes
|
|
12
|
+
* @param ports - The ports of the p2p nodes
|
|
13
|
+
* @returns A list of ENRs
|
|
14
|
+
*/
|
|
15
|
+
export async function makeEnrs(p2pPrivateKeys: string[], ports: number[], config: ChainConfig) {
|
|
16
|
+
return await Promise.all(
|
|
17
|
+
p2pPrivateKeys.map((pk, i) => {
|
|
18
|
+
return makeEnr(pk, ports[i], config);
|
|
19
|
+
}),
|
|
20
|
+
);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Make an ENR for a given p2p private key and port
|
|
25
|
+
* @param p2pPrivateKey - The private key of the p2p node
|
|
26
|
+
* @param port - The port of the p2p node
|
|
27
|
+
* @returns The ENR of the p2p node
|
|
28
|
+
*/
|
|
29
|
+
export async function makeEnr(p2pPrivateKey: string, port: number, config: ChainConfig) {
|
|
30
|
+
const peerId = await createLibP2PPeerIdFromPrivateKey(p2pPrivateKey);
|
|
31
|
+
const enr = SignableENR.createFromPeerId(peerId);
|
|
32
|
+
|
|
33
|
+
const udpAnnounceAddress = `127.0.0.1:${port}`;
|
|
34
|
+
const tcpAnnounceAddress = `127.0.0.1:${port}`;
|
|
35
|
+
const udpPublicAddr = multiaddr(convertToMultiaddr(udpAnnounceAddress, 'udp'));
|
|
36
|
+
const tcpPublicAddr = multiaddr(convertToMultiaddr(tcpAnnounceAddress, 'tcp'));
|
|
37
|
+
|
|
38
|
+
// ENRS must include the network and a discoverable address (udp for discv5)
|
|
39
|
+
setAztecEnrKey(enr, config);
|
|
40
|
+
enr.setLocationMultiaddr(udpPublicAddr);
|
|
41
|
+
enr.setLocationMultiaddr(tcpPublicAddr);
|
|
42
|
+
|
|
43
|
+
return enr.encodeTxt();
|
|
44
|
+
}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { MockL2BlockSource } from '@aztec/archiver/test';
|
|
2
|
+
import { P2PClientType, type WorldStateSynchronizer } from '@aztec/circuit-types';
|
|
3
|
+
import { type EpochCache } from '@aztec/epoch-cache';
|
|
4
|
+
import { type Logger, createLogger } from '@aztec/foundation/log';
|
|
5
|
+
import { type DataStoreConfig } from '@aztec/kv-store/config';
|
|
6
|
+
import { openTmpStore } from '@aztec/kv-store/lmdb-v2';
|
|
7
|
+
|
|
8
|
+
import { createP2PClient } from '../client/index.js';
|
|
9
|
+
import { type P2PClient } from '../client/p2p_client.js';
|
|
10
|
+
import { type P2PConfig } from '../config.js';
|
|
11
|
+
import { type AttestationPool } from '../mem_pools/attestation_pool/attestation_pool.js';
|
|
12
|
+
import { type EpochProofQuotePool } from '../mem_pools/epoch_proof_quote_pool/epoch_proof_quote_pool.js';
|
|
13
|
+
import { type TxPool } from '../mem_pools/tx_pool/index.js';
|
|
14
|
+
import { generatePeerIdPrivateKeys } from '../test-helpers/generate-peer-id-private-keys.js';
|
|
15
|
+
import { getPorts } from './get-ports.js';
|
|
16
|
+
import { makeEnrs } from './make-enrs.js';
|
|
17
|
+
import { AlwaysFalseCircuitVerifier, AlwaysTrueCircuitVerifier } from './reqresp-nodes.js';
|
|
18
|
+
|
|
19
|
+
interface MakeTestP2PClientOptions {
|
|
20
|
+
mockAttestationPool: AttestationPool;
|
|
21
|
+
mockEpochProofQuotePool: EpochProofQuotePool;
|
|
22
|
+
mockTxPool: TxPool;
|
|
23
|
+
mockEpochCache: EpochCache;
|
|
24
|
+
mockWorldState: WorldStateSynchronizer;
|
|
25
|
+
alwaysTrueVerifier?: boolean;
|
|
26
|
+
p2pBaseConfig: P2PConfig;
|
|
27
|
+
p2pConfigOverrides?: Partial<P2PConfig>;
|
|
28
|
+
logger?: Logger;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Creates a single P2P client for testing purposes.
|
|
33
|
+
* @param peerIdPrivateKey - The private key of the peer.
|
|
34
|
+
* @param port - The port to run the client on.
|
|
35
|
+
* @param peers - The peers to connect to.
|
|
36
|
+
* @param options - The options for the client.
|
|
37
|
+
* @returns The created client.
|
|
38
|
+
*/
|
|
39
|
+
export async function makeTestP2PClient(
|
|
40
|
+
peerIdPrivateKey: string,
|
|
41
|
+
port: number,
|
|
42
|
+
peers: string[],
|
|
43
|
+
{
|
|
44
|
+
alwaysTrueVerifier = true,
|
|
45
|
+
p2pBaseConfig,
|
|
46
|
+
p2pConfigOverrides = {},
|
|
47
|
+
mockAttestationPool,
|
|
48
|
+
mockEpochProofQuotePool,
|
|
49
|
+
mockTxPool,
|
|
50
|
+
mockEpochCache,
|
|
51
|
+
mockWorldState,
|
|
52
|
+
logger = createLogger('p2p-test-client'),
|
|
53
|
+
}: MakeTestP2PClientOptions,
|
|
54
|
+
) {
|
|
55
|
+
const addr = `127.0.0.1:${port}`;
|
|
56
|
+
const listenAddr = `0.0.0.0:${port}`;
|
|
57
|
+
|
|
58
|
+
// Filter nodes so that we only dial active peers
|
|
59
|
+
|
|
60
|
+
const config: P2PConfig & DataStoreConfig = {
|
|
61
|
+
...p2pBaseConfig,
|
|
62
|
+
p2pEnabled: true,
|
|
63
|
+
peerIdPrivateKey,
|
|
64
|
+
tcpListenAddress: listenAddr, // run on port 0
|
|
65
|
+
udpListenAddress: listenAddr,
|
|
66
|
+
tcpAnnounceAddress: addr,
|
|
67
|
+
udpAnnounceAddress: addr,
|
|
68
|
+
bootstrapNodes: peers,
|
|
69
|
+
peerCheckIntervalMS: 1000,
|
|
70
|
+
maxPeerCount: 10,
|
|
71
|
+
...p2pConfigOverrides,
|
|
72
|
+
} as P2PConfig & DataStoreConfig;
|
|
73
|
+
|
|
74
|
+
const l2BlockSource = new MockL2BlockSource();
|
|
75
|
+
await l2BlockSource.createBlocks(100);
|
|
76
|
+
|
|
77
|
+
const proofVerifier = alwaysTrueVerifier ? new AlwaysTrueCircuitVerifier() : new AlwaysFalseCircuitVerifier();
|
|
78
|
+
const kvStore = await openTmpStore('test');
|
|
79
|
+
const deps = {
|
|
80
|
+
txPool: mockTxPool as unknown as TxPool,
|
|
81
|
+
attestationPool: mockAttestationPool as unknown as AttestationPool,
|
|
82
|
+
epochProofQuotePool: mockEpochProofQuotePool as unknown as EpochProofQuotePool,
|
|
83
|
+
store: kvStore,
|
|
84
|
+
logger,
|
|
85
|
+
};
|
|
86
|
+
const client = await createP2PClient(
|
|
87
|
+
P2PClientType.Full,
|
|
88
|
+
config,
|
|
89
|
+
l2BlockSource,
|
|
90
|
+
proofVerifier,
|
|
91
|
+
mockWorldState,
|
|
92
|
+
mockEpochCache,
|
|
93
|
+
undefined,
|
|
94
|
+
deps,
|
|
95
|
+
);
|
|
96
|
+
await client.start();
|
|
97
|
+
|
|
98
|
+
return client;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Creates a number of P2P clients for testing purposes.
|
|
103
|
+
* @param numberOfPeers - The number of clients to create.
|
|
104
|
+
* @param options - The options for the clients.
|
|
105
|
+
* @returns The created clients.
|
|
106
|
+
*/
|
|
107
|
+
export async function makeTestP2PClients(numberOfPeers: number, testConfig: MakeTestP2PClientOptions) {
|
|
108
|
+
const clients: P2PClient[] = [];
|
|
109
|
+
const peerIdPrivateKeys = generatePeerIdPrivateKeys(numberOfPeers);
|
|
110
|
+
|
|
111
|
+
const ports = await getPorts(numberOfPeers);
|
|
112
|
+
const peerEnrs = await makeEnrs(peerIdPrivateKeys, ports, testConfig.p2pBaseConfig);
|
|
113
|
+
|
|
114
|
+
for (let i = 0; i < numberOfPeers; i++) {
|
|
115
|
+
const client = await makeTestP2PClient(peerIdPrivateKeys[i], ports[i], peerEnrs, {
|
|
116
|
+
...testConfig,
|
|
117
|
+
logger: createLogger(`p2p:${i}`),
|
|
118
|
+
});
|
|
119
|
+
clients.push(client);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
await Promise.all(clients.map(client => client.isReady()));
|
|
123
|
+
return clients;
|
|
124
|
+
}
|
|
@@ -5,6 +5,7 @@ import {
|
|
|
5
5
|
type Tx,
|
|
6
6
|
type WorldStateSynchronizer,
|
|
7
7
|
} from '@aztec/circuit-types';
|
|
8
|
+
import { type ChainConfig, emptyChainConfig } from '@aztec/circuit-types/config';
|
|
8
9
|
import { type EpochCache } from '@aztec/epoch-cache';
|
|
9
10
|
import { timesParallel } from '@aztec/foundation/collection';
|
|
10
11
|
import { type DataStoreConfig } from '@aztec/kv-store/config';
|
|
@@ -105,6 +106,7 @@ export async function createTestLibP2PService<T extends P2PClientType>(
|
|
|
105
106
|
telemetry: TelemetryClient,
|
|
106
107
|
port: number = 0,
|
|
107
108
|
peerId?: PeerId,
|
|
109
|
+
chainConfig: ChainConfig = emptyChainConfig,
|
|
108
110
|
) {
|
|
109
111
|
peerId = peerId ?? (await createSecp256k1PeerId());
|
|
110
112
|
const config = {
|
|
@@ -114,10 +116,11 @@ export async function createTestLibP2PService<T extends P2PClientType>(
|
|
|
114
116
|
udpListenAddress: `0.0.0.0:${port}`,
|
|
115
117
|
bootstrapNodes: boostrapAddrs,
|
|
116
118
|
peerCheckIntervalMS: 1000,
|
|
117
|
-
minPeerCount: 1,
|
|
118
119
|
maxPeerCount: 5,
|
|
119
120
|
p2pEnabled: true,
|
|
120
121
|
peerIdPrivateKey: Buffer.from(peerId.privateKey!).toString('hex'),
|
|
122
|
+
bootstrapNodeEnrVersionCheck: false,
|
|
123
|
+
...chainConfig,
|
|
121
124
|
} as P2PConfig & DataStoreConfig;
|
|
122
125
|
const discoveryService = new DiscV5Service(peerId, config, telemetry);
|
|
123
126
|
const proofVerifier = new AlwaysTrueCircuitVerifier();
|
|
@@ -230,15 +233,15 @@ export class AlwaysFalseCircuitVerifier implements ClientProtocolCircuitVerifier
|
|
|
230
233
|
}
|
|
231
234
|
|
|
232
235
|
// Bootnodes
|
|
233
|
-
export function createBootstrapNodeConfig(privateKey: string, port: number): BootnodeConfig {
|
|
236
|
+
export function createBootstrapNodeConfig(privateKey: string, port: number, chainConfig: ChainConfig): BootnodeConfig {
|
|
234
237
|
return {
|
|
235
238
|
udpListenAddress: `0.0.0.0:${port}`,
|
|
236
239
|
udpAnnounceAddress: `127.0.0.1:${port}`,
|
|
237
240
|
peerIdPrivateKey: privateKey,
|
|
238
|
-
minPeerCount: 10,
|
|
239
241
|
maxPeerCount: 100,
|
|
240
242
|
dataDirectory: undefined,
|
|
241
243
|
dataStoreMapSizeKB: 0,
|
|
244
|
+
...chainConfig,
|
|
242
245
|
};
|
|
243
246
|
}
|
|
244
247
|
|
|
@@ -246,17 +249,19 @@ export function createBootstrapNodeFromPrivateKey(
|
|
|
246
249
|
privateKey: string,
|
|
247
250
|
port: number,
|
|
248
251
|
telemetry: TelemetryClient = getTelemetryClient(),
|
|
252
|
+
chainConfig: ChainConfig = emptyChainConfig,
|
|
249
253
|
): Promise<BootstrapNode> {
|
|
250
|
-
const config = createBootstrapNodeConfig(privateKey, port);
|
|
254
|
+
const config = createBootstrapNodeConfig(privateKey, port, chainConfig);
|
|
251
255
|
return startBootstrapNode(config, telemetry);
|
|
252
256
|
}
|
|
253
257
|
|
|
254
258
|
export async function createBootstrapNode(
|
|
255
259
|
port: number,
|
|
256
260
|
telemetry: TelemetryClient = getTelemetryClient(),
|
|
261
|
+
chainConfig: ChainConfig = emptyChainConfig,
|
|
257
262
|
): Promise<BootstrapNode> {
|
|
258
263
|
const peerId = await createSecp256k1PeerId();
|
|
259
|
-
const config = createBootstrapNodeConfig(Buffer.from(peerId.privateKey!).toString('hex'), port);
|
|
264
|
+
const config = createBootstrapNodeConfig(Buffer.from(peerId.privateKey!).toString('hex'), port, chainConfig);
|
|
260
265
|
|
|
261
266
|
return startBootstrapNode(config, telemetry);
|
|
262
267
|
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
## P2P Test bench
|
|
2
|
+
|
|
3
|
+
A testbench that runs only the P2P client on a number of worker threads, with the purpose of monitoring and testing the performance of the P2P client.
|
|
4
|
+
|
|
5
|
+
### Running the testbench
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
./run_testbench.sh <outputfile>
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
This will produce a LONG series of logs that can be used for further analysis.
|
|
12
|
+
|
|
13
|
+
## TODO
|
|
14
|
+
|
|
15
|
+
- Strongly parameterizing the testbench scripts
|
|
16
|
+
- Add traffic shaping options to the testbench
|
|
17
|
+
- Add log parsing step that can categorize a report in json of the propoagation of the message
|
|
18
|
+
- Add multiple different tx sizes
|
|
19
|
+
- Create ci pipeline that can run analysis on the logs and compare against previous runs
|
|
20
|
+
- Create a series of markdown reports detailing what each parameter change does and include graphs to compare performance
|
|
@@ -0,0 +1,156 @@
|
|
|
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, type WorldStateSynchronizer } from '@aztec/circuit-types';
|
|
8
|
+
import { type EpochCacheInterface } from '@aztec/epoch-cache';
|
|
9
|
+
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
10
|
+
import { createLogger } from '@aztec/foundation/log';
|
|
11
|
+
import { sleep } from '@aztec/foundation/sleep';
|
|
12
|
+
import { type DataStoreConfig } from '@aztec/kv-store/config';
|
|
13
|
+
import { openTmpStore } from '@aztec/kv-store/lmdb-v2';
|
|
14
|
+
|
|
15
|
+
import { type P2PConfig } from '../config.js';
|
|
16
|
+
import { createP2PClient } from '../index.js';
|
|
17
|
+
import { type AttestationPool } from '../mem_pools/attestation_pool/attestation_pool.js';
|
|
18
|
+
import { type EpochProofQuotePool } from '../mem_pools/epoch_proof_quote_pool/epoch_proof_quote_pool.js';
|
|
19
|
+
import { type TxPool } from '../mem_pools/tx_pool/index.js';
|
|
20
|
+
import { AlwaysTrueCircuitVerifier } from '../test-helpers/reqresp-nodes.js';
|
|
21
|
+
|
|
22
|
+
// Simple mock implementation
|
|
23
|
+
function mockTxPool(): TxPool {
|
|
24
|
+
// Mock all methods
|
|
25
|
+
return {
|
|
26
|
+
addTxs: () => Promise.resolve(),
|
|
27
|
+
getTxByHash: () => Promise.resolve(undefined),
|
|
28
|
+
getArchivedTxByHash: () => Promise.resolve(undefined),
|
|
29
|
+
markAsMined: () => Promise.resolve(),
|
|
30
|
+
markMinedAsPending: () => Promise.resolve(),
|
|
31
|
+
deleteTxs: () => Promise.resolve(),
|
|
32
|
+
getAllTxs: () => Promise.resolve([]),
|
|
33
|
+
getAllTxHashes: () => Promise.resolve([]),
|
|
34
|
+
getPendingTxHashes: () => Promise.resolve([]),
|
|
35
|
+
getMinedTxHashes: () => Promise.resolve([]),
|
|
36
|
+
getTxStatus: () => Promise.resolve(TxStatus.PENDING),
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function mockAttestationPool(): AttestationPool {
|
|
41
|
+
return {
|
|
42
|
+
addAttestations: () => Promise.resolve(),
|
|
43
|
+
deleteAttestations: () => Promise.resolve(),
|
|
44
|
+
deleteAttestationsOlderThan: () => Promise.resolve(),
|
|
45
|
+
deleteAttestationsForSlot: () => Promise.resolve(),
|
|
46
|
+
deleteAttestationsForSlotAndProposal: () => Promise.resolve(),
|
|
47
|
+
getAttestationsForSlot: () => Promise.resolve([]),
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function mockEpochProofQuotePool(): EpochProofQuotePool {
|
|
52
|
+
return {
|
|
53
|
+
addQuote: () => {},
|
|
54
|
+
getQuotes: () => [],
|
|
55
|
+
deleteQuotesToEpoch: () => {},
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function mockEpochCache(): EpochCacheInterface {
|
|
60
|
+
return {
|
|
61
|
+
getCommittee: () => Promise.resolve([] as EthAddress[]),
|
|
62
|
+
getProposerIndexEncoding: () => '0x' as `0x${string}`,
|
|
63
|
+
getEpochAndSlotNow: () => ({ epoch: 0n, slot: 0n, ts: 0n }),
|
|
64
|
+
computeProposerIndex: () => 0n,
|
|
65
|
+
getProposerInCurrentOrNextSlot: () =>
|
|
66
|
+
Promise.resolve({
|
|
67
|
+
currentProposer: EthAddress.ZERO,
|
|
68
|
+
nextProposer: EthAddress.ZERO,
|
|
69
|
+
currentSlot: 0n,
|
|
70
|
+
nextSlot: 0n,
|
|
71
|
+
}),
|
|
72
|
+
isInCommittee: () => Promise.resolve(false),
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// eslint-disable-next-line @typescript-eslint/no-misused-promises
|
|
77
|
+
process.on('message', async msg => {
|
|
78
|
+
const { type, config, clientIndex } = msg as { type: string; config: P2PConfig; clientIndex: number };
|
|
79
|
+
|
|
80
|
+
try {
|
|
81
|
+
if (type === 'START') {
|
|
82
|
+
const txPool = mockTxPool();
|
|
83
|
+
const attestationPool = mockAttestationPool();
|
|
84
|
+
const epochProofQuotePool = mockEpochProofQuotePool();
|
|
85
|
+
const epochCache = mockEpochCache();
|
|
86
|
+
const worldState = {} as WorldStateSynchronizer;
|
|
87
|
+
const l2BlockSource = new MockL2BlockSource();
|
|
88
|
+
await l2BlockSource.createBlocks(100);
|
|
89
|
+
|
|
90
|
+
const proofVerifier = new AlwaysTrueCircuitVerifier();
|
|
91
|
+
const kvStore = await openTmpStore(`test-${clientIndex}`);
|
|
92
|
+
const logger = createLogger(`p2p:${clientIndex}`);
|
|
93
|
+
|
|
94
|
+
const deps = {
|
|
95
|
+
txPool,
|
|
96
|
+
attestationPool,
|
|
97
|
+
epochProofQuotePool,
|
|
98
|
+
store: kvStore,
|
|
99
|
+
logger,
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
const client = await createP2PClient(
|
|
103
|
+
P2PClientType.Full,
|
|
104
|
+
config as P2PConfig & DataStoreConfig,
|
|
105
|
+
l2BlockSource,
|
|
106
|
+
proofVerifier,
|
|
107
|
+
worldState,
|
|
108
|
+
epochCache,
|
|
109
|
+
undefined,
|
|
110
|
+
deps,
|
|
111
|
+
);
|
|
112
|
+
|
|
113
|
+
// Create spy for gossip messages
|
|
114
|
+
let gossipMessageCount = 0;
|
|
115
|
+
(client as any).p2pService.handleNewGossipMessage = (...args: any[]) => {
|
|
116
|
+
gossipMessageCount++;
|
|
117
|
+
process.send!({ type: 'GOSSIP_RECEIVED', count: gossipMessageCount });
|
|
118
|
+
return (client as any).p2pService.constructor.prototype.handleNewGossipMessage.apply(
|
|
119
|
+
(client as any).p2pService,
|
|
120
|
+
args,
|
|
121
|
+
);
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
await client.start();
|
|
125
|
+
// Wait until the client is ready
|
|
126
|
+
for (let i = 0; i < 100; i++) {
|
|
127
|
+
const isReady = client.isReady();
|
|
128
|
+
logger.debug(`Client ${clientIndex} isReady: ${isReady}`);
|
|
129
|
+
if (isReady) {
|
|
130
|
+
break;
|
|
131
|
+
}
|
|
132
|
+
await sleep(1000);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// Listen for commands from parent
|
|
136
|
+
// eslint-disable-next-line @typescript-eslint/no-misused-promises
|
|
137
|
+
process.on('message', async (cmd: any) => {
|
|
138
|
+
switch (cmd.type) {
|
|
139
|
+
case 'STOP':
|
|
140
|
+
await client.stop();
|
|
141
|
+
process.exit(0);
|
|
142
|
+
break;
|
|
143
|
+
case 'SEND_TX':
|
|
144
|
+
await client.sendTx(Tx.fromBuffer(Buffer.from(cmd.tx)));
|
|
145
|
+
process.send!({ type: 'TX_SENT' });
|
|
146
|
+
break;
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
process.send!({ type: 'READY' });
|
|
151
|
+
}
|
|
152
|
+
} catch (err: any) {
|
|
153
|
+
process.send!({ type: 'ERROR', error: err.message });
|
|
154
|
+
process.exit(1);
|
|
155
|
+
}
|
|
156
|
+
});
|