@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,25 @@
|
|
|
1
|
+
import { createLogger } from '@aztec/foundation/log';
|
|
2
|
+
import { Tx } from '@aztec/stdlib/tx';
|
|
3
|
+
export class TxProofValidator {
|
|
4
|
+
verifier;
|
|
5
|
+
#log;
|
|
6
|
+
constructor(verifier){
|
|
7
|
+
this.verifier = verifier;
|
|
8
|
+
this.#log = createLogger('p2p:tx_validator:private_proof');
|
|
9
|
+
}
|
|
10
|
+
async validateTx(tx) {
|
|
11
|
+
if (!await this.verifier.verifyProof(tx)) {
|
|
12
|
+
this.#log.warn(`Rejecting tx ${Tx.getHash(tx)} for invalid proof`);
|
|
13
|
+
return {
|
|
14
|
+
result: 'invalid',
|
|
15
|
+
reason: [
|
|
16
|
+
'Invalid proof'
|
|
17
|
+
]
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
this.#log.trace(`Accepted ${Tx.getHash(tx)} with valid proof`);
|
|
21
|
+
return {
|
|
22
|
+
result: 'valid'
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { AztecAsyncKVStore } from '@aztec/kv-store';
|
|
2
|
+
import { type Batch, type Datastore, Key, type KeyQuery, type Pair, type Query } from 'interface-datastore';
|
|
3
|
+
import type { AwaitIterable } from 'interface-store';
|
|
4
|
+
export declare class AztecDatastore implements Datastore {
|
|
5
|
+
#private;
|
|
6
|
+
private maxMemoryItems;
|
|
7
|
+
constructor(db: AztecAsyncKVStore, { maxMemoryItems }?: {
|
|
8
|
+
maxMemoryItems: number;
|
|
9
|
+
});
|
|
10
|
+
has(key: Key): Promise<boolean>;
|
|
11
|
+
get(key: Key): Promise<Uint8Array>;
|
|
12
|
+
put(key: Key, val: Uint8Array): Promise<Key>;
|
|
13
|
+
putMany(source: AwaitIterable<Pair>): AwaitIterable<Key>;
|
|
14
|
+
getMany(source: AwaitIterable<Key>): AwaitIterable<Pair>;
|
|
15
|
+
deleteMany(source: AwaitIterable<Key>): AwaitIterable<Key>;
|
|
16
|
+
delete(key: Key): Promise<void>;
|
|
17
|
+
batch(): Batch;
|
|
18
|
+
query(q: Query): AwaitIterable<Pair>;
|
|
19
|
+
queryKeys(q: KeyQuery): AsyncIterable<Key>;
|
|
20
|
+
private _put;
|
|
21
|
+
private all;
|
|
22
|
+
/**
|
|
23
|
+
* Prune memory store
|
|
24
|
+
*/
|
|
25
|
+
private pruneMemoryDatastore;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=data_store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data_store.d.ts","sourceRoot":"","sources":["../../src/services/data_store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAiB,MAAM,iBAAiB,CAAC;AAExE,OAAO,EAAE,KAAK,KAAK,EAAE,KAAK,SAAS,EAAE,GAAG,EAAE,KAAK,QAAQ,EAAE,KAAK,IAAI,EAAE,KAAK,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5G,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAqBrD,qBAAa,cAAe,YAAW,SAAS;;IAM9C,OAAO,CAAC,cAAc,CAAS;gBAEnB,EAAE,EAAE,iBAAiB,EAAE,EAAE,cAAc,EAAE;;KAAyB;IAOxE,GAAG,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC;IAI/B,GAAG,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,UAAU,CAAC;IAgBxC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC;IAIrC,OAAO,CAAC,MAAM,EAAE,aAAa,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,GAAG,CAAC;IAOxD,OAAO,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,IAAI,CAAC;IASxD,UAAU,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,GAAG,CAAC;IAO3D,MAAM,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAKrC,KAAK,IAAI,KAAK;IA4Bd,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC;IA4BpC,SAAS,CAAC,CAAC,EAAE,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC;YA2B5B,IAAI;YAqBH,GAAG;IAkBlB;;OAEG;IACH,OAAO,CAAC,oBAAoB;CAiB7B"}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import { filter, map, sort, take } from '@aztec/foundation/iterable';
|
|
2
|
+
import { Key } from 'interface-datastore';
|
|
3
|
+
class KeyNotFoundError extends Error {
|
|
4
|
+
code;
|
|
5
|
+
constructor(message){
|
|
6
|
+
super(message);
|
|
7
|
+
this.code = 'ERR_NOT_FOUND';
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
export class AztecDatastore {
|
|
11
|
+
#memoryDatastore;
|
|
12
|
+
#dbDatastore;
|
|
13
|
+
#batchOps = [];
|
|
14
|
+
maxMemoryItems;
|
|
15
|
+
constructor(db, { maxMemoryItems } = {
|
|
16
|
+
maxMemoryItems: 50
|
|
17
|
+
}){
|
|
18
|
+
this.#memoryDatastore = new Map();
|
|
19
|
+
this.#dbDatastore = db.openMap('p2p_datastore');
|
|
20
|
+
this.maxMemoryItems = maxMemoryItems;
|
|
21
|
+
}
|
|
22
|
+
async has(key) {
|
|
23
|
+
return this.#memoryDatastore.has(key.toString()) || await this.#dbDatastore.hasAsync(key.toString());
|
|
24
|
+
}
|
|
25
|
+
async get(key) {
|
|
26
|
+
const keyStr = key.toString();
|
|
27
|
+
const memoryItem = this.#memoryDatastore.get(keyStr);
|
|
28
|
+
if (memoryItem) {
|
|
29
|
+
memoryItem.lastAccessedMs = Date.now();
|
|
30
|
+
return memoryItem.data;
|
|
31
|
+
}
|
|
32
|
+
const dbItem = await this.#dbDatastore.getAsync(keyStr);
|
|
33
|
+
if (!dbItem) {
|
|
34
|
+
throw new KeyNotFoundError(`Key not found`);
|
|
35
|
+
}
|
|
36
|
+
return Uint8Array.from(dbItem);
|
|
37
|
+
}
|
|
38
|
+
put(key, val) {
|
|
39
|
+
return this._put(key, val);
|
|
40
|
+
}
|
|
41
|
+
async *putMany(source) {
|
|
42
|
+
for await (const { key, value } of source){
|
|
43
|
+
await this.put(key, value);
|
|
44
|
+
yield key;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
async *getMany(source) {
|
|
48
|
+
for await (const key of source){
|
|
49
|
+
yield {
|
|
50
|
+
key,
|
|
51
|
+
value: await this.get(key)
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
async *deleteMany(source) {
|
|
56
|
+
for await (const key of source){
|
|
57
|
+
await this.delete(key);
|
|
58
|
+
yield key;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
async delete(key) {
|
|
62
|
+
this.#memoryDatastore.delete(key.toString());
|
|
63
|
+
await this.#dbDatastore.delete(key.toString());
|
|
64
|
+
}
|
|
65
|
+
batch() {
|
|
66
|
+
return {
|
|
67
|
+
put: (key, value)=>{
|
|
68
|
+
this.#batchOps.push({
|
|
69
|
+
type: 'put',
|
|
70
|
+
key,
|
|
71
|
+
value
|
|
72
|
+
});
|
|
73
|
+
},
|
|
74
|
+
delete: (key)=>{
|
|
75
|
+
this.#batchOps.push({
|
|
76
|
+
type: 'del',
|
|
77
|
+
key
|
|
78
|
+
});
|
|
79
|
+
},
|
|
80
|
+
commit: async ()=>{
|
|
81
|
+
for (const op of this.#batchOps){
|
|
82
|
+
if (op.type === 'put' && op.value) {
|
|
83
|
+
await this.put(op.key, op.value);
|
|
84
|
+
} else if (op.type === 'del') {
|
|
85
|
+
await this.delete(op.key);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
this.#batchOps = []; // Clear operations after commit
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
query(q) {
|
|
93
|
+
let it = this.all(); //
|
|
94
|
+
const { prefix, filters, orders, offset, limit } = q;
|
|
95
|
+
if (prefix != null) {
|
|
96
|
+
it = filter(it, (e)=>e.key.toString().startsWith(`${prefix}`));
|
|
97
|
+
}
|
|
98
|
+
if (Array.isArray(filters)) {
|
|
99
|
+
it = filters.reduce((it, f)=>filter(it, f), it);
|
|
100
|
+
}
|
|
101
|
+
if (Array.isArray(orders)) {
|
|
102
|
+
it = orders.reduce((it, f)=>sort(it, f), it);
|
|
103
|
+
}
|
|
104
|
+
if (offset != null) {
|
|
105
|
+
let i = 0;
|
|
106
|
+
it = filter(it, ()=>i++ >= offset);
|
|
107
|
+
}
|
|
108
|
+
if (limit != null) {
|
|
109
|
+
it = take(it, limit);
|
|
110
|
+
}
|
|
111
|
+
return it;
|
|
112
|
+
}
|
|
113
|
+
queryKeys(q) {
|
|
114
|
+
let it = map(this.all(), ({ key })=>key);
|
|
115
|
+
const { prefix, filters, orders, offset, limit } = q;
|
|
116
|
+
if (prefix != null) {
|
|
117
|
+
it = filter(it, (e)=>e.toString().startsWith(`${prefix}`));
|
|
118
|
+
}
|
|
119
|
+
if (Array.isArray(filters)) {
|
|
120
|
+
it = filters.reduce((it, f)=>filter(it, f), it);
|
|
121
|
+
}
|
|
122
|
+
if (Array.isArray(orders)) {
|
|
123
|
+
it = orders.reduce((it, f)=>sort(it, f), it);
|
|
124
|
+
}
|
|
125
|
+
if (offset != null) {
|
|
126
|
+
let i = 0;
|
|
127
|
+
it = filter(it, ()=>i++ >= offset);
|
|
128
|
+
}
|
|
129
|
+
if (limit != null) {
|
|
130
|
+
it = take(it, limit);
|
|
131
|
+
}
|
|
132
|
+
return it;
|
|
133
|
+
}
|
|
134
|
+
async _put(key, val) {
|
|
135
|
+
const keyStr = key.toString();
|
|
136
|
+
while(this.#memoryDatastore.size >= this.maxMemoryItems){
|
|
137
|
+
this.pruneMemoryDatastore();
|
|
138
|
+
}
|
|
139
|
+
const memoryItem = this.#memoryDatastore.get(keyStr);
|
|
140
|
+
if (memoryItem) {
|
|
141
|
+
// update existing
|
|
142
|
+
memoryItem.lastAccessedMs = Date.now();
|
|
143
|
+
memoryItem.data = val;
|
|
144
|
+
} else {
|
|
145
|
+
// new entry
|
|
146
|
+
this.#memoryDatastore.set(keyStr, {
|
|
147
|
+
data: val,
|
|
148
|
+
lastAccessedMs: Date.now()
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
// Always add to DB
|
|
152
|
+
await this.#dbDatastore.set(keyStr, val);
|
|
153
|
+
return key;
|
|
154
|
+
}
|
|
155
|
+
async *all() {
|
|
156
|
+
for (const [key, value] of this.#memoryDatastore.entries()){
|
|
157
|
+
yield {
|
|
158
|
+
key: new Key(key),
|
|
159
|
+
value: value.data
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
for await (const [key, value] of this.#dbDatastore.entriesAsync()){
|
|
163
|
+
if (!this.#memoryDatastore.has(key)) {
|
|
164
|
+
yield {
|
|
165
|
+
key: new Key(key),
|
|
166
|
+
value
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Prune memory store
|
|
173
|
+
*/ pruneMemoryDatastore() {
|
|
174
|
+
let oldestAccessedMs = Date.now() + 1000;
|
|
175
|
+
let oldestKey = undefined;
|
|
176
|
+
let oldestValue = undefined;
|
|
177
|
+
for (const [key, value] of this.#memoryDatastore){
|
|
178
|
+
if (value.lastAccessedMs < oldestAccessedMs) {
|
|
179
|
+
oldestAccessedMs = value.lastAccessedMs;
|
|
180
|
+
oldestKey = key;
|
|
181
|
+
oldestValue = value.data;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
if (oldestKey && oldestValue) {
|
|
185
|
+
this.#memoryDatastore.delete(oldestKey);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/// <reference types="node" resolution-mode="require"/>
|
|
2
|
+
import { type TelemetryClient } from '@aztec/telemetry-client';
|
|
3
|
+
import { ENR } from '@chainsafe/enr';
|
|
4
|
+
import type { PeerId } from '@libp2p/interface';
|
|
5
|
+
import EventEmitter from 'events';
|
|
6
|
+
import type { P2PConfig } from '../../config.js';
|
|
7
|
+
import { type PeerDiscoveryService, PeerDiscoveryState } from '../service.js';
|
|
8
|
+
/**
|
|
9
|
+
* Peer discovery service using Discv5.
|
|
10
|
+
*/
|
|
11
|
+
export declare class DiscV5Service extends EventEmitter implements PeerDiscoveryService {
|
|
12
|
+
private peerId;
|
|
13
|
+
private config;
|
|
14
|
+
private logger;
|
|
15
|
+
/** The Discv5 instance */
|
|
16
|
+
private discv5;
|
|
17
|
+
/** This instance's ENR */
|
|
18
|
+
private enr;
|
|
19
|
+
/** Version identifiers. */
|
|
20
|
+
private versions;
|
|
21
|
+
/** UDP listen addr */
|
|
22
|
+
private listenMultiAddrUdp;
|
|
23
|
+
private currentState;
|
|
24
|
+
readonly bootstrapNodes: string[];
|
|
25
|
+
private bootstrapNodePeerIds;
|
|
26
|
+
private bootstrapNodeEnrs;
|
|
27
|
+
private startTime;
|
|
28
|
+
constructor(peerId: PeerId, config: P2PConfig, telemetry?: TelemetryClient, logger?: import("@aztec/foundation/log").Logger);
|
|
29
|
+
start(): Promise<void>;
|
|
30
|
+
runRandomNodesQuery(): Promise<void>;
|
|
31
|
+
getAllPeers(): ENR[];
|
|
32
|
+
getEnr(): ENR;
|
|
33
|
+
getPeerId(): PeerId;
|
|
34
|
+
getStatus(): PeerDiscoveryState;
|
|
35
|
+
isBootstrapPeer(peerId: PeerId): boolean;
|
|
36
|
+
stop(): Promise<void>;
|
|
37
|
+
private onEnrAdded;
|
|
38
|
+
private isOurBootnode;
|
|
39
|
+
private onDiscovered;
|
|
40
|
+
private validateEnr;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=discV5_service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discV5_service.d.ts","sourceRoot":"","sources":["../../../src/services/discv5/discV5_service.ts"],"names":[],"mappings":";AAGA,OAAO,EAAsB,KAAK,eAAe,EAAsB,MAAM,yBAAyB,CAAC;AAGvG,OAAO,EAAE,GAAG,EAAe,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,YAAY,MAAM,QAAQ,CAAC;AAElC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAIjD,OAAO,EAAE,KAAK,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAI9E;;GAEG;AACH,qBAAa,aAAc,SAAQ,YAAa,YAAW,oBAAoB;IAsB3E,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,MAAM;IAEd,OAAO,CAAC,MAAM;IAxBhB,0BAA0B;IAC1B,OAAO,CAAC,MAAM,CAA8B;IAE5C,0BAA0B;IAC1B,OAAO,CAAC,GAAG,CAAc;IAEzB,2BAA2B;IAC3B,OAAO,CAAC,QAAQ,CAAqB;IAErC,sBAAsB;IACtB,OAAO,CAAC,kBAAkB,CAAY;IAEtC,OAAO,CAAC,YAAY,CAA8B;IAElD,SAAgB,cAAc,EAAE,MAAM,EAAE,CAAM;IAC9C,OAAO,CAAC,oBAAoB,CAAgB;IAC5C,OAAO,CAAC,iBAAiB,CAAa;IAEtC,OAAO,CAAC,SAAS,CAAK;gBAGZ,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,SAAS,EACzB,SAAS,GAAE,eAAsC,EACzC,MAAM,yCAAqC;IA+DxC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAuCtB,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC;IAmB1C,WAAW,IAAI,GAAG,EAAE;IAIpB,MAAM,IAAI,GAAG;IAIb,SAAS,IAAI,MAAM;IAInB,SAAS,IAAI,kBAAkB;IAI/B,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAIlC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YASpB,UAAU;IAOxB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,YAAY;IAqBpB,OAAO,CAAC,WAAW;CA0BpB"}
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import { createLogger } from '@aztec/foundation/log';
|
|
2
|
+
import { sleep } from '@aztec/foundation/sleep';
|
|
3
|
+
import { checkCompressedComponentVersion } from '@aztec/stdlib/versioning';
|
|
4
|
+
import { OtelMetricsAdapter, getTelemetryClient } from '@aztec/telemetry-client';
|
|
5
|
+
import { Discv5 } from '@chainsafe/discv5';
|
|
6
|
+
import { ENR, SignableENR } from '@chainsafe/enr';
|
|
7
|
+
import { multiaddr } from '@multiformats/multiaddr';
|
|
8
|
+
import EventEmitter from 'events';
|
|
9
|
+
import { AZTEC_ENR_KEY, Discv5Event, PeerEvent } from '../../types/index.js';
|
|
10
|
+
import { convertToMultiaddr } from '../../util.js';
|
|
11
|
+
import { setAztecEnrKey } from '../../versioning.js';
|
|
12
|
+
import { PeerDiscoveryState } from '../service.js';
|
|
13
|
+
const delayBeforeStart = 2000; // 2sec
|
|
14
|
+
/**
|
|
15
|
+
* Peer discovery service using Discv5.
|
|
16
|
+
*/ export class DiscV5Service extends EventEmitter {
|
|
17
|
+
peerId;
|
|
18
|
+
config;
|
|
19
|
+
logger;
|
|
20
|
+
/** The Discv5 instance */ discv5;
|
|
21
|
+
/** This instance's ENR */ enr;
|
|
22
|
+
/** Version identifiers. */ versions;
|
|
23
|
+
/** UDP listen addr */ listenMultiAddrUdp;
|
|
24
|
+
currentState;
|
|
25
|
+
bootstrapNodes;
|
|
26
|
+
bootstrapNodePeerIds;
|
|
27
|
+
bootstrapNodeEnrs;
|
|
28
|
+
startTime;
|
|
29
|
+
constructor(peerId, config, telemetry = getTelemetryClient(), logger = createLogger('p2p:discv5_service')){
|
|
30
|
+
super(), this.peerId = peerId, this.config = config, this.logger = logger, this.currentState = PeerDiscoveryState.STOPPED, this.bootstrapNodes = [], this.bootstrapNodePeerIds = [], this.bootstrapNodeEnrs = [], this.startTime = 0;
|
|
31
|
+
const { tcpAnnounceAddress, udpAnnounceAddress, udpListenAddress, bootstrapNodes } = config;
|
|
32
|
+
this.bootstrapNodes = bootstrapNodes ?? [];
|
|
33
|
+
this.bootstrapNodeEnrs = this.bootstrapNodes.map((x)=>ENR.decodeTxt(x));
|
|
34
|
+
// create ENR from PeerId
|
|
35
|
+
this.enr = SignableENR.createFromPeerId(peerId);
|
|
36
|
+
// Add aztec identification to ENR
|
|
37
|
+
this.versions = setAztecEnrKey(this.enr, config);
|
|
38
|
+
if (!tcpAnnounceAddress) {
|
|
39
|
+
throw new Error('You need to provide at least a TCP announce address.');
|
|
40
|
+
}
|
|
41
|
+
const multiAddrTcp = multiaddr(`${convertToMultiaddr(tcpAnnounceAddress, 'tcp')}/p2p/${peerId.toString()}`);
|
|
42
|
+
// if no udp announce address is provided, use the tcp announce address
|
|
43
|
+
const multiAddrUdp = multiaddr(`${convertToMultiaddr(udpAnnounceAddress || tcpAnnounceAddress, 'udp')}/p2p/${peerId.toString()}`);
|
|
44
|
+
this.listenMultiAddrUdp = multiaddr(convertToMultiaddr(udpListenAddress, 'udp'));
|
|
45
|
+
// set location multiaddr in ENR record
|
|
46
|
+
this.enr.setLocationMultiaddr(multiAddrUdp);
|
|
47
|
+
this.enr.setLocationMultiaddr(multiAddrTcp);
|
|
48
|
+
const metricsRegistry = new OtelMetricsAdapter(telemetry);
|
|
49
|
+
this.discv5 = Discv5.create({
|
|
50
|
+
enr: this.enr,
|
|
51
|
+
peerId,
|
|
52
|
+
bindAddrs: {
|
|
53
|
+
ip4: this.listenMultiAddrUdp
|
|
54
|
+
},
|
|
55
|
+
config: {
|
|
56
|
+
lookupTimeout: 2000,
|
|
57
|
+
requestTimeout: 2000,
|
|
58
|
+
allowUnverifiedSessions: true
|
|
59
|
+
},
|
|
60
|
+
metricsRegistry
|
|
61
|
+
});
|
|
62
|
+
// Hook onto the onEstablished method to check the peer's version from the ENR,
|
|
63
|
+
// so we don't add it to our dht if it doesn't have the correct version.
|
|
64
|
+
// In addition, we'll hook onto onDiscovered to to repeat the same check there,
|
|
65
|
+
// just in case. Note that not adding the peer to the dht could lead to it
|
|
66
|
+
// being "readded" constantly, we'll need to keep an eye on whether this
|
|
67
|
+
// turns out to be a problem or not.
|
|
68
|
+
const origOnEstablished = this.discv5.onEstablished.bind(this.discv5);
|
|
69
|
+
this.discv5.onEstablished = (...args)=>{
|
|
70
|
+
const enr = args[1];
|
|
71
|
+
// A special case is for bootnodes. If this is a bootnode and we have been told to skip version checks
|
|
72
|
+
// then proceed straight to handling the event
|
|
73
|
+
if (!this.config.bootstrapNodeEnrVersionCheck && this.isOurBootnode(enr)) {
|
|
74
|
+
return origOnEstablished(...args);
|
|
75
|
+
}
|
|
76
|
+
if (this.validateEnr(enr)) {
|
|
77
|
+
return origOnEstablished(...args);
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
this.discv5.on(Discv5Event.DISCOVERED, this.onDiscovered.bind(this));
|
|
81
|
+
this.discv5.on(Discv5Event.ENR_ADDED, this.onEnrAdded.bind(this));
|
|
82
|
+
}
|
|
83
|
+
async start() {
|
|
84
|
+
if (this.currentState === PeerDiscoveryState.RUNNING) {
|
|
85
|
+
throw new Error('DiscV5Service already started');
|
|
86
|
+
}
|
|
87
|
+
this.logger.debug('Starting DiscV5');
|
|
88
|
+
await this.discv5.start();
|
|
89
|
+
this.startTime = Date.now();
|
|
90
|
+
this.logger.info(`DiscV5 service started`, {
|
|
91
|
+
nodeId: this.enr.nodeId,
|
|
92
|
+
peerId: this.peerId,
|
|
93
|
+
enrUdp: await this.enr.getFullMultiaddr('udp'),
|
|
94
|
+
enrTcp: await this.enr.getFullMultiaddr('tcp'),
|
|
95
|
+
versions: this.versions
|
|
96
|
+
});
|
|
97
|
+
this.currentState = PeerDiscoveryState.RUNNING;
|
|
98
|
+
// Add bootnode ENR if provided
|
|
99
|
+
if (this.bootstrapNodes?.length) {
|
|
100
|
+
// Do this conversion once since it involves an async function call
|
|
101
|
+
this.bootstrapNodePeerIds = await Promise.all(this.bootstrapNodeEnrs.map((enr)=>enr.peerId()));
|
|
102
|
+
this.logger.info(`Adding ${this.bootstrapNodes} bootstrap nodes ENRs: ${this.bootstrapNodes.join(', ')}`);
|
|
103
|
+
for (const enr of this.bootstrapNodeEnrs){
|
|
104
|
+
try {
|
|
105
|
+
if (this.config.bootstrapNodeEnrVersionCheck) {
|
|
106
|
+
const value = enr.kvs.get(AZTEC_ENR_KEY);
|
|
107
|
+
if (!value) {
|
|
108
|
+
throw new Error('ENR does not contain aztec key');
|
|
109
|
+
}
|
|
110
|
+
checkCompressedComponentVersion(Buffer.from(value).toString(), this.versions);
|
|
111
|
+
}
|
|
112
|
+
this.discv5.addEnr(enr);
|
|
113
|
+
} catch (e) {
|
|
114
|
+
this.logger.error(`Error adding bootratrap node ${enr.encodeTxt()}`, e);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
async runRandomNodesQuery() {
|
|
120
|
+
if (this.currentState !== PeerDiscoveryState.RUNNING) {
|
|
121
|
+
throw new Error('DiscV5Service not running');
|
|
122
|
+
}
|
|
123
|
+
// First, wait some time before starting the peer discovery
|
|
124
|
+
// reference: https://github.com/ChainSafe/lodestar/issues/3423
|
|
125
|
+
const msSinceStart = Date.now() - this.startTime;
|
|
126
|
+
if (Date.now() - this.startTime <= delayBeforeStart) {
|
|
127
|
+
await sleep(delayBeforeStart - msSinceStart);
|
|
128
|
+
}
|
|
129
|
+
try {
|
|
130
|
+
await this.discv5.findRandomNode();
|
|
131
|
+
} catch (err) {
|
|
132
|
+
this.logger.error(`Error running discV5 random node query: ${err}`);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
getAllPeers() {
|
|
136
|
+
return this.discv5.kadValues();
|
|
137
|
+
}
|
|
138
|
+
getEnr() {
|
|
139
|
+
return this.enr.toENR();
|
|
140
|
+
}
|
|
141
|
+
getPeerId() {
|
|
142
|
+
return this.peerId;
|
|
143
|
+
}
|
|
144
|
+
getStatus() {
|
|
145
|
+
return this.currentState;
|
|
146
|
+
}
|
|
147
|
+
isBootstrapPeer(peerId) {
|
|
148
|
+
return this.bootstrapNodePeerIds.some((node)=>node.equals(peerId));
|
|
149
|
+
}
|
|
150
|
+
async stop() {
|
|
151
|
+
await this.discv5.off(Discv5Event.DISCOVERED, this.onDiscovered);
|
|
152
|
+
await this.discv5.off(Discv5Event.ENR_ADDED, this.onEnrAdded);
|
|
153
|
+
await this.discv5.stop();
|
|
154
|
+
this.currentState = PeerDiscoveryState.STOPPED;
|
|
155
|
+
}
|
|
156
|
+
async onEnrAdded(enr) {
|
|
157
|
+
const multiAddrTcp = await enr.getFullMultiaddr('tcp');
|
|
158
|
+
const multiAddrUdp = await enr.getFullMultiaddr('udp');
|
|
159
|
+
this.logger.debug(`Added ENR ${enr.encodeTxt()}`, {
|
|
160
|
+
multiAddrTcp,
|
|
161
|
+
multiAddrUdp,
|
|
162
|
+
nodeId: enr.nodeId
|
|
163
|
+
});
|
|
164
|
+
this.onDiscovered(enr);
|
|
165
|
+
}
|
|
166
|
+
isOurBootnode(enr) {
|
|
167
|
+
return this.bootstrapNodeEnrs.some((x)=>x.nodeId === enr.nodeId);
|
|
168
|
+
}
|
|
169
|
+
onDiscovered(enr) {
|
|
170
|
+
// Find out if this is one of our bootnodes
|
|
171
|
+
if (this.isOurBootnode(enr)) {
|
|
172
|
+
// it is, what we do here depends
|
|
173
|
+
if (!this.config.bootstrapNodesAsFullPeers) {
|
|
174
|
+
// we don't consider bootnodes as full peers, don't perform any checks and don't emit anything
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
if (!this.config.bootstrapNodeEnrVersionCheck) {
|
|
178
|
+
// we do consider bootnodes to be full peers and we have been told to NOT version check them, so emit
|
|
179
|
+
this.logger.trace(`Skipping version check for bootnode ${enr.nodeId}`);
|
|
180
|
+
this.emit(PeerEvent.DISCOVERED, enr);
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
// here, we do consider bootnodes as full peers and we must version check so we continue to regular validation
|
|
184
|
+
}
|
|
185
|
+
if (this.validateEnr(enr)) {
|
|
186
|
+
this.emit(PeerEvent.DISCOVERED, enr);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
validateEnr(enr) {
|
|
190
|
+
// Check the peer is an aztec peer
|
|
191
|
+
const value = enr.kvs.get(AZTEC_ENR_KEY);
|
|
192
|
+
if (!value) {
|
|
193
|
+
this.logger.warn(`Peer node ${enr.nodeId} does not have aztec key in ENR`);
|
|
194
|
+
return false;
|
|
195
|
+
}
|
|
196
|
+
// And check it has the correct version
|
|
197
|
+
let compressedVersion;
|
|
198
|
+
try {
|
|
199
|
+
compressedVersion = Buffer.from(value).toString();
|
|
200
|
+
checkCompressedComponentVersion(compressedVersion, this.versions);
|
|
201
|
+
return true;
|
|
202
|
+
} catch (err) {
|
|
203
|
+
if (err.name === 'ComponentsVersionsError') {
|
|
204
|
+
this.logger.debug(`Peer node ${enr.nodeId} has incorrect version: ${err.message}`, {
|
|
205
|
+
compressedVersion,
|
|
206
|
+
expected: this.versions
|
|
207
|
+
});
|
|
208
|
+
} else {
|
|
209
|
+
this.logger.error(`Error checking peer version`, err);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
return false;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/// <reference types="node" resolution-mode="require"/>
|
|
2
|
+
import type { PeerInfo } from '@aztec/stdlib/interfaces/server';
|
|
3
|
+
import type { BlockAttestation, BlockProposal, Gossipable } from '@aztec/stdlib/p2p';
|
|
4
|
+
import { TxHash } from '@aztec/stdlib/tx';
|
|
5
|
+
import type { PeerId } from '@libp2p/interface';
|
|
6
|
+
import EventEmitter from 'events';
|
|
7
|
+
import type { ReqRespSubProtocol, SubProtocolMap } from './reqresp/interface.js';
|
|
8
|
+
import { type P2PService, type PeerDiscoveryService, PeerDiscoveryState } from './service.js';
|
|
9
|
+
/**
|
|
10
|
+
* A dummy implementation of the P2P Service.
|
|
11
|
+
*/
|
|
12
|
+
export declare class DummyP2PService implements P2PService {
|
|
13
|
+
/** Returns an empty array for peers. */
|
|
14
|
+
getPeers(): PeerInfo[];
|
|
15
|
+
/**
|
|
16
|
+
* Starts the dummy implementation.
|
|
17
|
+
* @returns A resolved promise.
|
|
18
|
+
*/
|
|
19
|
+
start(): Promise<void>;
|
|
20
|
+
/**
|
|
21
|
+
* Stops the dummy implementation.
|
|
22
|
+
* @returns A resolved promise.
|
|
23
|
+
*/
|
|
24
|
+
stop(): Promise<void>;
|
|
25
|
+
/**
|
|
26
|
+
* Called to have the given message propagated through the P2P network.
|
|
27
|
+
* @param _ - The message to be propagated.
|
|
28
|
+
*/
|
|
29
|
+
propagate<T extends Gossipable>(_: T): void;
|
|
30
|
+
/**
|
|
31
|
+
* Called upon receipt of settled transactions.
|
|
32
|
+
* @param _ - The hashes of the settled transactions.
|
|
33
|
+
*/
|
|
34
|
+
settledTxs(_: TxHash[]): void;
|
|
35
|
+
/**
|
|
36
|
+
* Register a callback into the validator client for when a block proposal is received
|
|
37
|
+
*/
|
|
38
|
+
registerBlockReceivedCallback(_: (block: BlockProposal) => Promise<BlockAttestation>): void;
|
|
39
|
+
/**
|
|
40
|
+
* Sends a request to a peer.
|
|
41
|
+
* @param _protocol - The protocol to send the request on.
|
|
42
|
+
* @param _request - The request to send.
|
|
43
|
+
* @returns The response from the peer, otherwise undefined.
|
|
44
|
+
*/
|
|
45
|
+
sendRequest<Protocol extends ReqRespSubProtocol>(_protocol: Protocol, _request: InstanceType<SubProtocolMap[Protocol]['request']>): Promise<InstanceType<SubProtocolMap[Protocol]['response']> | undefined>;
|
|
46
|
+
/**
|
|
47
|
+
* Sends a batch request to a peer.
|
|
48
|
+
* @param _protocol - The protocol to send the request on.
|
|
49
|
+
* @param _requests - The requests to send.
|
|
50
|
+
* @returns The responses from the peer, otherwise undefined.
|
|
51
|
+
*/
|
|
52
|
+
sendBatchRequest<Protocol extends ReqRespSubProtocol>(_protocol: Protocol, _requests: InstanceType<SubProtocolMap[Protocol]['request']>[]): Promise<InstanceType<SubProtocolMap[Protocol]['response']>[]>;
|
|
53
|
+
/**
|
|
54
|
+
* Returns the ENR of the peer.
|
|
55
|
+
* @returns The ENR of the peer, otherwise undefined.
|
|
56
|
+
*/
|
|
57
|
+
getEnr(): undefined;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* A dummy implementation of the Peer Discovery Service.
|
|
61
|
+
*/
|
|
62
|
+
export declare class DummyPeerDiscoveryService extends EventEmitter implements PeerDiscoveryService {
|
|
63
|
+
private currentState;
|
|
64
|
+
bootstrapNodes: string[];
|
|
65
|
+
/**
|
|
66
|
+
* Starts the dummy implementation.
|
|
67
|
+
* @returns A resolved promise.
|
|
68
|
+
*/
|
|
69
|
+
start(): Promise<void>;
|
|
70
|
+
/**
|
|
71
|
+
* Stops the dummy implementation.
|
|
72
|
+
* @returns A resolved promise.
|
|
73
|
+
*/
|
|
74
|
+
stop(): Promise<void>;
|
|
75
|
+
/**
|
|
76
|
+
* Called to discover peers in the network.
|
|
77
|
+
* @returns An array of discovered peer addresses.
|
|
78
|
+
*/
|
|
79
|
+
getAllPeers(): never[];
|
|
80
|
+
runRandomNodesQuery(): Promise<void>;
|
|
81
|
+
isBootstrapPeer(_: PeerId): boolean;
|
|
82
|
+
getStatus(): PeerDiscoveryState;
|
|
83
|
+
getEnr(): undefined;
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=dummy_service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dummy_service.d.ts","sourceRoot":"","sources":["../../src/services/dummy_service.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACrF,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,YAAY,MAAM,QAAQ,CAAC;AAElC,OAAO,KAAK,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACjF,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAE9F;;GAEG;AACH,qBAAa,eAAgB,YAAW,UAAU;IAChD,wCAAwC;IACxC,QAAQ,IAAI,QAAQ,EAAE;IAItB;;;OAGG;IACI,KAAK;IAIZ;;;OAGG;IACI,IAAI;IAIX;;;OAGG;IACI,SAAS,CAAC,CAAC,SAAS,UAAU,EAAE,CAAC,EAAE,CAAC;IAE3C;;;OAGG;IACI,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE;IAE7B;;OAEG;IACI,6BAA6B,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,OAAO,CAAC,gBAAgB,CAAC;IAE3F;;;;;OAKG;IACI,WAAW,CAAC,QAAQ,SAAS,kBAAkB,EACpD,SAAS,EAAE,QAAQ,EACnB,QAAQ,EAAE,YAAY,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,GAC1D,OAAO,CAAC,YAAY,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,CAAC,GAAG,SAAS,CAAC;IAI1E;;;;;OAKG;IACI,gBAAgB,CAAC,QAAQ,SAAS,kBAAkB,EACzD,SAAS,EAAE,QAAQ,EACnB,SAAS,EAAE,YAAY,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,GAC7D,OAAO,CAAC,YAAY,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;IAIhE;;;OAGG;IACI,MAAM,IAAI,SAAS;CAG3B;AAED;;GAEG;AACH,qBAAa,yBAA0B,SAAQ,YAAa,YAAW,oBAAoB;IACzF,OAAO,CAAC,YAAY,CAA8B;IAC3C,cAAc,EAAE,MAAM,EAAE,CAAM;IAErC;;;OAGG;IACI,KAAK;IAIZ;;;OAGG;IACI,IAAI;IAIX;;;OAGG;IACI,WAAW;IAIX,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC;IAIpC,eAAe,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO;IAInC,SAAS,IAAI,kBAAkB;IAI/B,MAAM,IAAI,SAAS;CAG3B"}
|