@lodestar/beacon-node 1.18.0-dev.e10a54d8d5 → 1.18.0-dev.ea7c6c6bb6
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/state/utils.js +6 -4
- package/lib/api/impl/beacon/state/utils.js.map +1 -1
- package/lib/chain/chain.d.ts +1 -5
- package/lib/chain/chain.js +1 -10
- package/lib/chain/chain.js.map +1 -1
- package/lib/chain/interface.d.ts +1 -6
- package/lib/chain/stateCache/index.d.ts +1 -1
- package/lib/chain/stateCache/index.js +1 -1
- package/lib/chain/stateCache/index.js.map +1 -1
- package/lib/chain/stateCache/persistentCheckpointsCache.js +2 -2
- package/lib/chain/stateCache/persistentCheckpointsCache.js.map +1 -1
- package/lib/chain/stateCache/{inMemoryCheckpointsCache.d.ts → stateContextCheckpointsCache.d.ts} +1 -7
- package/lib/chain/stateCache/{inMemoryCheckpointsCache.js → stateContextCheckpointsCache.js} +4 -5
- package/lib/chain/stateCache/stateContextCheckpointsCache.js.map +1 -0
- package/lib/metrics/metrics/lodestar.d.ts +2 -2
- package/lib/metrics/metrics/lodestar.js +4 -4
- package/lib/metrics/metrics/lodestar.js.map +1 -1
- package/lib/network/core/metrics.d.ts +3 -2
- package/lib/network/core/metrics.js.map +1 -1
- package/lib/network/core/networkCore.js +6 -3
- package/lib/network/core/networkCore.js.map +1 -1
- package/lib/network/options.js +2 -0
- package/lib/network/options.js.map +1 -1
- package/lib/network/subnets/attnetsService.d.ts +44 -38
- package/lib/network/subnets/attnetsService.js +149 -160
- package/lib/network/subnets/attnetsService.js.map +1 -1
- package/lib/network/subnets/dllAttnetsService.d.ts +112 -0
- package/lib/network/subnets/dllAttnetsService.js +336 -0
- package/lib/network/subnets/dllAttnetsService.js.map +1 -0
- package/lib/network/subnets/index.d.ts +1 -0
- package/lib/network/subnets/index.js +1 -0
- package/lib/network/subnets/index.js.map +1 -1
- package/lib/network/subnets/interface.d.ts +1 -0
- package/lib/util/profile.js +1 -4
- package/lib/util/profile.js.map +1 -1
- package/package.json +14 -14
- package/lib/chain/stateCache/inMemoryCheckpointsCache.js.map +0 -1
|
@@ -1,38 +1,37 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { computeStartSlotAtEpoch } from "@lodestar/state-transition";
|
|
2
|
+
import { ATTESTATION_SUBNET_COUNT, EPOCHS_PER_RANDOM_SUBNET_SUBSCRIPTION, RANDOM_SUBNETS_PER_VALIDATOR, SLOTS_PER_EPOCH, } from "@lodestar/params";
|
|
2
3
|
import { ssz } from "@lodestar/types";
|
|
3
|
-
import { MapDef } from "@lodestar/utils";
|
|
4
|
+
import { MapDef, randBetween } from "@lodestar/utils";
|
|
5
|
+
import { shuffle } from "../../util/shuffle.js";
|
|
4
6
|
import { ClockEvent } from "../../util/clock.js";
|
|
5
7
|
import { GossipType } from "../gossip/index.js";
|
|
6
8
|
import { SubnetMap } from "../peers/utils/index.js";
|
|
7
9
|
import { getActiveForks } from "../forks.js";
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
10
|
+
/**
|
|
11
|
+
* The time (in slots) before a last seen validator is considered absent and we unsubscribe from the random
|
|
12
|
+
* gossip topics that we subscribed to due to the validator connection.
|
|
13
|
+
*/
|
|
14
|
+
const LAST_SEEN_VALIDATOR_TIMEOUT = 150;
|
|
11
15
|
const gossipType = GossipType.beacon_attestation;
|
|
12
16
|
export var SubnetSource;
|
|
13
17
|
(function (SubnetSource) {
|
|
14
18
|
SubnetSource["committee"] = "committee";
|
|
15
|
-
SubnetSource["
|
|
19
|
+
SubnetSource["random"] = "random";
|
|
16
20
|
})(SubnetSource || (SubnetSource = {}));
|
|
17
21
|
/**
|
|
18
|
-
*
|
|
19
|
-
|
|
20
|
-
const NOT_ABLE_TO_FORM_STABLE_MESH_SEC = -1;
|
|
21
|
-
/**
|
|
22
|
-
* Manage deleterministic long lived (DLL) subnets and short lived subnets.
|
|
23
|
-
* - PeerManager uses attnetsService to know which peers are required for duties and long lived subscriptions
|
|
22
|
+
* Manage random (long lived) subnets and committee (short lived) subnets.
|
|
23
|
+
* - PeerManager uses attnetsService to know which peers are required for duties
|
|
24
24
|
* - Network call addCommitteeSubscriptions() from API calls
|
|
25
25
|
* - Gossip handler checks shouldProcess to know if validator is aggregator
|
|
26
26
|
*/
|
|
27
27
|
export class AttnetsService {
|
|
28
|
-
constructor(config, clock, gossip, metadata, logger, metrics,
|
|
28
|
+
constructor(config, clock, gossip, metadata, logger, metrics, opts) {
|
|
29
29
|
this.config = config;
|
|
30
30
|
this.clock = clock;
|
|
31
31
|
this.gossip = gossip;
|
|
32
32
|
this.metadata = metadata;
|
|
33
33
|
this.logger = logger;
|
|
34
34
|
this.metrics = metrics;
|
|
35
|
-
this.nodeId = nodeId;
|
|
36
35
|
this.opts = opts;
|
|
37
36
|
/** Committee subnets - PeerManager must find peers for those */
|
|
38
37
|
this.committeeSubnets = new SubnetMap();
|
|
@@ -41,59 +40,55 @@ export class AttnetsService {
|
|
|
41
40
|
* This class will tell gossip to subscribe and un-subscribe
|
|
42
41
|
* If a value exists for `SubscriptionId` it means that gossip subscription is active in network.gossip
|
|
43
42
|
*/
|
|
44
|
-
this.
|
|
45
|
-
/**
|
|
46
|
-
this.
|
|
43
|
+
this.subscriptionsCommittee = new SubnetMap();
|
|
44
|
+
/** Same as `subscriptionsCommittee` but for long-lived subnets. May overlap with `subscriptionsCommittee` */
|
|
45
|
+
this.subscriptionsRandom = new SubnetMap();
|
|
47
46
|
/**
|
|
48
|
-
* Map of an aggregator at a slot and
|
|
47
|
+
* Map of an aggregator at a slot and subnet
|
|
49
48
|
* Used to determine if we should process an attestation.
|
|
50
49
|
*/
|
|
51
|
-
this.aggregatorSlotSubnet = new MapDef(() => new
|
|
50
|
+
this.aggregatorSlotSubnet = new MapDef(() => new Set());
|
|
51
|
+
/**
|
|
52
|
+
* A collection of seen validators. These dictate how many random subnets we should be
|
|
53
|
+
* subscribed to. As these time out, we unsubscribe from the required random subnets and update our ENR.
|
|
54
|
+
* This is a map of validator index and its last active slot.
|
|
55
|
+
*/
|
|
56
|
+
this.knownValidators = new Map();
|
|
52
57
|
/**
|
|
53
58
|
* Run per slot.
|
|
54
59
|
* - Subscribe to gossip subnets 2 slots in advance
|
|
55
60
|
* - Unsubscribe from expired subnets
|
|
56
|
-
* - Track time to stable mesh if not yet formed
|
|
57
61
|
*/
|
|
58
62
|
this.onSlot = (clockSlot) => {
|
|
59
63
|
try {
|
|
60
|
-
|
|
61
|
-
this.onHalfSlot(clockSlot);
|
|
62
|
-
}, this.config.SECONDS_PER_SLOT * 0.5 * 1000);
|
|
63
|
-
for (const [dutiedSlot, dutiedInfo] of this.aggregatorSlotSubnet.entries()) {
|
|
64
|
+
for (const [dutiedSlot, subnets] of this.aggregatorSlotSubnet.entries()) {
|
|
64
65
|
if (dutiedSlot === clockSlot + this.opts.slotsToSubscribeBeforeAggregatorDuty) {
|
|
65
66
|
// Trigger gossip subscription first, in batch
|
|
66
|
-
if (
|
|
67
|
-
this.subscribeToSubnets(Array.from(
|
|
67
|
+
if (subnets.size > 0) {
|
|
68
|
+
this.subscribeToSubnets(Array.from(subnets), SubnetSource.committee);
|
|
68
69
|
}
|
|
69
70
|
// Then, register the subscriptions
|
|
70
|
-
|
|
71
|
-
this.shortLivedSubscriptions.request({ subnet, toSlot: dutiedSlot });
|
|
72
|
-
}
|
|
71
|
+
Array.from(subnets).map((subnet) => this.subscriptionsCommittee.request({ subnet, toSlot: dutiedSlot }));
|
|
73
72
|
}
|
|
74
|
-
this.trackTimeToStableMesh(clockSlot, dutiedSlot, dutiedInfo);
|
|
75
73
|
}
|
|
74
|
+
// For node >= 64 validators, we should consistently subscribe to all subnets
|
|
75
|
+
// it's important to check random subnets first
|
|
76
|
+
// See https://github.com/ChainSafe/lodestar/issues/4929
|
|
77
|
+
this.unsubscribeExpiredRandomSubnets(clockSlot);
|
|
76
78
|
this.unsubscribeExpiredCommitteeSubnets(clockSlot);
|
|
77
|
-
this.pruneExpiredAggregator(clockSlot);
|
|
78
79
|
}
|
|
79
80
|
catch (e) {
|
|
80
81
|
this.logger.error("Error on AttnetsService.onSlot", { slot: clockSlot }, e);
|
|
81
82
|
}
|
|
82
83
|
};
|
|
83
|
-
this.onHalfSlot = (clockSlot) => {
|
|
84
|
-
for (const [dutiedSlot, dutiedInfo] of this.aggregatorSlotSubnet.entries()) {
|
|
85
|
-
this.trackTimeToStableMesh(clockSlot, dutiedSlot, dutiedInfo);
|
|
86
|
-
}
|
|
87
|
-
};
|
|
88
84
|
/**
|
|
89
85
|
* Run per epoch, clean-up operations that are not urgent
|
|
90
|
-
* Subscribe to new random subnets every EPOCHS_PER_RANDOM_SUBNET_SUBSCRIPTION epochs
|
|
91
86
|
*/
|
|
92
87
|
this.onEpoch = (epoch) => {
|
|
93
88
|
try {
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
89
|
+
const slot = computeStartSlotAtEpoch(epoch);
|
|
90
|
+
this.pruneExpiredKnownValidators(slot);
|
|
91
|
+
this.pruneExpiredAggregator(slot);
|
|
97
92
|
}
|
|
98
93
|
catch (e) {
|
|
99
94
|
this.logger.error("Error on AttnetsService.onEpoch", { epoch }, e);
|
|
@@ -106,10 +101,11 @@ export class AttnetsService {
|
|
|
106
101
|
this.committeeSubnets.request({ subnet, toSlot: Infinity });
|
|
107
102
|
}
|
|
108
103
|
}
|
|
104
|
+
this.randBetweenFn = this.opts.randBetweenFn ?? randBetween;
|
|
105
|
+
this.shuffleFn = this.opts.shuffleFn ?? shuffle;
|
|
109
106
|
if (metrics) {
|
|
110
|
-
metrics.attnetsService.
|
|
107
|
+
metrics.attnetsService.subscriptionsRandom.addCollect(() => this.onScrapeLodestarMetrics(metrics));
|
|
111
108
|
}
|
|
112
|
-
this.recomputeLongLivedSubnets();
|
|
113
109
|
this.clock.on(ClockEvent.slot, this.onSlot);
|
|
114
110
|
this.clock.on(ClockEvent.epoch, this.onEpoch);
|
|
115
111
|
}
|
|
@@ -118,34 +114,32 @@ export class AttnetsService {
|
|
|
118
114
|
this.clock.off(ClockEvent.epoch, this.onEpoch);
|
|
119
115
|
}
|
|
120
116
|
/**
|
|
121
|
-
* Get all active subnets for the hearbeat
|
|
122
|
-
* - committeeSubnets so that submitted attestations can be spread to the network
|
|
123
|
-
* - longLivedSubscriptions because other peers based on this node's ENR for their submitted attestations
|
|
117
|
+
* Get all active subnets for the hearbeat.
|
|
124
118
|
*/
|
|
125
119
|
getActiveSubnets() {
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
EPOCHS_PER_RANDOM_SUBNET_SUBSCRIPTION *
|
|
129
|
-
SLOTS_PER_EPOCH;
|
|
130
|
-
const longLivedSubnets = Array.from(this.longLivedSubscriptions).map((subnet) => ({
|
|
131
|
-
subnet,
|
|
132
|
-
toSlot: longLivedSubscriptionsToSlot,
|
|
133
|
-
}));
|
|
134
|
-
// could be overlap, PeerDiscovery will handle it
|
|
135
|
-
return [...shortLivedSubnets, ...longLivedSubnets];
|
|
120
|
+
// Omit subscriptionsRandom, not necessary to force the network component to keep peers on that subnets
|
|
121
|
+
return this.committeeSubnets.getActiveTtl(this.clock.currentSlot);
|
|
136
122
|
}
|
|
137
123
|
/**
|
|
138
124
|
* Called from the API when validator is a part of a committee.
|
|
139
125
|
*/
|
|
140
126
|
addCommitteeSubscriptions(subscriptions) {
|
|
141
|
-
|
|
127
|
+
const currentSlot = this.clock.currentSlot;
|
|
128
|
+
let addedknownValidators = false;
|
|
129
|
+
for (const { validatorIndex, subnet, slot, isAggregator } of subscriptions) {
|
|
130
|
+
// Add known validator
|
|
131
|
+
if (!this.knownValidators.has(validatorIndex))
|
|
132
|
+
addedknownValidators = true;
|
|
133
|
+
this.knownValidators.set(validatorIndex, currentSlot);
|
|
142
134
|
// the peer-manager heartbeat will help find the subnet
|
|
143
135
|
this.committeeSubnets.request({ subnet, toSlot: slot + 1 });
|
|
144
136
|
if (isAggregator) {
|
|
145
137
|
// need exact slot here
|
|
146
|
-
this.aggregatorSlotSubnet.getOrDefault(slot).
|
|
138
|
+
this.aggregatorSlotSubnet.getOrDefault(slot).add(subnet);
|
|
147
139
|
}
|
|
148
140
|
}
|
|
141
|
+
if (addedknownValidators)
|
|
142
|
+
this.rebalanceRandomSubnets();
|
|
149
143
|
}
|
|
150
144
|
/**
|
|
151
145
|
* Check if a subscription is still active before handling a gossip object
|
|
@@ -156,25 +150,16 @@ export class AttnetsService {
|
|
|
156
150
|
}
|
|
157
151
|
return this.aggregatorSlotSubnet.getOrDefault(slot).has(subnet);
|
|
158
152
|
}
|
|
159
|
-
/**
|
|
160
|
-
* TODO-dll: clarify how many epochs before the fork we should subscribe to the new fork
|
|
161
|
-
* Call ONLY ONCE: Two epoch before the fork, re-subscribe all existing random subscriptions to the new fork
|
|
162
|
-
**/
|
|
153
|
+
/** Call ONLY ONCE: Two epoch before the fork, re-subscribe all existing random subscriptions to the new fork */
|
|
163
154
|
subscribeSubnetsToNextFork(nextFork) {
|
|
164
|
-
this.logger.info("Subscribing to
|
|
165
|
-
|
|
166
|
-
subnets: Array.from(this.longLivedSubscriptions).join(","),
|
|
167
|
-
});
|
|
168
|
-
for (const subnet of this.longLivedSubscriptions) {
|
|
155
|
+
this.logger.info("Subscribing to random attnets to next fork", { nextFork });
|
|
156
|
+
for (const subnet of this.subscriptionsRandom.getAll()) {
|
|
169
157
|
this.gossip.subscribeTopic({ type: gossipType, fork: nextFork, subnet });
|
|
170
158
|
}
|
|
171
159
|
}
|
|
172
|
-
/**
|
|
173
|
-
* TODO-dll: clarify how many epochs after the fork we should unsubscribe to the new fork
|
|
174
|
-
* Call ONLY ONCE: Two epochs after the fork, un-subscribe all subnets from the old fork
|
|
175
|
-
**/
|
|
160
|
+
/** Call ONLY ONCE: Two epochs after the fork, un-subscribe all subnets from the old fork */
|
|
176
161
|
unsubscribeSubnetsFromPrevFork(prevFork) {
|
|
177
|
-
this.logger.info("Unsubscribing to
|
|
162
|
+
this.logger.info("Unsubscribing to random attnets from prev fork", { prevFork });
|
|
178
163
|
for (let subnet = 0; subnet < ATTESTATION_SUBNET_COUNT; subnet++) {
|
|
179
164
|
if (!this.opts.subscribeAllSubnets) {
|
|
180
165
|
this.gossip.unsubscribeTopic({ type: gossipType, fork: prevFork, subnet });
|
|
@@ -182,95 +167,111 @@ export class AttnetsService {
|
|
|
182
167
|
}
|
|
183
168
|
}
|
|
184
169
|
/**
|
|
185
|
-
*
|
|
170
|
+
* Unsubscribe to a committee subnet from subscribedCommitteeSubnets.
|
|
171
|
+
* If a random subnet is present, we do not unsubscribe from it.
|
|
186
172
|
*/
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
if (timeToFormMesh === null) {
|
|
192
|
-
dutiedInfo.set(subnet, NOT_ABLE_TO_FORM_STABLE_MESH_SEC);
|
|
193
|
-
this.metrics?.attnetsService.subscriptionsCommitteeTimeToStableMesh.observe({ subnet }, NOT_ABLE_TO_FORM_STABLE_MESH_SEC);
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
else if (dutiedSlot <= clockSlot + this.opts.slotsToSubscribeBeforeAggregatorDuty) {
|
|
198
|
-
// aggregator duty is not expired, track time to stable mesh if this is the 1st time we see mesh peers>=Dlo (6)
|
|
199
|
-
for (const [subnet, timeToFormMesh] of dutiedInfo.entries()) {
|
|
200
|
-
if (timeToFormMesh === null) {
|
|
201
|
-
const topicStr = stringifyGossipTopic(this.config, {
|
|
202
|
-
type: gossipType,
|
|
203
|
-
fork: this.config.getForkName(dutiedSlot),
|
|
204
|
-
subnet,
|
|
205
|
-
});
|
|
206
|
-
const numMeshPeers = this.gossip.mesh.get(topicStr)?.size ?? 0;
|
|
207
|
-
if (numMeshPeers >= GOSSIP_D_LOW) {
|
|
208
|
-
const timeToStableMeshSec = this.clock.secFromSlot(dutiedSlot - this.opts.slotsToSubscribeBeforeAggregatorDuty);
|
|
209
|
-
// set to dutiedInfo so we'll not set to metrics again
|
|
210
|
-
dutiedInfo.set(subnet, timeToStableMeshSec);
|
|
211
|
-
this.metrics?.attnetsService.subscriptionsCommitteeTimeToStableMesh.observe({ subnet }, timeToStableMeshSec);
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
}
|
|
173
|
+
unsubscribeExpiredCommitteeSubnets(slot) {
|
|
174
|
+
const expired = this.subscriptionsCommittee.getExpired(slot);
|
|
175
|
+
if (expired.length > 0) {
|
|
176
|
+
this.unsubscribeSubnets(expired, slot, SubnetSource.committee);
|
|
215
177
|
}
|
|
216
178
|
}
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
179
|
+
/**
|
|
180
|
+
* A random subnet has expired.
|
|
181
|
+
* This function selects a new subnet to join, or extends the expiry if there are no more
|
|
182
|
+
* available subnets to choose from.
|
|
183
|
+
*/
|
|
184
|
+
unsubscribeExpiredRandomSubnets(slot) {
|
|
185
|
+
const expired = this.subscriptionsRandom.getExpired(slot);
|
|
186
|
+
const currentSlot = this.clock.currentSlot;
|
|
187
|
+
if (expired.length === 0) {
|
|
220
188
|
return;
|
|
221
189
|
}
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
oldSubnets: Array.from(oldSubnets).join(","),
|
|
227
|
-
newSubnets: newSubnets.join(","),
|
|
228
|
-
});
|
|
229
|
-
const toRemoveSubnets = [];
|
|
230
|
-
for (const subnet of oldSubnets) {
|
|
231
|
-
if (!newSubnets.includes(subnet)) {
|
|
232
|
-
toRemoveSubnets.push(subnet);
|
|
190
|
+
if (this.knownValidators.size * RANDOM_SUBNETS_PER_VALIDATOR >= ATTESTATION_SUBNET_COUNT) {
|
|
191
|
+
// Optimization: If we have to be subcribed to all subnets, no need to unsubscribe. Just extend the timeout
|
|
192
|
+
for (const subnet of expired) {
|
|
193
|
+
this.subscriptionsRandom.request({ subnet, toSlot: this.randomSubscriptionSlotLen() + currentSlot });
|
|
233
194
|
}
|
|
195
|
+
return;
|
|
234
196
|
}
|
|
235
|
-
//
|
|
236
|
-
this.
|
|
237
|
-
|
|
238
|
-
for (const subnet of toRemoveSubnets) {
|
|
239
|
-
this.longLivedSubscriptions.delete(subnet);
|
|
240
|
-
}
|
|
241
|
-
for (const subnet of newSubnets) {
|
|
242
|
-
// this.longLivedSubscriptions is a set so it'll handle duplicates
|
|
243
|
-
this.longLivedSubscriptions.add(subnet);
|
|
244
|
-
}
|
|
245
|
-
// Only tell gossip to unsubsribe last, longLivedSubscriptions has the latest state
|
|
246
|
-
this.unsubscribeSubnets(toRemoveSubnets, this.clock.currentSlot, SubnetSource.longLived);
|
|
247
|
-
this.updateMetadata();
|
|
197
|
+
// Prune subnets and re-subcribe to new ones
|
|
198
|
+
this.unsubscribeSubnets(expired, slot, SubnetSource.random);
|
|
199
|
+
this.rebalanceRandomSubnets();
|
|
248
200
|
}
|
|
249
201
|
/**
|
|
250
|
-
*
|
|
251
|
-
*
|
|
202
|
+
* A known validator has not sent a subscription in a while. They are considered offline and the
|
|
203
|
+
* beacon node no longer needs to be subscribed to the allocated random subnets.
|
|
204
|
+
*
|
|
205
|
+
* We don't keep track of a specific validator to random subnet, rather the ratio of active
|
|
206
|
+
* validators to random subnets. So when a validator goes offline, we can simply remove the
|
|
207
|
+
* allocated amount of random subnets.
|
|
252
208
|
*/
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
209
|
+
pruneExpiredKnownValidators(currentSlot) {
|
|
210
|
+
let deletedKnownValidators = false;
|
|
211
|
+
for (const [index, slot] of this.knownValidators.entries()) {
|
|
212
|
+
if (currentSlot > slot + LAST_SEEN_VALIDATOR_TIMEOUT) {
|
|
213
|
+
const deleted = this.knownValidators.delete(index);
|
|
214
|
+
if (deleted)
|
|
215
|
+
deletedKnownValidators = true;
|
|
216
|
+
}
|
|
257
217
|
}
|
|
218
|
+
if (deletedKnownValidators)
|
|
219
|
+
this.rebalanceRandomSubnets();
|
|
258
220
|
}
|
|
259
221
|
/**
|
|
260
222
|
* No need to track aggregator for past slots.
|
|
261
223
|
* @param currentSlot
|
|
262
224
|
*/
|
|
263
225
|
pruneExpiredAggregator(currentSlot) {
|
|
264
|
-
for (const
|
|
265
|
-
if (currentSlot >
|
|
266
|
-
this.aggregatorSlotSubnet.delete(
|
|
226
|
+
for (const slot of this.aggregatorSlotSubnet.keys()) {
|
|
227
|
+
if (currentSlot > slot) {
|
|
228
|
+
this.aggregatorSlotSubnet.delete(slot);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Called when we have new validators or expired validators.
|
|
234
|
+
* knownValidators should be updated before this function.
|
|
235
|
+
*/
|
|
236
|
+
rebalanceRandomSubnets() {
|
|
237
|
+
const slot = this.clock.currentSlot;
|
|
238
|
+
// By limiting to ATTESTATION_SUBNET_COUNT, if target is still over subnetDiff equals 0
|
|
239
|
+
const targetRandomSubnetCount = Math.min(this.knownValidators.size * RANDOM_SUBNETS_PER_VALIDATOR, ATTESTATION_SUBNET_COUNT);
|
|
240
|
+
const subnetDiff = targetRandomSubnetCount - this.subscriptionsRandom.size;
|
|
241
|
+
// subscribe to more random subnets
|
|
242
|
+
if (subnetDiff > 0) {
|
|
243
|
+
const activeSubnets = new Set(this.subscriptionsRandom.getActive(slot));
|
|
244
|
+
const allSubnets = Array.from({ length: ATTESTATION_SUBNET_COUNT }, (_, i) => i);
|
|
245
|
+
const availableSubnets = allSubnets.filter((subnet) => !activeSubnets.has(subnet));
|
|
246
|
+
const subnetsToConnect = this.shuffleFn(availableSubnets).slice(0, subnetDiff);
|
|
247
|
+
// Tell gossip to connect to the subnets if not connected already
|
|
248
|
+
this.subscribeToSubnets(subnetsToConnect, SubnetSource.random);
|
|
249
|
+
// Register these new subnets until some future slot
|
|
250
|
+
for (const subnet of subnetsToConnect) {
|
|
251
|
+
// the heartbeat will help connect to respective peers
|
|
252
|
+
this.subscriptionsRandom.request({ subnet, toSlot: this.randomSubscriptionSlotLen() + slot });
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
// unsubscribe some random subnets
|
|
256
|
+
if (subnetDiff < 0) {
|
|
257
|
+
const activeRandomSubnets = this.subscriptionsRandom.getActive(slot);
|
|
258
|
+
// TODO: Do we want to remove the oldest subnets or the newest subnets?
|
|
259
|
+
// .slice(-2) will extract the last two items of the array
|
|
260
|
+
const toRemoveSubnets = activeRandomSubnets.slice(subnetDiff);
|
|
261
|
+
for (const subnet of toRemoveSubnets) {
|
|
262
|
+
this.subscriptionsRandom.delete(subnet);
|
|
267
263
|
}
|
|
264
|
+
this.unsubscribeSubnets(toRemoveSubnets, slot, SubnetSource.random);
|
|
265
|
+
}
|
|
266
|
+
// If there has been a change update the local ENR bitfield
|
|
267
|
+
if (subnetDiff !== 0) {
|
|
268
|
+
this.updateMetadata();
|
|
268
269
|
}
|
|
269
270
|
}
|
|
270
271
|
/** Update ENR */
|
|
271
272
|
updateMetadata() {
|
|
272
273
|
const subnets = ssz.phase0.AttestationSubnets.defaultValue();
|
|
273
|
-
for (const subnet of this.
|
|
274
|
+
for (const subnet of this.subscriptionsRandom.getAll()) {
|
|
274
275
|
subnets.set(subnet, true);
|
|
275
276
|
}
|
|
276
277
|
// Only update metadata if necessary, setting `metadata.[key]` triggers a write to disk
|
|
@@ -278,14 +279,11 @@ export class AttnetsService {
|
|
|
278
279
|
this.metadata.attnets = subnets;
|
|
279
280
|
}
|
|
280
281
|
}
|
|
281
|
-
/**
|
|
282
|
-
* Trigger a gossip subcription only if not already subscribed
|
|
283
|
-
* shortLivedSubscriptions or longLivedSubscriptions should be updated right AFTER this called
|
|
284
|
-
**/
|
|
282
|
+
/** Tigger a gossip subcription only if not already subscribed */
|
|
285
283
|
subscribeToSubnets(subnets, src) {
|
|
286
284
|
const forks = getActiveForks(this.config, this.clock.currentEpoch);
|
|
287
285
|
for (const subnet of subnets) {
|
|
288
|
-
if (!this.
|
|
286
|
+
if (!this.subscriptionsCommittee.has(subnet) && !this.subscriptionsRandom.has(subnet)) {
|
|
289
287
|
for (const fork of forks) {
|
|
290
288
|
this.gossip.subscribeTopic({ type: gossipType, fork, subnet });
|
|
291
289
|
}
|
|
@@ -293,17 +291,15 @@ export class AttnetsService {
|
|
|
293
291
|
}
|
|
294
292
|
}
|
|
295
293
|
}
|
|
296
|
-
/**
|
|
297
|
-
* Trigger a gossip un-subscription only if no-one is still subscribed
|
|
298
|
-
* If unsubscribe long lived subnets, longLivedSubscriptions should be updated right BEFORE this called
|
|
299
|
-
**/
|
|
294
|
+
/** Trigger a gossip un-subscrition only if no-one is still subscribed */
|
|
300
295
|
unsubscribeSubnets(subnets, slot, src) {
|
|
301
296
|
// No need to unsubscribeTopic(). Return early to prevent repetitive extra work
|
|
302
297
|
if (this.opts.subscribeAllSubnets)
|
|
303
298
|
return;
|
|
304
299
|
const forks = getActiveForks(this.config, this.clock.currentEpoch);
|
|
305
300
|
for (const subnet of subnets) {
|
|
306
|
-
if (!this.
|
|
301
|
+
if (!this.subscriptionsCommittee.isActiveAtSlot(subnet, slot) &&
|
|
302
|
+
!this.subscriptionsRandom.isActiveAtSlot(subnet, slot)) {
|
|
307
303
|
for (const fork of forks) {
|
|
308
304
|
this.gossip.unsubscribeTopic({ type: gossipType, fork, subnet });
|
|
309
305
|
}
|
|
@@ -311,21 +307,14 @@ export class AttnetsService {
|
|
|
311
307
|
}
|
|
312
308
|
}
|
|
313
309
|
}
|
|
310
|
+
randomSubscriptionSlotLen() {
|
|
311
|
+
return (this.randBetweenFn(EPOCHS_PER_RANDOM_SUBNET_SUBSCRIPTION, 2 * EPOCHS_PER_RANDOM_SUBNET_SUBSCRIPTION) *
|
|
312
|
+
SLOTS_PER_EPOCH);
|
|
313
|
+
}
|
|
314
314
|
onScrapeLodestarMetrics(metrics) {
|
|
315
315
|
metrics.attnetsService.committeeSubnets.set(this.committeeSubnets.size);
|
|
316
|
-
metrics.attnetsService.subscriptionsCommittee.set(this.
|
|
317
|
-
|
|
318
|
-
const currentSlot = this.clock.currentSlot;
|
|
319
|
-
for (const { subnet } of this.shortLivedSubscriptions.getActiveTtl(currentSlot)) {
|
|
320
|
-
const topicStr = stringifyGossipTopic(this.config, {
|
|
321
|
-
type: gossipType,
|
|
322
|
-
fork: this.config.getForkName(currentSlot),
|
|
323
|
-
subnet,
|
|
324
|
-
});
|
|
325
|
-
const numMeshPeers = this.gossip.mesh.get(topicStr)?.size ?? 0;
|
|
326
|
-
metrics.attnetsService.subscriptionsCommitteeMeshPeers.observe({ subnet }, numMeshPeers);
|
|
327
|
-
}
|
|
328
|
-
metrics.attnetsService.longLivedSubscriptions.set(this.longLivedSubscriptions.size);
|
|
316
|
+
metrics.attnetsService.subscriptionsCommittee.set(this.subscriptionsCommittee.size);
|
|
317
|
+
metrics.attnetsService.subscriptionsRandom.set(this.subscriptionsRandom.size);
|
|
329
318
|
let aggregatorCount = 0;
|
|
330
319
|
for (const subnets of this.aggregatorSlotSubnet.values()) {
|
|
331
320
|
aggregatorCount += subnets.size;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attnetsService.js","sourceRoot":"","sources":["../../../src/network/subnets/attnetsService.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"attnetsService.js","sourceRoot":"","sources":["../../../src/network/subnets/attnetsService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { ForkName } from "@lodestar/params";
|
|
2
|
+
import { Slot } from "@lodestar/types";
|
|
3
|
+
import { Logger } from "@lodestar/utils";
|
|
4
|
+
import { BeaconConfig } from "@lodestar/config";
|
|
5
|
+
import { IClock } from "../../util/clock.js";
|
|
6
|
+
import { MetadataController } from "../metadata.js";
|
|
7
|
+
import { RequestedSubnet } from "../peers/utils/index.js";
|
|
8
|
+
import { NetworkCoreMetrics } from "../core/metrics.js";
|
|
9
|
+
import { IAttnetsService, CommitteeSubscription, SubnetsServiceOpts, GossipSubscriber, NodeId } from "./interface.js";
|
|
10
|
+
export declare enum DLLSubnetSource {
|
|
11
|
+
committee = "committee",
|
|
12
|
+
longLived = "long_lived"
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Manage deleterministic long lived (DLL) subnets and short lived subnets.
|
|
16
|
+
* - PeerManager uses attnetsService to know which peers are required for duties and long lived subscriptions
|
|
17
|
+
* - Network call addCommitteeSubscriptions() from API calls
|
|
18
|
+
* - Gossip handler checks shouldProcess to know if validator is aggregator
|
|
19
|
+
*/
|
|
20
|
+
export declare class DLLAttnetsService implements IAttnetsService {
|
|
21
|
+
private readonly config;
|
|
22
|
+
private readonly clock;
|
|
23
|
+
private readonly gossip;
|
|
24
|
+
private readonly metadata;
|
|
25
|
+
private readonly logger;
|
|
26
|
+
private readonly metrics;
|
|
27
|
+
private readonly nodeId;
|
|
28
|
+
private readonly opts;
|
|
29
|
+
/** Committee subnets - PeerManager must find peers for those */
|
|
30
|
+
private committeeSubnets;
|
|
31
|
+
/**
|
|
32
|
+
* All currently subscribed short-lived subnets, for attestation aggregation
|
|
33
|
+
* This class will tell gossip to subscribe and un-subscribe
|
|
34
|
+
* If a value exists for `SubscriptionId` it means that gossip subscription is active in network.gossip
|
|
35
|
+
*/
|
|
36
|
+
private shortLivedSubscriptions;
|
|
37
|
+
/** ${SUBNETS_PER_NODE} long lived subscriptions, may overlap with `shortLivedSubscriptions` */
|
|
38
|
+
private longLivedSubscriptions;
|
|
39
|
+
/**
|
|
40
|
+
* Map of an aggregator at a slot and AggregatorDutyInfo
|
|
41
|
+
* Used to determine if we should process an attestation.
|
|
42
|
+
*/
|
|
43
|
+
private aggregatorSlotSubnet;
|
|
44
|
+
constructor(config: BeaconConfig, clock: IClock, gossip: GossipSubscriber, metadata: MetadataController, logger: Logger, metrics: NetworkCoreMetrics | null, nodeId: NodeId | null, opts: SubnetsServiceOpts);
|
|
45
|
+
close(): void;
|
|
46
|
+
/**
|
|
47
|
+
* Get all active subnets for the hearbeat:
|
|
48
|
+
* - committeeSubnets so that submitted attestations can be spread to the network
|
|
49
|
+
* - longLivedSubscriptions because other peers based on this node's ENR for their submitted attestations
|
|
50
|
+
*/
|
|
51
|
+
getActiveSubnets(): RequestedSubnet[];
|
|
52
|
+
/**
|
|
53
|
+
* Called from the API when validator is a part of a committee.
|
|
54
|
+
*/
|
|
55
|
+
addCommitteeSubscriptions(subscriptions: CommitteeSubscription[]): void;
|
|
56
|
+
/**
|
|
57
|
+
* Check if a subscription is still active before handling a gossip object
|
|
58
|
+
*/
|
|
59
|
+
shouldProcess(subnet: number, slot: Slot): boolean;
|
|
60
|
+
/**
|
|
61
|
+
* TODO-dll: clarify how many epochs before the fork we should subscribe to the new fork
|
|
62
|
+
* Call ONLY ONCE: Two epoch before the fork, re-subscribe all existing random subscriptions to the new fork
|
|
63
|
+
**/
|
|
64
|
+
subscribeSubnetsToNextFork(nextFork: ForkName): void;
|
|
65
|
+
/**
|
|
66
|
+
* TODO-dll: clarify how many epochs after the fork we should unsubscribe to the new fork
|
|
67
|
+
* Call ONLY ONCE: Two epochs after the fork, un-subscribe all subnets from the old fork
|
|
68
|
+
**/
|
|
69
|
+
unsubscribeSubnetsFromPrevFork(prevFork: ForkName): void;
|
|
70
|
+
/**
|
|
71
|
+
* Run per slot.
|
|
72
|
+
* - Subscribe to gossip subnets 2 slots in advance
|
|
73
|
+
* - Unsubscribe from expired subnets
|
|
74
|
+
* - Track time to stable mesh if not yet formed
|
|
75
|
+
*/
|
|
76
|
+
private onSlot;
|
|
77
|
+
private onHalfSlot;
|
|
78
|
+
/**
|
|
79
|
+
* Track time to form stable mesh if not yet formed
|
|
80
|
+
*/
|
|
81
|
+
private trackTimeToStableMesh;
|
|
82
|
+
/**
|
|
83
|
+
* Run per epoch, clean-up operations that are not urgent
|
|
84
|
+
* Subscribe to new random subnets every EPOCHS_PER_RANDOM_SUBNET_SUBSCRIPTION epochs
|
|
85
|
+
*/
|
|
86
|
+
private onEpoch;
|
|
87
|
+
private recomputeLongLivedSubnets;
|
|
88
|
+
/**
|
|
89
|
+
* Unsubscribe to a committee subnet from subscribedCommitteeSubnets.
|
|
90
|
+
* If a random subnet is present, we do not unsubscribe from it.
|
|
91
|
+
*/
|
|
92
|
+
private unsubscribeExpiredCommitteeSubnets;
|
|
93
|
+
/**
|
|
94
|
+
* No need to track aggregator for past slots.
|
|
95
|
+
* @param currentSlot
|
|
96
|
+
*/
|
|
97
|
+
private pruneExpiredAggregator;
|
|
98
|
+
/** Update ENR */
|
|
99
|
+
private updateMetadata;
|
|
100
|
+
/**
|
|
101
|
+
* Trigger a gossip subcription only if not already subscribed
|
|
102
|
+
* shortLivedSubscriptions or longLivedSubscriptions should be updated right AFTER this called
|
|
103
|
+
**/
|
|
104
|
+
private subscribeToSubnets;
|
|
105
|
+
/**
|
|
106
|
+
* Trigger a gossip un-subscription only if no-one is still subscribed
|
|
107
|
+
* If unsubscribe long lived subnets, longLivedSubscriptions should be updated right BEFORE this called
|
|
108
|
+
**/
|
|
109
|
+
private unsubscribeSubnets;
|
|
110
|
+
private onScrapeLodestarMetrics;
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=dllAttnetsService.d.ts.map
|