@lodestar/beacon-node 1.32.0-dev.ea8c82564a → 1.32.0-peerDAS.223a48c40a
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.js +72 -16
- package/lib/api/impl/beacon/blocks/index.js.map +1 -1
- package/lib/api/impl/debug/index.d.ts +1 -1
- package/lib/api/impl/debug/index.js +24 -1
- package/lib/api/impl/debug/index.js.map +1 -1
- package/lib/chain/archiveStore/archiveStore.d.ts +1 -1
- package/lib/chain/archiveStore/archiveStore.js +2 -2
- package/lib/chain/archiveStore/archiveStore.js.map +1 -1
- package/lib/chain/archiveStore/historicalState/metrics.js +8 -0
- package/lib/chain/archiveStore/historicalState/metrics.js.map +1 -1
- package/lib/chain/archiveStore/interface.d.ts +1 -1
- package/lib/chain/archiveStore/utils/archiveBlocks.d.ts +1 -1
- package/lib/chain/archiveStore/utils/archiveBlocks.js +116 -23
- package/lib/chain/archiveStore/utils/archiveBlocks.js.map +1 -1
- package/lib/chain/beaconProposerCache.d.ts +1 -0
- package/lib/chain/beaconProposerCache.js +3 -0
- package/lib/chain/beaconProposerCache.js.map +1 -1
- package/lib/chain/blocks/importBlock.js +9 -19
- package/lib/chain/blocks/importBlock.js.map +1 -1
- package/lib/chain/blocks/types.d.ts +66 -24
- package/lib/chain/blocks/types.js +39 -6
- package/lib/chain/blocks/types.js.map +1 -1
- package/lib/chain/blocks/verifyBlocksDataAvailability.js +21 -10
- package/lib/chain/blocks/verifyBlocksDataAvailability.js.map +1 -1
- package/lib/chain/blocks/writeBlockInputToDb.js +89 -15
- package/lib/chain/blocks/writeBlockInputToDb.js.map +1 -1
- package/lib/chain/chain.d.ts +16 -5
- package/lib/chain/chain.js +50 -5
- package/lib/chain/chain.js.map +1 -1
- package/lib/chain/emitter.d.ts +23 -2
- package/lib/chain/emitter.js +17 -0
- package/lib/chain/emitter.js.map +1 -1
- package/lib/chain/errors/dataColumnSidecarError.d.ts +69 -0
- package/lib/chain/errors/dataColumnSidecarError.js +21 -0
- package/lib/chain/errors/dataColumnSidecarError.js.map +1 -0
- package/lib/chain/errors/index.d.ts +1 -0
- package/lib/chain/errors/index.js +1 -0
- package/lib/chain/errors/index.js.map +1 -1
- package/lib/chain/interface.d.ts +10 -4
- package/lib/chain/interface.js.map +1 -1
- package/lib/chain/options.d.ts +6 -3
- package/lib/chain/options.js +4 -0
- package/lib/chain/options.js.map +1 -1
- package/lib/chain/produceBlock/produceBlockBody.d.ts +4 -2
- package/lib/chain/produceBlock/produceBlockBody.js +7 -2
- package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
- package/lib/chain/produceBlock/validateBlobsAndKzgCommitments.d.ts +3 -2
- package/lib/chain/produceBlock/validateBlobsAndKzgCommitments.js +25 -2
- package/lib/chain/produceBlock/validateBlobsAndKzgCommitments.js.map +1 -1
- package/lib/chain/seenCache/seenGossipBlockInput.d.ts +64 -18
- package/lib/chain/seenCache/seenGossipBlockInput.js +320 -53
- package/lib/chain/seenCache/seenGossipBlockInput.js.map +1 -1
- package/lib/chain/validation/blobSidecar.d.ts +1 -1
- package/lib/chain/validation/blobSidecar.js +6 -6
- package/lib/chain/validation/blobSidecar.js.map +1 -1
- package/lib/chain/validation/dataColumnSidecar.d.ts +28 -0
- package/lib/chain/validation/dataColumnSidecar.js +248 -0
- package/lib/chain/validation/dataColumnSidecar.js.map +1 -0
- package/lib/db/beacon.d.ts +3 -1
- package/lib/db/beacon.js +3 -1
- package/lib/db/beacon.js.map +1 -1
- package/lib/db/buckets.d.ts +3 -1
- package/lib/db/buckets.js +2 -0
- package/lib/db/buckets.js.map +1 -1
- package/lib/db/interface.d.ts +3 -1
- package/lib/db/repositories/dataColumnSidecars.d.ts +47 -0
- package/lib/db/repositories/dataColumnSidecars.js +40 -0
- package/lib/db/repositories/dataColumnSidecars.js.map +1 -0
- package/lib/db/repositories/dataColumnSidecarsArchive.d.ts +15 -0
- package/lib/db/repositories/dataColumnSidecarsArchive.js +23 -0
- package/lib/db/repositories/dataColumnSidecarsArchive.js.map +1 -0
- package/lib/db/repositories/index.d.ts +2 -0
- package/lib/db/repositories/index.js +2 -0
- package/lib/db/repositories/index.js.map +1 -1
- package/lib/execution/engine/http.d.ts +5 -3
- package/lib/execution/engine/http.js +70 -31
- package/lib/execution/engine/http.js.map +1 -1
- package/lib/execution/engine/interface.d.ts +4 -2
- package/lib/execution/engine/interface.js +1 -1
- package/lib/execution/engine/interface.js.map +1 -1
- package/lib/execution/engine/mock.d.ts +1 -0
- package/lib/execution/engine/mock.js +8 -3
- package/lib/execution/engine/mock.js.map +1 -1
- package/lib/execution/engine/types.d.ts +10 -0
- package/lib/execution/engine/types.js +6 -0
- package/lib/execution/engine/types.js.map +1 -1
- package/lib/metrics/metrics/beacon.d.ts +15 -0
- package/lib/metrics/metrics/beacon.js +59 -0
- package/lib/metrics/metrics/beacon.js.map +1 -1
- package/lib/metrics/metrics/lodestar.d.ts +15 -0
- package/lib/metrics/metrics/lodestar.js +32 -0
- package/lib/metrics/metrics/lodestar.js.map +1 -1
- package/lib/network/core/metrics.d.ts +10 -3
- package/lib/network/core/metrics.js +22 -4
- package/lib/network/core/metrics.js.map +1 -1
- package/lib/network/core/networkCore.d.ts +9 -3
- package/lib/network/core/networkCore.js +24 -12
- package/lib/network/core/networkCore.js.map +1 -1
- package/lib/network/core/networkCoreWorker.js +2 -0
- package/lib/network/core/networkCoreWorker.js.map +1 -1
- package/lib/network/core/networkCoreWorkerHandler.d.ts +5 -3
- package/lib/network/core/networkCoreWorkerHandler.js +7 -0
- package/lib/network/core/networkCoreWorkerHandler.js.map +1 -1
- package/lib/network/core/types.d.ts +8 -4
- package/lib/network/events.d.ts +4 -2
- package/lib/network/events.js.map +1 -1
- package/lib/network/gossip/encoding.js +1 -1
- package/lib/network/gossip/encoding.js.map +1 -1
- package/lib/network/gossip/gossipsub.js +6 -4
- package/lib/network/gossip/gossipsub.js.map +1 -1
- package/lib/network/gossip/interface.d.ts +10 -3
- package/lib/network/gossip/interface.js +1 -0
- package/lib/network/gossip/interface.js.map +1 -1
- package/lib/network/gossip/scoringParameters.js +7 -8
- package/lib/network/gossip/scoringParameters.js.map +1 -1
- package/lib/network/gossip/topic.d.ts +1047 -1031
- package/lib/network/gossip/topic.js +33 -13
- package/lib/network/gossip/topic.js.map +1 -1
- package/lib/network/interface.d.ts +13 -1
- package/lib/network/metadata.d.ts +10 -6
- package/lib/network/metadata.js +23 -4
- package/lib/network/metadata.js.map +1 -1
- package/lib/network/network.d.ts +13 -2
- package/lib/network/network.js +100 -33
- package/lib/network/network.js.map +1 -1
- package/lib/network/networkConfig.d.ts +23 -0
- package/lib/network/networkConfig.js +32 -0
- package/lib/network/networkConfig.js.map +1 -0
- package/lib/network/options.js +5 -0
- package/lib/network/options.js.map +1 -1
- package/lib/network/peers/discover.d.ts +8 -3
- package/lib/network/peers/discover.js +106 -13
- package/lib/network/peers/discover.js.map +1 -1
- package/lib/network/peers/peerManager.d.ts +10 -4
- package/lib/network/peers/peerManager.js +93 -11
- package/lib/network/peers/peerManager.js.map +1 -1
- package/lib/network/peers/peersData.d.ts +17 -3
- package/lib/network/peers/peersData.js.map +1 -1
- package/lib/network/peers/score/interface.d.ts +1 -1
- package/lib/network/peers/score/score.d.ts +2 -2
- package/lib/network/peers/score/score.js +4 -1
- package/lib/network/peers/score/score.js.map +1 -1
- package/lib/network/peers/score/store.d.ts +3 -1
- package/lib/network/peers/score/store.js +6 -2
- package/lib/network/peers/score/store.js.map +1 -1
- package/lib/network/peers/utils/assertPeerRelevance.d.ts +7 -3
- package/lib/network/peers/utils/assertPeerRelevance.js +10 -1
- package/lib/network/peers/utils/assertPeerRelevance.js.map +1 -1
- package/lib/network/peers/utils/prioritizePeers.d.ts +18 -7
- package/lib/network/peers/utils/prioritizePeers.js +43 -7
- package/lib/network/peers/utils/prioritizePeers.js.map +1 -1
- package/lib/network/processor/extractSlotRootFns.js +8 -1
- package/lib/network/processor/extractSlotRootFns.js.map +1 -1
- package/lib/network/processor/gossipHandlers.js +175 -18
- package/lib/network/processor/gossipHandlers.js.map +1 -1
- package/lib/network/processor/gossipQueues/index.js +6 -1
- package/lib/network/processor/gossipQueues/index.js.map +1 -1
- package/lib/network/processor/index.js +3 -2
- package/lib/network/processor/index.js.map +1 -1
- package/lib/network/reqresp/ReqRespBeaconNode.d.ts +2 -2
- package/lib/network/reqresp/ReqRespBeaconNode.js +32 -10
- package/lib/network/reqresp/ReqRespBeaconNode.js.map +1 -1
- package/lib/network/reqresp/beaconBlocksMaybeBlobsByRange.d.ts +15 -5
- package/lib/network/reqresp/beaconBlocksMaybeBlobsByRange.js +203 -14
- package/lib/network/reqresp/beaconBlocksMaybeBlobsByRange.js.map +1 -1
- package/lib/network/reqresp/beaconBlocksMaybeBlobsByRoot.d.ts +33 -5
- package/lib/network/reqresp/beaconBlocksMaybeBlobsByRoot.js +302 -28
- package/lib/network/reqresp/beaconBlocksMaybeBlobsByRoot.js.map +1 -1
- package/lib/network/reqresp/handlers/beaconBlocksByRange.d.ts +1 -1
- package/lib/network/reqresp/handlers/beaconBlocksByRange.js.map +1 -1
- package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.d.ts +8 -0
- package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js +106 -0
- package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js.map +1 -0
- package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.d.ts +6 -0
- package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.js +57 -0
- package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.js.map +1 -0
- package/lib/network/reqresp/handlers/index.js +10 -0
- package/lib/network/reqresp/handlers/index.js.map +1 -1
- package/lib/network/reqresp/handlers/status.js +3 -2
- package/lib/network/reqresp/handlers/status.js.map +1 -1
- package/lib/network/reqresp/protocols.d.ts +4 -0
- package/lib/network/reqresp/protocols.js +20 -0
- package/lib/network/reqresp/protocols.js.map +1 -1
- package/lib/network/reqresp/rateLimit.js +11 -1
- package/lib/network/reqresp/rateLimit.js.map +1 -1
- package/lib/network/reqresp/types.d.ts +15 -8
- package/lib/network/reqresp/types.js +10 -3
- package/lib/network/reqresp/types.js.map +1 -1
- package/lib/network/statusCache.d.ts +5 -5
- package/lib/network/statusCache.js.map +1 -1
- package/lib/network/subnets/attnetsService.js +6 -6
- package/lib/network/subnets/attnetsService.js.map +1 -1
- package/lib/network/subnets/interface.d.ts +3 -0
- package/lib/network/subnets/interface.js +14 -1
- package/lib/network/subnets/interface.js.map +1 -1
- package/lib/network/subnets/syncnetsService.js +4 -5
- package/lib/network/subnets/syncnetsService.js.map +1 -1
- package/lib/network/subscribeBoundary.d.ts +5 -0
- package/lib/network/subscribeBoundary.js +4 -0
- package/lib/network/subscribeBoundary.js.map +1 -0
- package/lib/node/nodejs.js +1 -6
- package/lib/node/nodejs.js.map +1 -1
- package/lib/sync/interface.d.ts +2 -2
- package/lib/sync/interface.js +1 -1
- package/lib/sync/interface.js.map +1 -1
- package/lib/sync/range/batch.d.ts +9 -2
- package/lib/sync/range/batch.js +23 -7
- package/lib/sync/range/batch.js.map +1 -1
- package/lib/sync/range/chain.d.ts +16 -1
- package/lib/sync/range/chain.js +105 -29
- package/lib/sync/range/chain.js.map +1 -1
- package/lib/sync/range/range.d.ts +3 -2
- package/lib/sync/range/range.js +9 -3
- package/lib/sync/range/range.js.map +1 -1
- package/lib/sync/range/utils/chainTarget.d.ts +5 -1
- package/lib/sync/range/utils/chainTarget.js +26 -1
- package/lib/sync/range/utils/chainTarget.js.map +1 -1
- package/lib/sync/range/utils/peerBalancer.d.ts +12 -5
- package/lib/sync/range/utils/peerBalancer.js +69 -10
- package/lib/sync/range/utils/peerBalancer.js.map +1 -1
- package/lib/sync/unknownBlock.d.ts +8 -1
- package/lib/sync/unknownBlock.js +226 -68
- package/lib/sync/unknownBlock.js.map +1 -1
- package/lib/sync/utils/remoteSyncType.d.ts +4 -4
- package/lib/sync/utils/remoteSyncType.js.map +1 -1
- package/lib/util/blobs.d.ts +18 -1
- package/lib/util/blobs.js +104 -1
- package/lib/util/blobs.js.map +1 -1
- package/lib/util/dataColumns.d.ts +137 -0
- package/lib/util/dataColumns.js +353 -0
- package/lib/util/dataColumns.js.map +1 -0
- package/lib/util/kzg.d.ts +2 -34
- package/lib/util/kzg.js +2 -123
- package/lib/util/kzg.js.map +1 -1
- package/lib/util/metadata.d.ts +4 -0
- package/lib/util/metadata.js +7 -0
- package/lib/util/metadata.js.map +1 -1
- package/lib/util/sszBytes.d.ts +1 -0
- package/lib/util/sszBytes.js +17 -0
- package/lib/util/sszBytes.js.map +1 -1
- package/package.json +15 -15
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
import { ENR } from "@chainsafe/enr";
|
|
2
|
-
import {
|
|
2
|
+
import { toHexString } from "@chainsafe/ssz";
|
|
3
|
+
import { ATTESTATION_SUBNET_COUNT, ForkSeq, SYNC_COMMITTEE_SUBNET_COUNT } from "@lodestar/params";
|
|
3
4
|
import { pruneSetToMax, sleep } from "@lodestar/utils";
|
|
5
|
+
import { bytesToInt } from "@lodestar/utils";
|
|
6
|
+
import { getCustodyGroups } from "../../util/dataColumns.js";
|
|
4
7
|
import { Discv5Worker } from "../discv5/index.js";
|
|
5
8
|
import { getLibp2pError } from "../libp2p/error.js";
|
|
6
9
|
import { ENRKey, SubnetType } from "../metadata.js";
|
|
10
|
+
import { computeNodeId } from "../subnets/interface.js";
|
|
7
11
|
import { getConnectionsMap, prettyPrintPeerId } from "../util.js";
|
|
8
12
|
import { ScoreState } from "./score/index.js";
|
|
9
13
|
import { deserializeEnrSubnets, zeroAttnets, zeroSyncnets } from "./utils/enrSubnetsDeserialize.js";
|
|
@@ -59,7 +63,7 @@ export class PeerDiscovery {
|
|
|
59
63
|
}
|
|
60
64
|
const attnets = zeroAttnets;
|
|
61
65
|
const syncnets = zeroSyncnets;
|
|
62
|
-
const status = this.handleDiscoveredPeer(id, multiaddrs[0], attnets, syncnets);
|
|
66
|
+
const status = this.handleDiscoveredPeer(id, multiaddrs[0], attnets, syncnets, undefined);
|
|
63
67
|
this.logger.debug("Discovered peer via libp2p", { peer: prettyPrintPeerId(id), status });
|
|
64
68
|
this.metrics?.discovery.discoveredStatus.inc({ status });
|
|
65
69
|
};
|
|
@@ -81,22 +85,34 @@ export class PeerDiscovery {
|
|
|
81
85
|
// Are this fields mandatory?
|
|
82
86
|
const attnetsBytes = enr.kvs.get(ENRKey.attnets); // 64 bits
|
|
83
87
|
const syncnetsBytes = enr.kvs.get(ENRKey.syncnets); // 4 bits
|
|
88
|
+
const custodyGroupCountBytes = enr.kvs.get(ENRKey.cgc); // 64 bits
|
|
89
|
+
if (custodyGroupCountBytes === undefined) {
|
|
90
|
+
this.logger.warn("peer discovered with no cgc assuming 4", exportENRToJSON(enr));
|
|
91
|
+
}
|
|
84
92
|
// Use faster version than ssz's implementation that leverages pre-cached.
|
|
85
93
|
// Some nodes don't serialize the bitfields properly, encoding the syncnets as attnets,
|
|
86
94
|
// which cause the ssz implementation to throw on validation. deserializeEnrSubnets() will
|
|
87
95
|
// never throw and treat too long or too short bitfields as zero-ed
|
|
88
96
|
const attnets = attnetsBytes ? deserializeEnrSubnets(attnetsBytes, ATTESTATION_SUBNET_COUNT) : zeroAttnets;
|
|
89
97
|
const syncnets = syncnetsBytes ? deserializeEnrSubnets(syncnetsBytes, SYNC_COMMITTEE_SUBNET_COUNT) : zeroSyncnets;
|
|
90
|
-
const
|
|
91
|
-
this.
|
|
98
|
+
const custodyGroupCount = custodyGroupCountBytes ? bytesToInt(custodyGroupCountBytes, "be") : undefined;
|
|
99
|
+
const status = this.handleDiscoveredPeer(peerId, multiaddrTCP, attnets, syncnets, custodyGroupCount);
|
|
100
|
+
this.logger.debug("Discovered peer via discv5", {
|
|
101
|
+
peer: prettyPrintPeerId(peerId),
|
|
102
|
+
status,
|
|
103
|
+
custodySubnetCount: custodyGroupCount,
|
|
104
|
+
});
|
|
92
105
|
this.metrics?.discovery.discoveredStatus.inc({ status });
|
|
93
106
|
};
|
|
94
|
-
const { libp2p, peerRpcScores, metrics, logger } = modules;
|
|
107
|
+
const { libp2p, clock, peerRpcScores, metrics, logger, networkConfig } = modules;
|
|
95
108
|
this.libp2p = libp2p;
|
|
109
|
+
this.clock = clock;
|
|
96
110
|
this.peerRpcScores = peerRpcScores;
|
|
97
111
|
this.metrics = metrics;
|
|
98
112
|
this.logger = logger;
|
|
113
|
+
this.config = networkConfig.getConfig();
|
|
99
114
|
this.discv5 = discv5;
|
|
115
|
+
this.groupRequests = new Map();
|
|
100
116
|
this.discv5StartMs = 0;
|
|
101
117
|
this.discv5StartMs = Date.now();
|
|
102
118
|
this.discv5FirstQueryDelayMs = opts.discv5FirstQueryDelayMs;
|
|
@@ -122,6 +138,11 @@ export class PeerDiscovery {
|
|
|
122
138
|
metrics.discovery.cachedENRsSize.addCollect(() => {
|
|
123
139
|
metrics.discovery.cachedENRsSize.set(this.cachedENRs.size);
|
|
124
140
|
metrics.discovery.peersToConnect.set(this.peersToConnect);
|
|
141
|
+
// PeerDAS metrics
|
|
142
|
+
const groupsToConnect = Array.from(this.groupRequests.values());
|
|
143
|
+
const groupPeersToConnect = groupsToConnect.reduce((acc, elem) => acc + elem, 0);
|
|
144
|
+
metrics.discovery.groupPeersToConnect.set(groupPeersToConnect);
|
|
145
|
+
metrics.discovery.groupsToConnect.set(groupsToConnect.filter((elem) => elem > 0).length);
|
|
125
146
|
for (const type of [SubnetType.attnets, SubnetType.syncnets]) {
|
|
126
147
|
const subnetPeersToConnect = Array.from(this.subnetRequests[type].values()).reduce((acc, { peersToConnect }) => acc + peersToConnect, 0);
|
|
127
148
|
metrics.discovery.subnetPeersToConnect.set({ type }, subnetPeersToConnect);
|
|
@@ -136,7 +157,7 @@ export class PeerDiscovery {
|
|
|
136
157
|
privateKey: modules.privateKey,
|
|
137
158
|
metrics: modules.metrics ?? undefined,
|
|
138
159
|
logger: modules.logger,
|
|
139
|
-
config: modules.
|
|
160
|
+
config: modules.networkConfig.getConfig(),
|
|
140
161
|
genesisTime: modules.clock.genesisTime,
|
|
141
162
|
});
|
|
142
163
|
return new PeerDiscovery(modules, opts, discv5);
|
|
@@ -148,8 +169,9 @@ export class PeerDiscovery {
|
|
|
148
169
|
}
|
|
149
170
|
/**
|
|
150
171
|
* Request to find peers, both on specific subnets and in general
|
|
172
|
+
* pre-fulu groupRequests is empty
|
|
151
173
|
*/
|
|
152
|
-
discoverPeers(peersToConnect, subnetRequests = []) {
|
|
174
|
+
discoverPeers(peersToConnect, groupRequests, subnetRequests = []) {
|
|
153
175
|
const subnetsToDiscoverPeers = [];
|
|
154
176
|
const cachedENRsToDial = new Map();
|
|
155
177
|
// Iterate in reverse to consider first the most recent ENRs
|
|
@@ -171,14 +193,38 @@ export class PeerDiscovery {
|
|
|
171
193
|
}
|
|
172
194
|
cachedENRsReverse.reverse();
|
|
173
195
|
this.peersToConnect += peersToConnect;
|
|
196
|
+
// starting from PeerDAS, we need to prioritize column subnet peers first in order to have stable subnet sampling
|
|
197
|
+
const groupsToDiscover = new Set();
|
|
198
|
+
let groupPeersToDiscover = 0;
|
|
199
|
+
const forkSeq = this.config.getForkSeq(this.clock.currentSlot);
|
|
200
|
+
if (forkSeq >= ForkSeq.fulu) {
|
|
201
|
+
group: for (const [group, maxPeersToConnect] of groupRequests) {
|
|
202
|
+
let cachedENRsInGroup = 0;
|
|
203
|
+
for (const cachedENR of cachedENRsReverse) {
|
|
204
|
+
if (cachedENR.peerCustodyGroups?.includes(group)) {
|
|
205
|
+
cachedENRsToDial.set(cachedENR.peerId.toString(), cachedENR);
|
|
206
|
+
if (++cachedENRsInGroup >= maxPeersToConnect) {
|
|
207
|
+
continue group;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
const groupPeersToConnect = Math.max(maxPeersToConnect - cachedENRsInGroup, 0);
|
|
211
|
+
this.groupRequests.set(group, groupPeersToConnect);
|
|
212
|
+
groupsToDiscover.add(group);
|
|
213
|
+
groupPeersToDiscover += groupPeersToConnect;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
174
217
|
subnet: for (const subnetRequest of subnetRequests) {
|
|
175
218
|
// Get cached ENRs from the discovery service that are in the requested `subnetId`, but not connected yet
|
|
176
219
|
let cachedENRsInSubnet = 0;
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
if (
|
|
181
|
-
|
|
220
|
+
// only dial attnet/syncnet peers if subnet sampling peers are stable
|
|
221
|
+
if (groupPeersToDiscover === 0) {
|
|
222
|
+
for (const cachedENR of cachedENRsReverse) {
|
|
223
|
+
if (cachedENR.subnets[subnetRequest.type][subnetRequest.subnet]) {
|
|
224
|
+
cachedENRsToDial.set(cachedENR.peerId.toString(), cachedENR);
|
|
225
|
+
if (++cachedENRsInSubnet >= subnetRequest.maxPeersToDiscover) {
|
|
226
|
+
continue subnet;
|
|
227
|
+
}
|
|
182
228
|
}
|
|
183
229
|
}
|
|
184
230
|
}
|
|
@@ -218,6 +264,8 @@ export class PeerDiscovery {
|
|
|
218
264
|
peersToConnect,
|
|
219
265
|
peersAvailableToDial: cachedENRsToDial.size,
|
|
220
266
|
subnetsToDiscover: subnetsToDiscoverPeers.length,
|
|
267
|
+
groupsToDiscover: Array.from(groupsToDiscover).join(","),
|
|
268
|
+
groupPeersToDiscover,
|
|
221
269
|
shouldRunFindRandomNodeQuery,
|
|
222
270
|
});
|
|
223
271
|
}
|
|
@@ -256,7 +304,9 @@ export class PeerDiscovery {
|
|
|
256
304
|
/**
|
|
257
305
|
* Progressively called by peer discovery as a result of any query.
|
|
258
306
|
*/
|
|
259
|
-
handleDiscoveredPeer(peerId, multiaddrTCP, attnets, syncnets) {
|
|
307
|
+
handleDiscoveredPeer(peerId, multiaddrTCP, attnets, syncnets, custodySubnetCount) {
|
|
308
|
+
const nodeId = computeNodeId(peerId);
|
|
309
|
+
this.logger.warn("handleDiscoveredPeer", { nodeId: toHexString(nodeId), peerId: peerId.toString() });
|
|
260
310
|
try {
|
|
261
311
|
// Check if peer is not banned or disconnected
|
|
262
312
|
if (this.peerRpcScores.getScoreState(peerId) !== ScoreState.Healthy) {
|
|
@@ -272,12 +322,17 @@ export class PeerDiscovery {
|
|
|
272
322
|
.find((pendingDial) => pendingDial.peerId?.equals(peerId))) {
|
|
273
323
|
return DiscoveredPeerStatus.already_dialing;
|
|
274
324
|
}
|
|
325
|
+
const forkSeq = this.config.getForkSeq(this.clock.currentSlot);
|
|
275
326
|
// Should dial peer?
|
|
276
327
|
const cachedPeer = {
|
|
277
328
|
peerId,
|
|
278
329
|
multiaddrTCP,
|
|
279
330
|
subnets: { attnets, syncnets },
|
|
280
331
|
addedUnixMs: Date.now(),
|
|
332
|
+
// for pre-fulu, peerCustodyGroups is null
|
|
333
|
+
peerCustodyGroups: forkSeq >= ForkSeq.fulu
|
|
334
|
+
? getCustodyGroups(nodeId, custodySubnetCount ?? this.config.CUSTODY_REQUIREMENT)
|
|
335
|
+
: null,
|
|
281
336
|
};
|
|
282
337
|
// Only dial peer if necessary
|
|
283
338
|
if (this.shouldDialPeer(cachedPeer)) {
|
|
@@ -296,6 +351,33 @@ export class PeerDiscovery {
|
|
|
296
351
|
}
|
|
297
352
|
}
|
|
298
353
|
shouldDialPeer(peer) {
|
|
354
|
+
const forkSeq = this.config.getForkSeq(this.clock.currentSlot);
|
|
355
|
+
if (forkSeq >= ForkSeq.fulu && peer.peerCustodyGroups !== null) {
|
|
356
|
+
// pre-fulu `this.groupRequests` is empty
|
|
357
|
+
// starting from fulu, we need to make sure we have stable subnet sampling peers first
|
|
358
|
+
// given SAMPLES_PER_SLOT = 8 and 100 peers, we have 800 custody columns from peers
|
|
359
|
+
// with NUMBER_OF_CUSTODY_GROUPS = 128, we have 800 / 128 = 6.25 peers per column in average
|
|
360
|
+
// it would not be hard to find TARGET_SUBNET_PEERS(6) peers per sampling columns columns and TARGET_GROUP_PEERS_PER_SUBNET(4) peers per non-sampling columns
|
|
361
|
+
// after some first heartbeats, we should have no more column requested, then go with conditions of prior forks
|
|
362
|
+
let hasMatchingGroup = false;
|
|
363
|
+
let groupRequestCount = 0;
|
|
364
|
+
for (const [group, peersToConnect] of this.groupRequests.entries()) {
|
|
365
|
+
if (peersToConnect <= 0) {
|
|
366
|
+
this.groupRequests.delete(group);
|
|
367
|
+
}
|
|
368
|
+
else if (peer.peerCustodyGroups.includes(group)) {
|
|
369
|
+
this.groupRequests.set(group, Math.max(0, peersToConnect - 1));
|
|
370
|
+
hasMatchingGroup = true;
|
|
371
|
+
groupRequestCount += peersToConnect;
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
// if subnet sampling peers are not stable and this peer is not in the requested columns, ignore it
|
|
375
|
+
if (groupRequestCount > 0 && !hasMatchingGroup) {
|
|
376
|
+
this.metrics?.discovery.notDialReason.inc({ reason: NotDialReason.not_contain_requested_sampling_groups });
|
|
377
|
+
return false;
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
// logics up to Deneb fork
|
|
299
381
|
for (const type of [SubnetType.attnets, SubnetType.syncnets]) {
|
|
300
382
|
for (const [subnet, { toUnixMs, peersToConnect }] of this.subnetRequests[type].entries()) {
|
|
301
383
|
if (toUnixMs < Date.now() || peersToConnect === 0) {
|
|
@@ -320,6 +402,7 @@ export class PeerDiscovery {
|
|
|
320
402
|
if (this.peersToConnect > 0) {
|
|
321
403
|
return true;
|
|
322
404
|
}
|
|
405
|
+
this.metrics?.discovery.notDialReason.inc({ reason: NotDialReason.not_contain_requested_attnet_syncnet_subnets });
|
|
323
406
|
return false;
|
|
324
407
|
}
|
|
325
408
|
/**
|
|
@@ -405,4 +488,14 @@ function formatLibp2pDialError(e) {
|
|
|
405
488
|
e.stack = undefined;
|
|
406
489
|
}
|
|
407
490
|
}
|
|
491
|
+
function exportENRToJSON(enr) {
|
|
492
|
+
if (enr === undefined) {
|
|
493
|
+
return undefined;
|
|
494
|
+
}
|
|
495
|
+
return {
|
|
496
|
+
ip4: enr.kvs.get("ip")?.toString(),
|
|
497
|
+
cgc: enr.kvs.get("cgc")?.toString(),
|
|
498
|
+
nodeId: enr.nodeId,
|
|
499
|
+
};
|
|
500
|
+
}
|
|
408
501
|
//# sourceMappingURL=discover.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discover.js","sourceRoot":"","sources":["../../../src/network/peers/discover.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"discover.js","sourceRoot":"","sources":["../../../src/network/peers/discover.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import { PeerId, PrivateKey } from "@libp2p/interface";
|
|
2
|
-
import { BeaconConfig } from "@lodestar/config";
|
|
3
2
|
import { LoggerNode } from "@lodestar/logger/node";
|
|
4
|
-
import { Metadata, phase0 } from "@lodestar/types";
|
|
3
|
+
import { Metadata, Status, phase0 } from "@lodestar/types";
|
|
5
4
|
import { IClock } from "../../util/clock.js";
|
|
6
5
|
import { NetworkCoreMetrics } from "../core/metrics.js";
|
|
7
6
|
import { LodestarDiscv5Opts } from "../discv5/types.js";
|
|
8
7
|
import { INetworkEventBus } from "../events.js";
|
|
9
8
|
import { Eth2Gossipsub } from "../gossip/gossipsub.js";
|
|
10
9
|
import { Libp2p } from "../interface.js";
|
|
10
|
+
import { SubnetType } from "../metadata.js";
|
|
11
|
+
import { NetworkConfig } from "../networkConfig.js";
|
|
11
12
|
import { StatusCache } from "../statusCache.js";
|
|
12
13
|
import { SubnetsService } from "../subnets/index.js";
|
|
13
14
|
import { PeerDiscovery } from "./discover.js";
|
|
@@ -18,6 +19,8 @@ export type PeerManagerOpts = {
|
|
|
18
19
|
targetPeers: number;
|
|
19
20
|
/** The maximum number of peers we allow (exceptions for subnet peers) */
|
|
20
21
|
maxPeers: number;
|
|
22
|
+
/** Target peer per PeerDAS group */
|
|
23
|
+
targetGroupPeers: number;
|
|
21
24
|
/**
|
|
22
25
|
* Delay the 1st query after starting discv5
|
|
23
26
|
* See https://github.com/ChainSafe/lodestar/issues/3423
|
|
@@ -37,7 +40,7 @@ export type PeerManagerOpts = {
|
|
|
37
40
|
*/
|
|
38
41
|
export interface IReqRespBeaconNodePeerManager {
|
|
39
42
|
sendPing(peerId: PeerId): Promise<phase0.Ping>;
|
|
40
|
-
sendStatus(peerId: PeerId, request:
|
|
43
|
+
sendStatus(peerId: PeerId, request: Status): Promise<Status>;
|
|
41
44
|
sendGoodbye(peerId: PeerId, request: phase0.Goodbye): Promise<void>;
|
|
42
45
|
sendMetadata(peerId: PeerId): Promise<Metadata>;
|
|
43
46
|
}
|
|
@@ -51,12 +54,13 @@ export type PeerManagerModules = {
|
|
|
51
54
|
attnetsService: SubnetsService;
|
|
52
55
|
syncnetsService: SubnetsService;
|
|
53
56
|
clock: IClock;
|
|
54
|
-
config: BeaconConfig;
|
|
55
57
|
peerRpcScores: IPeerRpcScoreStore;
|
|
56
58
|
events: INetworkEventBus;
|
|
59
|
+
networkConfig: NetworkConfig;
|
|
57
60
|
peersData: PeersData;
|
|
58
61
|
statusCache: StatusCache;
|
|
59
62
|
};
|
|
63
|
+
export type PeerRequestedSubnetType = SubnetType | "column";
|
|
60
64
|
type PeerIdStr = string;
|
|
61
65
|
/**
|
|
62
66
|
* Performs all peer management functionality in a single grouped class:
|
|
@@ -67,6 +71,7 @@ type PeerIdStr = string;
|
|
|
67
71
|
* - Disconnect peers if over target peers
|
|
68
72
|
*/
|
|
69
73
|
export declare class PeerManager {
|
|
74
|
+
private nodeId;
|
|
70
75
|
private readonly libp2p;
|
|
71
76
|
private readonly logger;
|
|
72
77
|
private readonly metrics;
|
|
@@ -75,6 +80,7 @@ export declare class PeerManager {
|
|
|
75
80
|
private readonly attnetsService;
|
|
76
81
|
private readonly syncnetsService;
|
|
77
82
|
private readonly clock;
|
|
83
|
+
private readonly networkConfig;
|
|
78
84
|
private readonly config;
|
|
79
85
|
private readonly peerRpcScores;
|
|
80
86
|
/** If null, discovery is disabled */
|
|
@@ -1,10 +1,12 @@
|
|
|
1
|
-
import { BitArray } from "@chainsafe/ssz";
|
|
2
|
-
import { SLOTS_PER_EPOCH, SYNC_COMMITTEE_SUBNET_COUNT } from "@lodestar/params";
|
|
1
|
+
import { BitArray, toHexString } from "@chainsafe/ssz";
|
|
2
|
+
import { ForkSeq, SLOTS_PER_EPOCH, SYNC_COMMITTEE_SUBNET_COUNT } from "@lodestar/params";
|
|
3
3
|
import { withTimeout } from "@lodestar/utils";
|
|
4
4
|
import { GOODBYE_KNOWN_CODES, GoodByeReasonCode, Libp2pEvent } from "../../constants/index.js";
|
|
5
|
+
import { getCustodyGroups, getDataColumns } from "../../util/dataColumns.js";
|
|
5
6
|
import { NetworkEvent } from "../events.js";
|
|
6
7
|
import { SubnetType } from "../metadata.js";
|
|
7
8
|
import { ReqRespMethod } from "../reqresp/ReqRespBeaconNode.js";
|
|
9
|
+
import { computeNodeId } from "../subnets/index.js";
|
|
8
10
|
import { getConnection, getConnectionsMap, prettyPrintPeerId } from "../util.js";
|
|
9
11
|
import { ClientKind, getKnownClientFromAgentVersion } from "./client.js";
|
|
10
12
|
import { PeerDiscovery } from "./discover.js";
|
|
@@ -41,6 +43,7 @@ const STARVATION_PRUNE_RATIO = 0.05;
|
|
|
41
43
|
* Relative factor of peers that are allowed to have a negative gossipsub score without penalizing them in lodestar.
|
|
42
44
|
*/
|
|
43
45
|
const ALLOWED_NEGATIVE_GOSSIPSUB_FACTOR = 0.1;
|
|
46
|
+
// TODO(fulu): dedupe with network/peers/peerData.ts
|
|
44
47
|
var RelevantPeerStatus;
|
|
45
48
|
(function (RelevantPeerStatus) {
|
|
46
49
|
RelevantPeerStatus["Unknown"] = "unknown";
|
|
@@ -106,6 +109,7 @@ export class PeerManager {
|
|
|
106
109
|
// NOTE: libp2p may emit two "peer:connect" events: One for inbound, one for outbound
|
|
107
110
|
// If that happens, it's okay. Only the "outbound" connection triggers immediate action
|
|
108
111
|
const now = Date.now();
|
|
112
|
+
const nodeId = computeNodeId(remotePeer);
|
|
109
113
|
const peerData = {
|
|
110
114
|
lastReceivedMsgUnixTsMs: direction === "outbound" ? 0 : now,
|
|
111
115
|
// If inbound, request after STATUS_INBOUND_GRACE_PERIOD
|
|
@@ -113,6 +117,7 @@ export class PeerManager {
|
|
|
113
117
|
connectedUnixTsMs: now,
|
|
114
118
|
relevantStatus: RelevantPeerStatus.Unknown,
|
|
115
119
|
direction,
|
|
120
|
+
nodeId,
|
|
116
121
|
peerId: remotePeer,
|
|
117
122
|
status: null,
|
|
118
123
|
metadata: null,
|
|
@@ -122,7 +127,7 @@ export class PeerManager {
|
|
|
122
127
|
};
|
|
123
128
|
this.connectedPeers.set(remotePeer.toString(), peerData);
|
|
124
129
|
if (direction === "outbound") {
|
|
125
|
-
//this.pingAndStatusTimeouts();
|
|
130
|
+
// this.pingAndStatusTimeouts();
|
|
126
131
|
void this.requestPing(remotePeer);
|
|
127
132
|
void this.requestStatus(remotePeer, this.statusCache.get());
|
|
128
133
|
}
|
|
@@ -153,6 +158,7 @@ export class PeerManager {
|
|
|
153
158
|
.merge(remotePeer, { tags: { [PEER_RELEVANT_TAG]: undefined } })
|
|
154
159
|
.catch((e) => this.logger.verbose("cannot untag peer", { peerId: remotePeer.toString() }, e));
|
|
155
160
|
};
|
|
161
|
+
const { networkConfig } = modules;
|
|
156
162
|
this.libp2p = modules.libp2p;
|
|
157
163
|
this.logger = modules.logger;
|
|
158
164
|
this.metrics = modules.metrics;
|
|
@@ -162,12 +168,14 @@ export class PeerManager {
|
|
|
162
168
|
this.syncnetsService = modules.syncnetsService;
|
|
163
169
|
this.statusCache = modules.statusCache;
|
|
164
170
|
this.clock = modules.clock;
|
|
165
|
-
this.
|
|
171
|
+
this.networkConfig = networkConfig;
|
|
172
|
+
this.config = networkConfig.getConfig();
|
|
166
173
|
this.peerRpcScores = modules.peerRpcScores;
|
|
167
174
|
this.networkEventBus = modules.events;
|
|
168
175
|
this.connectedPeers = modules.peersData.connectedPeers;
|
|
169
176
|
this.opts = opts;
|
|
170
177
|
this.discovery = discovery;
|
|
178
|
+
this.nodeId = networkConfig.getNodeId();
|
|
171
179
|
const { metrics } = modules;
|
|
172
180
|
if (metrics) {
|
|
173
181
|
metrics.peers.addCollect(() => this.runPeerCountMetrics(metrics));
|
|
@@ -254,6 +262,11 @@ export class PeerManager {
|
|
|
254
262
|
onPing(peer, seqNumber) {
|
|
255
263
|
// if the sequence number is unknown update the peer's metadata
|
|
256
264
|
const metadata = this.connectedPeers.get(peer.toString())?.metadata;
|
|
265
|
+
this.logger.warn("onPing", {
|
|
266
|
+
seqNumber,
|
|
267
|
+
metaSeqNumber: metadata?.seqNumber,
|
|
268
|
+
cond: !metadata || metadata.seqNumber < seqNumber,
|
|
269
|
+
});
|
|
257
270
|
if (!metadata || metadata.seqNumber < seqNumber) {
|
|
258
271
|
void this.requestMetadata(peer);
|
|
259
272
|
}
|
|
@@ -265,12 +278,37 @@ export class PeerManager {
|
|
|
265
278
|
// Store metadata always in case the peer updates attnets but not the sequence number
|
|
266
279
|
// Trust that the peer always sends the latest metadata (From Lighthouse)
|
|
267
280
|
const peerData = this.connectedPeers.get(peer.toString());
|
|
281
|
+
this.logger.warn("onMetadata", {
|
|
282
|
+
peer: peer.toString(),
|
|
283
|
+
peerData: peerData !== undefined,
|
|
284
|
+
custodyGroupCount: metadata.custodyGroupCount,
|
|
285
|
+
});
|
|
268
286
|
if (peerData) {
|
|
287
|
+
const oldMetadata = peerData.metadata;
|
|
288
|
+
const custodyGroupCount = metadata.custodyGroupCount ?? this.config.CUSTODY_REQUIREMENT;
|
|
289
|
+
const samplingGroupCount = Math.max(this.config.SAMPLES_PER_SLOT, custodyGroupCount);
|
|
290
|
+
const nodeId = peerData?.nodeId ?? computeNodeId(peer);
|
|
291
|
+
// TODO(fulu): this should be columns not groups. need to change everywhere
|
|
292
|
+
const custodyGroups = oldMetadata == null || oldMetadata.custodyGroups == null || custodyGroupCount !== oldMetadata.custodyGroupCount
|
|
293
|
+
? getCustodyGroups(nodeId, custodyGroupCount)
|
|
294
|
+
: oldMetadata.custodyGroups;
|
|
295
|
+
const oldSamplingGroupCount = Math.max(this.config.SAMPLES_PER_SLOT, oldMetadata?.custodyGroupCount ?? 0);
|
|
296
|
+
const samplingGroups = oldMetadata == null || oldMetadata.samplingGroups == null || samplingGroupCount !== oldSamplingGroupCount
|
|
297
|
+
? getCustodyGroups(nodeId, samplingGroupCount)
|
|
298
|
+
: oldMetadata.samplingGroups;
|
|
269
299
|
peerData.metadata = {
|
|
270
300
|
seqNumber: metadata.seqNumber,
|
|
271
301
|
attnets: metadata.attnets,
|
|
272
302
|
syncnets: metadata.syncnets ?? BitArray.fromBitLen(SYNC_COMMITTEE_SUBNET_COUNT),
|
|
303
|
+
custodyGroupCount: metadata.custodyGroupCount ??
|
|
304
|
+
// TODO: spec says that Clients MAY reject peers with a value less than CUSTODY_REQUIREMENT
|
|
305
|
+
this.config.CUSTODY_REQUIREMENT,
|
|
306
|
+
custodyGroups,
|
|
307
|
+
samplingGroups,
|
|
273
308
|
};
|
|
309
|
+
if (oldMetadata === null || oldMetadata.custodyGroupCount !== peerData.metadata.custodyGroupCount) {
|
|
310
|
+
void this.requestStatus(peer, this.statusCache.get());
|
|
311
|
+
}
|
|
274
312
|
}
|
|
275
313
|
}
|
|
276
314
|
/**
|
|
@@ -297,9 +335,10 @@ export class PeerManager {
|
|
|
297
335
|
peerData.lastStatusUnixTsMs = Date.now();
|
|
298
336
|
peerData.status = status;
|
|
299
337
|
}
|
|
338
|
+
const forkName = this.config.getForkName(this.clock.currentSlot);
|
|
300
339
|
let isIrrelevant;
|
|
301
340
|
try {
|
|
302
|
-
const irrelevantReasonType = assertPeerRelevance(status, this.statusCache.get(), this.clock.currentSlot);
|
|
341
|
+
const irrelevantReasonType = assertPeerRelevance(status, this.statusCache.get(), this.clock.currentSlot, forkName);
|
|
303
342
|
if (irrelevantReasonType === null) {
|
|
304
343
|
isIrrelevant = false;
|
|
305
344
|
}
|
|
@@ -334,19 +373,50 @@ export class PeerManager {
|
|
|
334
373
|
peerData.relevantStatus = RelevantPeerStatus.relevant;
|
|
335
374
|
}
|
|
336
375
|
if (getConnection(this.libp2p, peer.toString())) {
|
|
337
|
-
|
|
376
|
+
const nodeId = peerData?.nodeId ?? computeNodeId(peer);
|
|
377
|
+
const custodyGroupCount = peerData?.metadata?.custodyGroupCount;
|
|
378
|
+
const peerCustodyGroupCount = custodyGroupCount ?? this.config.CUSTODY_REQUIREMENT;
|
|
379
|
+
const dataColumns = getDataColumns(nodeId, peerCustodyGroupCount);
|
|
380
|
+
// on metadata, we should have custodyGroupss
|
|
381
|
+
const peerCustodyGroups = peerData?.metadata?.custodyGroups ?? getCustodyGroups(nodeId, peerCustodyGroupCount);
|
|
382
|
+
const sampleSubnets = this.networkConfig.getCustodyConfig().sampledSubnets;
|
|
383
|
+
const matchingSubnetsNum = sampleSubnets.reduce((acc, elem) => acc + (dataColumns.includes(elem) ? 1 : 0), 0);
|
|
384
|
+
const hasAllColumns = matchingSubnetsNum === sampleSubnets.length;
|
|
385
|
+
const clientAgent = peerData?.agentClient ?? ClientKind.Unknown;
|
|
386
|
+
this.logger.warn(`onStatus ${custodyGroupCount === undefined ? "undefined custody count assuming 4" : ""}`, {
|
|
387
|
+
nodeId: toHexString(nodeId),
|
|
388
|
+
myNodeId: toHexString(this.nodeId),
|
|
389
|
+
peerId: peer.toString(),
|
|
390
|
+
custodyGroupCount,
|
|
391
|
+
hasAllColumns,
|
|
392
|
+
dataColumns: dataColumns.join(" "),
|
|
393
|
+
matchingSubnetsNum,
|
|
394
|
+
peerCustodyGroups: peerCustodyGroups.join(" "),
|
|
395
|
+
mySampleSubnets: sampleSubnets.join(" "),
|
|
396
|
+
clientAgent,
|
|
397
|
+
});
|
|
398
|
+
// TODO @matthewkeil need to double check the dataColumns is received on the other end of this correctly
|
|
399
|
+
this.networkEventBus.emit(NetworkEvent.peerConnected, {
|
|
400
|
+
peer: peer.toString(),
|
|
401
|
+
status,
|
|
402
|
+
dataColumns,
|
|
403
|
+
clientAgent: `${clientAgent}-cgc:${dataColumns.length}`,
|
|
404
|
+
});
|
|
338
405
|
}
|
|
339
406
|
}
|
|
340
407
|
async requestMetadata(peer) {
|
|
341
408
|
try {
|
|
409
|
+
this.logger.warn("requestMetadata", { peer: peer.toString() });
|
|
342
410
|
this.onMetadata(peer, await this.reqResp.sendMetadata(peer));
|
|
343
411
|
}
|
|
344
|
-
catch (
|
|
412
|
+
catch (e) {
|
|
413
|
+
this.logger.error("invalid requestMetadata response", undefined, e);
|
|
345
414
|
// TODO: Downvote peer here or in the reqResp layer
|
|
346
415
|
}
|
|
347
416
|
}
|
|
348
417
|
async requestPing(peer) {
|
|
349
418
|
try {
|
|
419
|
+
this.logger.warn("requestPing", { peer: peer.toString() });
|
|
350
420
|
this.onPing(peer, await this.reqResp.sendPing(peer));
|
|
351
421
|
// If peer replies a PING request also update lastReceivedMsg
|
|
352
422
|
const peerData = this.connectedPeers.get(peer.toString());
|
|
@@ -407,7 +477,8 @@ export class PeerManager {
|
|
|
407
477
|
this.clock.currentSlot - status.headSlot > STARVATION_THRESHOLD_SLOTS;
|
|
408
478
|
this.lastStatus = status;
|
|
409
479
|
this.metrics?.peerManager.starved.set(starved ? 1 : 0);
|
|
410
|
-
const
|
|
480
|
+
const forkSeq = this.config.getForkSeq(this.clock.currentSlot);
|
|
481
|
+
const { peersToDisconnect, peersToConnect, attnetQueries, syncnetQueries, groupQueries } = prioritizePeers(connectedHealthyPeers.map((peer) => {
|
|
411
482
|
const peerData = this.connectedPeers.get(peer.toString());
|
|
412
483
|
return {
|
|
413
484
|
id: peer,
|
|
@@ -415,17 +486,21 @@ export class PeerManager {
|
|
|
415
486
|
status: peerData?.status ?? null,
|
|
416
487
|
attnets: peerData?.metadata?.attnets ?? null,
|
|
417
488
|
syncnets: peerData?.metadata?.syncnets ?? null,
|
|
489
|
+
// here we care samplingGroups not custodyGroups in order to know which column subnets peers subscribe to
|
|
490
|
+
samplingGroups: peerData?.metadata?.samplingGroups ?? null,
|
|
418
491
|
score: this.peerRpcScores.getScore(peer),
|
|
419
492
|
};
|
|
420
493
|
}),
|
|
421
494
|
// Collect subnets which we need peers for in the current slot
|
|
422
|
-
this.attnetsService.getActiveSubnets(), this.syncnetsService.getActiveSubnets(),
|
|
495
|
+
this.attnetsService.getActiveSubnets(), this.syncnetsService.getActiveSubnets(),
|
|
496
|
+
// ignore samplingGroups for pre-fulu forks
|
|
497
|
+
forkSeq >= ForkSeq.fulu ? this.networkConfig.getCustodyConfig().sampleGroups : undefined, {
|
|
423
498
|
...this.opts,
|
|
424
499
|
status,
|
|
425
500
|
starved,
|
|
426
501
|
starvationPruneRatio: STARVATION_PRUNE_RATIO,
|
|
427
502
|
starvationThresholdSlots: STARVATION_THRESHOLD_SLOTS,
|
|
428
|
-
});
|
|
503
|
+
}, this.metrics);
|
|
429
504
|
const queriesMerged = [];
|
|
430
505
|
for (const { type, queries } of [
|
|
431
506
|
{ type: SubnetType.attnets, queries: attnetQueries },
|
|
@@ -446,6 +521,10 @@ export class PeerManager {
|
|
|
446
521
|
this.metrics?.peersRequestedSubnetsPeerCount.inc({ type }, count);
|
|
447
522
|
}
|
|
448
523
|
}
|
|
524
|
+
for (const maxPeersToDiscover of groupQueries.values()) {
|
|
525
|
+
this.metrics?.peersRequestedSubnetsToQuery.inc({ type: "column" }, 1);
|
|
526
|
+
this.metrics?.peersRequestedSubnetsPeerCount.inc({ type: "column" }, maxPeersToDiscover);
|
|
527
|
+
}
|
|
449
528
|
// disconnect first to have more slots before we dial new peers
|
|
450
529
|
for (const [reason, peers] of peersToDisconnect) {
|
|
451
530
|
this.metrics?.peersRequestedToDisconnect.inc({ reason }, peers.length);
|
|
@@ -456,7 +535,8 @@ export class PeerManager {
|
|
|
456
535
|
if (this.discovery) {
|
|
457
536
|
try {
|
|
458
537
|
this.metrics?.peersRequestedToConnect.inc(peersToConnect);
|
|
459
|
-
|
|
538
|
+
// for PeerDAS, lodestar implements subnet sampling strategy, hence we need to issue columnSubnetQueries to PeerDiscovery
|
|
539
|
+
this.discovery.discoverPeers(peersToConnect, groupQueries, queriesMerged);
|
|
460
540
|
}
|
|
461
541
|
catch (e) {
|
|
462
542
|
this.logger.error("Error on discoverPeers", {}, e);
|
|
@@ -524,6 +604,7 @@ export class PeerManager {
|
|
|
524
604
|
try {
|
|
525
605
|
const reason = GOODBYE_KNOWN_CODES[goodbye.toString()] || "";
|
|
526
606
|
this.metrics?.peerGoodbyeSent.inc({ reason });
|
|
607
|
+
this.logger.debug("disconnected peer", { reason, peerId: prettyPrintPeerId(peer) });
|
|
527
608
|
const conn = getConnection(this.libp2p, peer.toString());
|
|
528
609
|
if (conn && Date.now() - conn.timeline.open > LONG_PEER_CONNECTION_MS) {
|
|
529
610
|
this.metrics?.peerLongConnectionDisconnect.inc({ reason });
|
|
@@ -565,6 +646,7 @@ export class PeerManager {
|
|
|
565
646
|
const attnets = peerData?.metadata?.attnets;
|
|
566
647
|
// TODO: Consider optimizing by doing observe in batch
|
|
567
648
|
metrics.peerLongLivedAttnets.observe(attnets ? attnets.getTrueBitIndexes().length : 0);
|
|
649
|
+
metrics.peerColumnGroupCount.observe(peerData?.metadata?.custodyGroupCount ?? 0);
|
|
568
650
|
metrics.peerScoreByClient.observe({ client }, this.peerRpcScores.getScore(peerId));
|
|
569
651
|
metrics.peerGossipScoreByClient.observe({ client }, this.peerRpcScores.getGossipScore(peerId));
|
|
570
652
|
metrics.peerConnectionLength.observe((now - openCnx.timeline.open) / 1000);
|