@lodestar/beacon-node 1.45.0-dev.0cff4e6916 → 1.45.0-dev.246e0ddef4
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/pool/index.d.ts.map +1 -1
- package/lib/api/impl/beacon/pool/index.js +2 -42
- package/lib/api/impl/beacon/pool/index.js.map +1 -1
- package/lib/api/impl/beacon/state/index.d.ts.map +1 -1
- package/lib/api/impl/beacon/state/index.js +46 -3
- package/lib/api/impl/beacon/state/index.js.map +1 -1
- package/lib/api/impl/beacon/state/utils.d.ts +11 -2
- package/lib/api/impl/beacon/state/utils.d.ts.map +1 -1
- package/lib/api/impl/beacon/state/utils.js +39 -3
- 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 +37 -3
- package/lib/api/impl/validator/index.js.map +1 -1
- package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
- package/lib/chain/produceBlock/produceBlockBody.js +4 -12
- package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
- package/lib/chain/validation/executionPayloadBid.js +11 -10
- package/lib/chain/validation/executionPayloadBid.js.map +1 -1
- package/lib/network/core/metrics.d.ts +65 -0
- package/lib/network/core/metrics.d.ts.map +1 -1
- package/lib/network/core/metrics.js +94 -0
- package/lib/network/core/metrics.js.map +1 -1
- package/lib/network/discv5/utils.d.ts.map +1 -1
- package/lib/network/discv5/utils.js +12 -3
- package/lib/network/discv5/utils.js.map +1 -1
- package/lib/network/gossip/encoding.d.ts.map +1 -1
- package/lib/network/gossip/encoding.js +7 -0
- package/lib/network/gossip/encoding.js.map +1 -1
- package/lib/network/gossip/gossipsub.d.ts.map +1 -1
- package/lib/network/gossip/gossipsub.js +2 -1
- package/lib/network/gossip/gossipsub.js.map +1 -1
- package/lib/network/gossip/topic.d.ts +6 -1
- package/lib/network/gossip/topic.d.ts.map +1 -1
- package/lib/network/gossip/topic.js +23 -3
- package/lib/network/gossip/topic.js.map +1 -1
- package/lib/network/peers/peerManager.d.ts.map +1 -1
- package/lib/network/peers/peerManager.js +10 -0
- package/lib/network/peers/peerManager.js.map +1 -1
- package/lib/network/peers/score/score.d.ts +3 -1
- package/lib/network/peers/score/score.d.ts.map +1 -1
- package/lib/network/peers/score/score.js +6 -1
- package/lib/network/peers/score/score.js.map +1 -1
- package/lib/network/peers/score/store.d.ts.map +1 -1
- package/lib/network/peers/score/store.js +6 -1
- package/lib/network/peers/score/store.js.map +1 -1
- package/lib/network/peers/utils/prioritizePeers.d.ts.map +1 -1
- package/lib/network/peers/utils/prioritizePeers.js +14 -0
- package/lib/network/peers/utils/prioritizePeers.js.map +1 -1
- package/lib/network/processor/gossipHandlers.js +2 -2
- package/lib/network/processor/gossipHandlers.js.map +1 -1
- package/package.json +14 -14
- package/src/api/impl/beacon/pool/index.ts +0 -52
- package/src/api/impl/beacon/state/index.ts +52 -1
- package/src/api/impl/beacon/state/utils.ts +57 -4
- package/src/api/impl/validator/index.ts +45 -2
- package/src/chain/produceBlock/produceBlockBody.ts +9 -17
- package/src/chain/validation/executionPayloadBid.ts +14 -9
- package/src/network/core/metrics.ts +94 -0
- package/src/network/discv5/utils.ts +11 -3
- package/src/network/gossip/encoding.ts +7 -0
- package/src/network/gossip/gossipsub.ts +2 -1
- package/src/network/gossip/topic.ts +28 -4
- package/src/network/peers/peerManager.ts +11 -0
- package/src/network/peers/score/score.ts +8 -1
- package/src/network/peers/score/store.ts +8 -1
- package/src/network/peers/utils/prioritizePeers.ts +15 -0
- package/src/network/processor/gossipHandlers.ts +1 -1
|
@@ -415,8 +415,10 @@ export class PeerManager {
|
|
|
415
415
|
);
|
|
416
416
|
if (irrelevantReasonType === null) {
|
|
417
417
|
isIrrelevant = false;
|
|
418
|
+
this.metrics?.peerManager.relevanceCheck.inc({result: "relevant"});
|
|
418
419
|
} else {
|
|
419
420
|
isIrrelevant = true;
|
|
421
|
+
this.metrics?.peerManager.relevanceCheck.inc({result: irrelevantReasonType.code});
|
|
420
422
|
this.logger.debug("Irrelevant peer", {
|
|
421
423
|
peer: prettyPrintPeerId(peer),
|
|
422
424
|
reason: renderIrrelevantPeerType(irrelevantReasonType),
|
|
@@ -424,6 +426,7 @@ export class PeerManager {
|
|
|
424
426
|
}
|
|
425
427
|
} catch (e) {
|
|
426
428
|
this.logger.error("Irrelevant peer - unexpected error", {peer: prettyPrintPeerId(peer)}, e as Error);
|
|
429
|
+
this.metrics?.peerManager.relevanceCheck.inc({result: "error"});
|
|
427
430
|
isIrrelevant = true;
|
|
428
431
|
}
|
|
429
432
|
|
|
@@ -552,15 +555,18 @@ export class PeerManager {
|
|
|
552
555
|
for (const peer of connectedPeers) {
|
|
553
556
|
switch (this.peerRpcScores.getScoreState(peer)) {
|
|
554
557
|
case ScoreState.Banned:
|
|
558
|
+
this.metrics?.peerManager.peersPruned.inc({reason: "banned"});
|
|
555
559
|
void this.goodbyeAndDisconnect(peer, GoodByeReasonCode.BANNED);
|
|
556
560
|
break;
|
|
557
561
|
case ScoreState.Disconnected:
|
|
562
|
+
this.metrics?.peerManager.peersPruned.inc({reason: "score_too_low"});
|
|
558
563
|
void this.goodbyeAndDisconnect(peer, GoodByeReasonCode.SCORE_TOO_LOW);
|
|
559
564
|
break;
|
|
560
565
|
case ScoreState.Healthy:
|
|
561
566
|
connectedHealthyPeers.push(peer);
|
|
562
567
|
}
|
|
563
568
|
}
|
|
569
|
+
this.metrics?.peerManager.peersEvaluated.observe(connectedHealthyPeers.length);
|
|
564
570
|
|
|
565
571
|
const status = this.statusCache.get();
|
|
566
572
|
const starved =
|
|
@@ -572,6 +578,7 @@ export class PeerManager {
|
|
|
572
578
|
this.metrics?.peerManager.starved.set(starved ? 1 : 0);
|
|
573
579
|
const forkSeq = this.config.getForkSeq(this.clock.currentSlot);
|
|
574
580
|
|
|
581
|
+
const prioritizeTimer = this.metrics?.peerManager.prioritizePeersDuration.startTimer();
|
|
575
582
|
const {peersToDisconnect, peersToConnect, attnetQueries, syncnetQueries, custodyGroupQueries} = prioritizePeers(
|
|
576
583
|
connectedHealthyPeers.map((peer) => {
|
|
577
584
|
const peerData = this.connectedPeers.get(peer.toString());
|
|
@@ -601,6 +608,7 @@ export class PeerManager {
|
|
|
601
608
|
this.config,
|
|
602
609
|
this.metrics
|
|
603
610
|
);
|
|
611
|
+
prioritizeTimer?.();
|
|
604
612
|
|
|
605
613
|
const queriesMerged: SubnetDiscvQueryMs[] = [];
|
|
606
614
|
for (const {type, queries} of [
|
|
@@ -632,6 +640,7 @@ export class PeerManager {
|
|
|
632
640
|
// disconnect first to have more slots before we dial new peers
|
|
633
641
|
for (const [reason, peers] of peersToDisconnect) {
|
|
634
642
|
this.metrics?.peersRequestedToDisconnect.inc({reason}, peers.length);
|
|
643
|
+
this.metrics?.peerManager.peersPruned.inc({reason}, peers.length);
|
|
635
644
|
for (const peer of peers) {
|
|
636
645
|
void this.goodbyeAndDisconnect(peer, GoodByeReasonCode.TOO_MANY_PEERS);
|
|
637
646
|
}
|
|
@@ -659,6 +668,8 @@ export class PeerManager {
|
|
|
659
668
|
}
|
|
660
669
|
}
|
|
661
670
|
|
|
671
|
+
this.metrics?.peerManager.connectedPeersMapSize.set(this.connectedPeers.size);
|
|
672
|
+
|
|
662
673
|
timer?.();
|
|
663
674
|
|
|
664
675
|
this.logger.debug("peerManager heartbeat result", {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import {GoodByeReasonCode} from "../../../constants/network.js";
|
|
2
|
+
import {NetworkCoreMetrics} from "../../core/metrics.js";
|
|
2
3
|
import {
|
|
3
4
|
COOL_DOWN_BEFORE_DECAY_MS,
|
|
4
5
|
DEFAULT_SCORE,
|
|
@@ -23,13 +24,15 @@ export class RealScore implements IPeerScore {
|
|
|
23
24
|
/** The final score, computed from the above */
|
|
24
25
|
private score: number;
|
|
25
26
|
private lastUpdate: number;
|
|
27
|
+
private readonly metrics: NetworkCoreMetrics | null;
|
|
26
28
|
|
|
27
|
-
constructor() {
|
|
29
|
+
constructor(metrics: NetworkCoreMetrics | null = null) {
|
|
28
30
|
this.lodestarScore = DEFAULT_SCORE;
|
|
29
31
|
this.gossipScore = DEFAULT_SCORE;
|
|
30
32
|
this.score = DEFAULT_SCORE;
|
|
31
33
|
this.ignoreNegativeGossipScore = false;
|
|
32
34
|
this.lastUpdate = Date.now();
|
|
35
|
+
this.metrics = metrics;
|
|
33
36
|
}
|
|
34
37
|
|
|
35
38
|
isCoolingDown(): boolean {
|
|
@@ -136,6 +139,10 @@ export class RealScore implements IPeerScore {
|
|
|
136
139
|
this.recomputeScore();
|
|
137
140
|
const newState = scoreToState(this.score);
|
|
138
141
|
|
|
142
|
+
if (prevState !== newState) {
|
|
143
|
+
this.metrics?.peerManager.scoreStateTransitions.inc({from: prevState, to: newState});
|
|
144
|
+
}
|
|
145
|
+
|
|
139
146
|
if (prevState !== ScoreState.Banned && newState === ScoreState.Banned) {
|
|
140
147
|
// ban this peer for at least BANNED_BEFORE_DECAY_MS seconds
|
|
141
148
|
this.lastUpdate = Date.now() + COOL_DOWN_BEFORE_DECAY_MS;
|
|
@@ -32,7 +32,9 @@ export class PeerRpcScoreStore implements IPeerRpcScoreStore {
|
|
|
32
32
|
constructor(opts: PeerRpcScoreOpts = {}, metrics: NetworkCoreMetrics | null = null, logger: Logger | null = null) {
|
|
33
33
|
this.metrics = metrics;
|
|
34
34
|
this.logger = logger;
|
|
35
|
-
this.scores = opts.disablePeerScoring
|
|
35
|
+
this.scores = opts.disablePeerScoring
|
|
36
|
+
? new MapDef(() => new MaxScore())
|
|
37
|
+
: new MapDef(() => new RealScore(this.metrics));
|
|
36
38
|
}
|
|
37
39
|
|
|
38
40
|
getScore(peer: PeerId): number {
|
|
@@ -75,6 +77,8 @@ export class PeerRpcScoreStore implements IPeerRpcScoreStore {
|
|
|
75
77
|
}
|
|
76
78
|
|
|
77
79
|
update(): void {
|
|
80
|
+
const timer = this.metrics?.peerManager.scoreUpdateDuration.startTimer();
|
|
81
|
+
|
|
78
82
|
// Bound size of data structures
|
|
79
83
|
pruneSetToMax(this.scores, MAX_ENTRIES);
|
|
80
84
|
|
|
@@ -86,6 +90,9 @@ export class PeerRpcScoreStore implements IPeerRpcScoreStore {
|
|
|
86
90
|
this.scores.delete(peerIdStr);
|
|
87
91
|
}
|
|
88
92
|
}
|
|
93
|
+
|
|
94
|
+
this.metrics?.peerManager.scoreMapSize.set(this.scores.size);
|
|
95
|
+
timer?.();
|
|
89
96
|
}
|
|
90
97
|
|
|
91
98
|
updateGossipsubScore(peerId: PeerIdStr, newScore: number, ignore: boolean): void {
|
|
@@ -7,6 +7,7 @@ import {MapDef} from "@lodestar/utils";
|
|
|
7
7
|
import {shuffle} from "../../../util/shuffle.js";
|
|
8
8
|
import {sortBy} from "../../../util/sortBy.js";
|
|
9
9
|
import {NetworkCoreMetrics} from "../../core/metrics.js";
|
|
10
|
+
import {SubnetType} from "../../metadata.js";
|
|
10
11
|
import {RequestedSubnet} from "./subnetMap.js";
|
|
11
12
|
|
|
12
13
|
/** Target number of peers we'd like to have connected to a given long-lived subnet */
|
|
@@ -189,6 +190,18 @@ export function prioritizePeers(
|
|
|
189
190
|
|
|
190
191
|
const connectedPeerCount = connectedPeers.length;
|
|
191
192
|
|
|
193
|
+
// Track the outbound peers invariant (we keep at least OUTBOUND_PEERS_RATIO outbound peers).
|
|
194
|
+
// Report 0 when there are no peers so the gauge doesn't go stale at its last value.
|
|
195
|
+
if (metrics) {
|
|
196
|
+
let outboundPeerCount = 0;
|
|
197
|
+
for (const peer of connectedPeers) {
|
|
198
|
+
if (peer.direction === "outbound") {
|
|
199
|
+
outboundPeerCount++;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
metrics.peerManager.outboundPeersRatio.set(connectedPeerCount > 0 ? outboundPeerCount / connectedPeerCount : 0);
|
|
203
|
+
}
|
|
204
|
+
|
|
192
205
|
if (connectedPeerCount < targetPeers) {
|
|
193
206
|
// Need more peers.
|
|
194
207
|
// Instead of attempting to connect the exact amount necessary this will overshoot a little since the success
|
|
@@ -256,6 +269,7 @@ function requestSubnetPeers(
|
|
|
256
269
|
|
|
257
270
|
for (const {subnet, toSlot} of activeAttnets) {
|
|
258
271
|
const peersInSubnet = peersPerSubnet.get(subnet) ?? 0;
|
|
272
|
+
metrics?.peerManager.peersPerActiveSubnet.observe({type: SubnetType.attnets}, peersInSubnet);
|
|
259
273
|
if (peersInSubnet < targetSubnetPeers) {
|
|
260
274
|
// We need more peers
|
|
261
275
|
attnetQueries.push({subnet, toSlot, maxPeersToDiscover: targetSubnetPeers - peersInSubnet});
|
|
@@ -282,6 +296,7 @@ function requestSubnetPeers(
|
|
|
282
296
|
|
|
283
297
|
for (const {subnet, toSlot} of activeSyncnets) {
|
|
284
298
|
const peersInSubnet = peersPerSubnet.get(subnet) ?? 0;
|
|
299
|
+
metrics?.peerManager.peersPerActiveSubnet.observe({type: SubnetType.syncnets}, peersInSubnet);
|
|
285
300
|
if (peersInSubnet < targetSubnetPeers) {
|
|
286
301
|
// We need more peers
|
|
287
302
|
syncnetQueries.push({subnet, toSlot, maxPeersToDiscover: targetSubnetPeers - peersInSubnet});
|
|
@@ -1274,7 +1274,7 @@ function getSequentialHandlers(modules: ValidatorFnsModules, options: GossipHand
|
|
|
1274
1274
|
await validateGossipProposerPreferences(chain, signedProposerPreferences);
|
|
1275
1275
|
|
|
1276
1276
|
chain.emitter.emit(routes.events.EventType.proposerPreferences, {
|
|
1277
|
-
version:
|
|
1277
|
+
version: config.getForkName(signedProposerPreferences.message.proposalSlot),
|
|
1278
1278
|
data: signedProposerPreferences,
|
|
1279
1279
|
});
|
|
1280
1280
|
},
|