@aztec/p2p 5.0.0-rc.1 → 5.0.0-rc.2
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 +1 -1
- package/dest/bootstrap/bootstrap.d.ts.map +1 -1
- package/dest/bootstrap/bootstrap.js +20 -12
- package/dest/client/interface.d.ts +9 -2
- package/dest/client/interface.d.ts.map +1 -1
- package/dest/client/p2p_client.d.ts +3 -2
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +5 -0
- package/dest/config.js +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +1 -1
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +10 -6
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/proposal_validator.js +17 -11
- package/dest/msg_validators/tx_validator/phases_validator.js +2 -2
- package/dest/services/discv5/discV5_service.d.ts +12 -2
- package/dest/services/discv5/discV5_service.d.ts.map +1 -1
- package/dest/services/discv5/discV5_service.js +84 -15
- package/dest/services/discv5/persisted_enr_store.d.ts +38 -0
- package/dest/services/discv5/persisted_enr_store.d.ts.map +1 -0
- package/dest/services/discv5/persisted_enr_store.js +145 -0
- package/dest/services/dummy_service.d.ts +6 -2
- package/dest/services/dummy_service.d.ts.map +1 -1
- package/dest/services/dummy_service.js +3 -0
- package/dest/services/encoding.d.ts +8 -8
- package/dest/services/encoding.d.ts.map +1 -1
- package/dest/services/encoding.js +11 -15
- package/dest/services/libp2p/libp2p_service.d.ts +10 -2
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +93 -33
- package/dest/services/peer-manager/peer_manager.d.ts +1 -1
- package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_manager.js +21 -12
- package/dest/services/service.d.ts +17 -1
- package/dest/services/service.d.ts.map +1 -1
- package/package.json +16 -17
- package/src/bootstrap/bootstrap.ts +15 -9
- package/src/client/interface.ts +9 -0
- package/src/client/p2p_client.ts +7 -0
- package/src/config.ts +1 -1
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +1 -1
- package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +1 -1
- package/src/msg_validators/proposal_validator/proposal_validator.ts +17 -14
- package/src/msg_validators/tx_validator/phases_validator.ts +2 -2
- package/src/services/discv5/discV5_service.ts +88 -9
- package/src/services/discv5/persisted_enr_store.ts +158 -0
- package/src/services/dummy_service.ts +6 -0
- package/src/services/encoding.ts +11 -21
- package/src/services/libp2p/libp2p_service.ts +104 -35
- package/src/services/peer-manager/peer_manager.ts +18 -11
- package/src/services/service.ts +19 -0
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { createLogger } from '@aztec/foundation/log';
|
|
2
2
|
import { sleep } from '@aztec/foundation/sleep';
|
|
3
|
+
import { DateProvider } from '@aztec/foundation/timer';
|
|
3
4
|
import { checkCompressedComponentVersion } from '@aztec/stdlib/versioning';
|
|
4
5
|
import { OtelMetricsAdapter, getTelemetryClient } from '@aztec/telemetry-client';
|
|
5
6
|
import { multiaddr } from '@multiformats/multiaddr';
|
|
@@ -10,7 +11,9 @@ import { createNodeENR } from '../../enr/generate-enr.js';
|
|
|
10
11
|
import { AZTEC_ENR_KEY, Discv5Event, PeerEvent } from '../../types/index.js';
|
|
11
12
|
import { convertToMultiaddr } from '../../util.js';
|
|
12
13
|
import { PeerDiscoveryState } from '../service.js';
|
|
14
|
+
import { PersistedEnrStore } from './persisted_enr_store.js';
|
|
13
15
|
const delayBeforeStart = 2000; // 2sec
|
|
16
|
+
/** Upper bound on persisted peer ENRs, to keep the store bounded as peers churn. */ const MAX_PERSISTED_PEER_ENRS = 100;
|
|
14
17
|
/**
|
|
15
18
|
* Peer discovery service using Discv5.
|
|
16
19
|
*/ export class DiscV5Service extends EventEmitter {
|
|
@@ -18,6 +21,7 @@ const delayBeforeStart = 2000; // 2sec
|
|
|
18
21
|
config;
|
|
19
22
|
packageVersion;
|
|
20
23
|
logger;
|
|
24
|
+
dateProvider;
|
|
21
25
|
/** The Discv5 instance */ discv5;
|
|
22
26
|
/** This instance's ENR */ enr;
|
|
23
27
|
/** Version identifiers. */ versions;
|
|
@@ -25,20 +29,30 @@ const delayBeforeStart = 2000; // 2sec
|
|
|
25
29
|
bootstrapNodePeerIds;
|
|
26
30
|
bootstrapNodeEnrs;
|
|
27
31
|
trustedPeerEnrs;
|
|
32
|
+
/** Node IDs of all config-provided peers (bootstrap, trusted, private); these are never persisted. */ configProvidedNodeIds;
|
|
28
33
|
startTime;
|
|
29
34
|
currentIp;
|
|
35
|
+
/** Persistent store of discovered peer ENRs, used to re-seed discovery after a restart. */ persistedEnrs;
|
|
30
36
|
handlers;
|
|
31
|
-
constructor(peerId, config, packageVersion, telemetry = getTelemetryClient(), logger = createLogger('p2p:discv5_service'), configOverrides = {}){
|
|
32
|
-
super(), this.peerId = peerId, this.config = config, this.packageVersion = packageVersion, this.logger = logger, this.currentState = PeerDiscoveryState.STOPPED, this.bootstrapNodePeerIds = [], this.bootstrapNodeEnrs = [], this.trustedPeerEnrs = [], this.startTime = 0, this.handlers = {
|
|
37
|
+
constructor(peerId, config, packageVersion, telemetry = getTelemetryClient(), logger = createLogger('p2p:discv5_service'), store, configOverrides = {}, dateProvider = new DateProvider()){
|
|
38
|
+
super(), this.peerId = peerId, this.config = config, this.packageVersion = packageVersion, this.logger = logger, this.dateProvider = dateProvider, this.currentState = PeerDiscoveryState.STOPPED, this.bootstrapNodePeerIds = [], this.bootstrapNodeEnrs = [], this.trustedPeerEnrs = [], this.startTime = 0, this.handlers = {
|
|
33
39
|
onMultiaddrUpdated: this.onMultiaddrUpdated.bind(this),
|
|
34
|
-
|
|
40
|
+
onPeerDiscovered: this.onPeerDiscovered.bind(this),
|
|
35
41
|
onEnrAdded: this.onEnrAdded.bind(this)
|
|
36
42
|
};
|
|
43
|
+
this.persistedEnrs = store ? new PersistedEnrStore(store, MAX_PERSISTED_PEER_ENRS, createLogger(`${this.logger.module}:enr-store`)) : undefined;
|
|
37
44
|
const { p2pIp, p2pPort, p2pBroadcastPort, bootstrapNodes, trustedPeers, privatePeers } = config;
|
|
38
45
|
this.currentIp = p2pIp;
|
|
39
46
|
this.bootstrapNodeEnrs = bootstrapNodes.map((x)=>ENR.decodeTxt(x));
|
|
40
47
|
const privatePeerEnrs = new Set(privatePeers);
|
|
41
48
|
this.trustedPeerEnrs = trustedPeers.filter((x)=>!privatePeerEnrs.has(x)).map((x)=>ENR.decodeTxt(x));
|
|
49
|
+
// Peers supplied via config are re-injected from config on every start, so they must never end up
|
|
50
|
+
// in the persisted (discovered-peer) store — private peers especially must not be written there.
|
|
51
|
+
this.configProvidedNodeIds = new Set([
|
|
52
|
+
...bootstrapNodes,
|
|
53
|
+
...trustedPeers,
|
|
54
|
+
...privatePeers
|
|
55
|
+
].map((x)=>ENR.decodeTxt(x).nodeId));
|
|
42
56
|
// If no overridden broadcast port is provided, use the p2p port as the broadcast port
|
|
43
57
|
if (!p2pBroadcastPort) {
|
|
44
58
|
this.logger.warn('No p2pBroadcastPort provided, using p2pPort as broadcast port');
|
|
@@ -86,7 +100,7 @@ const delayBeforeStart = 2000; // 2sec
|
|
|
86
100
|
return origOnEstablished(...args);
|
|
87
101
|
}
|
|
88
102
|
};
|
|
89
|
-
this.discv5.on(Discv5Event.DISCOVERED, this.handlers.
|
|
103
|
+
this.discv5.on(Discv5Event.DISCOVERED, this.handlers.onPeerDiscovered);
|
|
90
104
|
this.discv5.on(Discv5Event.ENR_ADDED, this.handlers.onEnrAdded);
|
|
91
105
|
this.discv5.on(Discv5Event.MULTIADDR_UPDATED, this.handlers.onMultiaddrUpdated);
|
|
92
106
|
}
|
|
@@ -124,7 +138,7 @@ const delayBeforeStart = 2000; // 2sec
|
|
|
124
138
|
}
|
|
125
139
|
this.logger.debug('Starting DiscV5');
|
|
126
140
|
await this.discv5.start();
|
|
127
|
-
this.startTime =
|
|
141
|
+
this.startTime = this.dateProvider.now();
|
|
128
142
|
const enrUpdateEnabled = this.config.queryForIp || !this.config.p2pIp;
|
|
129
143
|
this.logger.info(`DiscV5 service started`, {
|
|
130
144
|
nodeId: this.enr.nodeId,
|
|
@@ -165,6 +179,23 @@ const delayBeforeStart = 2000; // 2sec
|
|
|
165
179
|
this.discv5.addEnr(enr);
|
|
166
180
|
}
|
|
167
181
|
}
|
|
182
|
+
// Re-seed discovery from peers persisted on previous runs. This lets a node rejoin the network
|
|
183
|
+
// after a restart even when no bootstrap node is reachable: discv5 has no on-disk routing table,
|
|
184
|
+
// so without this its DHT would start empty and rediscovery would depend on inbound dials alone.
|
|
185
|
+
if (this.persistedEnrs) {
|
|
186
|
+
// Drop peers that are now config-provided (re-injected above) or fail version checks.
|
|
187
|
+
const enrs = await this.persistedEnrs.load((enr)=>this.validateEnr(enr) && !this.configProvidedNodeIds.has(enr.nodeId));
|
|
188
|
+
for (const enr of enrs){
|
|
189
|
+
try {
|
|
190
|
+
this.discv5.addEnr(enr);
|
|
191
|
+
} catch (err) {
|
|
192
|
+
this.logger.debug(`Error re-seeding persisted ENR ${enr.nodeId}`, err);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
if (enrs.length > 0) {
|
|
196
|
+
this.logger.info(`Re-seeded discovery with ${enrs.length} persisted peer ENRs`);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
168
199
|
}
|
|
169
200
|
async runRandomNodesQuery() {
|
|
170
201
|
if (this.currentState !== PeerDiscoveryState.RUNNING) {
|
|
@@ -172,8 +203,8 @@ const delayBeforeStart = 2000; // 2sec
|
|
|
172
203
|
}
|
|
173
204
|
// First, wait some time before starting the peer discovery
|
|
174
205
|
// reference: https://github.com/ChainSafe/lodestar/issues/3423
|
|
175
|
-
const msSinceStart =
|
|
176
|
-
if (
|
|
206
|
+
const msSinceStart = this.dateProvider.now() - this.startTime;
|
|
207
|
+
if (this.dateProvider.now() - this.startTime <= delayBeforeStart) {
|
|
177
208
|
await sleep(delayBeforeStart - msSinceStart);
|
|
178
209
|
}
|
|
179
210
|
try {
|
|
@@ -201,22 +232,48 @@ const delayBeforeStart = 2000; // 2sec
|
|
|
201
232
|
if (this.currentState !== PeerDiscoveryState.RUNNING) {
|
|
202
233
|
return;
|
|
203
234
|
}
|
|
204
|
-
await this.discv5.off(Discv5Event.DISCOVERED, this.handlers.
|
|
235
|
+
await this.discv5.off(Discv5Event.DISCOVERED, this.handlers.onPeerDiscovered);
|
|
205
236
|
await this.discv5.off(Discv5Event.ENR_ADDED, this.handlers.onEnrAdded);
|
|
206
237
|
await this.discv5.off(Discv5Event.MULTIADDR_UPDATED, this.handlers.onMultiaddrUpdated);
|
|
207
238
|
await this.discv5.stop();
|
|
208
239
|
this.currentState = PeerDiscoveryState.STOPPED;
|
|
209
240
|
}
|
|
210
241
|
async onEnrAdded(enr) {
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
242
|
+
try {
|
|
243
|
+
const multiAddrTcp = await enr.getFullMultiaddr('tcp');
|
|
244
|
+
const multiAddrUdp = await enr.getFullMultiaddr('udp');
|
|
245
|
+
this.logger.debug(`Added ENR ${enr.encodeTxt()}`, {
|
|
246
|
+
multiAddrTcp,
|
|
247
|
+
multiAddrUdp,
|
|
248
|
+
nodeId: enr.nodeId
|
|
249
|
+
});
|
|
250
|
+
// A peer just entered the routing table — persist it so we can re-seed discovery after a restart.
|
|
251
|
+
if (this.persistedEnrs && this.shouldPersist(enr)) {
|
|
252
|
+
await this.persistedEnrs.persist(enr);
|
|
253
|
+
}
|
|
254
|
+
this.onDiscovered(enr);
|
|
255
|
+
} catch (err) {
|
|
256
|
+
// A malformed ENR address field (e.g. a 3-byte TCP port) makes @nethermindeth/enr throw while
|
|
257
|
+
// parsing the multiaddr. This is an async event listener, so an unhandled rejection would crash
|
|
258
|
+
// the process — catch, log, and drop the ENR instead.
|
|
259
|
+
this.logger.warn(`Dropping ENR with unparseable address`, {
|
|
260
|
+
nodeId: enr.nodeId,
|
|
261
|
+
err
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
async onPeerDiscovered(enr) {
|
|
266
|
+
// discv5 updates an existing routing-table entry on an ENR sequence bump without emitting enrAdded,
|
|
267
|
+
// so DISCOVERED is our only signal that a peer we already track may have changed address. Refresh
|
|
268
|
+
// the persisted copy (a no-op for peers we don't already store) so we don't keep dialing a stale ENR.
|
|
269
|
+
if (this.persistedEnrs && this.shouldPersist(enr)) {
|
|
270
|
+
await this.persistedEnrs.refresh(enr);
|
|
271
|
+
}
|
|
218
272
|
this.onDiscovered(enr);
|
|
219
273
|
}
|
|
274
|
+
/** Whether an ENR belongs in the persisted store: a validated, non-config peer that isn't ourselves. */ shouldPersist(enr) {
|
|
275
|
+
return !this.configProvidedNodeIds.has(enr.nodeId) && enr.nodeId !== this.enr.nodeId && this.validateEnr(enr);
|
|
276
|
+
}
|
|
220
277
|
isOurBootnode(enr) {
|
|
221
278
|
return this.bootstrapNodeEnrs.some((x)=>x.nodeId === enr.nodeId);
|
|
222
279
|
}
|
|
@@ -247,6 +304,18 @@ const delayBeforeStart = 2000; // 2sec
|
|
|
247
304
|
this.logger.debug(`Peer node ${enr.nodeId} does not have aztec key in ENR`);
|
|
248
305
|
return false;
|
|
249
306
|
}
|
|
307
|
+
// A malformed TCP field (e.g. a non-2-byte port) makes @nethermindeth/enr throw while building the
|
|
308
|
+
// multiaddr. Reject such an ENR here so it's never emitted as a full peer or re-parsed by an
|
|
309
|
+
// unguarded listener (which would crash the process). A missing TCP addr is allowed — those peers
|
|
310
|
+
// are simply skipped at dial time.
|
|
311
|
+
try {
|
|
312
|
+
enr.getLocationMultiaddr('tcp');
|
|
313
|
+
} catch (err) {
|
|
314
|
+
this.logger.debug(`Peer node ${enr.nodeId} has an unparseable TCP address`, {
|
|
315
|
+
err
|
|
316
|
+
});
|
|
317
|
+
return false;
|
|
318
|
+
}
|
|
250
319
|
// And check it has the correct version
|
|
251
320
|
let compressedVersion;
|
|
252
321
|
try {
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { type Logger } from '@aztec/foundation/log';
|
|
2
|
+
import type { AztecAsyncKVStore } from '@aztec/kv-store';
|
|
3
|
+
import { ENR } from '@nethermindeth/enr';
|
|
4
|
+
/**
|
|
5
|
+
* A bounded, transactional store of discovered peer ENRs used to re-seed discovery after a restart.
|
|
6
|
+
*
|
|
7
|
+
* Entries are keyed by nodeId (so re-seeing a peer dedups in place) and carry a monotonic sequence so
|
|
8
|
+
* the store behaves as a FIFO: when it exceeds its cap, the oldest-seen peers are evicted first. All
|
|
9
|
+
* writes run in a transaction so concurrent discovery events can't race the size check.
|
|
10
|
+
*/
|
|
11
|
+
export declare class PersistedEnrStore {
|
|
12
|
+
private readonly store;
|
|
13
|
+
private readonly maxEntries;
|
|
14
|
+
private readonly logger;
|
|
15
|
+
private readonly enrs;
|
|
16
|
+
/** Monotonic sequence stamped on each entry; seeded from the store's max in {@link load}. */
|
|
17
|
+
private seq;
|
|
18
|
+
constructor(store: AztecAsyncKVStore, maxEntries: number, logger?: Logger);
|
|
19
|
+
/** Adds or replaces a peer's ENR, stamping it as most-recently-seen and evicting the oldest if over cap. */
|
|
20
|
+
persist(enr: ENR): Promise<void>;
|
|
21
|
+
/**
|
|
22
|
+
* Refreshes an already-persisted peer's stored ENR when a newer one (higher ENR sequence) is seen.
|
|
23
|
+
* A no-op for peers we don't already track — we never add new peers via this path, only update.
|
|
24
|
+
*
|
|
25
|
+
* This exists because discv5 updates an existing routing-table entry on an ENR sequence bump without
|
|
26
|
+
* emitting an `enrAdded` event, so a peer that changes address would otherwise keep its stale ENR
|
|
27
|
+
* persisted until evicted.
|
|
28
|
+
*/
|
|
29
|
+
refresh(enr: ENR): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* Loads all persisted ENRs, decoding each and keeping those the `accept` predicate allows. Entries
|
|
32
|
+
* that fail to decode or are rejected are removed from the store. The FIFO sequence resumes from the
|
|
33
|
+
* highest persisted value so eviction order survives restarts.
|
|
34
|
+
*/
|
|
35
|
+
load(accept: (enr: ENR) => boolean): Promise<ENR[]>;
|
|
36
|
+
private decodeStoredEnr;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVyc2lzdGVkX2Vucl9zdG9yZS5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NlcnZpY2VzL2Rpc2N2NS9wZXJzaXN0ZWRfZW5yX3N0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLE1BQU0sRUFBZ0IsTUFBTSx1QkFBdUIsQ0FBQztBQUNsRSxPQUFPLEtBQUssRUFBRSxpQkFBaUIsRUFBaUIsTUFBTSxpQkFBaUIsQ0FBQztBQUV4RSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUEwQnpDOzs7Ozs7R0FNRztBQUNILHFCQUFhLGlCQUFpQjtJQU0xQixPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUs7SUFDdEIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxVQUFVO0lBQzNCLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTTtJQVB6QixPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBZ0M7SUFDckQsNkZBQTZGO0lBQzdGLE9BQU8sQ0FBQyxHQUFHLENBQUs7SUFFaEIsWUFDbUIsS0FBSyxFQUFFLGlCQUFpQixFQUN4QixVQUFVLEVBQUUsTUFBTSxFQUNsQixNQUFNLEdBQUUsTUFBNkMsRUFHdkU7SUFFRCw0R0FBNEc7SUFDL0YsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQXdCNUM7SUFFRDs7Ozs7OztPQU9HO0lBQ1UsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQXVCNUM7SUFFRDs7OztPQUlHO0lBQ1UsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEtBQUssT0FBTyxHQUFHLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQThCL0Q7SUFFRCxPQUFPLENBQUMsZUFBZTtDQVd4QiJ9
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persisted_enr_store.d.ts","sourceRoot":"","sources":["../../../src/services/discv5/persisted_enr_store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAClE,OAAO,KAAK,EAAE,iBAAiB,EAAiB,MAAM,iBAAiB,CAAC;AAExE,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AA0BzC;;;;;;GAMG;AACH,qBAAa,iBAAiB;IAM1B,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM;IAPzB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAgC;IACrD,6FAA6F;IAC7F,OAAO,CAAC,GAAG,CAAK;IAEhB,YACmB,KAAK,EAAE,iBAAiB,EACxB,UAAU,EAAE,MAAM,EAClB,MAAM,GAAE,MAA6C,EAGvE;IAED,4GAA4G;IAC/F,OAAO,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAwB5C;IAED;;;;;;;OAOG;IACU,OAAO,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAuB5C;IAED;;;;OAIG;IACU,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CA8B/D;IAED,OAAO,CAAC,eAAe;CAWxB"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { createLogger } from '@aztec/foundation/log';
|
|
2
|
+
import { ENR } from '@nethermindeth/enr';
|
|
3
|
+
/** Map name under which discovered peer ENRs are persisted so discovery can be re-seeded after a restart. */ const PERSISTED_ENRS_MAP_NAME = 'discovered_peer_enrs';
|
|
4
|
+
function parsePersistedEnr(value) {
|
|
5
|
+
try {
|
|
6
|
+
const parsed = JSON.parse(value);
|
|
7
|
+
if (typeof parsed?.enr === 'string' && typeof parsed?.seq === 'number') {
|
|
8
|
+
return parsed;
|
|
9
|
+
}
|
|
10
|
+
} catch {
|
|
11
|
+
// Unparseable entry; caller treats it as stale.
|
|
12
|
+
}
|
|
13
|
+
return undefined;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* A bounded, transactional store of discovered peer ENRs used to re-seed discovery after a restart.
|
|
17
|
+
*
|
|
18
|
+
* Entries are keyed by nodeId (so re-seeing a peer dedups in place) and carry a monotonic sequence so
|
|
19
|
+
* the store behaves as a FIFO: when it exceeds its cap, the oldest-seen peers are evicted first. All
|
|
20
|
+
* writes run in a transaction so concurrent discovery events can't race the size check.
|
|
21
|
+
*/ export class PersistedEnrStore {
|
|
22
|
+
store;
|
|
23
|
+
maxEntries;
|
|
24
|
+
logger;
|
|
25
|
+
enrs;
|
|
26
|
+
/** Monotonic sequence stamped on each entry; seeded from the store's max in {@link load}. */ seq;
|
|
27
|
+
constructor(store, maxEntries, logger = createLogger('p2p:discv5:enr-store')){
|
|
28
|
+
this.store = store;
|
|
29
|
+
this.maxEntries = maxEntries;
|
|
30
|
+
this.logger = logger;
|
|
31
|
+
this.seq = 0;
|
|
32
|
+
this.enrs = store.openMap(PERSISTED_ENRS_MAP_NAME);
|
|
33
|
+
}
|
|
34
|
+
/** Adds or replaces a peer's ENR, stamping it as most-recently-seen and evicting the oldest if over cap. */ async persist(enr) {
|
|
35
|
+
const nodeId = enr.nodeId;
|
|
36
|
+
const enrTxt = enr.encodeTxt();
|
|
37
|
+
try {
|
|
38
|
+
await this.store.transactionAsync(async ()=>{
|
|
39
|
+
const seq = ++this.seq;
|
|
40
|
+
const others = [];
|
|
41
|
+
for await (const [id, value] of this.enrs.entriesAsync()){
|
|
42
|
+
if (id !== nodeId) {
|
|
43
|
+
others.push({
|
|
44
|
+
nodeId: id,
|
|
45
|
+
seq: parsePersistedEnr(value)?.seq ?? 0
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
const overflow = others.length + 1 - this.maxEntries;
|
|
50
|
+
if (overflow > 0) {
|
|
51
|
+
others.sort((a, b)=>a.seq - b.seq); // oldest-seen (lowest sequence) first
|
|
52
|
+
for(let i = 0; i < overflow; i++){
|
|
53
|
+
await this.enrs.delete(others[i].nodeId);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
await this.enrs.set(nodeId, JSON.stringify({
|
|
57
|
+
enr: enrTxt,
|
|
58
|
+
seq
|
|
59
|
+
}));
|
|
60
|
+
});
|
|
61
|
+
} catch (err) {
|
|
62
|
+
this.logger.warn(`Failed to persist discovered ENR ${nodeId}`, err);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Refreshes an already-persisted peer's stored ENR when a newer one (higher ENR sequence) is seen.
|
|
67
|
+
* A no-op for peers we don't already track — we never add new peers via this path, only update.
|
|
68
|
+
*
|
|
69
|
+
* This exists because discv5 updates an existing routing-table entry on an ENR sequence bump without
|
|
70
|
+
* emitting an `enrAdded` event, so a peer that changes address would otherwise keep its stale ENR
|
|
71
|
+
* persisted until evicted.
|
|
72
|
+
*/ async refresh(enr) {
|
|
73
|
+
const nodeId = enr.nodeId;
|
|
74
|
+
try {
|
|
75
|
+
await this.store.transactionAsync(async ()=>{
|
|
76
|
+
const existing = await this.enrs.getAsync(nodeId);
|
|
77
|
+
if (!existing) {
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
// Two unrelated sequence numbers are in play:
|
|
81
|
+
// - the ENR sequence (`enr.seq` / `storedEnrSeq`) is set by the *peer* and bumped whenever it
|
|
82
|
+
// revises its record (e.g. changes address); we compare these to decide whether the incoming
|
|
83
|
+
// ENR is genuinely newer and worth keeping.
|
|
84
|
+
// - our storage sequence (`this.seq`) is an internal counter used only for FIFO eviction; we
|
|
85
|
+
// stamp a fresh one so this entry counts as most-recently-seen.
|
|
86
|
+
const storedEnrSeq = this.decodeStoredEnr(existing)?.seq;
|
|
87
|
+
if (storedEnrSeq !== undefined && enr.seq <= storedEnrSeq) {
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
await this.enrs.set(nodeId, JSON.stringify({
|
|
91
|
+
enr: enr.encodeTxt(),
|
|
92
|
+
seq: ++this.seq
|
|
93
|
+
}));
|
|
94
|
+
});
|
|
95
|
+
} catch (err) {
|
|
96
|
+
this.logger.warn(`Failed to refresh persisted ENR ${nodeId}`, err);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Loads all persisted ENRs, decoding each and keeping those the `accept` predicate allows. Entries
|
|
101
|
+
* that fail to decode or are rejected are removed from the store. The FIFO sequence resumes from the
|
|
102
|
+
* highest persisted value so eviction order survives restarts.
|
|
103
|
+
*/ async load(accept) {
|
|
104
|
+
const valid = [];
|
|
105
|
+
const stale = [];
|
|
106
|
+
let maxSeq = 0;
|
|
107
|
+
for await (const [nodeId, value] of this.enrs.entriesAsync()){
|
|
108
|
+
const parsed = parsePersistedEnr(value);
|
|
109
|
+
let enr;
|
|
110
|
+
if (parsed) {
|
|
111
|
+
try {
|
|
112
|
+
enr = ENR.decodeTxt(parsed.enr);
|
|
113
|
+
} catch (err) {
|
|
114
|
+
this.logger.debug(`Dropping undecodable persisted ENR ${nodeId}`, err);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
if (!parsed || !enr || !accept(enr)) {
|
|
118
|
+
stale.push(nodeId);
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
maxSeq = Math.max(maxSeq, parsed.seq);
|
|
122
|
+
valid.push(enr);
|
|
123
|
+
}
|
|
124
|
+
this.seq = maxSeq;
|
|
125
|
+
if (stale.length > 0) {
|
|
126
|
+
await this.store.transactionAsync(async ()=>{
|
|
127
|
+
for (const nodeId of stale){
|
|
128
|
+
await this.enrs.delete(nodeId);
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
return valid;
|
|
133
|
+
}
|
|
134
|
+
decodeStoredEnr(value) {
|
|
135
|
+
const parsed = parsePersistedEnr(value);
|
|
136
|
+
if (!parsed) {
|
|
137
|
+
return undefined;
|
|
138
|
+
}
|
|
139
|
+
try {
|
|
140
|
+
return ENR.decodeTxt(parsed.enr);
|
|
141
|
+
} catch {
|
|
142
|
+
return undefined;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
@@ -12,7 +12,7 @@ import type { ConnectionSampler } from './reqresp/connection-sampler/connection_
|
|
|
12
12
|
import { type AuthRequest, StatusMessage } from './reqresp/index.js';
|
|
13
13
|
import type { ReqRespInterface, ReqRespResponse, ReqRespSubProtocol, ReqRespSubProtocolHandler, ReqRespSubProtocolHandlers, SubProtocolMap } from './reqresp/interface.js';
|
|
14
14
|
import type { GoodByeReason } from './reqresp/protocols/goodbye.js';
|
|
15
|
-
import { type P2PBlockReceivedCallback, type P2PCheckpointAttestationCallback, type P2PCheckpointReceivedCallback, type P2PDuplicateAttestationCallback, type P2PDuplicateProposalCallback, type P2PService, type PeerDiscoveryService, PeerDiscoveryState } from './service.js';
|
|
15
|
+
import { type P2PBlockReceivedCallback, type P2PCheckpointAttestationCallback, type P2PCheckpointReceivedCallback, type P2PDuplicateAttestationCallback, type P2PDuplicateProposalCallback, type P2POversizedProposalCallback, type P2PService, type PeerDiscoveryService, PeerDiscoveryState } from './service.js';
|
|
16
16
|
/**
|
|
17
17
|
* A dummy implementation of the P2P Service.
|
|
18
18
|
*/
|
|
@@ -55,6 +55,10 @@ export declare class DummyP2PService implements P2PService {
|
|
|
55
55
|
* Register a callback for when a duplicate proposal is detected
|
|
56
56
|
*/
|
|
57
57
|
registerDuplicateProposalCallback(_callback: P2PDuplicateProposalCallback): void;
|
|
58
|
+
/**
|
|
59
|
+
* Register a callback for when an oversized proposal is stored
|
|
60
|
+
*/
|
|
61
|
+
registerOversizedProposalCallback(_callback: P2POversizedProposalCallback): void;
|
|
58
62
|
/**
|
|
59
63
|
* Register a callback for when a duplicate attestation is detected
|
|
60
64
|
*/
|
|
@@ -141,4 +145,4 @@ export declare class DummyReqResp implements ReqRespInterface {
|
|
|
141
145
|
getConnectionSampler(): Pick<ConnectionSampler, 'getPeerListSortedByConnectionCountAsc'>;
|
|
142
146
|
addSubProtocol(_subProtocol: ReqRespSubProtocol, _handler: ReqRespSubProtocolHandler): Promise<void>;
|
|
143
147
|
}
|
|
144
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
148
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHVtbXlfc2VydmljZS5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZpY2VzL2R1bW15X3NlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDaEUsT0FBTyxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDaEUsT0FBTyxLQUFLLEVBQUUsVUFBVSxFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2xGLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFOUMsT0FBTyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDaEQsT0FBTyxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDOUMsT0FBTyxZQUFZLE1BQU0sUUFBUSxDQUFDO0FBRWxDLE9BQU8sS0FBSyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDeEUsT0FBTyxLQUFLLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUMvRixPQUFPLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzVELE9BQU8sS0FBSyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sb0RBQW9ELENBQUM7QUFDNUYsT0FBTyxFQUFFLEtBQUssV0FBVyxFQUFFLGFBQWEsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3JFLE9BQU8sS0FBSyxFQUNWLGdCQUFnQixFQUNoQixlQUFlLEVBQ2Ysa0JBQWtCLEVBQ2xCLHlCQUF5QixFQUN6QiwwQkFBMEIsRUFDMUIsY0FBYyxFQUNmLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxLQUFLLEVBQUUsYUFBYSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFFcEUsT0FB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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dummy_service.d.ts","sourceRoot":"","sources":["../../src/services/dummy_service.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"dummy_service.d.ts","sourceRoot":"","sources":["../../src/services/dummy_service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAClF,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,YAAY,MAAM,QAAQ,CAAC;AAElC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,2CAA2C,CAAC;AAC/F,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oDAAoD,CAAC;AAC5F,OAAO,EAAE,KAAK,WAAW,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACrE,OAAO,KAAK,EACV,gBAAgB,EAChB,eAAe,EACf,kBAAkB,EAClB,yBAAyB,EACzB,0BAA0B,EAC1B,cAAc,EACf,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAEpE,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,gCAAgC,EACrC,KAAK,6BAA6B,EAClC,KAAK,+BAA+B,EACpC,KAAK,4BAA4B,EACjC,KAAK,4BAA4B,EACjC,KAAK,UAAU,EACf,KAAK,oBAAoB,EACzB,kBAAkB,EACnB,MAAM,cAAc,CAAC;AAEtB;;GAEG;AACH,qBAAa,eAAgB,YAAW,UAAU;IAChD,OAAO,CAAC,kCAAkC,CAAC,CAAgC;IAE3E,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAG;IAEzD,wCAAwC;IACxC,QAAQ,IAAI,QAAQ,EAAE,CAErB;IAED,sBAAsB,CAAC,UAAU,EAAE,SAAS,GAAG,MAAM,CAEpD;IAED;;;OAGG;IACI,KAAK,kBAEX;IAED;;;OAGG;IACI,IAAI,kBAEV;IAED;;;OAGG;IACI,SAAS,CAAC,CAAC,SAAS,UAAU,EAAE,CAAC,EAAE,CAAC,iBAE1C;IAED;;;OAGG;IACI,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,QAAI;IAEjC;;OAEG;IACI,6BAA6B,CAAC,SAAS,EAAE,wBAAwB,QAAI;IAE5E;;OAEG;IACI,2CAA2C,CAAC,SAAS,EAAE,6BAA6B,QAAI;IACxF,0CAA0C,CAAC,QAAQ,EAAE,6BAA6B,QAExF;IAED;;OAEG;IACI,iCAAiC,CAAC,SAAS,EAAE,4BAA4B,GAAG,IAAI,CAAG;IAE1F;;OAEG;IACI,iCAAiC,CAAC,SAAS,EAAE,4BAA4B,GAAG,IAAI,CAAG;IAE1F;;OAEG;IACI,oCAAoC,CAAC,SAAS,EAAE,+BAA+B,GAAG,IAAI,CAAG;IAEzF,qCAAqC,CAAC,SAAS,EAAE,gCAAgC,GAAG,IAAI,CAAG;IAElG;;;;;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,CAEzE;IAEM,iBAAiB,CACtB,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,kBAAkB,EAChC,QAAQ,EAAE,MAAM,EAChB,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,eAAe,CAAC,CAE1B;IAED;;;OAGG;IACI,MAAM,IAAI,SAAS,CAEzB;IAED,kCAAkC,CAAC,IAAI,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAE5D;IAED,qBAAqB,CAAC,YAAY,EAAE,kBAAkB,EAAE,QAAQ,EAAE,yBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC,CAE1G;IAED,yBAAyB,CAAC,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAE5F;IAGD,8BAA8B,CAAC,QAAQ,EAAE,UAAU,EAAE,GAAG,IAAI,CAAG;IAE/D;;OAEG;IACH,0BAA0B,IAAI,6BAA6B,CAiB1D;CACF;AAED;;GAEG;AACH,qBAAa,yBAA0B,SAAQ,YAAa,YAAW,oBAAoB;IACzF,OAAO,CAAC,YAAY,CAA8B;IAC3C,iBAAiB,EAAE,GAAG,EAAE,CAAM;IAErC;;;OAGG;IACI,KAAK,kBAGX;IACD;;;OAGG;IACI,IAAI,kBAGV;IACD;;;OAGG;IACI,YAAY,YAElB;IAEM,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAE1C;IAEM,eAAe,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAEzC;IAEM,SAAS,IAAI,kBAAkB,CAErC;IAEM,MAAM,IAAI,SAAS,CAEzB;CACF;AAED,qBAAa,gBAAiB,YAAW,oBAAoB;IAElD,MAAM,EAAE,MAAM;IACrB,OAAO,CAAC,aAAa,CAAC;IAFxB,YACS,MAAM,EAAE,MAAM,EACb,aAAa,CAAC;;iBAA8B,EAClD;IAEG,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,GAAG,QAAQ,EAAE,CAYrD;IAEM,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAEtC;IACM,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE3C;IAEM,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEtD;IAEM,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAE3B;IACM,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAEhC;IACM,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAG;IACxC,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAG;IACxC,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI,CAAG;IACjE,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAAG;IACnE,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAG;IAC1C,yBAAyB,CAAC,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAEnG;IAGD,8BAA8B,CAAC,QAAQ,EAAE,UAAU,EAAE,GAAG,IAAI,CAAG;CAChE;AAED,qBAAa,YAAa,YAAW,gBAAgB;IACnD,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAG;IACzD,mBAAmB,IAAI,IAAI,CAAG;IAC9B,KAAK,CAAC,oBAAoB,EAAE,0BAA0B,GAAG,OAAO,CAAC,IAAI,CAAC,CAErE;IACD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAEpB;IACD,WAAW,CAAC,WAAW,SAAS,kBAAkB,EAChD,YAAY,EAAE,WAAW,EACzB,QAAQ,EAAE,YAAY,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,CAAC,GAC7D,OAAO,CAAC,YAAY,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,UAAU,CAAC,CAAC,GAAG,SAAS,CAAC,CAE5E;IACM,iBAAiB,CACtB,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,kBAAkB,EAChC,QAAQ,EAAE,MAAM,EAChB,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,eAAe,CAAC,CAE1B;IAED;;OAEG;IACH,oBAAoB,IAAI,IAAI,CAAC,iBAAiB,EAAE,uCAAuC,CAAC,CAIvF;IAED,cAAc,CAAC,YAAY,EAAE,kBAAkB,EAAE,QAAQ,EAAE,yBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC,CAEnG;CACF"}
|
|
@@ -48,6 +48,9 @@ import { PeerDiscoveryState } from './service.js';
|
|
|
48
48
|
* Register a callback for when a duplicate proposal is detected
|
|
49
49
|
*/ registerDuplicateProposalCallback(_callback) {}
|
|
50
50
|
/**
|
|
51
|
+
* Register a callback for when an oversized proposal is stored
|
|
52
|
+
*/ registerOversizedProposalCallback(_callback) {}
|
|
53
|
+
/**
|
|
51
54
|
* Register a callback for when a duplicate attestation is detected
|
|
52
55
|
*/ registerDuplicateAttestationCallback(_callback) {}
|
|
53
56
|
registerCheckpointAttestationCallback(_callback) {}
|
|
@@ -1,16 +1,10 @@
|
|
|
1
1
|
import { TopicType } from '@aztec/stdlib/p2p';
|
|
2
|
-
import type { RPC } from '@chainsafe/libp2p-gossipsub/message';
|
|
3
2
|
import type { DataTransform } from '@chainsafe/libp2p-gossipsub/types';
|
|
4
3
|
import type { Message } from '@libp2p/interface';
|
|
5
4
|
/** Thrown when a Snappy-compressed response exceeds the allowed decompressed size. */
|
|
6
5
|
export declare class OversizedSnappyResponseError extends Error {
|
|
7
6
|
constructor(decompressedSize: number, maxSizeKb: number);
|
|
8
7
|
}
|
|
9
|
-
/**
|
|
10
|
-
* The function used to generate a gossipsub message id
|
|
11
|
-
* We use the first 8 bytes of SHA256(data) for content addressing
|
|
12
|
-
*/
|
|
13
|
-
export declare function fastMsgIdFn(rpcMsg: RPC.Message): string;
|
|
14
8
|
export declare function msgIdToStrFn(msgId: Uint8Array): string;
|
|
15
9
|
/**
|
|
16
10
|
* Get the message identifier from a libp2p message
|
|
@@ -18,10 +12,16 @@ export declare function msgIdToStrFn(msgId: Uint8Array): string;
|
|
|
18
12
|
* Follows similarly to:
|
|
19
13
|
* https://github.com/ethereum/consensus-specs/blob/v1.1.0-alpha.7/specs/altair/p2p-interface.md#topics-and-messages
|
|
20
14
|
*
|
|
15
|
+
* The topic length is framed into the hash input (`uint32be(topicLen) || topic || data`) so the
|
|
16
|
+
* `(topic, data)` boundary is unambiguous. A raw `topic || data` concatenation is not injective —
|
|
17
|
+
* shifting bytes across the boundary (e.g. `(topic + data[0], data[1:])`) yields the same bytes and
|
|
18
|
+
* thus the same id, letting an unsubscribed-topic message pre-occupy a real message's seenCache slot
|
|
19
|
+
* and suppress it as a duplicate.
|
|
20
|
+
*
|
|
21
21
|
* @param message - The libp2p message
|
|
22
22
|
* @returns The message identifier
|
|
23
23
|
*/
|
|
24
|
-
export declare function getMsgIdFn({ topic, data }: Message): Promise<Uint8Array>;
|
|
24
|
+
export declare function getMsgIdFn({ topic, data }: Pick<Message, 'topic' | 'data'>): Promise<Uint8Array>;
|
|
25
25
|
/**
|
|
26
26
|
* Snappy transform for libp2p gossipsub
|
|
27
27
|
*/
|
|
@@ -51,4 +51,4 @@ export declare function readSnappyPreamble(data: Uint8Array): {
|
|
|
51
51
|
decompressedSize: number;
|
|
52
52
|
bytesRead: number;
|
|
53
53
|
};
|
|
54
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
54
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jb2RpbmcuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9lbmNvZGluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQWtCLFNBQVMsRUFBc0IsTUFBTSxtQkFBbUIsQ0FBQztBQUVsRixPQUFPLEtBQUssRUFBRSxhQUFhLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUN2RSxPQUFPLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUlqRCxzRkFBc0Y7QUFDdEYscUJBQWEsNEJBQTZCLFNBQVEsS0FBSztJQUNyRCxZQUFZLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUd0RDtDQUNGO0FBS0Qsd0JBQWdCLFlBQVksQ0FBQyxLQUFLLEVBQUUsVUFBVSxHQUFHLE1BQU0sQ0FJdEQ7QUFFRDs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILHdCQUFzQixVQUFVLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLEdBQUcsTUFBTSxDQUFDLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQU90RztBQWNEOztHQUVHO0FBQ0gscUJBQWEsZUFBZ0IsWUFBVyxhQUFhO0lBRWpELE9BQU8sQ0FBQyxVQUFVO0lBQ2xCLE9BQU8sQ0FBQyxnQkFBZ0I7SUFDeEIsT0FBTyxDQUFDLE1BQU07SUFIaEIsWUFDVSxVQUFVLEdBQUUsTUFBTSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQXFCLEVBQ3pELGdCQUFnQixHQUFFLE1BQWtCLEVBQ3BDLE1BQU0seUNBQXVDLEVBQ25EO0lBR0osZ0JBQWdCLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsVUFBVSxHQUFHLFVBQVUsQ0FHL0Q7SUFFTSxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsQ0FBQyxFQUFFLE1BQU0sR0FBRyxNQUFNLENBWS9GO0lBR0QsaUJBQWlCLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsVUFBVSxHQUFHLFVBQVUsQ0FFakU7SUFFTSxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsTUFBTSxHQUFHLE1BQU0sQ0FLakQ7Q0FDRjtBQUVEOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsd0JBQWdCLGtCQUFrQixDQUFDLElBQUksRUFBRSxVQUFVLEdBQUc7SUFBRSxnQkFBZ0IsRUFBRSxNQUFNLENBQUM7SUFBQyxTQUFTLEVBQUUsTUFBTSxDQUFBO0NBQUUsQ0FtQ3BHIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"encoding.d.ts","sourceRoot":"","sources":["../../src/services/encoding.ts"],"names":[],"mappings":"AAEA,OAAO,EAAkB,SAAS,EAAsB,MAAM,mBAAmB,CAAC;AAElF,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"encoding.d.ts","sourceRoot":"","sources":["../../src/services/encoding.ts"],"names":[],"mappings":"AAEA,OAAO,EAAkB,SAAS,EAAsB,MAAM,mBAAmB,CAAC;AAElF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AACvE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAIjD,sFAAsF;AACtF,qBAAa,4BAA6B,SAAQ,KAAK;IACrD,YAAY,gBAAgB,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAGtD;CACF;AAKD,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAItD;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,UAAU,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,CAOtG;AAcD;;GAEG;AACH,qBAAa,eAAgB,YAAW,aAAa;IAEjD,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,gBAAgB;IACxB,OAAO,CAAC,MAAM;IAHhB,YACU,UAAU,GAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAqB,EACzD,gBAAgB,GAAE,MAAkB,EACpC,MAAM,yCAAuC,EACnD;IAGJ,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,UAAU,CAG/D;IAEM,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,SAAS,EAAE,iBAAiB,CAAC,EAAE,MAAM,GAAG,MAAM,CAY/F;IAGD,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,UAAU,CAEjE;IAEM,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKjD;CACF;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,UAAU,GAAG;IAAE,gBAAgB,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAmCpG"}
|
|
@@ -3,28 +3,14 @@ import { createLogger } from '@aztec/foundation/log';
|
|
|
3
3
|
import { MAX_TX_SIZE_KB, TopicType, getTopicFromString } from '@aztec/stdlib/p2p';
|
|
4
4
|
import { webcrypto } from 'node:crypto';
|
|
5
5
|
import { compressSync, uncompressSync } from 'snappy';
|
|
6
|
-
import xxhashFactory from 'xxhash-wasm';
|
|
7
6
|
/** Thrown when a Snappy-compressed response exceeds the allowed decompressed size. */ export class OversizedSnappyResponseError extends Error {
|
|
8
7
|
constructor(decompressedSize, maxSizeKb){
|
|
9
8
|
super(`Decompressed size ${decompressedSize} exceeds maximum allowed size of ${maxSizeKb}kb`);
|
|
10
9
|
this.name = 'OversizedSnappyResponseError';
|
|
11
10
|
}
|
|
12
11
|
}
|
|
13
|
-
// Load WASM
|
|
14
|
-
const xxhash = await xxhashFactory();
|
|
15
|
-
// Use salt to prevent msgId from being mined for collisions
|
|
16
|
-
const h64Seed = BigInt(Math.floor(Math.random() * 1e9));
|
|
17
12
|
// Shared buffer to convert msgId to string
|
|
18
13
|
const sharedMsgIdBuf = Buffer.alloc(20);
|
|
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
|
-
*/ export function fastMsgIdFn(rpcMsg) {
|
|
23
|
-
if (rpcMsg.data) {
|
|
24
|
-
return xxhash.h64Raw(rpcMsg.data, h64Seed).toString(16);
|
|
25
|
-
}
|
|
26
|
-
return '0000000000000000';
|
|
27
|
-
}
|
|
28
14
|
export function msgIdToStrFn(msgId) {
|
|
29
15
|
// This happens serially, no need to reallocate the buffer
|
|
30
16
|
sharedMsgIdBuf.set(msgId);
|
|
@@ -36,11 +22,21 @@ export function msgIdToStrFn(msgId) {
|
|
|
36
22
|
* Follows similarly to:
|
|
37
23
|
* https://github.com/ethereum/consensus-specs/blob/v1.1.0-alpha.7/specs/altair/p2p-interface.md#topics-and-messages
|
|
38
24
|
*
|
|
25
|
+
* The topic length is framed into the hash input (`uint32be(topicLen) || topic || data`) so the
|
|
26
|
+
* `(topic, data)` boundary is unambiguous. A raw `topic || data` concatenation is not injective —
|
|
27
|
+
* shifting bytes across the boundary (e.g. `(topic + data[0], data[1:])`) yields the same bytes and
|
|
28
|
+
* thus the same id, letting an unsubscribed-topic message pre-occupy a real message's seenCache slot
|
|
29
|
+
* and suppress it as a duplicate.
|
|
30
|
+
*
|
|
39
31
|
* @param message - The libp2p message
|
|
40
32
|
* @returns The message identifier
|
|
41
33
|
*/ export async function getMsgIdFn({ topic, data }) {
|
|
34
|
+
const topicBytes = Buffer.from(topic);
|
|
35
|
+
const framedTopicLength = Buffer.allocUnsafe(4);
|
|
36
|
+
framedTopicLength.writeUInt32BE(topicBytes.length);
|
|
42
37
|
const buffer = Buffer.concat([
|
|
43
|
-
|
|
38
|
+
framedTopicLength,
|
|
39
|
+
topicBytes,
|
|
44
40
|
data
|
|
45
41
|
]);
|
|
46
42
|
const hash = await webcrypto.subtle.digest('SHA-256', buffer);
|