@aztec/p2p 0.65.2 → 0.67.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 +7 -2
- package/dest/bootstrap/bootstrap.d.ts.map +1 -1
- package/dest/bootstrap/bootstrap.js +25 -12
- package/dest/client/index.d.ts.map +1 -1
- package/dest/client/index.js +11 -7
- package/dest/client/p2p_client.d.ts +11 -16
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +32 -8
- package/dest/config.d.ts +40 -2
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +10 -2
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +8 -0
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +1 -0
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +22 -3
- package/dest/mem_pools/instrumentation.d.ts +2 -7
- package/dest/mem_pools/instrumentation.d.ts.map +1 -1
- package/dest/mem_pools/instrumentation.js +4 -25
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +5 -7
- package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/memory_tx_pool.js +4 -4
- package/dest/mocks/index.d.ts.map +1 -1
- package/dest/mocks/index.js +12 -6
- package/dest/service/discV5_service.d.ts +2 -0
- package/dest/service/discV5_service.d.ts.map +1 -1
- package/dest/service/discV5_service.js +14 -11
- package/dest/service/dummy_service.d.ts +3 -1
- package/dest/service/dummy_service.d.ts.map +1 -1
- package/dest/service/dummy_service.js +5 -1
- package/dest/service/encoding.d.ts +26 -0
- package/dest/service/encoding.d.ts.map +1 -0
- package/dest/service/encoding.js +49 -0
- package/dest/service/libp2p_service.d.ts +2 -7
- package/dest/service/libp2p_service.d.ts.map +1 -1
- package/dest/service/libp2p_service.js +24 -31
- package/dest/service/peer_manager.d.ts +3 -0
- package/dest/service/peer_manager.d.ts.map +1 -1
- package/dest/service/peer_manager.js +59 -21
- package/dest/service/peer_scoring.d.ts +4 -1
- package/dest/service/peer_scoring.d.ts.map +1 -1
- package/dest/service/peer_scoring.js +6 -1
- package/dest/service/reqresp/handlers.d.ts +4 -2
- package/dest/service/reqresp/handlers.d.ts.map +1 -1
- package/dest/service/reqresp/handlers.js +3 -3
- package/dest/service/reqresp/interface.d.ts +1 -1
- package/dest/service/reqresp/interface.d.ts.map +1 -1
- package/dest/service/reqresp/interface.js +2 -2
- package/dest/service/reqresp/reqresp.d.ts +3 -0
- package/dest/service/reqresp/reqresp.d.ts.map +1 -1
- package/dest/service/reqresp/reqresp.js +14 -9
- package/dest/service/service.d.ts +2 -1
- package/dest/service/service.d.ts.map +1 -1
- package/dest/tx_validator/data_validator.js +3 -3
- package/dest/tx_validator/double_spend_validator.js +3 -3
- package/dest/tx_validator/metadata_validator.js +3 -3
- package/dest/tx_validator/tx_proof_validator.js +3 -3
- package/dest/util.d.ts +20 -2
- package/dest/util.d.ts.map +1 -1
- package/dest/util.js +39 -3
- package/package.json +14 -9
- package/src/bootstrap/bootstrap.ts +33 -13
- package/src/client/index.ts +10 -6
- package/src/client/p2p_client.ts +47 -24
- package/src/config.ts +17 -2
- package/src/mem_pools/attestation_pool/attestation_pool.ts +9 -0
- package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +23 -2
- package/src/mem_pools/instrumentation.ts +4 -26
- package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +4 -6
- package/src/mem_pools/tx_pool/memory_tx_pool.ts +3 -3
- package/src/mocks/index.ts +11 -5
- package/src/service/discV5_service.ts +17 -12
- package/src/service/dummy_service.ts +6 -1
- package/src/service/encoding.ts +61 -0
- package/src/service/libp2p_service.ts +26 -32
- package/src/service/peer_manager.ts +68 -22
- package/src/service/peer_scoring.ts +8 -1
- package/src/service/reqresp/handlers.ts +4 -4
- package/src/service/reqresp/interface.ts +3 -3
- package/src/service/reqresp/reqresp.ts +13 -8
- package/src/service/service.ts +3 -1
- package/src/tx_validator/data_validator.ts +2 -2
- package/src/tx_validator/double_spend_validator.ts +2 -2
- package/src/tx_validator/metadata_validator.ts +2 -2
- package/src/tx_validator/tx_proof_validator.ts +2 -2
- package/src/util.ts +48 -2
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
var _MetadataTxValidator_instances, _MetadataTxValidator_log, _MetadataTxValidator_hasCorrectChainId, _MetadataTxValidator_isValidForBlockNumber;
|
|
2
2
|
import { __classPrivateFieldGet } from "tslib";
|
|
3
3
|
import { Tx } from '@aztec/circuit-types';
|
|
4
|
-
import {
|
|
4
|
+
import { createLogger } from '@aztec/foundation/log';
|
|
5
5
|
export class MetadataTxValidator {
|
|
6
6
|
constructor(chainId, blockNumber) {
|
|
7
7
|
_MetadataTxValidator_instances.add(this);
|
|
8
8
|
this.chainId = chainId;
|
|
9
9
|
this.blockNumber = blockNumber;
|
|
10
|
-
_MetadataTxValidator_log.set(this,
|
|
10
|
+
_MetadataTxValidator_log.set(this, createLogger('p2p:tx_validator:tx_metadata'));
|
|
11
11
|
}
|
|
12
12
|
validateTxs(txs) {
|
|
13
13
|
const validTxs = [];
|
|
@@ -47,4 +47,4 @@ _MetadataTxValidator_log = new WeakMap(), _MetadataTxValidator_instances = new W
|
|
|
47
47
|
return true;
|
|
48
48
|
}
|
|
49
49
|
};
|
|
50
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
50
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0YWRhdGFfdmFsaWRhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3R4X3ZhbGlkYXRvci9tZXRhZGF0YV92YWxpZGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxPQUFPLEVBQWMsRUFBRSxFQUFvQixNQUFNLHNCQUFzQixDQUFDO0FBRXhFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUVyRCxNQUFNLE9BQU8sbUJBQW1CO0lBRzlCLFlBQW9CLE9BQVcsRUFBVSxXQUFlOztRQUFwQyxZQUFPLEdBQVAsT0FBTyxDQUFJO1FBQVUsZ0JBQVcsR0FBWCxXQUFXLENBQUk7UUFGeEQsbUNBQU8sWUFBWSxDQUFDLDhCQUE4QixDQUFDLEVBQUM7SUFFTyxDQUFDO0lBRTVELFdBQVcsQ0FBQyxHQUFRO1FBQ2xCLE1BQU0sUUFBUSxHQUFRLEVBQUUsQ0FBQztRQUN6QixNQUFNLFVBQVUsR0FBUSxFQUFFLENBQUM7UUFDM0IsS0FBSyxNQUFNLEVBQUUsSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsdUJBQUEsSUFBSSw4RUFBbUIsTUFBdkIsSUFBSSxFQUFvQixFQUFFLENBQUMsRUFBRSxDQUFDO2dCQUNqQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNwQixTQUFTO1lBQ1gsQ0FBQztZQUVELElBQUksQ0FBQyx1QkFBQSxJQUFJLGtGQUF1QixNQUEzQixJQUFJLEVBQXdCLEVBQUUsQ0FBQyxFQUFFLENBQUM7Z0JBQ3JDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ3BCLFNBQVM7WUFDWCxDQUFDO1lBRUQsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNwQixDQUFDO1FBRUQsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVELFVBQVUsQ0FBQyxFQUFLO1FBQ2QsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLHVCQUFBLElBQUksOEVBQW1CLE1BQXZCLElBQUksRUFBb0IsRUFBRSxDQUFDLElBQUksdUJBQUEsSUFBSSxrRkFBdUIsTUFBM0IsSUFBSSxFQUF3QixFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3pGLENBQUM7Q0E2QkY7bUxBM0JvQixFQUFLO0lBQ3RCLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUM5RCx1QkFBQSxJQUFJLGdDQUFLLENBQUMsSUFBSSxDQUNaLGdCQUFnQixFQUFFLENBQUMsT0FBTyxDQUN4QixFQUFFLENBQ0gsK0JBQStCLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUMvRyxDQUFDO1FBQ0YsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO1NBQU0sQ0FBQztRQUNOLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztBQUNILENBQUMsbUdBRXNCLEVBQUs7SUFDMUIsTUFBTSxjQUFjLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxjQUFjLENBQUM7SUFFdkUsSUFBSSxjQUFjLENBQUMsTUFBTSxJQUFJLGNBQWMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3JFLHVCQUFBLElBQUksZ0NBQUssQ0FBQyxJQUFJLENBQ1osZ0JBQWdCLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLG1EQUM1QixjQUFjLENBQUMsS0FDakIsMkJBQTJCLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FDL0MsQ0FBQztRQUNGLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztTQUFNLENBQUM7UUFDTixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7QUFDSCxDQUFDIn0=
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
var _TxProofValidator_log;
|
|
2
2
|
import { __classPrivateFieldGet } from "tslib";
|
|
3
3
|
import { Tx } from '@aztec/circuit-types';
|
|
4
|
-
import {
|
|
4
|
+
import { createLogger } from '@aztec/foundation/log';
|
|
5
5
|
export class TxProofValidator {
|
|
6
6
|
constructor(verifier) {
|
|
7
7
|
this.verifier = verifier;
|
|
8
|
-
_TxProofValidator_log.set(this,
|
|
8
|
+
_TxProofValidator_log.set(this, createLogger('p2p:tx_validator:private_proof'));
|
|
9
9
|
}
|
|
10
10
|
async validateTxs(txs) {
|
|
11
11
|
const validTxs = [];
|
|
@@ -26,4 +26,4 @@ export class TxProofValidator {
|
|
|
26
26
|
}
|
|
27
27
|
}
|
|
28
28
|
_TxProofValidator_log = new WeakMap();
|
|
29
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
29
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhfcHJvb2ZfdmFsaWRhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3R4X3ZhbGlkYXRvci90eF9wcm9vZl92YWxpZGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxPQUFPLEVBQXNDLEVBQUUsRUFBb0IsTUFBTSxzQkFBc0IsQ0FBQztBQUNoRyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFckQsTUFBTSxPQUFPLGdCQUFnQjtJQUczQixZQUFvQixRQUF1QztRQUF2QyxhQUFRLEdBQVIsUUFBUSxDQUErQjtRQUYzRCxnQ0FBTyxZQUFZLENBQUMsZ0NBQWdDLENBQUMsRUFBQztJQUVRLENBQUM7SUFFL0QsS0FBSyxDQUFDLFdBQVcsQ0FBQyxHQUFTO1FBQ3pCLE1BQU0sUUFBUSxHQUFTLEVBQUUsQ0FBQztRQUMxQixNQUFNLFVBQVUsR0FBUyxFQUFFLENBQUM7UUFFNUIsS0FBSyxNQUFNLEVBQUUsSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUNyQixJQUFJLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztnQkFDeEMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNwQixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sdUJBQUEsSUFBSSw2QkFBSyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsb0JBQW9CLENBQUMsQ0FBQztnQkFDbkUsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN0QixDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVELFVBQVUsQ0FBQyxFQUFNO1FBQ2YsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN2QyxDQUFDO0NBQ0YifQ==
|
package/dest/util.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
+
import { type AztecKVStore } from '@aztec/kv-store';
|
|
1
2
|
import { type DataStoreConfig } from '@aztec/kv-store/config';
|
|
2
3
|
import type { GossipSub } from '@chainsafe/libp2p-gossipsub';
|
|
4
|
+
import { type PeerId } from '@libp2p/interface';
|
|
3
5
|
import type { Libp2p } from 'libp2p';
|
|
4
6
|
import { type P2PConfig } from './config.js';
|
|
5
7
|
export interface PubSubLibp2p extends Libp2p {
|
|
@@ -14,8 +16,7 @@ export interface PubSubLibp2p extends Libp2p {
|
|
|
14
16
|
* const udpAddr = '[2001:db8::1]:8080' -> /ip6/2001:db8::1/udp/8080
|
|
15
17
|
* @param address - The address string to convert. Has to be in the format <addr>:<port>.
|
|
16
18
|
* @param protocol - The protocol to use in the multiaddr string.
|
|
17
|
-
* @returns A multiaddr compliant string.
|
|
18
|
-
*/
|
|
19
|
+
* @returns A multiaddr compliant string. */
|
|
19
20
|
export declare function convertToMultiaddr(address: string, protocol: 'tcp' | 'udp'): string;
|
|
20
21
|
/**
|
|
21
22
|
* Splits an <address>:<port> string into its components.
|
|
@@ -28,4 +29,21 @@ export declare function splitAddressPort(address: string, allowEmptyAddress: boo
|
|
|
28
29
|
export declare function getPublicIp(): Promise<string>;
|
|
29
30
|
export declare function resolveAddressIfNecessary(address: string): Promise<string>;
|
|
30
31
|
export declare function configureP2PClientAddresses(_config: P2PConfig & DataStoreConfig): Promise<P2PConfig & DataStoreConfig>;
|
|
32
|
+
/**
|
|
33
|
+
* Get the peer id private key
|
|
34
|
+
*
|
|
35
|
+
* 1. Check if we have a peer id private key in the config
|
|
36
|
+
* 2. If not, check we have a peer id private key persisted in the node
|
|
37
|
+
* 3. If not, create a new one, then persist it in the node
|
|
38
|
+
*
|
|
39
|
+
*/
|
|
40
|
+
export declare function getPeerIdPrivateKey(config: {
|
|
41
|
+
peerIdPrivateKey?: string;
|
|
42
|
+
}, store: AztecKVStore): Promise<string>;
|
|
43
|
+
/**
|
|
44
|
+
* Create a libp2p peer ID from the private key.
|
|
45
|
+
* @param privateKey - peer ID private key as hex string
|
|
46
|
+
* @returns The peer ID.
|
|
47
|
+
*/
|
|
48
|
+
export declare function createLibP2PPeerIdFromPrivateKey(privateKey: string): Promise<PeerId>;
|
|
31
49
|
//# sourceMappingURL=util.d.ts.map
|
package/dest/util.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAE9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAE7D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAErC,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,WAAW,YAAa,SAAQ,MAAM;IAC1C,QAAQ,EAAE;QACR,MAAM,EAAE,SAAS,CAAC;KACnB,CAAC;CACH;AAED
|
|
1
|
+
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,YAAY,EAAuB,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAE9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAE7D,OAAO,EAAE,KAAK,MAAM,EAAmB,MAAM,mBAAmB,CAAC;AAGjE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAErC,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,WAAW,YAAa,SAAQ,MAAM;IAC1C,QAAQ,EAAE;QACR,MAAM,EAAE,SAAS,CAAC;KACnB,CAAC;CACH;AAED;;;;;;;6CAO6C;AAC7C,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,CASnF;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,OAAO,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAoB9F;AAED;;GAEG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,CAInD;AAED,wBAAsB,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAYhF;AAcD,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,SAAS,GAAG,eAAe,GACnC,OAAO,CAAC,SAAS,GAAG,eAAe,CAAC,CA6CtC;AAED;;;;;;;GAOG;AACH,wBAAsB,mBAAmB,CAAC,MAAM,EAAE;IAAE,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAiBrH;AAED;;;;GAIG;AACH,wBAAsB,gCAAgC,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAS1F"}
|
package/dest/util.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { generateKeyPair, marshalPrivateKey, unmarshalPrivateKey } from '@libp2p/crypto/keys';
|
|
2
|
+
import { createFromPrivKey } from '@libp2p/peer-id-factory';
|
|
1
3
|
import { resolve } from 'dns/promises';
|
|
2
4
|
/**
|
|
3
5
|
* Converts an address string to a multiaddr string.
|
|
@@ -6,8 +8,7 @@ import { resolve } from 'dns/promises';
|
|
|
6
8
|
* const udpAddr = '[2001:db8::1]:8080' -> /ip6/2001:db8::1/udp/8080
|
|
7
9
|
* @param address - The address string to convert. Has to be in the format <addr>:<port>.
|
|
8
10
|
* @param protocol - The protocol to use in the multiaddr string.
|
|
9
|
-
* @returns A multiaddr compliant string.
|
|
10
|
-
*/
|
|
11
|
+
* @returns A multiaddr compliant string. */
|
|
11
12
|
export function convertToMultiaddr(address, protocol) {
|
|
12
13
|
const [addr, port] = splitAddressPort(address, false);
|
|
13
14
|
const multiaddrPrefix = addressToMultiAddressType(addr);
|
|
@@ -112,4 +113,39 @@ export async function configureP2PClientAddresses(_config) {
|
|
|
112
113
|
}
|
|
113
114
|
return config;
|
|
114
115
|
}
|
|
115
|
-
|
|
116
|
+
/**
|
|
117
|
+
* Get the peer id private key
|
|
118
|
+
*
|
|
119
|
+
* 1. Check if we have a peer id private key in the config
|
|
120
|
+
* 2. If not, check we have a peer id private key persisted in the node
|
|
121
|
+
* 3. If not, create a new one, then persist it in the node
|
|
122
|
+
*
|
|
123
|
+
*/
|
|
124
|
+
export async function getPeerIdPrivateKey(config, store) {
|
|
125
|
+
const peerIdPrivateKeySingleton = store.openSingleton('peerIdPrivateKey');
|
|
126
|
+
if (config.peerIdPrivateKey) {
|
|
127
|
+
await peerIdPrivateKeySingleton.set(config.peerIdPrivateKey);
|
|
128
|
+
return config.peerIdPrivateKey;
|
|
129
|
+
}
|
|
130
|
+
const storedPeerIdPrivateKey = peerIdPrivateKeySingleton.get();
|
|
131
|
+
if (storedPeerIdPrivateKey) {
|
|
132
|
+
return storedPeerIdPrivateKey;
|
|
133
|
+
}
|
|
134
|
+
const newPeerIdPrivateKey = await generateKeyPair('secp256k1');
|
|
135
|
+
const privateKeyString = Buffer.from(marshalPrivateKey(newPeerIdPrivateKey)).toString('hex');
|
|
136
|
+
await peerIdPrivateKeySingleton.set(privateKeyString);
|
|
137
|
+
return privateKeyString;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Create a libp2p peer ID from the private key.
|
|
141
|
+
* @param privateKey - peer ID private key as hex string
|
|
142
|
+
* @returns The peer ID.
|
|
143
|
+
*/
|
|
144
|
+
export async function createLibP2PPeerIdFromPrivateKey(privateKey) {
|
|
145
|
+
if (!privateKey?.length) {
|
|
146
|
+
throw new Error('No peer private key provided');
|
|
147
|
+
}
|
|
148
|
+
const asLibp2pPrivateKey = await unmarshalPrivateKey(new Uint8Array(Buffer.from(privateKey, 'hex')));
|
|
149
|
+
return await createFromPrivKey(asLibp2pPrivateKey);
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUlBLE9BQU8sRUFBRSxlQUFlLEVBQUUsaUJBQWlCLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUU5RixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBV3ZDOzs7Ozs7OzZDQU82QztBQUM3QyxNQUFNLFVBQVUsa0JBQWtCLENBQUMsT0FBZSxFQUFFLFFBQXVCO0lBQ3pFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBRXRELE1BQU0sZUFBZSxHQUFHLHlCQUF5QixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3hELElBQUksZUFBZSxLQUFLLEtBQUssRUFBRSxDQUFDO1FBQzlCLE1BQU0sSUFBSSxLQUFLLENBQUMsMkRBQTJELENBQUMsQ0FBQztJQUMvRSxDQUFDO0lBRUQsT0FBTyxJQUFJLGVBQWUsSUFBSSxJQUFJLElBQUksUUFBUSxJQUFJLElBQUksRUFBRSxDQUFDO0FBQzNELENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsT0FBZSxFQUFFLGlCQUEwQjtJQUMxRSxJQUFJLElBQVksQ0FBQztJQUNqQixJQUFJLElBQVksQ0FBQztJQUVqQixJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUM1QiwyQ0FBMkM7UUFDM0MsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNYLE1BQU0sSUFBSSxLQUFLLENBQUMsK0JBQStCLE9BQU8sb0NBQW9DLENBQUMsQ0FBQztRQUM5RixDQUFDO1FBQ0QsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDekIsQ0FBQztTQUFNLENBQUM7UUFDTixlQUFlO1FBQ2YsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNsQyxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDM0MsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsT0FBTyxrQ0FBa0MsQ0FBQyxDQUFDO1FBQ3hGLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztBQUN0QixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLFdBQVc7SUFDL0IsTUFBTSxJQUFJLEdBQUcsTUFBTSxLQUFLLENBQUMsK0JBQStCLENBQUMsQ0FBQztJQUMxRCxNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUMvQixPQUFPLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUNyQixDQUFDO0FBRUQsTUFBTSxDQUFDLEtBQUssVUFBVSx5QkFBeUIsQ0FBQyxPQUFlO0lBQzdELE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3RELE1BQU0sZUFBZSxHQUFHLHlCQUF5QixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3hELElBQUksZUFBZSxLQUFLLEtBQUssRUFBRSxDQUFDO1FBQzlCLE1BQU0saUJBQWlCLEdBQUcsTUFBTSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUMsSUFBSSxpQkFBaUIsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDbkMsTUFBTSxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN4RCxDQUFDO1FBQ0QsT0FBTyxHQUFHLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDO0lBQzNDLENBQUM7U0FBTSxDQUFDO1FBQ04sT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztBQUNILENBQUM7QUFFRCwwREFBMEQ7QUFDMUQsMkVBQTJFO0FBQzNFLFNBQVMseUJBQXlCLENBQUMsT0FBZTtJQUNoRCxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUMxQixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7U0FBTSxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztRQUNyQyxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7U0FBTSxDQUFDO1FBQ04sT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0FBQ0gsQ0FBQztBQUVELE1BQU0sQ0FBQyxLQUFLLFVBQVUsMkJBQTJCLENBQy9DLE9BQW9DO0lBRXBDLE1BQU0sTUFBTSxHQUFHLEVBQUUsR0FBRyxPQUFPLEVBQUUsQ0FBQztJQUM5QixNQUFNLEVBQ0osa0JBQWtCLEVBQUUsd0JBQXdCLEVBQzVDLGtCQUFrQixFQUFFLHdCQUF3QixFQUM1QyxVQUFVLEdBQ1gsR0FBRyxNQUFNLENBQUM7SUFFWCxNQUFNLENBQUMsa0JBQWtCLEdBQUcsd0JBQXdCO1FBQ2xELENBQUMsQ0FBQyxNQUFNLHlCQUF5QixDQUFDLHdCQUF3QixDQUFDO1FBQzNELENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDZCxNQUFNLENBQUMsa0JBQWtCLEdBQUcsd0JBQXdCO1FBQ2xELENBQUMsQ0FBQyxNQUFNLHlCQUF5QixDQUFDLHdCQUF3QixDQUFDO1FBQzNELENBQUMsQ0FBQyxTQUFTLENBQUM7SUFFZCx1Q0FBdUM7SUFDdkMsSUFBSSxRQUFRLENBQUM7SUFFYix1Q0FBdUM7SUFDdkMsTUFBTSx1QkFBdUIsR0FBRyxnQkFBZ0IsQ0FBQyx3QkFBd0IsSUFBSSxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDdkYsSUFBSSx1QkFBdUIsQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDO1FBQzdFLElBQUksVUFBVSxFQUFFLENBQUM7WUFDZixRQUFRLEdBQUcsTUFBTSxXQUFXLEVBQUUsQ0FBQztZQUMvQixNQUFNLGtCQUFrQixHQUFHLEdBQUcsUUFBUSxJQUFJLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDdkUsTUFBTSxDQUFDLGtCQUFrQixHQUFHLGtCQUFrQixDQUFDO1FBQ2pELENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxJQUFJLEtBQUssQ0FDYix3Q0FBd0Msd0JBQXdCLGtDQUFrQyxDQUNuRyxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFRCxNQUFNLHVCQUF1QixHQUFHLGdCQUFnQixDQUFDLHdCQUF3QixJQUFJLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN2RixJQUFJLHVCQUF1QixDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksdUJBQXVCLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUM7UUFDN0UsZ0VBQWdFO1FBQ2hFLElBQUksQ0FBQyxVQUFVLElBQUksTUFBTSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDN0MsTUFBTSxDQUFDLGtCQUFrQixHQUFHLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQztRQUN4RCxDQUFDO2FBQU0sSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUN0QixNQUFNLFdBQVcsR0FBRyxRQUFRLElBQUksQ0FBQyxNQUFNLFdBQVcsRUFBRSxDQUFDLENBQUM7WUFDdEQsTUFBTSxrQkFBa0IsR0FBRyxHQUFHLFdBQVcsSUFBSSx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQzFFLE1BQU0sQ0FBQyxrQkFBa0IsR0FBRyxrQkFBa0IsQ0FBQztRQUNqRCxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxtQkFBbUIsQ0FBQyxNQUFxQyxFQUFFLEtBQW1CO0lBQ2xHLE1BQU0seUJBQXlCLEdBQTJCLEtBQUssQ0FBQyxhQUFhLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUNsRyxJQUFJLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQzVCLE1BQU0seUJBQXlCLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQzdELE9BQU8sTUFBTSxDQUFDLGdCQUFnQixDQUFDO0lBQ2pDLENBQUM7SUFFRCxNQUFNLHNCQUFzQixHQUFHLHlCQUF5QixDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQy9ELElBQUksc0JBQXNCLEVBQUUsQ0FBQztRQUMzQixPQUFPLHNCQUFzQixDQUFDO0lBQ2hDLENBQUM7SUFFRCxNQUFNLG1CQUFtQixHQUFHLE1BQU0sZUFBZSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQy9ELE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRTdGLE1BQU0seUJBQXlCLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDdEQsT0FBTyxnQkFBZ0IsQ0FBQztBQUMxQixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsZ0NBQWdDLENBQUMsVUFBa0I7SUFDdkUsSUFBSSxDQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUUsQ0FBQztRQUN4QixNQUFNLElBQUksS0FBSyxDQUFDLDhCQUE4QixDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVELE1BQU0sa0JBQWtCLEdBQTRCLE1BQU0sbUJBQW1CLENBQzNFLElBQUksVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQy9DLENBQUM7SUFDRixPQUFPLE1BQU0saUJBQWlCLENBQUMsa0JBQWtCLENBQUMsQ0FBQztBQUNyRCxDQUFDIn0=
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/p2p",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.67.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./dest/index.js",
|
|
@@ -60,21 +60,24 @@
|
|
|
60
60
|
}
|
|
61
61
|
]
|
|
62
62
|
],
|
|
63
|
-
"testTimeout":
|
|
63
|
+
"testTimeout": 30000,
|
|
64
|
+
"setupFiles": [
|
|
65
|
+
"../../foundation/src/jest/setup.mjs"
|
|
66
|
+
]
|
|
64
67
|
},
|
|
65
68
|
"dependencies": {
|
|
66
|
-
"@aztec/circuit-types": "0.
|
|
67
|
-
"@aztec/circuits.js": "0.
|
|
68
|
-
"@aztec/foundation": "0.
|
|
69
|
-
"@aztec/kv-store": "0.
|
|
70
|
-
"@aztec/telemetry-client": "0.
|
|
69
|
+
"@aztec/circuit-types": "0.67.0",
|
|
70
|
+
"@aztec/circuits.js": "0.67.0",
|
|
71
|
+
"@aztec/foundation": "0.67.0",
|
|
72
|
+
"@aztec/kv-store": "0.67.0",
|
|
73
|
+
"@aztec/telemetry-client": "0.67.0",
|
|
71
74
|
"@chainsafe/discv5": "9.0.0",
|
|
72
75
|
"@chainsafe/enr": "3.0.0",
|
|
73
76
|
"@chainsafe/libp2p-gossipsub": "13.0.0",
|
|
74
77
|
"@chainsafe/libp2p-noise": "^15.0.0",
|
|
75
78
|
"@chainsafe/libp2p-yamux": "^6.0.2",
|
|
76
79
|
"@libp2p/bootstrap": "10.0.0",
|
|
77
|
-
"@libp2p/crypto": "4.
|
|
80
|
+
"@libp2p/crypto": "^4.1.1",
|
|
78
81
|
"@libp2p/identify": "1.0.18",
|
|
79
82
|
"@libp2p/interface": "1.3.1",
|
|
80
83
|
"@libp2p/kad-dht": "10.0.4",
|
|
@@ -91,7 +94,9 @@
|
|
|
91
94
|
"libp2p": "1.5.0",
|
|
92
95
|
"semver": "^7.6.0",
|
|
93
96
|
"sha3": "^2.1.4",
|
|
94
|
-
"
|
|
97
|
+
"snappy": "^7.2.2",
|
|
98
|
+
"tslib": "^2.4.0",
|
|
99
|
+
"xxhash-wasm": "^1.1.0"
|
|
95
100
|
},
|
|
96
101
|
"devDependencies": {
|
|
97
102
|
"@aztec/archiver": "workspace:^",
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { type P2PBootstrapApi } from '@aztec/circuit-types/interfaces';
|
|
2
|
+
import { createLogger } from '@aztec/foundation/log';
|
|
3
|
+
import { type AztecKVStore } from '@aztec/kv-store';
|
|
2
4
|
import { OtelMetricsAdapter, type TelemetryClient } from '@aztec/telemetry-client';
|
|
3
5
|
|
|
4
6
|
import { Discv5, type Discv5EventEmitter } from '@chainsafe/discv5';
|
|
@@ -8,17 +10,20 @@ import { type Multiaddr, multiaddr } from '@multiformats/multiaddr';
|
|
|
8
10
|
|
|
9
11
|
import type { BootnodeConfig } from '../config.js';
|
|
10
12
|
import { AZTEC_ENR_KEY, AZTEC_NET } from '../service/discV5_service.js';
|
|
11
|
-
import {
|
|
12
|
-
import { convertToMultiaddr } from '../util.js';
|
|
13
|
+
import { convertToMultiaddr, createLibP2PPeerIdFromPrivateKey, getPeerIdPrivateKey } from '../util.js';
|
|
13
14
|
|
|
14
15
|
/**
|
|
15
16
|
* Encapsulates a 'Bootstrap' node, used for the purpose of assisting new joiners in acquiring peers.
|
|
16
17
|
*/
|
|
17
|
-
export class BootstrapNode {
|
|
18
|
+
export class BootstrapNode implements P2PBootstrapApi {
|
|
18
19
|
private node?: Discv5 = undefined;
|
|
19
20
|
private peerId?: PeerId;
|
|
20
21
|
|
|
21
|
-
constructor(
|
|
22
|
+
constructor(
|
|
23
|
+
private store: AztecKVStore,
|
|
24
|
+
private telemetry: TelemetryClient,
|
|
25
|
+
private logger = createLogger('p2p:bootstrap'),
|
|
26
|
+
) {}
|
|
22
27
|
|
|
23
28
|
/**
|
|
24
29
|
* Starts the bootstrap node.
|
|
@@ -26,8 +31,10 @@ export class BootstrapNode {
|
|
|
26
31
|
* @returns An empty promise.
|
|
27
32
|
*/
|
|
28
33
|
public async start(config: BootnodeConfig) {
|
|
29
|
-
const {
|
|
30
|
-
|
|
34
|
+
const { udpListenAddress, udpAnnounceAddress } = config;
|
|
35
|
+
|
|
36
|
+
const peerIdPrivateKey = await getPeerIdPrivateKey(config, this.store);
|
|
37
|
+
const peerId = await createLibP2PPeerIdFromPrivateKey(peerIdPrivateKey);
|
|
31
38
|
this.peerId = peerId;
|
|
32
39
|
const enr = SignableENR.createFromPeerId(peerId);
|
|
33
40
|
|
|
@@ -41,7 +48,7 @@ export class BootstrapNode {
|
|
|
41
48
|
enr.setLocationMultiaddr(publicAddr);
|
|
42
49
|
enr.set(AZTEC_ENR_KEY, Uint8Array.from([AZTEC_NET]));
|
|
43
50
|
|
|
44
|
-
this.logger.
|
|
51
|
+
this.logger.debug(`Starting bootstrap node ${peerId} listening on ${listenAddrUdp.toString()}`);
|
|
45
52
|
const metricsRegistry = new OtelMetricsAdapter(this.telemetry);
|
|
46
53
|
this.node = Discv5.create({
|
|
47
54
|
enr,
|
|
@@ -59,17 +66,15 @@ export class BootstrapNode {
|
|
|
59
66
|
});
|
|
60
67
|
(this.node as Discv5EventEmitter).on('discovered', async (enr: SignableENR) => {
|
|
61
68
|
const addr = await enr.getFullMultiaddr('udp');
|
|
62
|
-
this.logger.verbose(`Discovered new peer
|
|
69
|
+
this.logger.verbose(`Discovered new peer`, { enr: enr.encodeTxt(), addr: addr?.toString() });
|
|
63
70
|
});
|
|
64
71
|
|
|
65
72
|
try {
|
|
66
73
|
await this.node.start();
|
|
67
|
-
this.logger.info('
|
|
74
|
+
this.logger.info('Bootstrap node started', { peerId, enr: enr.encodeTxt(), addr: listenAddrUdp.toString() });
|
|
68
75
|
} catch (e) {
|
|
69
76
|
this.logger.error('Error starting Discv5', e);
|
|
70
77
|
}
|
|
71
|
-
|
|
72
|
-
this.logger.info(`ENR: ${this.node?.enr.encodeTxt()}`);
|
|
73
78
|
}
|
|
74
79
|
|
|
75
80
|
/**
|
|
@@ -78,8 +83,9 @@ export class BootstrapNode {
|
|
|
78
83
|
*/
|
|
79
84
|
public async stop() {
|
|
80
85
|
// stop libp2p
|
|
86
|
+
this.logger.debug('Stopping bootstrap node');
|
|
81
87
|
await this.node?.stop();
|
|
82
|
-
this.logger.
|
|
88
|
+
this.logger.info('Bootstrap node stopped');
|
|
83
89
|
}
|
|
84
90
|
|
|
85
91
|
/**
|
|
@@ -99,4 +105,18 @@ export class BootstrapNode {
|
|
|
99
105
|
}
|
|
100
106
|
return this.node?.enr.toENR();
|
|
101
107
|
}
|
|
108
|
+
|
|
109
|
+
public getEncodedEnr() {
|
|
110
|
+
if (!this.node) {
|
|
111
|
+
throw new Error('Node not started');
|
|
112
|
+
}
|
|
113
|
+
return Promise.resolve(this.node.enr.encodeTxt());
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
public getRoutingTable() {
|
|
117
|
+
if (!this.node) {
|
|
118
|
+
throw new Error('Node not started');
|
|
119
|
+
}
|
|
120
|
+
return Promise.resolve(this.node.kadValues().map(enr => enr.encodeTxt()));
|
|
121
|
+
}
|
|
102
122
|
}
|
package/src/client/index.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import type { ClientProtocolCircuitVerifier, L2BlockSource, WorldStateSynchronizer } from '@aztec/circuit-types';
|
|
2
|
-
import {
|
|
2
|
+
import { createLogger } from '@aztec/foundation/log';
|
|
3
3
|
import { type AztecKVStore } from '@aztec/kv-store';
|
|
4
4
|
import { type DataStoreConfig } from '@aztec/kv-store/config';
|
|
5
|
-
import { createStore } from '@aztec/kv-store/
|
|
5
|
+
import { createStore } from '@aztec/kv-store/lmdb';
|
|
6
6
|
import { type TelemetryClient } from '@aztec/telemetry-client';
|
|
7
7
|
import { NoopTelemetryClient } from '@aztec/telemetry-client/noop';
|
|
8
8
|
|
|
@@ -16,8 +16,8 @@ import { type MemPools } from '../mem_pools/interface.js';
|
|
|
16
16
|
import { AztecKVTxPool, type TxPool } from '../mem_pools/tx_pool/index.js';
|
|
17
17
|
import { DiscV5Service } from '../service/discV5_service.js';
|
|
18
18
|
import { DummyP2PService } from '../service/dummy_service.js';
|
|
19
|
-
import { LibP2PService
|
|
20
|
-
import { configureP2PClientAddresses } from '../util.js';
|
|
19
|
+
import { LibP2PService } from '../service/index.js';
|
|
20
|
+
import { configureP2PClientAddresses, createLibP2PPeerIdFromPrivateKey, getPeerIdPrivateKey } from '../util.js';
|
|
21
21
|
|
|
22
22
|
export * from './p2p_client.js';
|
|
23
23
|
|
|
@@ -35,7 +35,8 @@ export const createP2PClient = async (
|
|
|
35
35
|
} = {},
|
|
36
36
|
) => {
|
|
37
37
|
let config = { ..._config };
|
|
38
|
-
const
|
|
38
|
+
const logger = createLogger('p2p');
|
|
39
|
+
const store = deps.store ?? (await createStore('p2p', config, createLogger('p2p:lmdb')));
|
|
39
40
|
|
|
40
41
|
const mempools: MemPools = {
|
|
41
42
|
txPool: deps.txPool ?? new AztecKVTxPool(store, telemetry),
|
|
@@ -46,10 +47,12 @@ export const createP2PClient = async (
|
|
|
46
47
|
let p2pService;
|
|
47
48
|
|
|
48
49
|
if (_config.p2pEnabled) {
|
|
50
|
+
logger.verbose('P2P is enabled. Using LibP2P service.');
|
|
49
51
|
config = await configureP2PClientAddresses(_config);
|
|
50
52
|
|
|
51
53
|
// Create peer discovery service
|
|
52
|
-
const
|
|
54
|
+
const peerIdPrivateKey = await getPeerIdPrivateKey(config, store);
|
|
55
|
+
const peerId = await createLibP2PPeerIdFromPrivateKey(peerIdPrivateKey);
|
|
53
56
|
const discoveryService = new DiscV5Service(peerId, config, telemetry);
|
|
54
57
|
|
|
55
58
|
p2pService = await LibP2PService.new(
|
|
@@ -64,6 +67,7 @@ export const createP2PClient = async (
|
|
|
64
67
|
telemetry,
|
|
65
68
|
);
|
|
66
69
|
} else {
|
|
70
|
+
logger.verbose('P2P is disabled. Using dummy P2P service');
|
|
67
71
|
p2pService = new DummyP2PService();
|
|
68
72
|
}
|
|
69
73
|
return new P2PClient(store, l2BlockSource, mempools, p2pService, config.keepProvenTxsInPoolFor, telemetry);
|
package/src/client/p2p_client.ts
CHANGED
|
@@ -8,11 +8,13 @@ import {
|
|
|
8
8
|
L2BlockStream,
|
|
9
9
|
type L2BlockStreamEvent,
|
|
10
10
|
type L2Tips,
|
|
11
|
+
type P2PApi,
|
|
12
|
+
type PeerInfo,
|
|
11
13
|
type Tx,
|
|
12
14
|
type TxHash,
|
|
13
15
|
} from '@aztec/circuit-types';
|
|
14
16
|
import { INITIAL_L2_BLOCK_NUM } from '@aztec/circuits.js/constants';
|
|
15
|
-
import {
|
|
17
|
+
import { createLogger } from '@aztec/foundation/log';
|
|
16
18
|
import { type AztecKVStore, type AztecMap, type AztecSingleton } from '@aztec/kv-store';
|
|
17
19
|
import { Attributes, type TelemetryClient, WithTracer, trackSpan } from '@aztec/telemetry-client';
|
|
18
20
|
import { NoopTelemetryClient } from '@aztec/telemetry-client/noop';
|
|
@@ -54,7 +56,7 @@ export interface P2PSyncState {
|
|
|
54
56
|
/**
|
|
55
57
|
* Interface of a P2P client.
|
|
56
58
|
**/
|
|
57
|
-
export interface P2P {
|
|
59
|
+
export interface P2P extends P2PApi {
|
|
58
60
|
/**
|
|
59
61
|
* Broadcasts a block proposal to other peers.
|
|
60
62
|
*
|
|
@@ -62,15 +64,6 @@ export interface P2P {
|
|
|
62
64
|
*/
|
|
63
65
|
broadcastProposal(proposal: BlockProposal): void;
|
|
64
66
|
|
|
65
|
-
/**
|
|
66
|
-
* Queries the Attestation pool for attestations for the given slot
|
|
67
|
-
*
|
|
68
|
-
* @param slot - the slot to query
|
|
69
|
-
* @param proposalId - the proposal id to query
|
|
70
|
-
* @returns BlockAttestations
|
|
71
|
-
*/
|
|
72
|
-
getAttestationsForSlot(slot: bigint, proposalId: string): Promise<BlockAttestation[]>;
|
|
73
|
-
|
|
74
67
|
/**
|
|
75
68
|
* Queries the EpochProofQuote pool for quotes for the given epoch
|
|
76
69
|
*
|
|
@@ -122,12 +115,6 @@ export interface P2P {
|
|
|
122
115
|
**/
|
|
123
116
|
deleteTxs(txHashes: TxHash[]): Promise<void>;
|
|
124
117
|
|
|
125
|
-
/**
|
|
126
|
-
* Returns all transactions in the transaction pool.
|
|
127
|
-
* @returns An array of Txs.
|
|
128
|
-
*/
|
|
129
|
-
getTxs(filter: 'all' | 'pending' | 'mined'): Tx[];
|
|
130
|
-
|
|
131
118
|
/**
|
|
132
119
|
* Returns a transaction in the transaction pool by its hash.
|
|
133
120
|
* @param txHash - Hash of tx to return.
|
|
@@ -173,9 +160,12 @@ export interface P2P {
|
|
|
173
160
|
getStatus(): Promise<P2PSyncState>;
|
|
174
161
|
|
|
175
162
|
/**
|
|
176
|
-
* Returns the ENR
|
|
163
|
+
* Returns the ENR of this node, if any.
|
|
177
164
|
*/
|
|
178
165
|
getEnr(): ENR | undefined;
|
|
166
|
+
|
|
167
|
+
/** Identifies a p2p client. */
|
|
168
|
+
isP2PClient(): true;
|
|
179
169
|
}
|
|
180
170
|
|
|
181
171
|
/**
|
|
@@ -202,6 +192,9 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
202
192
|
private attestationPool: AttestationPool;
|
|
203
193
|
private epochProofQuotePool: EpochProofQuotePool;
|
|
204
194
|
|
|
195
|
+
/** How many slots to keep attestations for. */
|
|
196
|
+
private keepAttestationsInPoolFor: number;
|
|
197
|
+
|
|
205
198
|
private blockStream;
|
|
206
199
|
|
|
207
200
|
/**
|
|
@@ -220,13 +213,15 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
220
213
|
private p2pService: P2PService,
|
|
221
214
|
private keepProvenTxsFor: number,
|
|
222
215
|
telemetry: TelemetryClient = new NoopTelemetryClient(),
|
|
223
|
-
private log =
|
|
216
|
+
private log = createLogger('p2p'),
|
|
224
217
|
) {
|
|
225
218
|
super(telemetry, 'P2PClient');
|
|
226
219
|
|
|
227
|
-
const { blockCheckIntervalMS, blockRequestBatchSize } = getP2PConfigFromEnv();
|
|
220
|
+
const { blockCheckIntervalMS, blockRequestBatchSize, keepAttestationsInPoolFor } = getP2PConfigFromEnv();
|
|
221
|
+
|
|
222
|
+
this.keepAttestationsInPoolFor = keepAttestationsInPoolFor;
|
|
228
223
|
|
|
229
|
-
this.blockStream = new L2BlockStream(l2BlockSource, this, this, {
|
|
224
|
+
this.blockStream = new L2BlockStream(l2BlockSource, this, this, createLogger('p2p:block_stream'), {
|
|
230
225
|
batchSize: blockRequestBatchSize,
|
|
231
226
|
pollIntervalMS: blockCheckIntervalMS,
|
|
232
227
|
});
|
|
@@ -240,6 +235,14 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
240
235
|
this.epochProofQuotePool = mempools.epochProofQuotePool;
|
|
241
236
|
}
|
|
242
237
|
|
|
238
|
+
public isP2PClient(): true {
|
|
239
|
+
return true;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
public getPeers(includePending?: boolean): Promise<PeerInfo[]> {
|
|
243
|
+
return Promise.resolve(this.p2pService.getPeers(includePending));
|
|
244
|
+
}
|
|
245
|
+
|
|
243
246
|
public getL2BlockHash(number: number): Promise<string | undefined> {
|
|
244
247
|
return Promise.resolve(this.synchedBlockHashes.get(number));
|
|
245
248
|
}
|
|
@@ -356,7 +359,7 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
356
359
|
this.setCurrentState(P2PClientState.RUNNING);
|
|
357
360
|
this.syncPromise = Promise.resolve();
|
|
358
361
|
await this.p2pService.start();
|
|
359
|
-
this.log.
|
|
362
|
+
this.log.debug(`Block ${syncedLatestBlock} (proven ${syncedProvenBlock}) already beyond current block`);
|
|
360
363
|
}
|
|
361
364
|
|
|
362
365
|
// publish any txs in TxPool after its doing initial sync
|
|
@@ -431,14 +434,20 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
431
434
|
public async requestTxByHash(txHash: TxHash): Promise<Tx | undefined> {
|
|
432
435
|
const tx = await this.p2pService.sendRequest(TX_REQ_PROTOCOL, txHash);
|
|
433
436
|
|
|
434
|
-
this.log.debug(`Requested ${txHash.toString()} from peer | success = ${!!tx}`);
|
|
435
437
|
if (tx) {
|
|
438
|
+
this.log.debug(`Received tx ${txHash.toString()} from peer`);
|
|
436
439
|
await this.txPool.addTxs([tx]);
|
|
440
|
+
} else {
|
|
441
|
+
this.log.debug(`Failed to receive tx ${txHash.toString()} from peer`);
|
|
437
442
|
}
|
|
438
443
|
|
|
439
444
|
return tx;
|
|
440
445
|
}
|
|
441
446
|
|
|
447
|
+
public getPendingTxs(): Promise<Tx[]> {
|
|
448
|
+
return Promise.resolve(this.getTxs('pending'));
|
|
449
|
+
}
|
|
450
|
+
|
|
442
451
|
/**
|
|
443
452
|
* Returns all transactions in the transaction pool.
|
|
444
453
|
* @returns An array of Txs.
|
|
@@ -509,6 +518,10 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
509
518
|
return this.p2pService.getEnr();
|
|
510
519
|
}
|
|
511
520
|
|
|
521
|
+
public getEncodedEnr(): Promise<string | undefined> {
|
|
522
|
+
return Promise.resolve(this.p2pService.getEnr()?.encodeTxt());
|
|
523
|
+
}
|
|
524
|
+
|
|
512
525
|
/**
|
|
513
526
|
* Deletes the 'txs' from the pool.
|
|
514
527
|
* NOT used if we use sendTx as reconcileTxPool will handle this.
|
|
@@ -615,7 +628,9 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
615
628
|
|
|
616
629
|
const firstBlockNum = blocks[0].number;
|
|
617
630
|
const lastBlockNum = blocks[blocks.length - 1].number;
|
|
631
|
+
const lastBlockSlot = blocks[blocks.length - 1].header.globalVariables.slotNumber.toBigInt();
|
|
618
632
|
|
|
633
|
+
// If keepProvenTxsFor is 0, we delete all txs from all proven blocks.
|
|
619
634
|
if (this.keepProvenTxsFor === 0) {
|
|
620
635
|
await this.deleteTxsFromBlocks(blocks);
|
|
621
636
|
} else if (lastBlockNum - this.keepProvenTxsFor >= INITIAL_L2_BLOCK_NUM) {
|
|
@@ -626,12 +641,19 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
626
641
|
await this.deleteTxsFromBlocks(blocksToDeleteTxsFrom);
|
|
627
642
|
}
|
|
628
643
|
|
|
644
|
+
// We delete attestations older than the last block slot minus the number of slots we want to keep in the pool.
|
|
645
|
+
const lastBlockSlotMinusKeepAttestationsInPoolFor = lastBlockSlot - BigInt(this.keepAttestationsInPoolFor);
|
|
646
|
+
if (lastBlockSlotMinusKeepAttestationsInPoolFor >= BigInt(INITIAL_L2_BLOCK_NUM)) {
|
|
647
|
+
await this.attestationPool.deleteAttestationsOlderThan(lastBlockSlotMinusKeepAttestationsInPoolFor);
|
|
648
|
+
}
|
|
649
|
+
|
|
629
650
|
await this.synchedProvenBlockNumber.set(lastBlockNum);
|
|
630
651
|
this.log.debug(`Synched to proven block ${lastBlockNum}`);
|
|
631
652
|
const provenEpochNumber = await this.l2BlockSource.getProvenL2EpochNumber();
|
|
632
653
|
if (provenEpochNumber !== undefined) {
|
|
633
654
|
this.epochProofQuotePool.deleteQuotesToEpoch(BigInt(provenEpochNumber));
|
|
634
655
|
}
|
|
656
|
+
|
|
635
657
|
await this.startServiceIfSynched();
|
|
636
658
|
}
|
|
637
659
|
|
|
@@ -695,8 +717,9 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
695
717
|
* @param newState - New state value.
|
|
696
718
|
*/
|
|
697
719
|
private setCurrentState(newState: P2PClientState) {
|
|
720
|
+
const oldState = this.currentState;
|
|
698
721
|
this.currentState = newState;
|
|
699
|
-
this.log.debug(`Moved
|
|
722
|
+
this.log.debug(`Moved from state ${P2PClientState[oldState]} to ${P2PClientState[this.currentState]}`);
|
|
700
723
|
}
|
|
701
724
|
|
|
702
725
|
private async publishStoredTxs() {
|
package/src/config.ts
CHANGED
|
@@ -6,6 +6,7 @@ import {
|
|
|
6
6
|
numberConfigHelper,
|
|
7
7
|
pickConfigMappings,
|
|
8
8
|
} from '@aztec/foundation/config';
|
|
9
|
+
import { type DataStoreConfig, dataConfigMappings } from '@aztec/kv-store/config';
|
|
9
10
|
|
|
10
11
|
import { type P2PReqRespConfig, p2pReqRespConfigMappings } from './service/reqresp/config.js';
|
|
11
12
|
|
|
@@ -91,6 +92,9 @@ export interface P2PConfig extends P2PReqRespConfig {
|
|
|
91
92
|
/** How many blocks have to pass after a block is proven before its txs are deleted (zero to delete immediately once proven) */
|
|
92
93
|
keepProvenTxsInPoolFor: number;
|
|
93
94
|
|
|
95
|
+
/** How many slots to keep attestations for. */
|
|
96
|
+
keepAttestationsInPoolFor: number;
|
|
97
|
+
|
|
94
98
|
/**
|
|
95
99
|
* The interval of the gossipsub heartbeat to perform maintenance tasks.
|
|
96
100
|
*/
|
|
@@ -229,6 +233,11 @@ export const p2pConfigMappings: ConfigMappingsType<P2PConfig> = {
|
|
|
229
233
|
'How many blocks have to pass after a block is proven before its txs are deleted (zero to delete immediately once proven)',
|
|
230
234
|
...numberConfigHelper(0),
|
|
231
235
|
},
|
|
236
|
+
keepAttestationsInPoolFor: {
|
|
237
|
+
env: 'P2P_ATTESTATION_POOL_KEEP_FOR',
|
|
238
|
+
description: 'How many slots to keep attestations for.',
|
|
239
|
+
...numberConfigHelper(96),
|
|
240
|
+
},
|
|
232
241
|
gossipsubInterval: {
|
|
233
242
|
env: 'P2P_GOSSIPSUB_INTERVAL_MS',
|
|
234
243
|
description: 'The interval of the gossipsub heartbeat to perform maintenance tasks.',
|
|
@@ -318,7 +327,8 @@ export type BootnodeConfig = Pick<
|
|
|
318
327
|
P2PConfig,
|
|
319
328
|
'udpAnnounceAddress' | 'peerIdPrivateKey' | 'minPeerCount' | 'maxPeerCount'
|
|
320
329
|
> &
|
|
321
|
-
Required<Pick<P2PConfig, 'udpListenAddress'
|
|
330
|
+
Required<Pick<P2PConfig, 'udpListenAddress'>> &
|
|
331
|
+
Pick<DataStoreConfig, 'dataDirectory' | 'dataStoreMapSizeKB'>;
|
|
322
332
|
|
|
323
333
|
const bootnodeConfigKeys: (keyof BootnodeConfig)[] = [
|
|
324
334
|
'udpAnnounceAddress',
|
|
@@ -326,6 +336,11 @@ const bootnodeConfigKeys: (keyof BootnodeConfig)[] = [
|
|
|
326
336
|
'minPeerCount',
|
|
327
337
|
'maxPeerCount',
|
|
328
338
|
'udpListenAddress',
|
|
339
|
+
'dataDirectory',
|
|
340
|
+
'dataStoreMapSizeKB',
|
|
329
341
|
];
|
|
330
342
|
|
|
331
|
-
export const bootnodeConfigMappings = pickConfigMappings(
|
|
343
|
+
export const bootnodeConfigMappings = pickConfigMappings(
|
|
344
|
+
{ ...p2pConfigMappings, ...dataConfigMappings },
|
|
345
|
+
bootnodeConfigKeys,
|
|
346
|
+
);
|
|
@@ -21,6 +21,15 @@ export interface AttestationPool {
|
|
|
21
21
|
*/
|
|
22
22
|
deleteAttestations(attestations: BlockAttestation[]): Promise<void>;
|
|
23
23
|
|
|
24
|
+
/**
|
|
25
|
+
* Delete Attestations with a slot number smaller than the given slot
|
|
26
|
+
*
|
|
27
|
+
* Removes all attestations associated with a slot
|
|
28
|
+
*
|
|
29
|
+
* @param slot - The oldest slot to keep.
|
|
30
|
+
*/
|
|
31
|
+
deleteAttestationsOlderThan(slot: bigint): Promise<void>;
|
|
32
|
+
|
|
24
33
|
/**
|
|
25
34
|
* Delete Attestations for slot
|
|
26
35
|
*
|