@lodestar/beacon-node 1.41.0-dev.b90dff673d → 1.41.0-dev.bb16850567
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/lib/api/impl/beacon/blocks/index.d.ts.map +1 -1
- package/lib/api/impl/beacon/blocks/index.js +9 -0
- package/lib/api/impl/beacon/blocks/index.js.map +1 -1
- package/lib/api/impl/beacon/state/utils.d.ts +2 -2
- package/lib/api/impl/beacon/state/utils.d.ts.map +1 -1
- package/lib/api/impl/beacon/state/utils.js.map +1 -1
- package/lib/api/impl/validator/index.d.ts.map +1 -1
- package/lib/api/impl/validator/index.js +5 -1
- package/lib/api/impl/validator/index.js.map +1 -1
- package/lib/chain/archiveStore/archiveStore.d.ts +0 -1
- package/lib/chain/archiveStore/archiveStore.d.ts.map +1 -1
- package/lib/chain/archiveStore/archiveStore.js +0 -9
- package/lib/chain/archiveStore/archiveStore.js.map +1 -1
- package/lib/chain/archiveStore/interface.d.ts +4 -4
- package/lib/chain/archiveStore/interface.d.ts.map +1 -1
- package/lib/chain/archiveStore/strategies/frequencyStateArchiveStrategy.d.ts +4 -4
- package/lib/chain/archiveStore/strategies/frequencyStateArchiveStrategy.d.ts.map +1 -1
- package/lib/chain/archiveStore/strategies/frequencyStateArchiveStrategy.js +4 -1
- package/lib/chain/archiveStore/strategies/frequencyStateArchiveStrategy.js.map +1 -1
- package/lib/chain/archiveStore/utils/archiveBlocks.d.ts.map +1 -1
- package/lib/chain/archiveStore/utils/archiveBlocks.js +38 -0
- package/lib/chain/archiveStore/utils/archiveBlocks.js.map +1 -1
- package/lib/chain/blocks/importBlock.d.ts.map +1 -1
- package/lib/chain/blocks/importBlock.js +12 -8
- package/lib/chain/blocks/importBlock.js.map +1 -1
- package/lib/chain/blocks/verifyBlocksSignatures.js +1 -1
- package/lib/chain/blocks/verifyBlocksSignatures.js.map +1 -1
- package/lib/chain/chain.d.ts +3 -3
- package/lib/chain/chain.d.ts.map +1 -1
- package/lib/chain/chain.js +20 -9
- package/lib/chain/chain.js.map +1 -1
- package/lib/chain/interface.d.ts +2 -2
- package/lib/chain/interface.d.ts.map +1 -1
- package/lib/chain/prepareNextSlot.d.ts.map +1 -1
- package/lib/chain/prepareNextSlot.js +6 -2
- package/lib/chain/prepareNextSlot.js.map +1 -1
- package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
- package/lib/chain/produceBlock/produceBlockBody.js +9 -1
- package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
- package/lib/chain/regen/errors.d.ts +11 -1
- package/lib/chain/regen/errors.d.ts.map +1 -1
- package/lib/chain/regen/errors.js +2 -0
- package/lib/chain/regen/errors.js.map +1 -1
- package/lib/chain/regen/interface.d.ts +12 -6
- package/lib/chain/regen/interface.d.ts.map +1 -1
- package/lib/chain/regen/queued.d.ts +11 -6
- package/lib/chain/regen/queued.d.ts.map +1 -1
- package/lib/chain/regen/queued.js +40 -8
- package/lib/chain/regen/queued.js.map +1 -1
- package/lib/chain/regen/regen.d.ts +5 -0
- package/lib/chain/regen/regen.d.ts.map +1 -1
- package/lib/chain/regen/regen.js +33 -6
- package/lib/chain/regen/regen.js.map +1 -1
- package/lib/chain/stateCache/datastore/db.d.ts +4 -5
- package/lib/chain/stateCache/datastore/db.d.ts.map +1 -1
- package/lib/chain/stateCache/datastore/db.js +32 -10
- package/lib/chain/stateCache/datastore/db.js.map +1 -1
- package/lib/chain/stateCache/datastore/file.d.ts +1 -1
- package/lib/chain/stateCache/datastore/file.d.ts.map +1 -1
- package/lib/chain/stateCache/datastore/file.js +5 -5
- package/lib/chain/stateCache/datastore/file.js.map +1 -1
- package/lib/chain/stateCache/datastore/types.d.ts +1 -1
- package/lib/chain/stateCache/datastore/types.d.ts.map +1 -1
- package/lib/chain/stateCache/fifoBlockStateCache.d.ts +7 -4
- package/lib/chain/stateCache/fifoBlockStateCache.d.ts.map +1 -1
- package/lib/chain/stateCache/fifoBlockStateCache.js +8 -3
- package/lib/chain/stateCache/fifoBlockStateCache.js.map +1 -1
- package/lib/chain/stateCache/persistentCheckpointsCache.d.ts +33 -14
- package/lib/chain/stateCache/persistentCheckpointsCache.d.ts.map +1 -1
- package/lib/chain/stateCache/persistentCheckpointsCache.js +217 -119
- package/lib/chain/stateCache/persistentCheckpointsCache.js.map +1 -1
- package/lib/chain/stateCache/types.d.ts +15 -8
- package/lib/chain/stateCache/types.d.ts.map +1 -1
- package/lib/chain/stateCache/types.js.map +1 -1
- package/lib/chain/validation/dataColumnSidecar.d.ts +2 -1
- package/lib/chain/validation/dataColumnSidecar.d.ts.map +1 -1
- package/lib/chain/validation/dataColumnSidecar.js +124 -107
- package/lib/chain/validation/dataColumnSidecar.js.map +1 -1
- package/lib/chain/validation/voluntaryExit.d.ts.map +1 -1
- package/lib/chain/validation/voluntaryExit.js +2 -2
- package/lib/chain/validation/voluntaryExit.js.map +1 -1
- package/lib/metrics/metrics/beacon.d.ts +2 -1
- package/lib/metrics/metrics/beacon.d.ts.map +1 -1
- package/lib/metrics/metrics/beacon.js +9 -3
- package/lib/metrics/metrics/beacon.js.map +1 -1
- package/lib/metrics/metrics/lodestar.d.ts +5 -5
- package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
- package/lib/metrics/metrics/lodestar.js +16 -14
- package/lib/metrics/metrics/lodestar.js.map +1 -1
- package/lib/network/discv5/utils.d.ts +1 -1
- package/lib/network/discv5/utils.d.ts.map +1 -1
- package/lib/network/discv5/utils.js +5 -4
- package/lib/network/discv5/utils.js.map +1 -1
- package/lib/network/gossip/gossipsub.d.ts.map +1 -1
- package/lib/network/gossip/gossipsub.js +9 -6
- package/lib/network/gossip/gossipsub.js.map +1 -1
- package/lib/network/libp2p/index.d.ts +1 -1
- package/lib/network/libp2p/index.d.ts.map +1 -1
- package/lib/network/libp2p/index.js +35 -17
- package/lib/network/libp2p/index.js.map +1 -1
- package/lib/network/metadata.d.ts +1 -0
- package/lib/network/metadata.d.ts.map +1 -1
- package/lib/network/metadata.js +1 -0
- package/lib/network/metadata.js.map +1 -1
- package/lib/network/options.d.ts +2 -0
- package/lib/network/options.d.ts.map +1 -1
- package/lib/network/options.js +3 -0
- package/lib/network/options.js.map +1 -1
- package/lib/network/peers/discover.d.ts +2 -0
- package/lib/network/peers/discover.d.ts.map +1 -1
- package/lib/network/peers/discover.js +41 -10
- package/lib/network/peers/discover.js.map +1 -1
- package/lib/sync/range/range.d.ts.map +1 -1
- package/lib/sync/range/range.js +1 -0
- package/lib/sync/range/range.js.map +1 -1
- package/lib/sync/utils/downloadByRange.d.ts +6 -3
- package/lib/sync/utils/downloadByRange.d.ts.map +1 -1
- package/lib/sync/utils/downloadByRange.js +6 -5
- package/lib/sync/utils/downloadByRange.js.map +1 -1
- package/lib/sync/utils/downloadByRoot.js +1 -1
- package/lib/sync/utils/downloadByRoot.js.map +1 -1
- package/lib/util/dataColumns.d.ts.map +1 -1
- package/lib/util/dataColumns.js +5 -1
- package/lib/util/dataColumns.js.map +1 -1
- package/lib/util/execution.d.ts.map +1 -1
- package/lib/util/execution.js +17 -8
- package/lib/util/execution.js.map +1 -1
- package/package.json +28 -27
- package/src/api/impl/beacon/blocks/index.ts +11 -0
- package/src/api/impl/beacon/state/utils.ts +2 -2
- package/src/api/impl/validator/index.ts +7 -3
- package/src/chain/archiveStore/archiveStore.ts +0 -10
- package/src/chain/archiveStore/interface.ts +4 -4
- package/src/chain/archiveStore/strategies/frequencyStateArchiveStrategy.ts +8 -5
- package/src/chain/archiveStore/utils/archiveBlocks.ts +59 -1
- package/src/chain/blocks/importBlock.ts +12 -7
- package/src/chain/blocks/verifyBlocksSignatures.ts +1 -1
- package/src/chain/chain.ts +27 -14
- package/src/chain/interface.ts +2 -2
- package/src/chain/prepareNextSlot.ts +6 -2
- package/src/chain/produceBlock/produceBlockBody.ts +8 -1
- package/src/chain/regen/errors.ts +6 -1
- package/src/chain/regen/interface.ts +12 -6
- package/src/chain/regen/queued.ts +48 -12
- package/src/chain/regen/regen.ts +37 -7
- package/src/chain/stateCache/datastore/db.ts +33 -10
- package/src/chain/stateCache/datastore/file.ts +6 -5
- package/src/chain/stateCache/datastore/types.ts +3 -2
- package/src/chain/stateCache/fifoBlockStateCache.ts +10 -4
- package/src/chain/stateCache/persistentCheckpointsCache.ts +248 -139
- package/src/chain/stateCache/types.ts +18 -8
- package/src/chain/validation/dataColumnSidecar.ts +146 -126
- package/src/chain/validation/voluntaryExit.ts +2 -1
- package/src/metrics/metrics/beacon.ts +9 -3
- package/src/metrics/metrics/lodestar.ts +16 -14
- package/src/network/discv5/utils.ts +5 -4
- package/src/network/gossip/gossipsub.ts +12 -7
- package/src/network/libp2p/index.ts +40 -18
- package/src/network/metadata.ts +1 -0
- package/src/network/options.ts +5 -1
- package/src/network/peers/discover.ts +46 -11
- package/src/sync/range/range.ts +1 -0
- package/src/sync/utils/downloadByRange.ts +12 -3
- package/src/sync/utils/downloadByRoot.ts +1 -1
- package/src/util/dataColumns.ts +6 -2
- package/src/util/execution.ts +23 -12
- package/lib/chain/archiveStore/utils/archivePayloads.d.ts +0 -7
- package/lib/chain/archiveStore/utils/archivePayloads.d.ts.map +0 -1
- package/lib/chain/archiveStore/utils/archivePayloads.js +0 -10
- package/lib/chain/archiveStore/utils/archivePayloads.js.map +0 -1
- package/src/chain/archiveStore/utils/archivePayloads.ts +0 -15
package/src/network/options.ts
CHANGED
|
@@ -29,7 +29,6 @@ export interface NetworkOptions
|
|
|
29
29
|
useWorker?: boolean;
|
|
30
30
|
maxYoungGenerationSizeMb?: number;
|
|
31
31
|
disableLightClientServer?: boolean;
|
|
32
|
-
|
|
33
32
|
/**
|
|
34
33
|
* During E2E tests observe a lot of following `missing stream`:
|
|
35
34
|
*
|
|
@@ -48,11 +47,14 @@ export interface NetworkOptions
|
|
|
48
47
|
* We need to increase this only for the testing purpose
|
|
49
48
|
*/
|
|
50
49
|
disconnectThreshold?: number;
|
|
50
|
+
quic?: boolean;
|
|
51
|
+
tcp?: boolean;
|
|
51
52
|
}
|
|
52
53
|
|
|
53
54
|
export const defaultNetworkOptions: NetworkOptions = {
|
|
54
55
|
maxPeers: 210, // Allow some room above targetPeers for new inbound peers
|
|
55
56
|
targetPeers: 200,
|
|
57
|
+
// In CLI usage this is typically overridden; when unset it serves as a fallback default (e.g. programmatic usage/tests)
|
|
56
58
|
localMultiaddrs: ["/ip4/0.0.0.0/tcp/9000", "/ip6/::/tcp/9000"],
|
|
57
59
|
bootMultiaddrs: [],
|
|
58
60
|
/** disabled by default */
|
|
@@ -67,6 +69,8 @@ export const defaultNetworkOptions: NetworkOptions = {
|
|
|
67
69
|
slotsToSubscribeBeforeAggregatorDuty: 2,
|
|
68
70
|
// This will enable the light client server by default
|
|
69
71
|
disableLightClientServer: false,
|
|
72
|
+
quic: false,
|
|
73
|
+
tcp: true,
|
|
70
74
|
// specific option for fulu
|
|
71
75
|
// - this is the same to TARGET_SUBNET_PEERS
|
|
72
76
|
// - for fusaka-devnets, we have 25-30 peers per subnet
|
|
@@ -59,6 +59,7 @@ export enum DiscoveredPeerStatus {
|
|
|
59
59
|
cached = "cached",
|
|
60
60
|
dropped = "dropped",
|
|
61
61
|
no_multiaddrs = "no_multiaddrs",
|
|
62
|
+
transport_incompatible = "transport_incompatible",
|
|
62
63
|
peer_cooling_down = "peer_cooling_down",
|
|
63
64
|
}
|
|
64
65
|
|
|
@@ -88,7 +89,8 @@ export type SubnetDiscvQueryMs = {
|
|
|
88
89
|
|
|
89
90
|
type CachedENR = {
|
|
90
91
|
peerId: PeerId;
|
|
91
|
-
multiaddrTCP
|
|
92
|
+
multiaddrTCP?: Multiaddr;
|
|
93
|
+
multiaddrQUIC?: Multiaddr;
|
|
92
94
|
subnets: Record<SubnetType, boolean[]>;
|
|
93
95
|
addedUnixMs: number;
|
|
94
96
|
// custodyGroups is null for pre-fulu
|
|
@@ -114,6 +116,7 @@ export class PeerDiscovery {
|
|
|
114
116
|
attnets: new Map(),
|
|
115
117
|
syncnets: new Map(),
|
|
116
118
|
};
|
|
119
|
+
private transports: string[];
|
|
117
120
|
|
|
118
121
|
private custodyGroupQueries: CustodyGroupQueries;
|
|
119
122
|
|
|
@@ -180,6 +183,17 @@ export class PeerDiscovery {
|
|
|
180
183
|
}
|
|
181
184
|
});
|
|
182
185
|
}
|
|
186
|
+
|
|
187
|
+
// Transport tags vary by library: @libp2p/tcp uses '@libp2p/tcp', @chainsafe/libp2p-quic uses 'quic'
|
|
188
|
+
// Normalize to simple 'tcp' / 'quic' strings for matching
|
|
189
|
+
this.transports = libp2p.services.components.transportManager
|
|
190
|
+
.getTransports()
|
|
191
|
+
.map((t) => t[Symbol.toStringTag])
|
|
192
|
+
.map((tag) => {
|
|
193
|
+
if (tag?.includes("tcp")) return "tcp";
|
|
194
|
+
if (tag?.includes("quic")) return "quic";
|
|
195
|
+
return tag;
|
|
196
|
+
});
|
|
183
197
|
}
|
|
184
198
|
|
|
185
199
|
static async init(modules: PeerDiscoveryModules, opts: PeerDiscoveryOpts): Promise<PeerDiscovery> {
|
|
@@ -372,10 +386,15 @@ export class PeerDiscovery {
|
|
|
372
386
|
return;
|
|
373
387
|
}
|
|
374
388
|
|
|
389
|
+
// Select multiaddrs by protocol rather than index — libp2p discovery events
|
|
390
|
+
// don't guarantee ordering or number of addresses
|
|
391
|
+
const multiaddrTCP = multiaddrs.find((ma) => ma.toString().includes("/tcp/"));
|
|
392
|
+
const multiaddrQUIC = multiaddrs.find((ma) => ma.toString().includes("/quic-v1"));
|
|
393
|
+
|
|
375
394
|
const attnets = zeroAttnets;
|
|
376
395
|
const syncnets = zeroSyncnets;
|
|
377
396
|
|
|
378
|
-
const status = this.handleDiscoveredPeer(id,
|
|
397
|
+
const status = this.handleDiscoveredPeer(id, multiaddrTCP, multiaddrQUIC, attnets, syncnets, undefined);
|
|
379
398
|
this.logger.debug("Discovered peer via libp2p", {peer: prettyPrintPeerId(id), status});
|
|
380
399
|
this.metrics?.discovery.discoveredStatus.inc({status});
|
|
381
400
|
};
|
|
@@ -388,13 +407,15 @@ export class PeerDiscovery {
|
|
|
388
407
|
this.randomNodeQuery.count++;
|
|
389
408
|
}
|
|
390
409
|
const peerId = enr.peerId;
|
|
391
|
-
//
|
|
410
|
+
// At least one transport is known to be present, checked inside the worker
|
|
392
411
|
const multiaddrTCP = enr.getLocationMultiaddr(ENRKey.tcp);
|
|
393
|
-
|
|
394
|
-
|
|
412
|
+
const multiaddrQUIC = enr.getLocationMultiaddr(ENRKey.quic);
|
|
413
|
+
if (!multiaddrTCP && !multiaddrQUIC) {
|
|
414
|
+
this.logger.warn("Discv5 worker sent enr without any transport multiaddr", {enr: enr.encodeTxt()});
|
|
395
415
|
this.metrics?.discovery.discoveredStatus.inc({status: DiscoveredPeerStatus.no_multiaddrs});
|
|
396
416
|
return;
|
|
397
417
|
}
|
|
418
|
+
|
|
398
419
|
// Are this fields mandatory?
|
|
399
420
|
const attnetsBytes = enr.kvs.get(ENRKey.attnets); // 64 bits
|
|
400
421
|
const syncnetsBytes = enr.kvs.get(ENRKey.syncnets); // 4 bits
|
|
@@ -414,7 +435,7 @@ export class PeerDiscovery {
|
|
|
414
435
|
const syncnets = syncnetsBytes ? deserializeEnrSubnets(syncnetsBytes, SYNC_COMMITTEE_SUBNET_COUNT) : zeroSyncnets;
|
|
415
436
|
const custodyGroupCount = custodyGroupCountBytes ? bytesToInt(custodyGroupCountBytes, "be") : undefined;
|
|
416
437
|
|
|
417
|
-
const status = this.handleDiscoveredPeer(peerId, multiaddrTCP, attnets, syncnets, custodyGroupCount);
|
|
438
|
+
const status = this.handleDiscoveredPeer(peerId, multiaddrTCP, multiaddrQUIC, attnets, syncnets, custodyGroupCount);
|
|
418
439
|
this.logger.debug("Discovered peer via discv5", {
|
|
419
440
|
peer: prettyPrintPeerId(peerId),
|
|
420
441
|
status,
|
|
@@ -428,7 +449,8 @@ export class PeerDiscovery {
|
|
|
428
449
|
*/
|
|
429
450
|
private handleDiscoveredPeer(
|
|
430
451
|
peerId: PeerId,
|
|
431
|
-
multiaddrTCP: Multiaddr,
|
|
452
|
+
multiaddrTCP: Multiaddr | undefined,
|
|
453
|
+
multiaddrQUIC: Multiaddr | undefined,
|
|
432
454
|
attnets: boolean[],
|
|
433
455
|
syncnets: boolean[],
|
|
434
456
|
custodySubnetCount?: number
|
|
@@ -454,6 +476,13 @@ export class PeerDiscovery {
|
|
|
454
476
|
return DiscoveredPeerStatus.already_connected;
|
|
455
477
|
}
|
|
456
478
|
|
|
479
|
+
// ignore peers if they don't share any transport with us
|
|
480
|
+
const hasTcpMatch = this.transports.includes("tcp") && multiaddrTCP;
|
|
481
|
+
const hasQuicMatch = this.transports.includes("quic") && multiaddrQUIC;
|
|
482
|
+
if (!hasTcpMatch && !hasQuicMatch) {
|
|
483
|
+
return DiscoveredPeerStatus.transport_incompatible;
|
|
484
|
+
}
|
|
485
|
+
|
|
457
486
|
// Ignore dialing peers
|
|
458
487
|
if (
|
|
459
488
|
this.libp2p.services.components.connectionManager
|
|
@@ -469,6 +498,7 @@ export class PeerDiscovery {
|
|
|
469
498
|
const cachedPeer: CachedENR = {
|
|
470
499
|
peerId,
|
|
471
500
|
multiaddrTCP,
|
|
501
|
+
multiaddrQUIC,
|
|
472
502
|
subnets: {attnets, syncnets},
|
|
473
503
|
addedUnixMs: Date.now(),
|
|
474
504
|
// for pre-fulu, custodyGroups is null
|
|
@@ -566,19 +596,24 @@ export class PeerDiscovery {
|
|
|
566
596
|
// are not successful.
|
|
567
597
|
this.peersToConnect = Math.max(this.peersToConnect - 1, 0);
|
|
568
598
|
|
|
569
|
-
const {peerId, multiaddrTCP} = cachedPeer;
|
|
599
|
+
const {peerId, multiaddrTCP, multiaddrQUIC} = cachedPeer;
|
|
570
600
|
|
|
571
601
|
// Must add the multiaddrs array to the address book before dialing
|
|
572
602
|
// https://github.com/libp2p/js-libp2p/blob/aec8e3d3bb1b245051b60c2a890550d262d5b062/src/index.js#L638
|
|
573
|
-
const peer = await this.libp2p.peerStore.merge(peerId, {
|
|
603
|
+
const peer = await this.libp2p.peerStore.merge(peerId, {
|
|
604
|
+
multiaddrs: [multiaddrQUIC, multiaddrTCP].filter(Boolean) as Multiaddr[],
|
|
605
|
+
});
|
|
574
606
|
if (peer.addresses.length === 0) {
|
|
575
607
|
this.metrics?.discovery.notDialReason.inc({reason: NotDialReason.no_multiaddrs});
|
|
576
608
|
return;
|
|
577
609
|
}
|
|
578
610
|
|
|
579
|
-
// Note: PeerDiscovery adds the
|
|
611
|
+
// Note: PeerDiscovery adds the multiaddrs beforehand
|
|
580
612
|
const peerIdShort = prettyPrintPeerId(peerId);
|
|
581
|
-
this.logger.debug("Dialing discovered peer", {
|
|
613
|
+
this.logger.debug("Dialing discovered peer", {
|
|
614
|
+
peer: peerIdShort,
|
|
615
|
+
addresses: peer.addresses.map((a) => a.multiaddr.toString()).join(", "),
|
|
616
|
+
});
|
|
582
617
|
|
|
583
618
|
this.metrics?.discovery.dialAttempts.inc();
|
|
584
619
|
const timer = this.metrics?.discovery.dialTime.startTimer();
|
package/src/sync/range/range.ts
CHANGED
|
@@ -206,6 +206,7 @@ export class RangeSync extends (EventEmitter as {new (): RangeSyncEmitter}) {
|
|
|
206
206
|
logger: this.logger,
|
|
207
207
|
peerIdStr: peer.peerId,
|
|
208
208
|
batchBlocks,
|
|
209
|
+
peerDasMetrics: this.chain.metrics?.peerDas,
|
|
209
210
|
...batch.getRequestsForPeer(peer),
|
|
210
211
|
});
|
|
211
212
|
const cached = cacheByRangeResponses({
|
|
@@ -12,6 +12,7 @@ import {
|
|
|
12
12
|
import {SeenBlockInput} from "../../chain/seenCache/seenGossipBlockInput.js";
|
|
13
13
|
import {validateBlockBlobSidecars} from "../../chain/validation/blobSidecar.js";
|
|
14
14
|
import {validateBlockDataColumnSidecars} from "../../chain/validation/dataColumnSidecar.js";
|
|
15
|
+
import {BeaconMetrics} from "../../metrics/metrics/beacon.js";
|
|
15
16
|
import {INetwork} from "../../network/index.js";
|
|
16
17
|
import {getBlobKzgCommitments} from "../../util/dataColumns.js";
|
|
17
18
|
import {PeerIdStr} from "../../util/peerId.js";
|
|
@@ -35,6 +36,7 @@ export type DownloadAndCacheByRangeProps = DownloadByRangeRequests & {
|
|
|
35
36
|
logger: Logger;
|
|
36
37
|
peerIdStr: string;
|
|
37
38
|
batchBlocks?: IBlockInput[];
|
|
39
|
+
peerDasMetrics?: BeaconMetrics["peerDas"] | null;
|
|
38
40
|
};
|
|
39
41
|
|
|
40
42
|
export type CacheByRangeResponsesProps = {
|
|
@@ -196,6 +198,7 @@ export async function downloadByRange({
|
|
|
196
198
|
blocksRequest,
|
|
197
199
|
blobsRequest,
|
|
198
200
|
columnsRequest,
|
|
201
|
+
peerDasMetrics,
|
|
199
202
|
}: DownloadAndCacheByRangeProps): Promise<WarnResult<ValidatedResponses, DownloadByRangeError>> {
|
|
200
203
|
let response: DownloadByRangeResponses;
|
|
201
204
|
try {
|
|
@@ -220,6 +223,7 @@ export async function downloadByRange({
|
|
|
220
223
|
blocksRequest,
|
|
221
224
|
blobsRequest,
|
|
222
225
|
columnsRequest,
|
|
226
|
+
peerDasMetrics,
|
|
223
227
|
...response,
|
|
224
228
|
});
|
|
225
229
|
|
|
@@ -290,10 +294,12 @@ export async function validateResponses({
|
|
|
290
294
|
blocks,
|
|
291
295
|
blobSidecars,
|
|
292
296
|
columnSidecars,
|
|
297
|
+
peerDasMetrics,
|
|
293
298
|
}: DownloadByRangeRequests &
|
|
294
299
|
DownloadByRangeResponses & {
|
|
295
300
|
config: ChainForkConfig;
|
|
296
301
|
batchBlocks?: IBlockInput[];
|
|
302
|
+
peerDasMetrics?: BeaconMetrics["peerDas"] | null;
|
|
297
303
|
}): Promise<WarnResult<ValidatedResponses, DownloadByRangeError>> {
|
|
298
304
|
// Blocks are always required for blob/column validation
|
|
299
305
|
// If a blocksRequest is provided, blocks have just been downloaded
|
|
@@ -372,7 +378,8 @@ export async function validateResponses({
|
|
|
372
378
|
config,
|
|
373
379
|
columnsRequest,
|
|
374
380
|
blocksForDataValidation,
|
|
375
|
-
columnSidecars
|
|
381
|
+
columnSidecars,
|
|
382
|
+
peerDasMetrics
|
|
376
383
|
);
|
|
377
384
|
validatedResponses.validatedColumnSidecars = validatedColumnSidecarsResult.result;
|
|
378
385
|
warnings = validatedColumnSidecarsResult.warnings;
|
|
@@ -608,7 +615,8 @@ export async function validateColumnsByRangeResponse(
|
|
|
608
615
|
config: ChainForkConfig,
|
|
609
616
|
request: fulu.DataColumnSidecarsByRangeRequest,
|
|
610
617
|
blocks: ValidatedBlock[],
|
|
611
|
-
columnSidecars: fulu.DataColumnSidecars
|
|
618
|
+
columnSidecars: fulu.DataColumnSidecars,
|
|
619
|
+
peerDasMetrics?: BeaconMetrics["peerDas"] | null
|
|
612
620
|
): Promise<WarnResult<ValidatedColumnSidecars[], DownloadByRangeError>> {
|
|
613
621
|
const warnings: DownloadByRangeError[] = [];
|
|
614
622
|
|
|
@@ -764,7 +772,8 @@ export async function validateColumnsByRangeResponse(
|
|
|
764
772
|
slot,
|
|
765
773
|
blockRoot,
|
|
766
774
|
blobCount,
|
|
767
|
-
columnSidecars
|
|
775
|
+
columnSidecars,
|
|
776
|
+
peerDasMetrics
|
|
768
777
|
).then(() => ({
|
|
769
778
|
blockRoot,
|
|
770
779
|
columnSidecars,
|
|
@@ -440,7 +440,7 @@ export async function fetchAndValidateColumns({
|
|
|
440
440
|
);
|
|
441
441
|
}
|
|
442
442
|
|
|
443
|
-
await validateBlockDataColumnSidecars(chain, slot, blockRoot, blobCount, columnSidecars);
|
|
443
|
+
await validateBlockDataColumnSidecars(chain, slot, blockRoot, blobCount, columnSidecars, chain?.metrics?.peerDas);
|
|
444
444
|
|
|
445
445
|
return {result: columnSidecars, warnings: warnings.length > 0 ? warnings : null};
|
|
446
446
|
}
|
package/src/util/dataColumns.ts
CHANGED
|
@@ -425,7 +425,8 @@ export async function recoverDataColumnSidecars(
|
|
|
425
425
|
partialSidecars.set(columnSidecar.index, columnSidecar);
|
|
426
426
|
}
|
|
427
427
|
|
|
428
|
-
const timer = metrics?.
|
|
428
|
+
const timer = metrics?.peerDas.dataColumnsReconstructionTime.startTimer();
|
|
429
|
+
|
|
429
430
|
// if this function throws, we catch at the consumer side
|
|
430
431
|
const fullSidecars = await dataColumnMatrixRecovery(partialSidecars).catch(() => null);
|
|
431
432
|
timer?.();
|
|
@@ -435,6 +436,7 @@ export async function recoverDataColumnSidecars(
|
|
|
435
436
|
|
|
436
437
|
if (blockInput.getAllColumns().length === NUMBER_OF_COLUMNS) {
|
|
437
438
|
// either gossip or getBlobsV2 resolved availability while we were recovering
|
|
439
|
+
metrics?.dataColumns.alreadyAdded.inc(fullSidecars.length);
|
|
438
440
|
return DataColumnReconstructionCode.SuccessLate;
|
|
439
441
|
}
|
|
440
442
|
|
|
@@ -458,8 +460,10 @@ export async function recoverDataColumnSidecars(
|
|
|
458
460
|
sidecarsToPublish.push(columnSidecar);
|
|
459
461
|
}
|
|
460
462
|
}
|
|
463
|
+
metrics?.peerDas.reconstructedColumns.inc(sidecarsToPublish.length);
|
|
464
|
+
metrics?.dataColumns.bySource.inc({source: BlockInputSource.recovery}, sidecarsToPublish.length);
|
|
461
465
|
emitter.emit(ChainEvent.publishDataColumns, sidecarsToPublish);
|
|
462
|
-
|
|
466
|
+
// TODO: Can we record dataColumns.sentPeersPerSubnet metric somehow
|
|
463
467
|
return DataColumnReconstructionCode.SuccessResolved;
|
|
464
468
|
}
|
|
465
469
|
|
package/src/util/execution.ts
CHANGED
|
@@ -173,16 +173,21 @@ export async function getDataColumnSidecarsFromExecution(
|
|
|
173
173
|
}
|
|
174
174
|
|
|
175
175
|
let dataColumnSidecars: fulu.DataColumnSidecars;
|
|
176
|
-
const
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
176
|
+
const compTimer = metrics?.peerDas.dataColumnSidecarComputationTime.startTimer();
|
|
177
|
+
try {
|
|
178
|
+
const cellsAndProofs = await getCellsAndProofs(blobs);
|
|
179
|
+
if (blockInput.hasBlock()) {
|
|
180
|
+
dataColumnSidecars = getDataColumnSidecarsFromBlock(
|
|
181
|
+
config,
|
|
182
|
+
blockInput.getBlock() as fulu.SignedBeaconBlock,
|
|
183
|
+
cellsAndProofs
|
|
184
|
+
);
|
|
185
|
+
} else {
|
|
186
|
+
const firstSidecar = blockInput.getAllColumns()[0];
|
|
187
|
+
dataColumnSidecars = getDataColumnSidecarsFromColumnSidecar(firstSidecar, cellsAndProofs);
|
|
188
|
+
}
|
|
189
|
+
} finally {
|
|
190
|
+
compTimer?.();
|
|
186
191
|
}
|
|
187
192
|
|
|
188
193
|
// Publish columns if and only if subscribed to them
|
|
@@ -191,13 +196,15 @@ export async function getDataColumnSidecarsFromExecution(
|
|
|
191
196
|
|
|
192
197
|
// for columns that we already seen, it will be ignored through `ignoreDuplicatePublishError` gossip option
|
|
193
198
|
emitter.emit(ChainEvent.publishDataColumns, sampledColumns);
|
|
199
|
+
// TODO: Can we record dataColumns.sentPeersPerSubnet metric here somehow
|
|
194
200
|
|
|
195
201
|
// add all sampled columns to the block input, even if we didn't sample them
|
|
196
202
|
const seenTimestampSec = Date.now() / 1000;
|
|
203
|
+
let alreadyAddedColumnsCount = 0;
|
|
197
204
|
for (const columnSidecar of sampledColumns) {
|
|
198
205
|
if (blockInput.hasColumn(columnSidecar.index)) {
|
|
199
206
|
// columns may have been added while waiting
|
|
200
|
-
|
|
207
|
+
alreadyAddedColumnsCount++;
|
|
201
208
|
continue;
|
|
202
209
|
}
|
|
203
210
|
|
|
@@ -217,7 +224,11 @@ export async function getDataColumnSidecarsFromExecution(
|
|
|
217
224
|
});
|
|
218
225
|
}
|
|
219
226
|
}
|
|
227
|
+
metrics?.dataColumns.alreadyAdded.inc(alreadyAddedColumnsCount);
|
|
220
228
|
|
|
221
|
-
metrics?.dataColumns.bySource.inc(
|
|
229
|
+
metrics?.dataColumns.bySource.inc(
|
|
230
|
+
{source: BlockInputSource.engine},
|
|
231
|
+
previouslyMissingColumns.length - alreadyAddedColumnsCount
|
|
232
|
+
);
|
|
222
233
|
return DataColumnEngineResult.SuccessResolved;
|
|
223
234
|
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import { CheckpointWithHex } from "@lodestar/fork-choice";
|
|
2
|
-
import { IBeaconChain } from "../../interface.js";
|
|
3
|
-
/**
|
|
4
|
-
* Archives execution payload envelopes from hot DB to archive DB after finalization.
|
|
5
|
-
*/
|
|
6
|
-
export declare function archiveExecutionPayloadEnvelopes(chain: IBeaconChain, _finalized: CheckpointWithHex): Promise<void>;
|
|
7
|
-
//# sourceMappingURL=archivePayloads.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"archivePayloads.d.ts","sourceRoot":"","sources":["../../../../src/chain/archiveStore/utils/archivePayloads.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,iBAAiB,EAAC,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAC,YAAY,EAAC,MAAM,oBAAoB,CAAC;AAEhD;;GAEG;AACH,wBAAsB,gCAAgC,CACpD,KAAK,EAAE,YAAY,EACnB,UAAU,EAAE,iBAAiB,GAC5B,OAAO,CAAC,IAAI,CAAC,CAKf"}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Archives execution payload envelopes from hot DB to archive DB after finalization.
|
|
3
|
-
*/
|
|
4
|
-
export async function archiveExecutionPayloadEnvelopes(chain, _finalized) {
|
|
5
|
-
const finalizedBlock = chain.forkChoice.getFinalizedBlock();
|
|
6
|
-
if (!finalizedBlock)
|
|
7
|
-
return;
|
|
8
|
-
// TODO GLOAS: Implement payload envelope archival after epbs fork choice changes are merged
|
|
9
|
-
}
|
|
10
|
-
//# sourceMappingURL=archivePayloads.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"archivePayloads.js","sourceRoot":"","sources":["../../../../src/chain/archiveStore/utils/archivePayloads.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gCAAgC,CACpD,KAAmB,EACnB,UAA6B,EACd;IACf,MAAM,cAAc,GAAG,KAAK,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC;IAC5D,IAAI,CAAC,cAAc;QAAE,OAAO;IAE5B,4FAA4F;AAFhE,CAG7B"}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import {CheckpointWithHex} from "@lodestar/fork-choice";
|
|
2
|
-
import {IBeaconChain} from "../../interface.js";
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Archives execution payload envelopes from hot DB to archive DB after finalization.
|
|
6
|
-
*/
|
|
7
|
-
export async function archiveExecutionPayloadEnvelopes(
|
|
8
|
-
chain: IBeaconChain,
|
|
9
|
-
_finalized: CheckpointWithHex
|
|
10
|
-
): Promise<void> {
|
|
11
|
-
const finalizedBlock = chain.forkChoice.getFinalizedBlock();
|
|
12
|
-
if (!finalizedBlock) return;
|
|
13
|
-
|
|
14
|
-
// TODO GLOAS: Implement payload envelope archival after epbs fork choice changes are merged
|
|
15
|
-
}
|