@lodestar/beacon-node 1.18.0-dev.87f07fe67d → 1.18.0-dev.898cd903bf

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.
Files changed (105) hide show
  1. package/lib/api/impl/beacon/rewards/index.js +4 -0
  2. package/lib/api/impl/beacon/rewards/index.js.map +1 -1
  3. package/lib/api/impl/beacon/state/utils.js +4 -6
  4. package/lib/api/impl/beacon/state/utils.js.map +1 -1
  5. package/lib/api/impl/validator/index.d.ts +14 -0
  6. package/lib/api/impl/validator/index.js +25 -12
  7. package/lib/api/impl/validator/index.js.map +1 -1
  8. package/lib/api/rest/activeSockets.js +1 -1
  9. package/lib/api/rest/activeSockets.js.map +1 -1
  10. package/lib/api/rest/base.js +5 -5
  11. package/lib/api/rest/base.js.map +1 -1
  12. package/lib/chain/blocks/types.d.ts +15 -7
  13. package/lib/chain/blocks/types.js.map +1 -1
  14. package/lib/chain/blocks/verifyBlocksDataAvailability.js +1 -1
  15. package/lib/chain/blocks/verifyBlocksDataAvailability.js.map +1 -1
  16. package/lib/chain/bls/multithread/index.js +1 -1
  17. package/lib/chain/bls/multithread/index.js.map +1 -1
  18. package/lib/chain/chain.d.ts +11 -2
  19. package/lib/chain/chain.js +57 -13
  20. package/lib/chain/chain.js.map +1 -1
  21. package/lib/chain/forkChoice/index.d.ts +6 -3
  22. package/lib/chain/forkChoice/index.js +7 -3
  23. package/lib/chain/forkChoice/index.js.map +1 -1
  24. package/lib/chain/interface.d.ts +11 -1
  25. package/lib/chain/interface.js.map +1 -1
  26. package/lib/chain/opPools/attestationPool.js +1 -1
  27. package/lib/chain/opPools/attestationPool.js.map +1 -1
  28. package/lib/chain/options.d.ts +5 -1
  29. package/lib/chain/options.js +6 -0
  30. package/lib/chain/options.js.map +1 -1
  31. package/lib/chain/produceBlock/produceBlockBody.d.ts +1 -2
  32. package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
  33. package/lib/chain/reprocess.js +1 -1
  34. package/lib/chain/reprocess.js.map +1 -1
  35. package/lib/chain/rewards/attestationsRewards.d.ts +7 -0
  36. package/lib/chain/rewards/attestationsRewards.js +109 -0
  37. package/lib/chain/rewards/attestationsRewards.js.map +1 -0
  38. package/lib/chain/seenCache/seenGossipBlockInput.d.ts +2 -2
  39. package/lib/chain/seenCache/seenGossipBlockInput.js +22 -7
  40. package/lib/chain/seenCache/seenGossipBlockInput.js.map +1 -1
  41. package/lib/chain/stateCache/{stateContextCheckpointsCache.d.ts → inMemoryCheckpointsCache.d.ts} +9 -4
  42. package/lib/chain/stateCache/{stateContextCheckpointsCache.js → inMemoryCheckpointsCache.js} +6 -6
  43. package/lib/chain/stateCache/inMemoryCheckpointsCache.js.map +1 -0
  44. package/lib/chain/stateCache/index.d.ts +1 -1
  45. package/lib/chain/stateCache/index.js +1 -1
  46. package/lib/chain/stateCache/index.js.map +1 -1
  47. package/lib/chain/stateCache/persistentCheckpointsCache.d.ts +40 -7
  48. package/lib/chain/stateCache/persistentCheckpointsCache.js +64 -20
  49. package/lib/chain/stateCache/persistentCheckpointsCache.js.map +1 -1
  50. package/lib/chain/validation/block.js +2 -2
  51. package/lib/chain/validation/block.js.map +1 -1
  52. package/lib/eth1/provider/eth1Provider.js +1 -1
  53. package/lib/eth1/provider/eth1Provider.js.map +1 -1
  54. package/lib/metrics/metrics/lodestar.d.ts +3 -3
  55. package/lib/metrics/metrics/lodestar.js +9 -9
  56. package/lib/metrics/metrics/lodestar.js.map +1 -1
  57. package/lib/monitoring/options.js +3 -3
  58. package/lib/monitoring/options.js.map +1 -1
  59. package/lib/network/core/metrics.d.ts +2 -3
  60. package/lib/network/core/metrics.js.map +1 -1
  61. package/lib/network/core/networkCore.js +3 -6
  62. package/lib/network/core/networkCore.js.map +1 -1
  63. package/lib/network/events.d.ts +2 -2
  64. package/lib/network/gossip/gossipsub.js +5 -2
  65. package/lib/network/gossip/gossipsub.js.map +1 -1
  66. package/lib/network/libp2p/index.js +1 -1
  67. package/lib/network/libp2p/index.js.map +1 -1
  68. package/lib/network/options.js +0 -2
  69. package/lib/network/options.js.map +1 -1
  70. package/lib/network/peers/peerManager.js +1 -1
  71. package/lib/network/peers/peerManager.js.map +1 -1
  72. package/lib/network/processor/gossipHandlers.js +41 -16
  73. package/lib/network/processor/gossipHandlers.js.map +1 -1
  74. package/lib/network/processor/gossipQueues/indexed.d.ts +1 -1
  75. package/lib/network/processor/gossipQueues/indexed.js +1 -1
  76. package/lib/network/processor/index.js +1 -1
  77. package/lib/network/processor/index.js.map +1 -1
  78. package/lib/network/reqresp/beaconBlocksMaybeBlobsByRoot.d.ts +2 -2
  79. package/lib/network/reqresp/beaconBlocksMaybeBlobsByRoot.js +15 -3
  80. package/lib/network/reqresp/beaconBlocksMaybeBlobsByRoot.js.map +1 -1
  81. package/lib/network/reqresp/rateLimit.js +12 -12
  82. package/lib/network/reqresp/rateLimit.js.map +1 -1
  83. package/lib/network/subnets/attnetsService.d.ts +38 -44
  84. package/lib/network/subnets/attnetsService.js +160 -149
  85. package/lib/network/subnets/attnetsService.js.map +1 -1
  86. package/lib/network/subnets/index.d.ts +0 -1
  87. package/lib/network/subnets/index.js +0 -1
  88. package/lib/network/subnets/index.js.map +1 -1
  89. package/lib/network/subnets/interface.d.ts +0 -1
  90. package/lib/sync/interface.d.ts +16 -12
  91. package/lib/sync/interface.js +1 -0
  92. package/lib/sync/interface.js.map +1 -1
  93. package/lib/sync/unknownBlock.js +63 -60
  94. package/lib/sync/unknownBlock.js.map +1 -1
  95. package/lib/sync/utils/pendingBlocksTree.js +1 -1
  96. package/lib/sync/utils/pendingBlocksTree.js.map +1 -1
  97. package/lib/util/profile.js +4 -1
  98. package/lib/util/profile.js.map +1 -1
  99. package/lib/util/queue/itemQueue.js +1 -1
  100. package/lib/util/queue/itemQueue.js.map +1 -1
  101. package/package.json +17 -18
  102. package/lib/chain/stateCache/stateContextCheckpointsCache.js.map +0 -1
  103. package/lib/network/subnets/dllAttnetsService.d.ts +0 -112
  104. package/lib/network/subnets/dllAttnetsService.js +0 -336
  105. package/lib/network/subnets/dllAttnetsService.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"stateContextCheckpointsCache.js","sourceRoot":"","sources":["../../../src/chain/stateCache/stateContextCheckpointsCache.ts"],"names":[],"mappings":"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"}
@@ -1,112 +0,0 @@
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
@@ -1,336 +0,0 @@
1
- import { ATTESTATION_SUBNET_COUNT, EPOCHS_PER_RANDOM_SUBNET_SUBSCRIPTION, SLOTS_PER_EPOCH, } from "@lodestar/params";
2
- import { ssz } from "@lodestar/types";
3
- import { MapDef } from "@lodestar/utils";
4
- import { ClockEvent } from "../../util/clock.js";
5
- import { GossipType } from "../gossip/index.js";
6
- import { SubnetMap } from "../peers/utils/index.js";
7
- import { getActiveForks } from "../forks.js";
8
- import { stringifyGossipTopic } from "../gossip/topic.js";
9
- import { GOSSIP_D_LOW } from "../gossip/scoringParameters.js";
10
- import { computeSubscribedSubnet } from "./util.js";
11
- const gossipType = GossipType.beacon_attestation;
12
- export var DLLSubnetSource;
13
- (function (DLLSubnetSource) {
14
- DLLSubnetSource["committee"] = "committee";
15
- DLLSubnetSource["longLived"] = "long_lived";
16
- })(DLLSubnetSource || (DLLSubnetSource = {}));
17
- /**
18
- * This value means node is not able to form stable mesh.
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
24
- * - Network call addCommitteeSubscriptions() from API calls
25
- * - Gossip handler checks shouldProcess to know if validator is aggregator
26
- */
27
- export class DLLAttnetsService {
28
- constructor(config, clock, gossip, metadata, logger, metrics, nodeId, opts) {
29
- this.config = config;
30
- this.clock = clock;
31
- this.gossip = gossip;
32
- this.metadata = metadata;
33
- this.logger = logger;
34
- this.metrics = metrics;
35
- this.nodeId = nodeId;
36
- this.opts = opts;
37
- /** Committee subnets - PeerManager must find peers for those */
38
- this.committeeSubnets = new SubnetMap();
39
- /**
40
- * All currently subscribed short-lived subnets, for attestation aggregation
41
- * This class will tell gossip to subscribe and un-subscribe
42
- * If a value exists for `SubscriptionId` it means that gossip subscription is active in network.gossip
43
- */
44
- this.shortLivedSubscriptions = new SubnetMap();
45
- /** ${SUBNETS_PER_NODE} long lived subscriptions, may overlap with `shortLivedSubscriptions` */
46
- this.longLivedSubscriptions = new Set();
47
- /**
48
- * Map of an aggregator at a slot and AggregatorDutyInfo
49
- * Used to determine if we should process an attestation.
50
- */
51
- this.aggregatorSlotSubnet = new MapDef(() => new Map());
52
- /**
53
- * Run per slot.
54
- * - Subscribe to gossip subnets 2 slots in advance
55
- * - Unsubscribe from expired subnets
56
- * - Track time to stable mesh if not yet formed
57
- */
58
- this.onSlot = (clockSlot) => {
59
- try {
60
- setTimeout(() => {
61
- this.onHalfSlot(clockSlot);
62
- }, this.config.SECONDS_PER_SLOT * 0.5 * 1000);
63
- for (const [dutiedSlot, dutiedInfo] of this.aggregatorSlotSubnet.entries()) {
64
- if (dutiedSlot === clockSlot + this.opts.slotsToSubscribeBeforeAggregatorDuty) {
65
- // Trigger gossip subscription first, in batch
66
- if (dutiedInfo.size > 0) {
67
- this.subscribeToSubnets(Array.from(dutiedInfo.keys()), DLLSubnetSource.committee);
68
- }
69
- // Then, register the subscriptions
70
- for (const subnet of dutiedInfo.keys()) {
71
- this.shortLivedSubscriptions.request({ subnet, toSlot: dutiedSlot });
72
- }
73
- }
74
- this.trackTimeToStableMesh(clockSlot, dutiedSlot, dutiedInfo);
75
- }
76
- this.unsubscribeExpiredCommitteeSubnets(clockSlot);
77
- this.pruneExpiredAggregator(clockSlot);
78
- }
79
- catch (e) {
80
- this.logger.error("Error on AttnetsService.onSlot", { slot: clockSlot }, e);
81
- }
82
- };
83
- this.onHalfSlot = (clockSlot) => {
84
- for (const [dutiedSlot, dutiedInfo] of this.aggregatorSlotSubnet.entries()) {
85
- this.trackTimeToStableMesh(clockSlot, dutiedSlot, dutiedInfo);
86
- }
87
- };
88
- /**
89
- * Run per epoch, clean-up operations that are not urgent
90
- * Subscribe to new random subnets every EPOCHS_PER_RANDOM_SUBNET_SUBSCRIPTION epochs
91
- */
92
- this.onEpoch = (epoch) => {
93
- try {
94
- if (epoch % EPOCHS_PER_RANDOM_SUBNET_SUBSCRIPTION === 0) {
95
- this.recomputeLongLivedSubnets();
96
- }
97
- }
98
- catch (e) {
99
- this.logger.error("Error on AttnetsService.onEpoch", { epoch }, e);
100
- }
101
- };
102
- // if subscribeAllSubnets, we act like we have >= ATTESTATION_SUBNET_COUNT validators connecting to this node
103
- // so that we have enough subnet topic peers, see https://github.com/ChainSafe/lodestar/issues/4921
104
- if (this.opts.subscribeAllSubnets) {
105
- for (let subnet = 0; subnet < ATTESTATION_SUBNET_COUNT; subnet++) {
106
- this.committeeSubnets.request({ subnet, toSlot: Infinity });
107
- }
108
- }
109
- if (metrics) {
110
- metrics.attnetsService.longLivedSubscriptions.addCollect(() => this.onScrapeLodestarMetrics(metrics));
111
- }
112
- this.recomputeLongLivedSubnets();
113
- this.clock.on(ClockEvent.slot, this.onSlot);
114
- this.clock.on(ClockEvent.epoch, this.onEpoch);
115
- }
116
- close() {
117
- this.clock.off(ClockEvent.slot, this.onSlot);
118
- this.clock.off(ClockEvent.epoch, this.onEpoch);
119
- }
120
- /**
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
124
- */
125
- getActiveSubnets() {
126
- const shortLivedSubnets = this.committeeSubnets.getActiveTtl(this.clock.currentSlot);
127
- const longLivedSubscriptionsToSlot = (Math.floor(this.clock.currentEpoch / EPOCHS_PER_RANDOM_SUBNET_SUBSCRIPTION) + 1) *
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];
136
- }
137
- /**
138
- * Called from the API when validator is a part of a committee.
139
- */
140
- addCommitteeSubscriptions(subscriptions) {
141
- for (const { subnet, slot, isAggregator } of subscriptions) {
142
- // the peer-manager heartbeat will help find the subnet
143
- this.committeeSubnets.request({ subnet, toSlot: slot + 1 });
144
- if (isAggregator) {
145
- // need exact slot here
146
- this.aggregatorSlotSubnet.getOrDefault(slot).set(subnet, null);
147
- }
148
- }
149
- }
150
- /**
151
- * Check if a subscription is still active before handling a gossip object
152
- */
153
- shouldProcess(subnet, slot) {
154
- if (!this.aggregatorSlotSubnet.has(slot)) {
155
- return false;
156
- }
157
- return this.aggregatorSlotSubnet.getOrDefault(slot).has(subnet);
158
- }
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
- **/
163
- subscribeSubnetsToNextFork(nextFork) {
164
- this.logger.info("Subscribing to long lived attnets to next fork", {
165
- nextFork,
166
- subnets: Array.from(this.longLivedSubscriptions).join(","),
167
- });
168
- for (const subnet of this.longLivedSubscriptions) {
169
- this.gossip.subscribeTopic({ type: gossipType, fork: nextFork, subnet });
170
- }
171
- }
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
- **/
176
- unsubscribeSubnetsFromPrevFork(prevFork) {
177
- this.logger.info("Unsubscribing to long lived attnets from prev fork", { prevFork });
178
- for (let subnet = 0; subnet < ATTESTATION_SUBNET_COUNT; subnet++) {
179
- if (!this.opts.subscribeAllSubnets) {
180
- this.gossip.unsubscribeTopic({ type: gossipType, fork: prevFork, subnet });
181
- }
182
- }
183
- }
184
- /**
185
- * Track time to form stable mesh if not yet formed
186
- */
187
- trackTimeToStableMesh(clockSlot, dutiedSlot, dutiedInfo) {
188
- if (dutiedSlot < clockSlot) {
189
- // aggregator duty is expired, set timeToStableMesh to some big value so we know this value is not good
190
- for (const [subnet, timeToFormMesh] of dutiedInfo.entries()) {
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
- }
215
- }
216
- }
217
- recomputeLongLivedSubnets() {
218
- if (this.nodeId === null) {
219
- this.logger.verbose("Cannot recompute long-lived subscriptions, no nodeId");
220
- return;
221
- }
222
- const oldSubnets = this.longLivedSubscriptions;
223
- const newSubnets = computeSubscribedSubnet(this.nodeId, this.clock.currentEpoch);
224
- this.logger.verbose("Recomputing long-lived subscriptions", {
225
- epoch: this.clock.currentEpoch,
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);
233
- }
234
- }
235
- // First, tell gossip to subscribe to the subnets if not connected already
236
- this.subscribeToSubnets(newSubnets, DLLSubnetSource.longLived);
237
- // then update longLivedSubscriptions
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, DLLSubnetSource.longLived);
247
- this.updateMetadata();
248
- }
249
- /**
250
- * Unsubscribe to a committee subnet from subscribedCommitteeSubnets.
251
- * If a random subnet is present, we do not unsubscribe from it.
252
- */
253
- unsubscribeExpiredCommitteeSubnets(slot) {
254
- const expired = this.shortLivedSubscriptions.getExpired(slot);
255
- if (expired.length > 0) {
256
- this.unsubscribeSubnets(expired, slot, DLLSubnetSource.committee);
257
- }
258
- }
259
- /**
260
- * No need to track aggregator for past slots.
261
- * @param currentSlot
262
- */
263
- pruneExpiredAggregator(currentSlot) {
264
- for (const dutiedSlot of this.aggregatorSlotSubnet.keys()) {
265
- if (currentSlot > dutiedSlot) {
266
- this.aggregatorSlotSubnet.delete(dutiedSlot);
267
- }
268
- }
269
- }
270
- /** Update ENR */
271
- updateMetadata() {
272
- const subnets = ssz.phase0.AttestationSubnets.defaultValue();
273
- for (const subnet of this.longLivedSubscriptions) {
274
- subnets.set(subnet, true);
275
- }
276
- // Only update metadata if necessary, setting `metadata.[key]` triggers a write to disk
277
- if (!ssz.phase0.AttestationSubnets.equals(subnets, this.metadata.attnets)) {
278
- this.metadata.attnets = subnets;
279
- }
280
- }
281
- /**
282
- * Trigger a gossip subcription only if not already subscribed
283
- * shortLivedSubscriptions or longLivedSubscriptions should be updated right AFTER this called
284
- **/
285
- subscribeToSubnets(subnets, src) {
286
- const forks = getActiveForks(this.config, this.clock.currentEpoch);
287
- for (const subnet of subnets) {
288
- if (!this.shortLivedSubscriptions.has(subnet) && !this.longLivedSubscriptions.has(subnet)) {
289
- for (const fork of forks) {
290
- this.gossip.subscribeTopic({ type: gossipType, fork, subnet });
291
- }
292
- this.metrics?.attnetsService.subscribeSubnets.inc({ subnet, src });
293
- }
294
- }
295
- }
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
- **/
300
- unsubscribeSubnets(subnets, slot, src) {
301
- // No need to unsubscribeTopic(). Return early to prevent repetitive extra work
302
- if (this.opts.subscribeAllSubnets)
303
- return;
304
- const forks = getActiveForks(this.config, this.clock.currentEpoch);
305
- for (const subnet of subnets) {
306
- if (!this.shortLivedSubscriptions.isActiveAtSlot(subnet, slot) && !this.longLivedSubscriptions.has(subnet)) {
307
- for (const fork of forks) {
308
- this.gossip.unsubscribeTopic({ type: gossipType, fork, subnet });
309
- }
310
- this.metrics?.attnetsService.unsubscribeSubnets.inc({ subnet, src });
311
- }
312
- }
313
- }
314
- onScrapeLodestarMetrics(metrics) {
315
- metrics.attnetsService.committeeSubnets.set(this.committeeSubnets.size);
316
- metrics.attnetsService.subscriptionsCommittee.set(this.shortLivedSubscriptions.size);
317
- // track short lived subnet status, >= 6 (Dlo) means healthy, otherwise unhealthy
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);
329
- let aggregatorCount = 0;
330
- for (const subnets of this.aggregatorSlotSubnet.values()) {
331
- aggregatorCount += subnets.size;
332
- }
333
- metrics.attnetsService.aggregatorSlotSubnetCount.set(aggregatorCount);
334
- }
335
- }
336
- //# sourceMappingURL=dllAttnetsService.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dllAttnetsService.js","sourceRoot":"","sources":["../../../src/network/subnets/dllAttnetsService.ts"],"names":[],"mappings":"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"}