@aztec/p2p 0.65.2 → 0.66.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 +3 -1
- package/dest/bootstrap/bootstrap.d.ts.map +1 -1
- package/dest/bootstrap/bootstrap.js +7 -6
- package/dest/client/index.d.ts.map +1 -1
- package/dest/client/index.js +5 -4
- package/dest/client/p2p_client.d.ts +2 -0
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +10 -2
- 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 +20 -1
- 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 +3 -6
- 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 +2 -4
- package/dest/mocks/index.d.ts.map +1 -1
- package/dest/mocks/index.js +12 -6
- 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 +0 -6
- package/dest/service/libp2p_service.d.ts.map +1 -1
- package/dest/service/libp2p_service.js +10 -21
- 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 +8 -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 +10 -8
- package/src/bootstrap/bootstrap.ts +11 -5
- package/src/client/index.ts +4 -3
- package/src/client/p2p_client.ts +15 -1
- 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 +21 -0
- package/src/mem_pools/instrumentation.ts +3 -5
- package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +1 -3
- package/src/mocks/index.ts +11 -5
- package/src/service/encoding.ts +61 -0
- package/src/service/libp2p_service.ts +10 -22
- package/src/service/reqresp/handlers.ts +4 -4
- package/src/service/reqresp/interface.ts +3 -3
- package/src/service/reqresp/reqresp.ts +7 -2
- package/src/util.ts +48 -2
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import { createDebugLogger } from '@aztec/foundation/log';
|
|
3
3
|
import { executeTimeoutWithCustomError } from '@aztec/foundation/timer';
|
|
4
4
|
import { pipe } from 'it-pipe';
|
|
5
|
+
import { compressSync, uncompressSync } from 'snappy';
|
|
5
6
|
import { CollectiveReqRespTimeoutError, IndiviualReqRespTimeoutError } from '../../errors/reqresp.error.js';
|
|
6
7
|
import { PeerErrorSeverity } from '../peer_scoring.js';
|
|
7
8
|
import { DEFAULT_SUB_PROTOCOL_HANDLERS, DEFAULT_SUB_PROTOCOL_VALIDATORS, subProtocolMap, } from './interface.js';
|
|
@@ -15,6 +16,9 @@ import { RequestResponseRateLimiter } from './rate_limiter/rate_limiter.js';
|
|
|
15
16
|
* This service implements the request response sub protocol, it is heavily inspired from
|
|
16
17
|
* ethereum implementations of the same name.
|
|
17
18
|
*
|
|
19
|
+
* Note, responses get compressed in streamHandler
|
|
20
|
+
* so they get decompressed in readMessage
|
|
21
|
+
*
|
|
18
22
|
* see: https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/p2p-interface.md#the-reqresp-domain
|
|
19
23
|
*/
|
|
20
24
|
export class ReqResp {
|
|
@@ -179,7 +183,7 @@ export class ReqResp {
|
|
|
179
183
|
chunks.push(chunk.subarray());
|
|
180
184
|
}
|
|
181
185
|
const messageData = chunks.concat();
|
|
182
|
-
return Buffer.concat(messageData);
|
|
186
|
+
return uncompressSync(Buffer.concat(messageData), { asBuffer: true });
|
|
183
187
|
}
|
|
184
188
|
/**
|
|
185
189
|
* Stream Handler
|
|
@@ -210,7 +214,8 @@ export class ReqResp {
|
|
|
210
214
|
await pipe(stream, async function* (source) {
|
|
211
215
|
for await (const chunkList of source) {
|
|
212
216
|
const msg = Buffer.from(chunkList.subarray());
|
|
213
|
-
|
|
217
|
+
const response = await handler(msg);
|
|
218
|
+
yield new Uint8Array(compressSync(response));
|
|
214
219
|
}
|
|
215
220
|
}, stream);
|
|
216
221
|
}
|
|
@@ -222,4 +227,4 @@ export class ReqResp {
|
|
|
222
227
|
}
|
|
223
228
|
}
|
|
224
229
|
}
|
|
225
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
230
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxcmVzcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZXJ2aWNlL3JlcXJlc3AvcmVxcmVzcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw4Q0FBOEM7QUFDOUMsT0FBTyxFQUFlLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDdkUsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHeEUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUUvQixPQUFPLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUd0RCxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUU1RyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUV2RCxPQUFPLEVBQ0wsNkJBQTZCLEVBQzdCLCtCQUErQixFQUsvQixjQUFjLEdBQ2YsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUU1RTs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsTUFBTSxPQUFPLE9BQU87SUFZbEIsWUFBWSxNQUF3QixFQUFxQixNQUFjLEVBQVUsV0FBd0I7UUFBaEQsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUFVLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBTnpHLG1KQUFtSjtRQUMzSSx3QkFBbUIsR0FBK0IsNkJBQTZCLENBQUM7UUFDaEYsMEJBQXFCLEdBQWlDLCtCQUErQixDQUFDO1FBSzVGLElBQUksQ0FBQyxNQUFNLEdBQUcsaUJBQWlCLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUVyRCxJQUFJLENBQUMsdUJBQXVCLEdBQUcsTUFBTSxDQUFDLHVCQUF1QixDQUFDO1FBQzlELElBQUksQ0FBQywwQkFBMEIsR0FBRyxNQUFNLENBQUMsMEJBQTBCLENBQUM7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
|
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.66.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./dest/index.js",
|
|
@@ -63,18 +63,18 @@
|
|
|
63
63
|
"testTimeout": 15000
|
|
64
64
|
},
|
|
65
65
|
"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.
|
|
66
|
+
"@aztec/circuit-types": "0.66.0",
|
|
67
|
+
"@aztec/circuits.js": "0.66.0",
|
|
68
|
+
"@aztec/foundation": "0.66.0",
|
|
69
|
+
"@aztec/kv-store": "0.66.0",
|
|
70
|
+
"@aztec/telemetry-client": "0.66.0",
|
|
71
71
|
"@chainsafe/discv5": "9.0.0",
|
|
72
72
|
"@chainsafe/enr": "3.0.0",
|
|
73
73
|
"@chainsafe/libp2p-gossipsub": "13.0.0",
|
|
74
74
|
"@chainsafe/libp2p-noise": "^15.0.0",
|
|
75
75
|
"@chainsafe/libp2p-yamux": "^6.0.2",
|
|
76
76
|
"@libp2p/bootstrap": "10.0.0",
|
|
77
|
-
"@libp2p/crypto": "4.
|
|
77
|
+
"@libp2p/crypto": "^4.1.1",
|
|
78
78
|
"@libp2p/identify": "1.0.18",
|
|
79
79
|
"@libp2p/interface": "1.3.1",
|
|
80
80
|
"@libp2p/kad-dht": "10.0.4",
|
|
@@ -91,7 +91,9 @@
|
|
|
91
91
|
"libp2p": "1.5.0",
|
|
92
92
|
"semver": "^7.6.0",
|
|
93
93
|
"sha3": "^2.1.4",
|
|
94
|
-
"
|
|
94
|
+
"snappy": "^7.2.2",
|
|
95
|
+
"tslib": "^2.4.0",
|
|
96
|
+
"xxhash-wasm": "^1.1.0"
|
|
95
97
|
},
|
|
96
98
|
"devDependencies": {
|
|
97
99
|
"@aztec/archiver": "workspace:^",
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { createDebugLogger } from '@aztec/foundation/log';
|
|
2
|
+
import { type AztecKVStore } from '@aztec/kv-store';
|
|
2
3
|
import { OtelMetricsAdapter, type TelemetryClient } from '@aztec/telemetry-client';
|
|
3
4
|
|
|
4
5
|
import { Discv5, type Discv5EventEmitter } from '@chainsafe/discv5';
|
|
@@ -8,8 +9,7 @@ import { type Multiaddr, multiaddr } from '@multiformats/multiaddr';
|
|
|
8
9
|
|
|
9
10
|
import type { BootnodeConfig } from '../config.js';
|
|
10
11
|
import { AZTEC_ENR_KEY, AZTEC_NET } from '../service/discV5_service.js';
|
|
11
|
-
import {
|
|
12
|
-
import { convertToMultiaddr } from '../util.js';
|
|
12
|
+
import { convertToMultiaddr, createLibP2PPeerIdFromPrivateKey, getPeerIdPrivateKey } from '../util.js';
|
|
13
13
|
|
|
14
14
|
/**
|
|
15
15
|
* Encapsulates a 'Bootstrap' node, used for the purpose of assisting new joiners in acquiring peers.
|
|
@@ -18,7 +18,11 @@ export class BootstrapNode {
|
|
|
18
18
|
private node?: Discv5 = undefined;
|
|
19
19
|
private peerId?: PeerId;
|
|
20
20
|
|
|
21
|
-
constructor(
|
|
21
|
+
constructor(
|
|
22
|
+
private store: AztecKVStore,
|
|
23
|
+
private telemetry: TelemetryClient,
|
|
24
|
+
private logger = createDebugLogger('aztec:p2p_bootstrap'),
|
|
25
|
+
) {}
|
|
22
26
|
|
|
23
27
|
/**
|
|
24
28
|
* Starts the bootstrap node.
|
|
@@ -26,8 +30,10 @@ export class BootstrapNode {
|
|
|
26
30
|
* @returns An empty promise.
|
|
27
31
|
*/
|
|
28
32
|
public async start(config: BootnodeConfig) {
|
|
29
|
-
const {
|
|
30
|
-
|
|
33
|
+
const { udpListenAddress, udpAnnounceAddress } = config;
|
|
34
|
+
|
|
35
|
+
const peerIdPrivateKey = await getPeerIdPrivateKey(config, this.store);
|
|
36
|
+
const peerId = await createLibP2PPeerIdFromPrivateKey(peerIdPrivateKey);
|
|
31
37
|
this.peerId = peerId;
|
|
32
38
|
const enr = SignableENR.createFromPeerId(peerId);
|
|
33
39
|
|
package/src/client/index.ts
CHANGED
|
@@ -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
|
|
|
@@ -49,7 +49,8 @@ export const createP2PClient = async (
|
|
|
49
49
|
config = await configureP2PClientAddresses(_config);
|
|
50
50
|
|
|
51
51
|
// Create peer discovery service
|
|
52
|
-
const
|
|
52
|
+
const peerIdPrivateKey = await getPeerIdPrivateKey(config, store);
|
|
53
|
+
const peerId = await createLibP2PPeerIdFromPrivateKey(peerIdPrivateKey);
|
|
53
54
|
const discoveryService = new DiscV5Service(peerId, config, telemetry);
|
|
54
55
|
|
|
55
56
|
p2pService = await LibP2PService.new(
|
package/src/client/p2p_client.ts
CHANGED
|
@@ -202,6 +202,9 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
202
202
|
private attestationPool: AttestationPool;
|
|
203
203
|
private epochProofQuotePool: EpochProofQuotePool;
|
|
204
204
|
|
|
205
|
+
/** How many slots to keep attestations for. */
|
|
206
|
+
private keepAttestationsInPoolFor: number;
|
|
207
|
+
|
|
205
208
|
private blockStream;
|
|
206
209
|
|
|
207
210
|
/**
|
|
@@ -224,7 +227,9 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
224
227
|
) {
|
|
225
228
|
super(telemetry, 'P2PClient');
|
|
226
229
|
|
|
227
|
-
const { blockCheckIntervalMS, blockRequestBatchSize } = getP2PConfigFromEnv();
|
|
230
|
+
const { blockCheckIntervalMS, blockRequestBatchSize, keepAttestationsInPoolFor } = getP2PConfigFromEnv();
|
|
231
|
+
|
|
232
|
+
this.keepAttestationsInPoolFor = keepAttestationsInPoolFor;
|
|
228
233
|
|
|
229
234
|
this.blockStream = new L2BlockStream(l2BlockSource, this, this, {
|
|
230
235
|
batchSize: blockRequestBatchSize,
|
|
@@ -615,7 +620,9 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
615
620
|
|
|
616
621
|
const firstBlockNum = blocks[0].number;
|
|
617
622
|
const lastBlockNum = blocks[blocks.length - 1].number;
|
|
623
|
+
const lastBlockSlot = blocks[blocks.length - 1].header.globalVariables.slotNumber.toBigInt();
|
|
618
624
|
|
|
625
|
+
// If keepProvenTxsFor is 0, we delete all txs from all proven blocks.
|
|
619
626
|
if (this.keepProvenTxsFor === 0) {
|
|
620
627
|
await this.deleteTxsFromBlocks(blocks);
|
|
621
628
|
} else if (lastBlockNum - this.keepProvenTxsFor >= INITIAL_L2_BLOCK_NUM) {
|
|
@@ -626,12 +633,19 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
626
633
|
await this.deleteTxsFromBlocks(blocksToDeleteTxsFrom);
|
|
627
634
|
}
|
|
628
635
|
|
|
636
|
+
// We delete attestations older than the last block slot minus the number of slots we want to keep in the pool.
|
|
637
|
+
const lastBlockSlotMinusKeepAttestationsInPoolFor = lastBlockSlot - BigInt(this.keepAttestationsInPoolFor);
|
|
638
|
+
if (lastBlockSlotMinusKeepAttestationsInPoolFor >= BigInt(INITIAL_L2_BLOCK_NUM)) {
|
|
639
|
+
await this.attestationPool.deleteAttestationsOlderThan(lastBlockSlotMinusKeepAttestationsInPoolFor);
|
|
640
|
+
}
|
|
641
|
+
|
|
629
642
|
await this.synchedProvenBlockNumber.set(lastBlockNum);
|
|
630
643
|
this.log.debug(`Synched to proven block ${lastBlockNum}`);
|
|
631
644
|
const provenEpochNumber = await this.l2BlockSource.getProvenL2EpochNumber();
|
|
632
645
|
if (provenEpochNumber !== undefined) {
|
|
633
646
|
this.epochProofQuotePool.deleteQuotesToEpoch(BigInt(provenEpochNumber));
|
|
634
647
|
}
|
|
648
|
+
|
|
635
649
|
await this.startServiceIfSynched();
|
|
636
650
|
}
|
|
637
651
|
|
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
|
*
|
|
@@ -58,6 +58,27 @@ export class InMemoryAttestationPool implements AttestationPool {
|
|
|
58
58
|
return total;
|
|
59
59
|
}
|
|
60
60
|
|
|
61
|
+
public async deleteAttestationsOlderThan(oldestSlot: bigint): Promise<void> {
|
|
62
|
+
const olderThan = [];
|
|
63
|
+
|
|
64
|
+
// Entries are iterated in insertion order, so we can break as soon as we find a slot that is older than the oldestSlot.
|
|
65
|
+
// Note: this will only prune correctly if attestations are added in order of rising slot, it is important that we do not allow
|
|
66
|
+
// insertion of attestations that are old. #(https://github.com/AztecProtocol/aztec-packages/issues/10322)
|
|
67
|
+
const slots = this.attestations.keys();
|
|
68
|
+
for (const slot of slots) {
|
|
69
|
+
if (slot < oldestSlot) {
|
|
70
|
+
olderThan.push(slot);
|
|
71
|
+
} else {
|
|
72
|
+
break;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
for (const oldSlot of olderThan) {
|
|
77
|
+
await this.deleteAttestationsForSlot(oldSlot);
|
|
78
|
+
}
|
|
79
|
+
return Promise.resolve();
|
|
80
|
+
}
|
|
81
|
+
|
|
61
82
|
public deleteAttestationsForSlot(slot: bigint): Promise<void> {
|
|
62
83
|
// We count the number of attestations we are removing
|
|
63
84
|
const numberOfAttestations = this.#getNumberOfAttestationsInSlot(slot);
|
|
@@ -3,6 +3,7 @@ import {
|
|
|
3
3
|
Attributes,
|
|
4
4
|
type Histogram,
|
|
5
5
|
LmdbMetrics,
|
|
6
|
+
type LmdbStatsCallback,
|
|
6
7
|
Metrics,
|
|
7
8
|
type TelemetryClient,
|
|
8
9
|
type UpDownCounter,
|
|
@@ -58,7 +59,7 @@ export class PoolInstrumentation<PoolObject extends Gossipable> {
|
|
|
58
59
|
|
|
59
60
|
private defaultAttributes;
|
|
60
61
|
|
|
61
|
-
constructor(telemetry: TelemetryClient, name: PoolName) {
|
|
62
|
+
constructor(telemetry: TelemetryClient, name: PoolName, dbStats?: LmdbStatsCallback) {
|
|
62
63
|
const meter = telemetry.getMeter(name);
|
|
63
64
|
this.defaultAttributes = { [Attributes.POOL_NAME]: name };
|
|
64
65
|
|
|
@@ -98,13 +99,10 @@ export class PoolInstrumentation<PoolObject extends Gossipable> {
|
|
|
98
99
|
name: Metrics.MEMPOOL_DB_NUM_ITEMS,
|
|
99
100
|
description: 'Num items in database for the Tx mempool',
|
|
100
101
|
},
|
|
102
|
+
dbStats,
|
|
101
103
|
);
|
|
102
104
|
}
|
|
103
105
|
|
|
104
|
-
public recordDBMetrics(metrics: { mappingSize: number; numItems: number; actualSize: number }) {
|
|
105
|
-
this.dbMetrics.recordDBMetrics(metrics);
|
|
106
|
-
}
|
|
107
|
-
|
|
108
106
|
public recordSize(poolObject: PoolObject) {
|
|
109
107
|
this.objectSize.record(poolObject.getSize());
|
|
110
108
|
}
|
|
@@ -37,7 +37,7 @@ export class AztecKVTxPool implements TxPool {
|
|
|
37
37
|
|
|
38
38
|
this.#store = store;
|
|
39
39
|
this.#log = log;
|
|
40
|
-
this.#metrics = new PoolInstrumentation(telemetry, PoolName.TX_POOL);
|
|
40
|
+
this.#metrics = new PoolInstrumentation(telemetry, PoolName.TX_POOL, () => store.estimateSize());
|
|
41
41
|
}
|
|
42
42
|
|
|
43
43
|
public markAsMined(txHashes: TxHash[], blockNumber: number): Promise<void> {
|
|
@@ -53,8 +53,6 @@ export class AztecKVTxPool implements TxPool {
|
|
|
53
53
|
}
|
|
54
54
|
this.#metrics.recordRemovedObjects(deleted, 'pending');
|
|
55
55
|
this.#metrics.recordAddedObjects(txHashes.length, 'mined');
|
|
56
|
-
const storeSizes = this.#store.estimateSize();
|
|
57
|
-
this.#metrics.recordDBMetrics(storeSizes);
|
|
58
56
|
});
|
|
59
57
|
}
|
|
60
58
|
|
package/src/mocks/index.ts
CHANGED
|
@@ -5,6 +5,7 @@ import {
|
|
|
5
5
|
type WorldStateSynchronizer,
|
|
6
6
|
} from '@aztec/circuit-types';
|
|
7
7
|
import { type DataStoreConfig } from '@aztec/kv-store/config';
|
|
8
|
+
import { openTmpStore } from '@aztec/kv-store/utils';
|
|
8
9
|
import { type TelemetryClient } from '@aztec/telemetry-client';
|
|
9
10
|
import { NoopTelemetryClient } from '@aztec/telemetry-client/noop';
|
|
10
11
|
|
|
@@ -14,6 +15,7 @@ import { yamux } from '@chainsafe/libp2p-yamux';
|
|
|
14
15
|
import { bootstrap } from '@libp2p/bootstrap';
|
|
15
16
|
import { identify } from '@libp2p/identify';
|
|
16
17
|
import { type PeerId } from '@libp2p/interface';
|
|
18
|
+
import { createSecp256k1PeerId } from '@libp2p/peer-id-factory';
|
|
17
19
|
import { tcp } from '@libp2p/tcp';
|
|
18
20
|
import getPort from 'get-port';
|
|
19
21
|
import { type Libp2p, type Libp2pOptions, createLibp2p } from 'libp2p';
|
|
@@ -22,7 +24,7 @@ import { BootstrapNode } from '../bootstrap/bootstrap.js';
|
|
|
22
24
|
import { type BootnodeConfig, type P2PConfig } from '../config.js';
|
|
23
25
|
import { type MemPools } from '../mem_pools/interface.js';
|
|
24
26
|
import { DiscV5Service } from '../service/discV5_service.js';
|
|
25
|
-
import { LibP2PService
|
|
27
|
+
import { LibP2PService } from '../service/libp2p_service.js';
|
|
26
28
|
import { type PeerManager } from '../service/peer_manager.js';
|
|
27
29
|
import { type P2PReqRespConfig } from '../service/reqresp/config.js';
|
|
28
30
|
import { pingHandler, statusHandler } from '../service/reqresp/handlers.js';
|
|
@@ -102,7 +104,7 @@ export async function createTestLibP2PService(
|
|
|
102
104
|
port: number = 0,
|
|
103
105
|
peerId?: PeerId,
|
|
104
106
|
) {
|
|
105
|
-
peerId = peerId ?? (await
|
|
107
|
+
peerId = peerId ?? (await createSecp256k1PeerId());
|
|
106
108
|
const config = {
|
|
107
109
|
tcpAnnounceAddress: `127.0.0.1:${port}`,
|
|
108
110
|
udpAnnounceAddress: `127.0.0.1:${port}`,
|
|
@@ -146,7 +148,7 @@ export type ReqRespNode = {
|
|
|
146
148
|
export const MOCK_SUB_PROTOCOL_HANDLERS: ReqRespSubProtocolHandlers = {
|
|
147
149
|
[PING_PROTOCOL]: pingHandler,
|
|
148
150
|
[STATUS_PROTOCOL]: statusHandler,
|
|
149
|
-
[TX_REQ_PROTOCOL]: (_msg: any) => Promise.resolve(
|
|
151
|
+
[TX_REQ_PROTOCOL]: (_msg: any) => Promise.resolve(Buffer.from('tx')),
|
|
150
152
|
};
|
|
151
153
|
|
|
152
154
|
// By default, all requests are valid
|
|
@@ -231,6 +233,8 @@ export function createBootstrapNodeConfig(privateKey: string, port: number): Boo
|
|
|
231
233
|
peerIdPrivateKey: privateKey,
|
|
232
234
|
minPeerCount: 10,
|
|
233
235
|
maxPeerCount: 100,
|
|
236
|
+
dataDirectory: undefined,
|
|
237
|
+
dataStoreMapSizeKB: 0,
|
|
234
238
|
};
|
|
235
239
|
}
|
|
236
240
|
|
|
@@ -247,14 +251,16 @@ export async function createBootstrapNode(
|
|
|
247
251
|
port: number,
|
|
248
252
|
telemetry: TelemetryClient = new NoopTelemetryClient(),
|
|
249
253
|
): Promise<BootstrapNode> {
|
|
250
|
-
const peerId = await
|
|
254
|
+
const peerId = await createSecp256k1PeerId();
|
|
251
255
|
const config = createBootstrapNodeConfig(Buffer.from(peerId.privateKey!).toString('hex'), port);
|
|
252
256
|
|
|
253
257
|
return startBootstrapNode(config, telemetry);
|
|
254
258
|
}
|
|
255
259
|
|
|
256
260
|
async function startBootstrapNode(config: BootnodeConfig, telemetry: TelemetryClient) {
|
|
257
|
-
|
|
261
|
+
// Open an ephemeral store that will only exist in memory
|
|
262
|
+
const store = openTmpStore(true);
|
|
263
|
+
const bootstrapNode = new BootstrapNode(store, telemetry);
|
|
258
264
|
await bootstrapNode.start(config);
|
|
259
265
|
return bootstrapNode;
|
|
260
266
|
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
// Taken from lodestar: https://github.com/ChainSafe/lodestar
|
|
2
|
+
import { sha256 } from '@aztec/foundation/crypto';
|
|
3
|
+
|
|
4
|
+
import { type RPC } from '@chainsafe/libp2p-gossipsub/message';
|
|
5
|
+
import { type DataTransform } from '@chainsafe/libp2p-gossipsub/types';
|
|
6
|
+
import { type Message } from '@libp2p/interface';
|
|
7
|
+
import { compressSync, uncompressSync } from 'snappy';
|
|
8
|
+
import xxhashFactory from 'xxhash-wasm';
|
|
9
|
+
|
|
10
|
+
// Load WASM
|
|
11
|
+
const xxhash = await xxhashFactory();
|
|
12
|
+
|
|
13
|
+
// Use salt to prevent msgId from being mined for collisions
|
|
14
|
+
const h64Seed = BigInt(Math.floor(Math.random() * 1e9));
|
|
15
|
+
|
|
16
|
+
// Shared buffer to convert msgId to string
|
|
17
|
+
const sharedMsgIdBuf = Buffer.alloc(20);
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* The function used to generate a gossipsub message id
|
|
21
|
+
* We use the first 8 bytes of SHA256(data) for content addressing
|
|
22
|
+
*/
|
|
23
|
+
export function fastMsgIdFn(rpcMsg: RPC.Message): string {
|
|
24
|
+
if (rpcMsg.data) {
|
|
25
|
+
return xxhash.h64Raw(rpcMsg.data, h64Seed).toString(16);
|
|
26
|
+
}
|
|
27
|
+
return '0000000000000000';
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export function msgIdToStrFn(msgId: Uint8Array): string {
|
|
31
|
+
// This happens serially, no need to reallocate the buffer
|
|
32
|
+
sharedMsgIdBuf.set(msgId);
|
|
33
|
+
return `0x${sharedMsgIdBuf.toString('hex')}`;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Get the message identifier from a libp2p message
|
|
38
|
+
*
|
|
39
|
+
* Follows similarly to:
|
|
40
|
+
* https://github.com/ethereum/consensus-specs/blob/v1.1.0-alpha.7/specs/altair/p2p-interface.md#topics-and-messages
|
|
41
|
+
*
|
|
42
|
+
* @param message - The libp2p message
|
|
43
|
+
* @returns The message identifier
|
|
44
|
+
*/
|
|
45
|
+
export function getMsgIdFn(message: Message) {
|
|
46
|
+
const { topic } = message;
|
|
47
|
+
|
|
48
|
+
const vec = [Buffer.from(topic), message.data];
|
|
49
|
+
return sha256(Buffer.concat(vec)).subarray(0, 20);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export class SnappyTransform implements DataTransform {
|
|
53
|
+
inboundTransform(_topicStr: string, data: Uint8Array): Uint8Array {
|
|
54
|
+
const uncompressed = Buffer.from(uncompressSync(Buffer.from(data), { asBuffer: true }));
|
|
55
|
+
return new Uint8Array(uncompressed);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
outboundTransform(_topicStr: string, data: Uint8Array): Uint8Array {
|
|
59
|
+
return new Uint8Array(compressSync(Buffer.from(data)));
|
|
60
|
+
}
|
|
61
|
+
}
|