@lodestar/validator 1.35.0-dev.91dadf81de → 1.35.0-dev.955e9f89ed
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/index.d.ts +7 -7
- package/lib/index.js +5 -5
- package/lib/index.js.map +1 -1
- package/lib/metrics.js +14 -14
- package/lib/metrics.js.map +1 -1
- package/lib/repositories/metaDataRepository.js +3 -4
- package/lib/repositories/metaDataRepository.js.map +1 -1
- package/lib/services/attestation.js +60 -77
- package/lib/services/attestation.js.map +1 -1
- package/lib/services/attestationDuties.js +98 -105
- package/lib/services/attestationDuties.js.map +1 -1
- package/lib/services/block.js +56 -64
- package/lib/services/block.js.map +1 -1
- package/lib/services/blockDuties.d.ts +2 -2
- package/lib/services/blockDuties.js +26 -35
- package/lib/services/blockDuties.js.map +1 -1
- package/lib/services/chainHeaderTracker.js +27 -30
- package/lib/services/chainHeaderTracker.js.map +1 -1
- package/lib/services/doppelgangerService.js +45 -52
- package/lib/services/doppelgangerService.js.map +1 -1
- package/lib/services/emitter.d.ts +1 -1
- package/lib/services/externalSignerSync.js.map +1 -1
- package/lib/services/indices.js +5 -8
- package/lib/services/indices.js.map +1 -1
- package/lib/services/prepareBeaconProposer.js.map +1 -1
- package/lib/services/syncCommittee.js +61 -80
- package/lib/services/syncCommittee.js.map +1 -1
- package/lib/services/syncCommitteeDuties.js +23 -28
- package/lib/services/syncCommitteeDuties.js.map +1 -1
- package/lib/services/syncingStatusTracker.js +27 -32
- package/lib/services/syncingStatusTracker.js.map +1 -1
- package/lib/services/validatorStore.js +3 -9
- package/lib/services/validatorStore.js.map +1 -1
- package/lib/slashingProtection/attestation/attestationByTargetRepository.js +3 -7
- package/lib/slashingProtection/attestation/attestationByTargetRepository.js.map +1 -1
- package/lib/slashingProtection/attestation/attestationLowerBoundRepository.js +3 -5
- package/lib/slashingProtection/attestation/attestationLowerBoundRepository.js.map +1 -1
- package/lib/slashingProtection/attestation/index.js +0 -3
- package/lib/slashingProtection/attestation/index.js.map +1 -1
- package/lib/slashingProtection/block/blockBySlotRepository.js +3 -7
- package/lib/slashingProtection/block/blockBySlotRepository.js.map +1 -1
- package/lib/slashingProtection/block/index.js +0 -1
- package/lib/slashingProtection/block/index.js.map +1 -1
- package/lib/slashingProtection/index.d.ts +1 -1
- package/lib/slashingProtection/index.js +0 -3
- package/lib/slashingProtection/index.js.map +1 -1
- package/lib/slashingProtection/minMaxSurround/distanceStoreRepository.js +0 -8
- package/lib/slashingProtection/minMaxSurround/distanceStoreRepository.js.map +1 -1
- package/lib/slashingProtection/minMaxSurround/minMaxSurround.js +0 -2
- package/lib/slashingProtection/minMaxSurround/minMaxSurround.js.map +1 -1
- package/lib/slashingProtection/utils.d.ts +1 -1
- package/lib/util/clock.d.ts +0 -3
- package/lib/util/clock.js +1 -9
- package/lib/util/clock.js.map +1 -1
- package/lib/util/params.js +1 -17
- package/lib/util/params.js.map +1 -1
- package/lib/validator.js +0 -15
- package/lib/validator.js.map +1 -1
- package/package.json +16 -19
- package/lib/buckets.d.ts.map +0 -1
- package/lib/defaults.d.ts.map +0 -1
- package/lib/genesis.d.ts.map +0 -1
- package/lib/index.d.ts.map +0 -1
- package/lib/metrics.d.ts.map +0 -1
- package/lib/repositories/index.d.ts.map +0 -1
- package/lib/repositories/metaDataRepository.d.ts.map +0 -1
- package/lib/services/attestation.d.ts.map +0 -1
- package/lib/services/attestationDuties.d.ts.map +0 -1
- package/lib/services/block.d.ts.map +0 -1
- package/lib/services/blockDuties.d.ts.map +0 -1
- package/lib/services/chainHeaderTracker.d.ts.map +0 -1
- package/lib/services/doppelgangerService.d.ts.map +0 -1
- package/lib/services/emitter.d.ts.map +0 -1
- package/lib/services/externalSignerSync.d.ts.map +0 -1
- package/lib/services/indices.d.ts.map +0 -1
- package/lib/services/prepareBeaconProposer.d.ts.map +0 -1
- package/lib/services/syncCommittee.d.ts.map +0 -1
- package/lib/services/syncCommitteeDuties.d.ts.map +0 -1
- package/lib/services/syncingStatusTracker.d.ts.map +0 -1
- package/lib/services/utils.d.ts.map +0 -1
- package/lib/services/validatorStore.d.ts.map +0 -1
- package/lib/slashingProtection/attestation/attestationByTargetRepository.d.ts.map +0 -1
- package/lib/slashingProtection/attestation/attestationLowerBoundRepository.d.ts.map +0 -1
- package/lib/slashingProtection/attestation/errors.d.ts.map +0 -1
- package/lib/slashingProtection/attestation/index.d.ts.map +0 -1
- package/lib/slashingProtection/block/blockBySlotRepository.d.ts.map +0 -1
- package/lib/slashingProtection/block/errors.d.ts.map +0 -1
- package/lib/slashingProtection/block/index.d.ts.map +0 -1
- package/lib/slashingProtection/index.d.ts.map +0 -1
- package/lib/slashingProtection/interchange/errors.d.ts.map +0 -1
- package/lib/slashingProtection/interchange/formats/completeV4.d.ts.map +0 -1
- package/lib/slashingProtection/interchange/formats/index.d.ts.map +0 -1
- package/lib/slashingProtection/interchange/formats/v5.d.ts.map +0 -1
- package/lib/slashingProtection/interchange/index.d.ts.map +0 -1
- package/lib/slashingProtection/interchange/parseInterchange.d.ts.map +0 -1
- package/lib/slashingProtection/interchange/serializeInterchange.d.ts.map +0 -1
- package/lib/slashingProtection/interchange/types.d.ts.map +0 -1
- package/lib/slashingProtection/interface.d.ts.map +0 -1
- package/lib/slashingProtection/minMaxSurround/distanceStoreRepository.d.ts.map +0 -1
- package/lib/slashingProtection/minMaxSurround/errors.d.ts.map +0 -1
- package/lib/slashingProtection/minMaxSurround/index.d.ts.map +0 -1
- package/lib/slashingProtection/minMaxSurround/interface.d.ts.map +0 -1
- package/lib/slashingProtection/minMaxSurround/minMaxSurround.d.ts.map +0 -1
- package/lib/slashingProtection/types.d.ts.map +0 -1
- package/lib/slashingProtection/utils.d.ts.map +0 -1
- package/lib/types.d.ts.map +0 -1
- package/lib/util/batch.d.ts.map +0 -1
- package/lib/util/clock.d.ts.map +0 -1
- package/lib/util/difference.d.ts.map +0 -1
- package/lib/util/externalSignerClient.d.ts.map +0 -1
- package/lib/util/format.d.ts.map +0 -1
- package/lib/util/index.d.ts.map +0 -1
- package/lib/util/logger.d.ts.map +0 -1
- package/lib/util/params.d.ts.map +0 -1
- package/lib/util/url.d.ts.map +0 -1
- package/lib/validator.d.ts.map +0 -1
- package/src/buckets.ts +0 -30
- package/src/defaults.ts +0 -8
- package/src/genesis.ts +0 -19
- package/src/index.ts +0 -22
- package/src/metrics.ts +0 -417
- package/src/repositories/index.ts +0 -1
- package/src/repositories/metaDataRepository.ts +0 -42
- package/src/services/attestation.ts +0 -362
- package/src/services/attestationDuties.ts +0 -406
- package/src/services/block.ts +0 -261
- package/src/services/blockDuties.ts +0 -217
- package/src/services/chainHeaderTracker.ts +0 -89
- package/src/services/doppelgangerService.ts +0 -286
- package/src/services/emitter.ts +0 -43
- package/src/services/externalSignerSync.ts +0 -81
- package/src/services/indices.ts +0 -165
- package/src/services/prepareBeaconProposer.ts +0 -119
- package/src/services/syncCommittee.ts +0 -338
- package/src/services/syncCommitteeDuties.ts +0 -337
- package/src/services/syncingStatusTracker.ts +0 -74
- package/src/services/utils.ts +0 -58
- package/src/services/validatorStore.ts +0 -830
- package/src/slashingProtection/attestation/attestationByTargetRepository.ts +0 -77
- package/src/slashingProtection/attestation/attestationLowerBoundRepository.ts +0 -44
- package/src/slashingProtection/attestation/errors.ts +0 -66
- package/src/slashingProtection/attestation/index.ts +0 -171
- package/src/slashingProtection/block/blockBySlotRepository.ts +0 -78
- package/src/slashingProtection/block/errors.ts +0 -28
- package/src/slashingProtection/block/index.ts +0 -94
- package/src/slashingProtection/index.ts +0 -95
- package/src/slashingProtection/interchange/errors.ts +0 -15
- package/src/slashingProtection/interchange/formats/completeV4.ts +0 -125
- package/src/slashingProtection/interchange/formats/index.ts +0 -7
- package/src/slashingProtection/interchange/formats/v5.ts +0 -120
- package/src/slashingProtection/interchange/index.ts +0 -5
- package/src/slashingProtection/interchange/parseInterchange.ts +0 -55
- package/src/slashingProtection/interchange/serializeInterchange.ts +0 -35
- package/src/slashingProtection/interchange/types.ts +0 -18
- package/src/slashingProtection/interface.ts +0 -28
- package/src/slashingProtection/minMaxSurround/distanceStoreRepository.ts +0 -57
- package/src/slashingProtection/minMaxSurround/errors.ts +0 -27
- package/src/slashingProtection/minMaxSurround/index.ts +0 -4
- package/src/slashingProtection/minMaxSurround/interface.ts +0 -23
- package/src/slashingProtection/minMaxSurround/minMaxSurround.ts +0 -104
- package/src/slashingProtection/types.ts +0 -12
- package/src/slashingProtection/utils.ts +0 -42
- package/src/types.ts +0 -31
- package/src/util/batch.ts +0 -15
- package/src/util/clock.ts +0 -170
- package/src/util/difference.ts +0 -10
- package/src/util/externalSignerClient.ts +0 -277
- package/src/util/format.ts +0 -3
- package/src/util/index.ts +0 -6
- package/src/util/logger.ts +0 -51
- package/src/util/params.ts +0 -320
- package/src/util/url.ts +0 -16
- package/src/validator.ts +0 -418
|
@@ -7,16 +7,37 @@ const { EventType } = routes.events;
|
|
|
7
7
|
* Track the head slot/root using the event stream api "head".
|
|
8
8
|
*/
|
|
9
9
|
export class ChainHeaderTracker {
|
|
10
|
-
logger;
|
|
11
|
-
api;
|
|
12
|
-
emitter;
|
|
13
|
-
headBlockSlot = GENESIS_SLOT;
|
|
14
|
-
headBlockRoot = null;
|
|
15
|
-
fns = [];
|
|
16
10
|
constructor(logger, api, emitter) {
|
|
17
11
|
this.logger = logger;
|
|
18
12
|
this.api = api;
|
|
19
13
|
this.emitter = emitter;
|
|
14
|
+
this.headBlockSlot = GENESIS_SLOT;
|
|
15
|
+
this.headBlockRoot = null;
|
|
16
|
+
this.fns = [];
|
|
17
|
+
this.onHeadUpdate = (event) => {
|
|
18
|
+
if (event.type === EventType.head) {
|
|
19
|
+
const { message } = event;
|
|
20
|
+
const { slot, block, previousDutyDependentRoot, currentDutyDependentRoot } = message;
|
|
21
|
+
this.headBlockSlot = slot;
|
|
22
|
+
this.headBlockRoot = fromHex(block);
|
|
23
|
+
const headEventData = {
|
|
24
|
+
slot: this.headBlockSlot,
|
|
25
|
+
head: block,
|
|
26
|
+
previousDutyDependentRoot: previousDutyDependentRoot,
|
|
27
|
+
currentDutyDependentRoot: currentDutyDependentRoot,
|
|
28
|
+
};
|
|
29
|
+
for (const fn of this.fns) {
|
|
30
|
+
fn(headEventData).catch((e) => this.logger.error("Error calling head event handler", e));
|
|
31
|
+
}
|
|
32
|
+
this.emitter.emit(ValidatorEvent.chainHead, headEventData);
|
|
33
|
+
this.logger.verbose("Found new chain head", {
|
|
34
|
+
slot: slot,
|
|
35
|
+
head: block,
|
|
36
|
+
previousDuty: previousDutyDependentRoot,
|
|
37
|
+
currentDuty: currentDutyDependentRoot,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
};
|
|
20
41
|
}
|
|
21
42
|
start(signal) {
|
|
22
43
|
this.logger.verbose("Subscribing to head event");
|
|
@@ -44,29 +65,5 @@ export class ChainHeaderTracker {
|
|
|
44
65
|
runOnNewHead(fn) {
|
|
45
66
|
this.fns.push(fn);
|
|
46
67
|
}
|
|
47
|
-
onHeadUpdate = (event) => {
|
|
48
|
-
if (event.type === EventType.head) {
|
|
49
|
-
const { message } = event;
|
|
50
|
-
const { slot, block, previousDutyDependentRoot, currentDutyDependentRoot } = message;
|
|
51
|
-
this.headBlockSlot = slot;
|
|
52
|
-
this.headBlockRoot = fromHex(block);
|
|
53
|
-
const headEventData = {
|
|
54
|
-
slot: this.headBlockSlot,
|
|
55
|
-
head: block,
|
|
56
|
-
previousDutyDependentRoot: previousDutyDependentRoot,
|
|
57
|
-
currentDutyDependentRoot: currentDutyDependentRoot,
|
|
58
|
-
};
|
|
59
|
-
for (const fn of this.fns) {
|
|
60
|
-
fn(headEventData).catch((e) => this.logger.error("Error calling head event handler", e));
|
|
61
|
-
}
|
|
62
|
-
this.emitter.emit(ValidatorEvent.chainHead, headEventData);
|
|
63
|
-
this.logger.verbose("Found new chain head", {
|
|
64
|
-
slot: slot,
|
|
65
|
-
head: block,
|
|
66
|
-
previousDuty: previousDutyDependentRoot,
|
|
67
|
-
currentDuty: currentDutyDependentRoot,
|
|
68
|
-
});
|
|
69
|
-
}
|
|
70
|
-
};
|
|
71
68
|
}
|
|
72
69
|
//# sourceMappingURL=chainHeaderTracker.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chainHeaderTracker.js","sourceRoot":"","sources":["../../src/services/chainHeaderTracker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,MAAM,EAAC,MAAM,eAAe,CAAC;AAChD,OAAO,EAAC,YAAY,EAAC,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EAAS,OAAO,EAAC,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAC,cAAc,EAAwB,MAAM,cAAc,CAAC;AAEnE,MAAM,EAAC,SAAS,EAAC,GAAG,MAAM,CAAC,MAAM,CAAC;AAWlC;;GAEG;AACH,MAAM,OAAO,kBAAkB;
|
|
1
|
+
{"version":3,"file":"chainHeaderTracker.js","sourceRoot":"","sources":["../../src/services/chainHeaderTracker.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,14 +17,6 @@ export var DoppelgangerStatus;
|
|
|
17
17
|
DoppelgangerStatus["DoppelgangerDetected"] = "DoppelgangerDetected";
|
|
18
18
|
})(DoppelgangerStatus || (DoppelgangerStatus = {}));
|
|
19
19
|
export class DoppelgangerService {
|
|
20
|
-
logger;
|
|
21
|
-
clock;
|
|
22
|
-
api;
|
|
23
|
-
indicesService;
|
|
24
|
-
slashingProtection;
|
|
25
|
-
processShutdownCallback;
|
|
26
|
-
metrics;
|
|
27
|
-
doppelgangerStateByPubkey = new Map();
|
|
28
20
|
constructor(logger, clock, api, indicesService, slashingProtection, processShutdownCallback, metrics) {
|
|
29
21
|
this.logger = logger;
|
|
30
22
|
this.clock = clock;
|
|
@@ -33,6 +25,51 @@ export class DoppelgangerService {
|
|
|
33
25
|
this.slashingProtection = slashingProtection;
|
|
34
26
|
this.processShutdownCallback = processShutdownCallback;
|
|
35
27
|
this.metrics = metrics;
|
|
28
|
+
this.doppelgangerStateByPubkey = new Map();
|
|
29
|
+
this.pollLiveness = async (currentEpoch, signal) => {
|
|
30
|
+
if (currentEpoch < 0) {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
const endSlotOfCurrentEpoch = computeStartSlotAtEpoch(currentEpoch + 1) - 1;
|
|
34
|
+
// Run the doppelganger protection check 75% through the last slot of this epoch. This
|
|
35
|
+
// *should* mean that the BN has seen the blocks and attestations for the epoch
|
|
36
|
+
await sleep(this.clock.msToSlot(endSlotOfCurrentEpoch + 3 / 4), signal);
|
|
37
|
+
// Collect indices that still need doppelganger checks
|
|
38
|
+
const pubkeysToCheckWithoutIndex = [];
|
|
39
|
+
// Collect as Map for detectDoppelganger() which needs to map back index -> pubkey
|
|
40
|
+
const indicesToCheckMap = new Map();
|
|
41
|
+
for (const [pubkeyHex, state] of this.doppelgangerStateByPubkey.entries()) {
|
|
42
|
+
if (state.remainingEpochs > 0 && state.nextEpochToCheck <= currentEpoch) {
|
|
43
|
+
const index = this.indicesService.pubkey2index.get(pubkeyHex);
|
|
44
|
+
if (index !== undefined) {
|
|
45
|
+
indicesToCheckMap.set(index, pubkeyHex);
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
pubkeysToCheckWithoutIndex.push(pubkeyHex);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
// Attempt to collect missing indexes
|
|
53
|
+
const newIndices = await this.indicesService.pollValidatorIndices(pubkeysToCheckWithoutIndex);
|
|
54
|
+
for (const index of newIndices) {
|
|
55
|
+
const pubkey = this.indicesService.index2pubkey.get(index);
|
|
56
|
+
if (pubkey) {
|
|
57
|
+
indicesToCheckMap.set(index, pubkey);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
if (indicesToCheckMap.size === 0) {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
this.logger.info("Doppelganger liveness check", { currentEpoch, indicesCount: indicesToCheckMap.size });
|
|
64
|
+
// in the current epoch also request for liveness check for past epoch in case a validator index was live
|
|
65
|
+
// in the remaining 25% of the last slot of the previous epoch
|
|
66
|
+
const indicesToCheck = Array.from(indicesToCheckMap.keys());
|
|
67
|
+
const [previous, current] = await Promise.all([
|
|
68
|
+
this.getLiveness(currentEpoch - 1, indicesToCheck),
|
|
69
|
+
this.getLiveness(currentEpoch, indicesToCheck),
|
|
70
|
+
]);
|
|
71
|
+
this.detectDoppelganger(currentEpoch, previous, current, indicesToCheckMap);
|
|
72
|
+
};
|
|
36
73
|
this.clock.runEveryEpoch(this.pollLiveness);
|
|
37
74
|
if (metrics) {
|
|
38
75
|
metrics.doppelganger.statusCount.addCollect(() => this.onScrapeMetrics(metrics));
|
|
@@ -86,50 +123,6 @@ export class DoppelgangerService {
|
|
|
86
123
|
isDoppelgangerSafe(pubKeyHex) {
|
|
87
124
|
return getStatus(this.doppelgangerStateByPubkey.get(pubKeyHex)) === DoppelgangerStatus.VerifiedSafe;
|
|
88
125
|
}
|
|
89
|
-
pollLiveness = async (currentEpoch, signal) => {
|
|
90
|
-
if (currentEpoch < 0) {
|
|
91
|
-
return;
|
|
92
|
-
}
|
|
93
|
-
const endSlotOfCurrentEpoch = computeStartSlotAtEpoch(currentEpoch + 1) - 1;
|
|
94
|
-
// Run the doppelganger protection check 75% through the last slot of this epoch. This
|
|
95
|
-
// *should* mean that the BN has seen the blocks and attestations for the epoch
|
|
96
|
-
await sleep(this.clock.msToSlot(endSlotOfCurrentEpoch + 3 / 4), signal);
|
|
97
|
-
// Collect indices that still need doppelganger checks
|
|
98
|
-
const pubkeysToCheckWithoutIndex = [];
|
|
99
|
-
// Collect as Map for detectDoppelganger() which needs to map back index -> pubkey
|
|
100
|
-
const indicesToCheckMap = new Map();
|
|
101
|
-
for (const [pubkeyHex, state] of this.doppelgangerStateByPubkey.entries()) {
|
|
102
|
-
if (state.remainingEpochs > 0 && state.nextEpochToCheck <= currentEpoch) {
|
|
103
|
-
const index = this.indicesService.pubkey2index.get(pubkeyHex);
|
|
104
|
-
if (index !== undefined) {
|
|
105
|
-
indicesToCheckMap.set(index, pubkeyHex);
|
|
106
|
-
}
|
|
107
|
-
else {
|
|
108
|
-
pubkeysToCheckWithoutIndex.push(pubkeyHex);
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
// Attempt to collect missing indexes
|
|
113
|
-
const newIndices = await this.indicesService.pollValidatorIndices(pubkeysToCheckWithoutIndex);
|
|
114
|
-
for (const index of newIndices) {
|
|
115
|
-
const pubkey = this.indicesService.index2pubkey.get(index);
|
|
116
|
-
if (pubkey) {
|
|
117
|
-
indicesToCheckMap.set(index, pubkey);
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
if (indicesToCheckMap.size === 0) {
|
|
121
|
-
return;
|
|
122
|
-
}
|
|
123
|
-
this.logger.info("Doppelganger liveness check", { currentEpoch, indicesCount: indicesToCheckMap.size });
|
|
124
|
-
// in the current epoch also request for liveness check for past epoch in case a validator index was live
|
|
125
|
-
// in the remaining 25% of the last slot of the previous epoch
|
|
126
|
-
const indicesToCheck = Array.from(indicesToCheckMap.keys());
|
|
127
|
-
const [previous, current] = await Promise.all([
|
|
128
|
-
this.getLiveness(currentEpoch - 1, indicesToCheck),
|
|
129
|
-
this.getLiveness(currentEpoch, indicesToCheck),
|
|
130
|
-
]);
|
|
131
|
-
this.detectDoppelganger(currentEpoch, previous, current, indicesToCheckMap);
|
|
132
|
-
};
|
|
133
126
|
async getLiveness(epoch, indicesToCheck) {
|
|
134
127
|
if (epoch < 0) {
|
|
135
128
|
return { epoch, responses: [] };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doppelgangerService.js","sourceRoot":"","sources":["../../src/services/doppelgangerService.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,uBAAuB,EAAC,MAAM,4BAA4B,CAAC;AAEnE,OAAO,EAAS,OAAO,EAAE,KAAK,EAAE,UAAU,EAAC,MAAM,iBAAiB,CAAC;AAOnE,4EAA4E;AAC5E,+CAA+C;AAC/C,MAAM,kCAAkC,GAAG,CAAC,CAAC;AAC7C,MAAM,gCAAgC,GAAG,QAAQ,CAAC;AAClD,MAAM,2BAA2B,GAAG,CAAC,CAAC;AAatC,MAAM,CAAN,IAAY,kBASX;AATD,WAAY,kBAAkB;IAC5B,kFAAkF;IAClF,mDAA6B,CAAA;IAC7B,sFAAsF;IACtF,+CAAyB,CAAA;IACzB,yDAAyD;IACzD,yCAAmB,CAAA;IACnB,gEAAgE;IAChE,mEAA6C,CAAA;AAC/C,CAAC,EATW,kBAAkB,KAAlB,kBAAkB,QAS7B;AAED,MAAM,OAAO,mBAAmB;
|
|
1
|
+
{"version":3,"file":"doppelgangerService.js","sourceRoot":"","sources":["../../src/services/doppelgangerService.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,uBAAuB,EAAC,MAAM,4BAA4B,CAAC;AAEnE,OAAO,EAAS,OAAO,EAAE,KAAK,EAAE,UAAU,EAAC,MAAM,iBAAiB,CAAC;AAOnE,4EAA4E;AAC5E,+CAA+C;AAC/C,MAAM,kCAAkC,GAAG,CAAC,CAAC;AAC7C,MAAM,gCAAgC,GAAG,QAAQ,CAAC;AAClD,MAAM,2BAA2B,GAAG,CAAC,CAAC;AAatC,MAAM,CAAN,IAAY,kBASX;AATD,WAAY,kBAAkB;IAC5B,kFAAkF;IAClF,mDAA6B,CAAA;IAC7B,sFAAsF;IACtF,+CAAyB,CAAA;IACzB,yDAAyD;IACzD,yCAAmB,CAAA;IACnB,gEAAgE;IAChE,mEAA6C,CAAA;AAC/C,CAAC,EATW,kBAAkB,KAAlB,kBAAkB,QAS7B;AAED,MAAM,OAAO,mBAAmB;IAG9B,YACmB,MAAc,EACd,KAAa,EACb,GAAc,EACd,cAA8B,EAC9B,kBAAuC,EACvC,uBAAgD,EAChD,OAAuB;QANvB,WAAM,GAAN,MAAM,CAAQ;QACd,UAAK,GAAL,KAAK,CAAQ;QACb,QAAG,GAAH,GAAG,CAAW;QACd,mBAAc,GAAd,cAAc,CAAgB;QAC9B,uBAAkB,GAAlB,kBAAkB,CAAqB;QACvC,4BAAuB,GAAvB,uBAAuB,CAAyB;QAChD,YAAO,GAAP,OAAO,CAAgB;QATzB,8BAAyB,GAAG,IAAI,GAAG,EAAgC,CAAC;QA2E7E,iBAAY,GAAG,KAAK,EAAE,YAAmB,EAAE,MAAmB,EAAiB,EAAE;YACvF,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;gBACrB,OAAO;YACT,CAAC;YAED,MAAM,qBAAqB,GAAG,uBAAuB,CAAC,YAAY,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;YAC5E,sFAAsF;YACtF,+EAA+E;YAC/E,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,qBAAqB,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;YAExE,sDAAsD;YACtD,MAAM,0BAA0B,GAAgB,EAAE,CAAC;YACnD,kFAAkF;YAClF,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAA6B,CAAC;YAE/D,KAAK,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,yBAAyB,CAAC,OAAO,EAAE,EAAE,CAAC;gBAC1E,IAAI,KAAK,CAAC,eAAe,GAAG,CAAC,IAAI,KAAK,CAAC,gBAAgB,IAAI,YAAY,EAAE,CAAC;oBACxE,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;oBAC9D,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;wBACxB,iBAAiB,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;oBAC1C,CAAC;yBAAM,CAAC;wBACN,0BAA0B,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;oBAC7C,CAAC;gBACH,CAAC;YACH,CAAC;YAED,qCAAqC;YACrC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,oBAAoB,CAAC,0BAA0B,CAAC,CAAC;YAC9F,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE,CAAC;gBAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBAC3D,IAAI,MAAM,EAAE,CAAC;oBACX,iBAAiB,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;gBACvC,CAAC;YACH,CAAC;YAED,IAAI,iBAAiB,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBACjC,OAAO;YACT,CAAC;YAED,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,6BAA6B,EAAE,EAAC,YAAY,EAAE,YAAY,EAAE,iBAAiB,CAAC,IAAI,EAAC,CAAC,CAAC;YAEtG,yGAAyG;YACzG,8DAA8D;YAC9D,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,CAAC,CAAC;YAC5D,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBAC5C,IAAI,CAAC,WAAW,CAAC,YAAY,GAAG,CAAC,EAAE,cAAc,CAAC;gBAClD,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE,cAAc,CAAC;aAC/C,CAAC,CAAC;YAEH,IAAI,CAAC,kBAAkB,CAAC,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE,iBAAiB,CAAC,CAAC;QAC9E,CAAC,CAAC;QAlHA,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAE5C,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,YAAY,CAAC,WAAW,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC;QACnF,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iCAAiC,EAAE,EAAC,eAAe,EAAE,kCAAkC,EAAC,CAAC,CAAC;IAC7G,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,SAAoB;QAC1C,MAAM,EAAC,YAAY,EAAC,GAAG,IAAI,CAAC,KAAK,CAAC;QAClC,qFAAqF;QACrF,oEAAoE;QACpE,IAAI,eAAe,GAAG,YAAY,IAAI,CAAC,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,kCAAkC,CAAC;QAC3G,MAAM,gBAAgB,GAAG,YAAY,GAAG,CAAC,CAAC;QAE1C,+EAA+E;QAC/E,IAAI,eAAe,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,aAAa,GAAG,YAAY,GAAG,CAAC,CAAC;YACvC,MAAM,uBAAuB,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,kBAAkB,CAC9E,OAAO,CAAC,SAAS,CAAC,EAClB,aAAa,CACd,CAAC;YAEF,IAAI,uBAAuB,EAAE,CAAC;gBAC5B,4CAA4C;gBAC5C,oDAAoD;gBACpD,eAAe,GAAG,2BAA2B,CAAC;gBAC9C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,2EAA2E,EAAE;oBAC5F,MAAM,EAAE,UAAU,CAAC,SAAS,CAAC;oBAC7B,aAAa;iBACd,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iDAAiD,EAAE;oBAClE,MAAM,EAAE,UAAU,CAAC,SAAS,CAAC;oBAC7B,eAAe;oBACf,gBAAgB;iBACjB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,yEAAyE,EAAE;gBAC1F,MAAM,EAAE,UAAU,CAAC,SAAS,CAAC;gBAC7B,YAAY;aACb,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,SAAS,EAAE;YAC5C,gBAAgB;YAChB,eAAe;SAChB,CAAC,CAAC;IACL,CAAC;IAED,mBAAmB,CAAC,SAAoB;QACtC,IAAI,CAAC,yBAAyB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACnD,CAAC;IAED,SAAS,CAAC,SAAoB;QAC5B,OAAO,SAAS,CAAC,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;IAClE,CAAC;IAED,kBAAkB,CAAC,SAAoB;QACrC,OAAO,SAAS,CAAC,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,KAAK,kBAAkB,CAAC,YAAY,CAAC;IACtG,CAAC;IAsDO,KAAK,CAAC,WAAW,CAAC,KAAY,EAAE,cAAgC;QACtE,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACd,OAAO,EAAC,KAAK,EAAE,SAAS,EAAE,EAAE,EAAC,CAAC;QAChC,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC,EAAC,KAAK,EAAE,OAAO,EAAE,cAAc,EAAC,CAAC,CAAC;QACnF,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,yCAAyC,KAAK,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,KAAK,EAAW,CAAC,CAAC;YAC9F,OAAO,EAAC,KAAK,EAAE,SAAS,EAAE,EAAE,EAAC,CAAC;QAChC,CAAC;QACD,OAAO,EAAC,KAAK,EAAE,SAAS,EAAE,GAAG,CAAC,KAAK,EAAE,EAAC,CAAC;IACzC,CAAC;IAEO,kBAAkB,CACxB,YAAmB,EACnB,qBAAwC,EACxC,oBAAuC,EACvC,iBAAiD;QAEjD,MAAM,aAAa,GAAG,YAAY,GAAG,CAAC,CAAC;QACvC,MAAM,SAAS,GAAqB,EAAE,CAAC;QAEvC,4FAA4F;QAC5F,EAAE;QACF,yFAAyF;QACzF,oCAAoC;QAEpC,KAAK,MAAM,EAAC,KAAK,EAAE,SAAS,EAAC,IAAI,CAAC,qBAAqB,EAAE,oBAAoB,CAAC,EAAE,CAAC;YAC/E,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;gBACjC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;oBACrB,SAAS;gBACX,CAAC;gBAED,MAAM,KAAK,GAAG,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC9F,IAAI,CAAC,KAAK,EAAE,CAAC;oBACX,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,mDAAmD,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;oBACvF,SAAS;gBACX,CAAC;gBAED,IAAI,KAAK,CAAC,gBAAgB,IAAI,KAAK,EAAE,CAAC;oBACpC,wBAAwB;oBACxB,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;gBACjC,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,6FAA6F;YAC7F,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,yBAAyB,CAAC,MAAM,EAAE,EAAE,CAAC;gBAC5D,KAAK,CAAC,eAAe,GAAG,gCAAgC,CAAC;YAC3D,CAAC;YAED,IAAI,CAAC,MAAM,CAAC,KAAK,CACf;;;;4DAIoD,EACpD,SAAS,CACV,CAAC;YAEF,8BAA8B;YAC9B,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC,CAAC;QAClE,CAAC;QAED,iCAAiC;aAC5B,CAAC;YACJ,yFAAyF;YACzF,EAAE;YACF,yFAAyF;YACzF,qEAAqE;YACrE,KAAK,MAAM,QAAQ,IAAI,qBAAqB,CAAC,SAAS,EAAE,CAAC;gBACvD,MAAM,KAAK,GAAG,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC9F,IAAI,CAAC,KAAK,EAAE,CAAC;oBACX,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,mDAAmD,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;oBACvF,SAAS;gBACX,CAAC;gBAED,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,KAAK,CAAC,gBAAgB,IAAI,aAAa,EAAE,CAAC;oBAChE,KAAK,CAAC,eAAe,EAAE,CAAC;oBACxB,KAAK,CAAC,gBAAgB,GAAG,YAAY,CAAC;oBACtC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;oBAEhD,MAAM,EAAC,eAAe,EAAE,gBAAgB,EAAC,GAAG,KAAK,CAAC;oBAClD,IAAI,eAAe,IAAI,CAAC,EAAE,CAAC;wBACzB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iCAAiC,EAAE,EAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,YAAY,EAAC,CAAC,CAAC;oBACpG,CAAC;yBAAM,CAAC;wBACN,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,uBAAuB,EAAE,EAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAC,CAAC,CAAC;oBACxG,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAEO,eAAe,CAAC,OAAgB;QACtC,MAAM,aAAa,GAAG,IAAI,GAAG,EAA8B,CAAC;QAC5D,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,yBAAyB,CAAC,MAAM,EAAE,EAAE,CAAC;YAC5D,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;YAChC,aAAa,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAClE,CAAC;QAED,+EAA+E;QAC/E,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,kBAAkB,CAAC,EAAE,CAAC;YACvD,OAAO,CAAC,YAAY,CAAC,WAAW,CAAC,GAAG,CAAC,EAAC,MAAM,EAAC,EAAE,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QACjF,CAAC;IACH,CAAC;CACF;AAED,SAAS,SAAS,CAAC,KAAoC;IACrD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,kBAAkB,CAAC,OAAO,CAAC;IACpC,CAAC;IACD,IAAI,KAAK,CAAC,eAAe,IAAI,CAAC,EAAE,CAAC;QAC/B,OAAO,kBAAkB,CAAC,YAAY,CAAC;IACzC,CAAC;IACD,IAAI,KAAK,CAAC,eAAe,KAAK,gCAAgC,EAAE,CAAC;QAC/D,OAAO,kBAAkB,CAAC,oBAAoB,CAAC;IACjD,CAAC;IACD,OAAO,kBAAkB,CAAC,UAAU,CAAC;AACvC,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { EventEmitter } from "node:events";
|
|
2
|
-
import { StrictEventEmitter } from "strict-event-emitter-types";
|
|
3
2
|
import { Slot } from "@lodestar/types";
|
|
3
|
+
import { StrictEventEmitter } from "strict-event-emitter-types";
|
|
4
4
|
import { HeadEventData } from "./chainHeaderTracker.js";
|
|
5
5
|
export declare enum ValidatorEvent {
|
|
6
6
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"externalSignerSync.js","sourceRoot":"","sources":["../../src/services/externalSignerSync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAC,MAAM,iBAAiB,CAAC;AAE1C,OAAO,EAAC,eAAe,EAAC,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAC,OAAO,EAAE,cAAc,EAAC,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"externalSignerSync.js","sourceRoot":"","sources":["../../src/services/externalSignerSync.ts"],"names":[],"mappings":"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"}
|
package/lib/services/indices.js
CHANGED
|
@@ -25,18 +25,15 @@ const statusToSimpleStatusMapping = (status) => {
|
|
|
25
25
|
}
|
|
26
26
|
};
|
|
27
27
|
export class IndicesService {
|
|
28
|
-
logger;
|
|
29
|
-
api;
|
|
30
|
-
metrics;
|
|
31
|
-
index2pubkey = new Map();
|
|
32
|
-
/** Indexed by pubkey in hex 0x prefixed */
|
|
33
|
-
pubkey2index = new Map();
|
|
34
|
-
// Request indices once
|
|
35
|
-
pollValidatorIndicesPromise = null;
|
|
36
28
|
constructor(logger, api, metrics) {
|
|
37
29
|
this.logger = logger;
|
|
38
30
|
this.api = api;
|
|
39
31
|
this.metrics = metrics;
|
|
32
|
+
this.index2pubkey = new Map();
|
|
33
|
+
/** Indexed by pubkey in hex 0x prefixed */
|
|
34
|
+
this.pubkey2index = new Map();
|
|
35
|
+
// Request indices once
|
|
36
|
+
this.pollValidatorIndicesPromise = null;
|
|
40
37
|
if (metrics) {
|
|
41
38
|
metrics.indices.addCollect(() => metrics.indices.set(this.index2pubkey.size));
|
|
42
39
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"indices.js","sourceRoot":"","sources":["../../src/services/indices.ts"],"names":[],"mappings":"AAEA,OAAO,EAAS,MAAM,EAAE,WAAW,EAAC,MAAM,iBAAiB,CAAC;AAE5D,OAAO,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAE5C;;;;;GAKG;AACH,MAAM,mBAAmB,GAAG,MAAM,CAAC;AAQnC,MAAM,2BAA2B,GAAG,CAAC,MAAqC,EAAyB,EAAE;IACnG,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,gBAAgB,CAAC;QACtB,KAAK,gBAAgB,CAAC;QACtB,KAAK,gBAAgB;YACnB,OAAO,QAAQ,CAAC;QAElB,KAAK,qBAAqB,CAAC;QAC3B,KAAK,gBAAgB,CAAC;QACtB,KAAK,kBAAkB;YACrB,OAAO,QAAQ,CAAC;QAElB,KAAK,qBAAqB,CAAC;QAC3B,KAAK,gBAAgB;YACnB,OAAO,SAAS,CAAC;QAEnB,KAAK,iBAAiB;YACpB,OAAO,WAAW,CAAC;IACvB,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,OAAO,cAAc;
|
|
1
|
+
{"version":3,"file":"indices.js","sourceRoot":"","sources":["../../src/services/indices.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prepareBeaconProposer.js","sourceRoot":"","sources":["../../src/services/prepareBeaconProposer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,MAAM,EAAC,MAAM,eAAe,CAAC;AAEhD,OAAO,EAAC,aAAa,EAAE,eAAe,EAAC,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"prepareBeaconProposer.js","sourceRoot":"","sources":["../../src/services/prepareBeaconProposer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { isSyncCommitteeAggregator } from "@lodestar/state-transition";
|
|
1
|
+
import { computeEpochAtSlot, isSyncCommitteeAggregator } from "@lodestar/state-transition";
|
|
3
2
|
import { sleep } from "@lodestar/utils";
|
|
4
3
|
import { SyncCommitteeDutiesService } from "./syncCommitteeDuties.js";
|
|
5
4
|
import { groupSyncDutiesBySubcommitteeIndex } from "./utils.js";
|
|
@@ -7,17 +6,6 @@ import { groupSyncDutiesBySubcommitteeIndex } from "./utils.js";
|
|
|
7
6
|
* Service that sets up and handles validator sync duties.
|
|
8
7
|
*/
|
|
9
8
|
export class SyncCommitteeService {
|
|
10
|
-
config;
|
|
11
|
-
logger;
|
|
12
|
-
api;
|
|
13
|
-
clock;
|
|
14
|
-
validatorStore;
|
|
15
|
-
emitter;
|
|
16
|
-
chainHeaderTracker;
|
|
17
|
-
syncingStatusTracker;
|
|
18
|
-
metrics;
|
|
19
|
-
opts;
|
|
20
|
-
dutiesService;
|
|
21
9
|
constructor(config, logger, api, clock, validatorStore, emitter, chainHeaderTracker, syncingStatusTracker, metrics, opts) {
|
|
22
10
|
this.config = config;
|
|
23
11
|
this.logger = logger;
|
|
@@ -29,6 +17,55 @@ export class SyncCommitteeService {
|
|
|
29
17
|
this.syncingStatusTracker = syncingStatusTracker;
|
|
30
18
|
this.metrics = metrics;
|
|
31
19
|
this.opts = opts;
|
|
20
|
+
this.runSyncCommitteeTasks = async (slot, signal) => {
|
|
21
|
+
try {
|
|
22
|
+
// Before altair fork no need to check duties
|
|
23
|
+
if (computeEpochAtSlot(slot) < this.config.ALTAIR_FORK_EPOCH) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
// Fetch info first so a potential delay is absorbed by the sleep() below
|
|
27
|
+
const dutiesAtSlot = await this.dutiesService.getDutiesAtSlot(slot);
|
|
28
|
+
if (dutiesAtSlot.length === 0) {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
if (this.opts?.distributedAggregationSelection) {
|
|
32
|
+
// Validator in distributed cluster only has a key share, not the full private key.
|
|
33
|
+
// The partial selection proofs must be exchanged for combined selection proofs by
|
|
34
|
+
// calling submitSyncCommitteeSelections on the distributed validator middleware client.
|
|
35
|
+
// This will run in parallel to other sync committee tasks but must be finished before starting
|
|
36
|
+
// sync committee contributions as it is required to correctly determine if validator is aggregator
|
|
37
|
+
// and to produce a ContributionAndProof that can be threshold aggregated by the middleware client.
|
|
38
|
+
this.runDistributedAggregationSelectionTasks(dutiesAtSlot, slot, signal).catch((e) => this.logger.error("Error on sync committee aggregation selection", { slot }, e));
|
|
39
|
+
}
|
|
40
|
+
// unlike Attestation, SyncCommitteeSignature could be published asap
|
|
41
|
+
// especially with lodestar, it's very busy at 1/3 of slot
|
|
42
|
+
// see https://github.com/ChainSafe/lodestar/issues/4608
|
|
43
|
+
await Promise.race([sleep(this.clock.msToSlot(slot + 1 / 3), signal), this.emitter.waitForBlockSlot(slot)]);
|
|
44
|
+
this.metrics?.syncCommitteeStepCallProduceMessage.observe(this.clock.secFromSlot(slot + 1 / 3));
|
|
45
|
+
// Step 1. Download, sign and publish an `SyncCommitteeMessage` for each validator.
|
|
46
|
+
// Differs from AttestationService, `SyncCommitteeMessage` are equal for all
|
|
47
|
+
const beaconBlockRoot = await this.produceAndPublishSyncCommittees(slot, dutiesAtSlot);
|
|
48
|
+
// Step 2. If an attestation was produced, make an aggregate.
|
|
49
|
+
// First, wait until the `aggregation_production_instant` (2/3rds of the way though the slot)
|
|
50
|
+
await sleep(this.clock.msToSlot(slot + 2 / 3), signal);
|
|
51
|
+
this.metrics?.syncCommitteeStepCallProduceAggregate.observe(this.clock.secFromSlot(slot + 2 / 3));
|
|
52
|
+
// await for all so if the Beacon node is overloaded it auto-throttles
|
|
53
|
+
// TODO: This approach is conservative to reduce the node's load, review
|
|
54
|
+
const dutiesBySubcommitteeIndex = groupSyncDutiesBySubcommitteeIndex(dutiesAtSlot);
|
|
55
|
+
await Promise.all(Array.from(dutiesBySubcommitteeIndex.entries()).map(async ([subcommitteeIndex, duties]) => {
|
|
56
|
+
if (duties.length === 0)
|
|
57
|
+
return;
|
|
58
|
+
// Then download, sign and publish a `SignedAggregateAndProof` for each
|
|
59
|
+
// validator that is elected to aggregate for this `slot` and `subcommitteeIndex`.
|
|
60
|
+
await this.produceAndPublishAggregates(slot, subcommitteeIndex, beaconBlockRoot, duties).catch((e) => {
|
|
61
|
+
this.logger.error("Error on SyncCommitteeContribution", { slot, index: subcommitteeIndex }, e);
|
|
62
|
+
});
|
|
63
|
+
}));
|
|
64
|
+
}
|
|
65
|
+
catch (e) {
|
|
66
|
+
this.logger.error("Error on runSyncCommitteeTasks", { slot }, e);
|
|
67
|
+
}
|
|
68
|
+
};
|
|
32
69
|
this.dutiesService = new SyncCommitteeDutiesService(config, logger, api, clock, validatorStore, syncingStatusTracker, metrics, {
|
|
33
70
|
distributedAggregationSelection: opts?.distributedAggregationSelection,
|
|
34
71
|
});
|
|
@@ -38,61 +75,6 @@ export class SyncCommitteeService {
|
|
|
38
75
|
removeDutiesForKey(pubkey) {
|
|
39
76
|
this.dutiesService.removeDutiesForKey(pubkey);
|
|
40
77
|
}
|
|
41
|
-
runSyncCommitteeTasks = async (slot, signal) => {
|
|
42
|
-
const fork = this.config.getForkName(slot);
|
|
43
|
-
try {
|
|
44
|
-
// Before altair fork no need to check duties
|
|
45
|
-
if (!isForkPostAltair(fork)) {
|
|
46
|
-
return;
|
|
47
|
-
}
|
|
48
|
-
// Fetch info first so a potential delay is absorbed by the sleep() below
|
|
49
|
-
const dutiesAtSlot = await this.dutiesService.getDutiesAtSlot(slot);
|
|
50
|
-
if (dutiesAtSlot.length === 0) {
|
|
51
|
-
return;
|
|
52
|
-
}
|
|
53
|
-
if (this.opts?.distributedAggregationSelection) {
|
|
54
|
-
// Validator in distributed cluster only has a key share, not the full private key.
|
|
55
|
-
// The partial selection proofs must be exchanged for combined selection proofs by
|
|
56
|
-
// calling submitSyncCommitteeSelections on the distributed validator middleware client.
|
|
57
|
-
// This will run in parallel to other sync committee tasks but must be finished before starting
|
|
58
|
-
// sync committee contributions as it is required to correctly determine if validator is aggregator
|
|
59
|
-
// and to produce a ContributionAndProof that can be threshold aggregated by the middleware client.
|
|
60
|
-
this.runDistributedAggregationSelectionTasks(fork, dutiesAtSlot, slot, signal).catch((e) => this.logger.error("Error on sync committee aggregation selection", { slot }, e));
|
|
61
|
-
}
|
|
62
|
-
// unlike Attestation, SyncCommitteeSignature could be published asap
|
|
63
|
-
// especially with lodestar, it's very busy at ATTESTATION_DUE_BPS of the slot
|
|
64
|
-
// see https://github.com/ChainSafe/lodestar/issues/4608
|
|
65
|
-
const syncMessageDueMs = this.config.getSyncMessageDueMs(fork);
|
|
66
|
-
await Promise.race([
|
|
67
|
-
sleep(syncMessageDueMs - this.clock.msFromSlot(slot), signal),
|
|
68
|
-
this.emitter.waitForBlockSlot(slot),
|
|
69
|
-
]);
|
|
70
|
-
this.metrics?.syncCommitteeStepCallProduceMessage.observe(this.clock.secFromSlot(slot) - syncMessageDueMs / 1000);
|
|
71
|
-
// Step 1. Download, sign and publish an `SyncCommitteeMessage` for each validator.
|
|
72
|
-
// Differs from AttestationService, `SyncCommitteeMessage` are equal for all
|
|
73
|
-
const beaconBlockRoot = await this.produceAndPublishSyncCommittees(fork, slot, dutiesAtSlot);
|
|
74
|
-
// Step 2. If an attestation was produced, make an aggregate.
|
|
75
|
-
// First, wait until the `CONTRIBUTION_DUE_BPS` of the slot
|
|
76
|
-
const syncContributionDueMs = this.config.getSyncContributionDueMs(fork);
|
|
77
|
-
await sleep(syncContributionDueMs - this.clock.msFromSlot(slot), signal);
|
|
78
|
-
this.metrics?.syncCommitteeStepCallProduceAggregate.observe(this.clock.secFromSlot(slot) - syncContributionDueMs / 1000);
|
|
79
|
-
// await for all so if the Beacon node is overloaded it auto-throttles
|
|
80
|
-
// TODO: This approach is conservative to reduce the node's load, review
|
|
81
|
-
const dutiesBySubcommitteeIndex = groupSyncDutiesBySubcommitteeIndex(dutiesAtSlot);
|
|
82
|
-
await Promise.all(Array.from(dutiesBySubcommitteeIndex.entries()).map(async ([subcommitteeIndex, duties]) => {
|
|
83
|
-
if (duties.length === 0)
|
|
84
|
-
return;
|
|
85
|
-
// Then download, sign and publish a `SignedAggregateAndProof` for each
|
|
86
|
-
// validator that is elected to aggregate for this `slot` and `subcommitteeIndex`.
|
|
87
|
-
await this.produceAndPublishAggregates(fork, slot, subcommitteeIndex, beaconBlockRoot, duties).catch((e) => {
|
|
88
|
-
this.logger.error("Error on SyncCommitteeContribution", { slot, index: subcommitteeIndex }, e);
|
|
89
|
-
});
|
|
90
|
-
}));
|
|
91
|
-
}
|
|
92
|
-
catch (e) {
|
|
93
|
-
this.logger.error("Error on runSyncCommitteeTasks", { slot }, e);
|
|
94
|
-
}
|
|
95
|
-
};
|
|
96
78
|
/**
|
|
97
79
|
* Performs the first step of the attesting process: downloading `SyncCommittee` objects,
|
|
98
80
|
* signing them and returning them to the validator.
|
|
@@ -102,7 +84,7 @@ export class SyncCommitteeService {
|
|
|
102
84
|
* Only one `SyncCommittee` is downloaded from the BN. It is then signed by each
|
|
103
85
|
* validator and the list of individually-signed `SyncCommittee` objects is returned to the BN.
|
|
104
86
|
*/
|
|
105
|
-
async produceAndPublishSyncCommittees(
|
|
87
|
+
async produceAndPublishSyncCommittees(slot, duties) {
|
|
106
88
|
const logCtx = { slot };
|
|
107
89
|
// /eth/v1/beacon/blocks/:blockId/root -> at slot -1
|
|
108
90
|
// Produce one attestation data per slot and subcommitteeIndex
|
|
@@ -124,14 +106,13 @@ export class SyncCommitteeService {
|
|
|
124
106
|
// by default we want to submit SyncCommitteeSignature asap after we receive block
|
|
125
107
|
// provide a delay option just in case any client implementation validate the existence of block in
|
|
126
108
|
// SyncCommitteeSignature gossip validation.
|
|
127
|
-
const
|
|
128
|
-
const msToCutoffTime = syncMessageDueMs - this.clock.msFromSlot(slot);
|
|
109
|
+
const msToOneThirdSlot = this.clock.msToSlot(slot + 1 / 3);
|
|
129
110
|
const afterBlockDelayMs = 1000 * this.clock.secondsPerSlot * (this.opts?.scAfterBlockDelaySlotFraction ?? 0);
|
|
130
|
-
const toDelayMs = Math.min(
|
|
111
|
+
const toDelayMs = Math.min(msToOneThirdSlot, afterBlockDelayMs);
|
|
131
112
|
if (toDelayMs > 0) {
|
|
132
113
|
await sleep(toDelayMs);
|
|
133
114
|
}
|
|
134
|
-
this.metrics?.syncCommitteeStepCallPublishMessage.observe(this.clock.secFromSlot(slot
|
|
115
|
+
this.metrics?.syncCommitteeStepCallPublishMessage.observe(this.clock.secFromSlot(slot + 1 / 3));
|
|
135
116
|
if (signatures.length > 0) {
|
|
136
117
|
try {
|
|
137
118
|
(await this.api.beacon.submitPoolSyncCommitteeSignatures({ signatures })).assertOk();
|
|
@@ -154,7 +135,7 @@ export class SyncCommitteeService {
|
|
|
154
135
|
* by each validator and the list of individually-signed `SignedAggregateAndProof` objects is
|
|
155
136
|
* returned to the BN.
|
|
156
137
|
*/
|
|
157
|
-
async produceAndPublishAggregates(
|
|
138
|
+
async produceAndPublishAggregates(slot, subcommitteeIndex, beaconBlockRoot, duties) {
|
|
158
139
|
const logCtx = { slot, index: subcommitteeIndex };
|
|
159
140
|
// No validator is aggregator, skip
|
|
160
141
|
if (duties.every(({ selectionProof }) => selectionProof === null)) {
|
|
@@ -176,7 +157,7 @@ export class SyncCommitteeService {
|
|
|
176
157
|
this.logger.error("Error signing SyncCommitteeContribution", logCtxValidator, e);
|
|
177
158
|
}
|
|
178
159
|
}));
|
|
179
|
-
this.metrics?.syncCommitteeStepCallPublishAggregate.observe(this.clock.secFromSlot(slot
|
|
160
|
+
this.metrics?.syncCommitteeStepCallPublishAggregate.observe(this.clock.secFromSlot(slot + 2 / 3));
|
|
180
161
|
if (signedContributions.length > 0) {
|
|
181
162
|
try {
|
|
182
163
|
(await this.api.validator.publishContributionAndProofs({ contributionAndProofs: signedContributions })).assertOk();
|
|
@@ -197,7 +178,7 @@ export class SyncCommitteeService {
|
|
|
197
178
|
*
|
|
198
179
|
* See https://docs.google.com/document/d/1q9jOTPcYQa-3L8luRvQJ-M0eegtba4Nmon3dpO79TMk/mobilebasic
|
|
199
180
|
*/
|
|
200
|
-
async runDistributedAggregationSelectionTasks(
|
|
181
|
+
async runDistributedAggregationSelectionTasks(duties, slot, signal) {
|
|
201
182
|
const partialSelections = [];
|
|
202
183
|
for (const { duty, selectionProofs } of duties) {
|
|
203
184
|
const validatorSelections = selectionProofs.map(({ subcommitteeIndex, partialSelectionProof }) => ({
|
|
@@ -211,17 +192,17 @@ export class SyncCommitteeService {
|
|
|
211
192
|
this.logger.debug("Submitting partial sync committee selection proofs", { slot, count: partialSelections.length });
|
|
212
193
|
const res = await Promise.race([
|
|
213
194
|
this.api.validator.submitSyncCommitteeSelections({ selections: partialSelections }),
|
|
214
|
-
// Exit sync committee contributions flow if there is no response after
|
|
215
|
-
// This is in contrast to attestations aggregations flow which is already exited at
|
|
195
|
+
// Exit sync committee contributions flow if there is no response after 2/3 of slot.
|
|
196
|
+
// This is in contrast to attestations aggregations flow which is already exited at 1/3 of the slot
|
|
216
197
|
// because for sync committee is not required to resubscribe to subnets as beacon node will assume
|
|
217
198
|
// validator always aggregates. This allows us to wait until we have to produce sync committee contributions.
|
|
218
199
|
// Note that the sync committee contributions flow is not explicitly exited but rather will be skipped
|
|
219
200
|
// due to the fact that calculation of `is_sync_committee_aggregator` in SyncCommitteeDutiesService is not done
|
|
220
201
|
// and selectionProof is set to null, meaning no validator will be considered an aggregator.
|
|
221
|
-
sleep(this.
|
|
202
|
+
sleep(this.clock.msToSlot(slot + 2 / 3), signal),
|
|
222
203
|
]);
|
|
223
204
|
if (!res) {
|
|
224
|
-
throw new Error("Failed to receive combined selection proofs before
|
|
205
|
+
throw new Error("Failed to receive combined selection proofs before 2/3 of slot");
|
|
225
206
|
}
|
|
226
207
|
const combinedSelections = res.value();
|
|
227
208
|
this.logger.debug("Received combined sync committee selection proofs", { slot, count: combinedSelections.length });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"syncCommittee.js","sourceRoot":"","sources":["../../src/services/syncCommittee.ts"],"names":[],"mappings":"AAEA,OAAO,
|
|
1
|
+
{"version":3,"file":"syncCommittee.js","sourceRoot":"","sources":["../../src/services/syncCommittee.ts"],"names":[],"mappings":"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"}
|