@lodestar/validator 1.35.0-dev.f80d2d52da → 1.35.0-dev.fcf8d024ea
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/buckets.d.ts.map +1 -0
- package/lib/defaults.d.ts.map +1 -0
- package/lib/genesis.d.ts.map +1 -0
- package/lib/index.d.ts +7 -7
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +5 -5
- package/lib/index.js.map +1 -1
- package/lib/metrics.d.ts.map +1 -0
- package/lib/metrics.js +14 -14
- package/lib/metrics.js.map +1 -1
- package/lib/repositories/index.d.ts.map +1 -0
- package/lib/repositories/metaDataRepository.d.ts.map +1 -0
- package/lib/repositories/metaDataRepository.js +4 -3
- package/lib/repositories/metaDataRepository.js.map +1 -1
- package/lib/services/attestation.d.ts.map +1 -0
- package/lib/services/attestation.js +77 -60
- package/lib/services/attestation.js.map +1 -1
- package/lib/services/attestationDuties.d.ts.map +1 -0
- package/lib/services/attestationDuties.js +105 -98
- package/lib/services/attestationDuties.js.map +1 -1
- package/lib/services/block.d.ts.map +1 -0
- package/lib/services/block.js +64 -56
- package/lib/services/block.js.map +1 -1
- package/lib/services/blockDuties.d.ts +2 -2
- package/lib/services/blockDuties.d.ts.map +1 -0
- package/lib/services/blockDuties.js +35 -26
- package/lib/services/blockDuties.js.map +1 -1
- package/lib/services/chainHeaderTracker.d.ts.map +1 -0
- package/lib/services/chainHeaderTracker.js +30 -27
- package/lib/services/chainHeaderTracker.js.map +1 -1
- package/lib/services/doppelgangerService.d.ts.map +1 -0
- package/lib/services/doppelgangerService.js +52 -45
- package/lib/services/doppelgangerService.js.map +1 -1
- package/lib/services/emitter.d.ts +1 -1
- package/lib/services/emitter.d.ts.map +1 -0
- package/lib/services/externalSignerSync.d.ts.map +1 -0
- package/lib/services/externalSignerSync.js.map +1 -1
- package/lib/services/indices.d.ts.map +1 -0
- package/lib/services/indices.js +8 -5
- package/lib/services/indices.js.map +1 -1
- package/lib/services/prepareBeaconProposer.d.ts.map +1 -0
- package/lib/services/prepareBeaconProposer.js.map +1 -1
- package/lib/services/syncCommittee.d.ts.map +1 -0
- package/lib/services/syncCommittee.js +80 -61
- package/lib/services/syncCommittee.js.map +1 -1
- package/lib/services/syncCommitteeDuties.d.ts.map +1 -0
- package/lib/services/syncCommitteeDuties.js +28 -23
- package/lib/services/syncCommitteeDuties.js.map +1 -1
- package/lib/services/syncingStatusTracker.d.ts.map +1 -0
- package/lib/services/syncingStatusTracker.js +32 -27
- package/lib/services/syncingStatusTracker.js.map +1 -1
- package/lib/services/utils.d.ts.map +1 -0
- package/lib/services/validatorStore.d.ts.map +1 -0
- package/lib/services/validatorStore.js +9 -3
- package/lib/services/validatorStore.js.map +1 -1
- package/lib/slashingProtection/attestation/attestationByTargetRepository.d.ts.map +1 -0
- package/lib/slashingProtection/attestation/attestationByTargetRepository.js +7 -3
- package/lib/slashingProtection/attestation/attestationByTargetRepository.js.map +1 -1
- package/lib/slashingProtection/attestation/attestationLowerBoundRepository.d.ts.map +1 -0
- package/lib/slashingProtection/attestation/attestationLowerBoundRepository.js +5 -3
- package/lib/slashingProtection/attestation/attestationLowerBoundRepository.js.map +1 -1
- package/lib/slashingProtection/attestation/errors.d.ts.map +1 -0
- package/lib/slashingProtection/attestation/index.d.ts.map +1 -0
- package/lib/slashingProtection/attestation/index.js +3 -0
- package/lib/slashingProtection/attestation/index.js.map +1 -1
- package/lib/slashingProtection/block/blockBySlotRepository.d.ts.map +1 -0
- package/lib/slashingProtection/block/blockBySlotRepository.js +7 -3
- package/lib/slashingProtection/block/blockBySlotRepository.js.map +1 -1
- package/lib/slashingProtection/block/errors.d.ts.map +1 -0
- package/lib/slashingProtection/block/index.d.ts.map +1 -0
- package/lib/slashingProtection/block/index.js +1 -0
- package/lib/slashingProtection/block/index.js.map +1 -1
- package/lib/slashingProtection/index.d.ts +1 -1
- package/lib/slashingProtection/index.d.ts.map +1 -0
- package/lib/slashingProtection/index.js +3 -0
- package/lib/slashingProtection/index.js.map +1 -1
- package/lib/slashingProtection/interchange/errors.d.ts.map +1 -0
- package/lib/slashingProtection/interchange/formats/completeV4.d.ts.map +1 -0
- package/lib/slashingProtection/interchange/formats/index.d.ts.map +1 -0
- package/lib/slashingProtection/interchange/formats/v5.d.ts.map +1 -0
- package/lib/slashingProtection/interchange/index.d.ts.map +1 -0
- package/lib/slashingProtection/interchange/parseInterchange.d.ts.map +1 -0
- package/lib/slashingProtection/interchange/serializeInterchange.d.ts.map +1 -0
- package/lib/slashingProtection/interchange/types.d.ts.map +1 -0
- package/lib/slashingProtection/interface.d.ts.map +1 -0
- package/lib/slashingProtection/minMaxSurround/distanceStoreRepository.d.ts.map +1 -0
- package/lib/slashingProtection/minMaxSurround/distanceStoreRepository.js +8 -0
- package/lib/slashingProtection/minMaxSurround/distanceStoreRepository.js.map +1 -1
- package/lib/slashingProtection/minMaxSurround/errors.d.ts.map +1 -0
- package/lib/slashingProtection/minMaxSurround/index.d.ts.map +1 -0
- package/lib/slashingProtection/minMaxSurround/interface.d.ts.map +1 -0
- package/lib/slashingProtection/minMaxSurround/minMaxSurround.d.ts.map +1 -0
- package/lib/slashingProtection/minMaxSurround/minMaxSurround.js +2 -0
- package/lib/slashingProtection/minMaxSurround/minMaxSurround.js.map +1 -1
- package/lib/slashingProtection/types.d.ts.map +1 -0
- package/lib/slashingProtection/utils.d.ts +1 -1
- package/lib/slashingProtection/utils.d.ts.map +1 -0
- package/lib/types.d.ts.map +1 -0
- package/lib/util/batch.d.ts.map +1 -0
- package/lib/util/clock.d.ts +3 -0
- package/lib/util/clock.d.ts.map +1 -0
- package/lib/util/clock.js +9 -1
- package/lib/util/clock.js.map +1 -1
- package/lib/util/difference.d.ts.map +1 -0
- package/lib/util/externalSignerClient.d.ts.map +1 -0
- package/lib/util/format.d.ts.map +1 -0
- package/lib/util/index.d.ts.map +1 -0
- package/lib/util/logger.d.ts.map +1 -0
- package/lib/util/params.d.ts.map +1 -0
- package/lib/util/params.js +18 -2
- package/lib/util/params.js.map +1 -1
- package/lib/util/url.d.ts.map +1 -0
- package/lib/validator.d.ts.map +1 -0
- package/lib/validator.js +15 -0
- package/lib/validator.js.map +1 -1
- package/package.json +19 -16
- package/src/buckets.ts +30 -0
- package/src/defaults.ts +8 -0
- package/src/genesis.ts +19 -0
- package/src/index.ts +22 -0
- package/src/metrics.ts +417 -0
- package/src/repositories/index.ts +1 -0
- package/src/repositories/metaDataRepository.ts +42 -0
- package/src/services/attestation.ts +362 -0
- package/src/services/attestationDuties.ts +406 -0
- package/src/services/block.ts +261 -0
- package/src/services/blockDuties.ts +217 -0
- package/src/services/chainHeaderTracker.ts +89 -0
- package/src/services/doppelgangerService.ts +286 -0
- package/src/services/emitter.ts +43 -0
- package/src/services/externalSignerSync.ts +81 -0
- package/src/services/indices.ts +165 -0
- package/src/services/prepareBeaconProposer.ts +119 -0
- package/src/services/syncCommittee.ts +338 -0
- package/src/services/syncCommitteeDuties.ts +337 -0
- package/src/services/syncingStatusTracker.ts +74 -0
- package/src/services/utils.ts +58 -0
- package/src/services/validatorStore.ts +830 -0
- package/src/slashingProtection/attestation/attestationByTargetRepository.ts +77 -0
- package/src/slashingProtection/attestation/attestationLowerBoundRepository.ts +44 -0
- package/src/slashingProtection/attestation/errors.ts +66 -0
- package/src/slashingProtection/attestation/index.ts +171 -0
- package/src/slashingProtection/block/blockBySlotRepository.ts +78 -0
- package/src/slashingProtection/block/errors.ts +28 -0
- package/src/slashingProtection/block/index.ts +94 -0
- package/src/slashingProtection/index.ts +95 -0
- package/src/slashingProtection/interchange/errors.ts +15 -0
- package/src/slashingProtection/interchange/formats/completeV4.ts +125 -0
- package/src/slashingProtection/interchange/formats/index.ts +7 -0
- package/src/slashingProtection/interchange/formats/v5.ts +120 -0
- package/src/slashingProtection/interchange/index.ts +5 -0
- package/src/slashingProtection/interchange/parseInterchange.ts +55 -0
- package/src/slashingProtection/interchange/serializeInterchange.ts +35 -0
- package/src/slashingProtection/interchange/types.ts +18 -0
- package/src/slashingProtection/interface.ts +28 -0
- package/src/slashingProtection/minMaxSurround/distanceStoreRepository.ts +57 -0
- package/src/slashingProtection/minMaxSurround/errors.ts +27 -0
- package/src/slashingProtection/minMaxSurround/index.ts +4 -0
- package/src/slashingProtection/minMaxSurround/interface.ts +23 -0
- package/src/slashingProtection/minMaxSurround/minMaxSurround.ts +104 -0
- package/src/slashingProtection/types.ts +12 -0
- package/src/slashingProtection/utils.ts +42 -0
- package/src/types.ts +31 -0
- package/src/util/batch.ts +15 -0
- package/src/util/clock.ts +170 -0
- package/src/util/difference.ts +10 -0
- package/src/util/externalSignerClient.ts +277 -0
- package/src/util/format.ts +3 -0
- package/src/util/index.ts +6 -0
- package/src/util/logger.ts +51 -0
- package/src/util/params.ts +320 -0
- package/src/util/url.ts +16 -0
- package/src/validator.ts +418 -0
|
@@ -7,37 +7,16 @@ 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 = [];
|
|
10
16
|
constructor(logger, api, emitter) {
|
|
11
17
|
this.logger = logger;
|
|
12
18
|
this.api = api;
|
|
13
19
|
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
|
-
};
|
|
41
20
|
}
|
|
42
21
|
start(signal) {
|
|
43
22
|
this.logger.verbose("Subscribing to head event");
|
|
@@ -65,5 +44,29 @@ export class ChainHeaderTracker {
|
|
|
65
44
|
runOnNewHead(fn) {
|
|
66
45
|
this.fns.push(fn);
|
|
67
46
|
}
|
|
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
|
+
};
|
|
68
71
|
}
|
|
69
72
|
//# 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":"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;IAMV;IACA;IACA;IAPX,aAAa,GAAS,YAAY,CAAC;IACnC,aAAa,GAAgB,IAAI,CAAC;IACzB,GAAG,GAAiB,EAAE,CAAC;IAExC,YACmB,MAAc,EACd,GAAc,EACd,OAA8B;QAF9B,WAAM,GAAN,MAAM,CAAQ;QACd,QAAG,GAAH,GAAG,CAAW;QACd,YAAO,GAAP,OAAO,CAAuB;IAC9C,CAAC;IAEJ,KAAK,CAAC,MAAmB;QACvB,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC;QACjD,IAAI,CAAC,GAAG,CAAC,MAAM;aACZ,WAAW,CAAC;YACX,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC;YACxB,MAAM;YACN,OAAO,EAAE,IAAI,CAAC,YAAY;YAC1B,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;gBACb,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,8BAA8B,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;YAC3D,CAAC;YACD,OAAO,EAAE,GAAG,EAAE;gBACZ,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,8BAA8B,EAAE,EAAE,CAAC,CAAC;YAC1D,CAAC;SACF,CAAC;aACD,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,mCAAmC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IACjF,CAAC;IAED,mBAAmB,CAAC,IAAU;QAC5B,IAAI,IAAI,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YAC/B,OAAO,IAAI,CAAC,aAAa,CAAC;QAC5B,CAAC;QACD,qCAAqC;QACrC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,YAAY,CAAC,EAAc;QACzB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC;IAEO,YAAY,GAAG,CAAC,KAAgC,EAAQ,EAAE;QAChE,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;YAClC,MAAM,EAAC,OAAO,EAAC,GAAG,KAAK,CAAC;YACxB,MAAM,EAAC,IAAI,EAAE,KAAK,EAAE,yBAAyB,EAAE,wBAAwB,EAAC,GAAG,OAAO,CAAC;YACnF,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;YAC1B,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;YAEpC,MAAM,aAAa,GAAG;gBACpB,IAAI,EAAE,IAAI,CAAC,aAAa;gBACxB,IAAI,EAAE,KAAK;gBACX,yBAAyB,EAAE,yBAAyB;gBACpD,wBAAwB,EAAE,wBAAwB;aACnD,CAAC;YAEF,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;gBAC1B,EAAE,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,kCAAkC,EAAE,CAAC,CAAC,CAAC,CAAC;YAC3F,CAAC;YAED,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;YAE3D,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,sBAAsB,EAAE;gBAC1C,IAAI,EAAE,IAAI;gBACV,IAAI,EAAE,KAAK;gBACX,YAAY,EAAE,yBAAyB;gBACvC,WAAW,EAAE,wBAAwB;aACtC,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC;CACH"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doppelgangerService.d.ts","sourceRoot":"","sources":["../../src/services/doppelgangerService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAS,MAAM,eAAe,CAAC;AAEhD,OAAO,EAAC,KAAK,EAAiB,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAC,MAAM,EAA6B,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAC,OAAO,EAAC,MAAM,eAAe,CAAC;AACtC,OAAO,EAAC,mBAAmB,EAAC,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAC,uBAAuB,EAAE,SAAS,EAAC,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAC,MAAM,EAAC,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAC,cAAc,EAAC,MAAM,cAAc,CAAC;AAc5C,MAAM,MAAM,iBAAiB,GAAG;IAC9B,gBAAgB,EAAE,KAAK,CAAC;IACxB,eAAe,EAAE,KAAK,CAAC;CACxB,CAAC;AAEF,oBAAY,kBAAkB;IAC5B,kFAAkF;IAClF,YAAY,iBAAiB;IAC7B,sFAAsF;IACtF,UAAU,eAAe;IACzB,yDAAyD;IACzD,OAAO,YAAY;IACnB,gEAAgE;IAChE,oBAAoB,yBAAyB;CAC9C;AAED,qBAAa,mBAAmB;IAI5B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IACnC,OAAO,CAAC,QAAQ,CAAC,uBAAuB;IACxC,OAAO,CAAC,QAAQ,CAAC,OAAO;IAT1B,OAAO,CAAC,QAAQ,CAAC,yBAAyB,CAA2C;gBAGlE,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,SAAS,EACd,cAAc,EAAE,cAAc,EAC9B,kBAAkB,EAAE,mBAAmB,EACvC,uBAAuB,EAAE,uBAAuB,EAChD,OAAO,EAAE,OAAO,GAAG,IAAI;IAWpC,iBAAiB,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IA2C5D,mBAAmB,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI;IAI/C,SAAS,CAAC,SAAS,EAAE,SAAS,GAAG,kBAAkB;IAInD,kBAAkB,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO;IAIjD,OAAO,CAAC,YAAY,CAkDlB;YAEY,WAAW;IAazB,OAAO,CAAC,kBAAkB;IAiF1B,OAAO,CAAC,eAAe;CAYxB"}
|
|
@@ -17,6 +17,14 @@ 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();
|
|
20
28
|
constructor(logger, clock, api, indicesService, slashingProtection, processShutdownCallback, metrics) {
|
|
21
29
|
this.logger = logger;
|
|
22
30
|
this.clock = clock;
|
|
@@ -25,51 +33,6 @@ export class DoppelgangerService {
|
|
|
25
33
|
this.slashingProtection = slashingProtection;
|
|
26
34
|
this.processShutdownCallback = processShutdownCallback;
|
|
27
35
|
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
|
-
};
|
|
73
36
|
this.clock.runEveryEpoch(this.pollLiveness);
|
|
74
37
|
if (metrics) {
|
|
75
38
|
metrics.doppelganger.statusCount.addCollect(() => this.onScrapeMetrics(metrics));
|
|
@@ -123,6 +86,50 @@ export class DoppelgangerService {
|
|
|
123
86
|
isDoppelgangerSafe(pubKeyHex) {
|
|
124
87
|
return getStatus(this.doppelgangerStateByPubkey.get(pubKeyHex)) === DoppelgangerStatus.VerifiedSafe;
|
|
125
88
|
}
|
|
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
|
+
};
|
|
126
133
|
async getLiveness(epoch, indicesToCheck) {
|
|
127
134
|
if (epoch < 0) {
|
|
128
135
|
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":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { EventEmitter } from "node:events";
|
|
2
|
-
import { Slot } from "@lodestar/types";
|
|
3
2
|
import { StrictEventEmitter } from "strict-event-emitter-types";
|
|
3
|
+
import { Slot } from "@lodestar/types";
|
|
4
4
|
import { HeadEventData } from "./chainHeaderTracker.js";
|
|
5
5
|
export declare enum ValidatorEvent {
|
|
6
6
|
/**
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emitter.d.ts","sourceRoot":"","sources":["../../src/services/emitter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,aAAa,CAAC;AACzC,OAAO,EAAC,kBAAkB,EAAC,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAC,IAAI,EAAC,MAAM,iBAAiB,CAAC;AACrC,OAAO,EAAC,aAAa,EAAC,MAAM,yBAAyB,CAAC;AAEtD,oBAAY,cAAc;IACxB;;OAEG;IACH,SAAS,cAAc;CACxB;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,IAAI,CAAC;CAC3D,CAAC;0CAK0D;IAC1D,QAAQ,kBAAkB,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;CAC3D;AALD;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,0BAEzC;IACA;;OAEG;IACG,gBAAgB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;CAiBlD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"externalSignerSync.d.ts","sourceRoot":"","sources":["../../src/services/externalSignerSync.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,eAAe,EAAC,MAAM,kBAAkB,CAAC;AAIjD,OAAO,EAAC,QAAQ,EAAC,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAa,cAAc,EAAC,MAAM,qBAAqB,CAAC;AAE/D,MAAM,MAAM,qBAAqB,GAAG;IAClC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE,QAAQ,EAChB,MAAM,EAAE,WAAW,EACnB,cAAc,EAAE,cAAc,EAC9B,IAAI,CAAC,EAAE,qBAAqB,GAC3B,IAAI,CAgDN"}
|
|
@@ -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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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"indices.d.ts","sourceRoot":"","sources":["../../src/services/indices.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAS,MAAM,eAAe,CAAC;AAChD,OAAO,EAAC,cAAc,EAAC,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAC,MAAM,EAAsB,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAC,OAAO,EAAC,MAAM,eAAe,CAAC;AAYtC,KAAK,SAAS,GAAG,MAAM,CAAC;AA0BxB,qBAAa,cAAc;IAQvB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAT1B,QAAQ,CAAC,YAAY,sBAAwC;IAC7D,2CAA2C;IAC3C,QAAQ,CAAC,YAAY,sBAAwC;IAE7D,OAAO,CAAC,2BAA2B,CAA0C;gBAG1D,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,SAAS,EACd,OAAO,EAAE,OAAO,GAAG,IAAI;IAO1C,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED,+DAA+D;IAC/D,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,cAAc,GAAG,SAAS;IAIhE,+DAA+D;IAC/D,kBAAkB,IAAI,cAAc,EAAE;IAItC,qEAAqE;IACrE,iBAAiB,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO;IAI3C,oBAAoB,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAe9E,YAAY,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO;IASxC;gEAC4D;YAC9C,4BAA4B;YAsB5B,qBAAqB;CAuCpC"}
|
package/lib/services/indices.js
CHANGED
|
@@ -25,15 +25,18 @@ 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;
|
|
28
36
|
constructor(logger, api, metrics) {
|
|
29
37
|
this.logger = logger;
|
|
30
38
|
this.api = api;
|
|
31
39
|
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;
|
|
37
40
|
if (metrics) {
|
|
38
41
|
metrics.indices.addCollect(() => metrics.indices.set(this.index2pubkey.size));
|
|
39
42
|
}
|
|
@@ -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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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prepareBeaconProposer.d.ts","sourceRoot":"","sources":["../../src/services/prepareBeaconProposer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAS,MAAM,eAAe,CAAC;AAChD,OAAO,EAAC,YAAY,EAAC,MAAM,kBAAkB,CAAC;AAG9C,OAAO,EAAC,OAAO,EAAC,MAAM,eAAe,CAAC;AACtC,OAAO,EAAC,MAAM,EAAE,QAAQ,EAAa,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAC,cAAc,EAAC,MAAM,qBAAqB,CAAC;AAGnD;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,QAAQ,EAChB,GAAG,EAAE,SAAS,EACd,KAAK,EAAE,MAAM,EACb,cAAc,EAAE,cAAc,EAC9B,QAAQ,EAAE,OAAO,GAAG,IAAI,GACvB,IAAI,CA8BN;AAED;;;;;;GAMG;AACH,wBAAgB,gCAAgC,CAC9C,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,QAAQ,EAChB,GAAG,EAAE,SAAS,EACd,KAAK,EAAE,MAAM,EACb,cAAc,EAAE,cAAc,EAC9B,QAAQ,EAAE,OAAO,GAAG,IAAI,GACvB,IAAI,CAgDN"}
|
|
@@ -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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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"syncCommittee.d.ts","sourceRoot":"","sources":["../../src/services/syncCommittee.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAS,MAAM,eAAe,CAAC;AAChD,OAAO,EAAC,eAAe,EAAC,MAAM,kBAAkB,CAAC;AAKjD,OAAO,EAAC,OAAO,EAAC,MAAM,eAAe,CAAC;AACtC,OAAO,EAAC,SAAS,EAAC,MAAM,aAAa,CAAC;AACtC,OAAO,EAAC,MAAM,EAAE,QAAQ,EAAC,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAC,kBAAkB,EAAC,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAC,qBAAqB,EAAC,MAAM,cAAc,CAAC;AAEnD,OAAO,EAAC,oBAAoB,EAAC,MAAM,2BAA2B,CAAC;AAE/D,OAAO,EAAC,cAAc,EAAC,MAAM,qBAAqB,CAAC;AAEnD,MAAM,MAAM,wBAAwB,GAAG;IACrC,6BAA6B,CAAC,EAAE,MAAM,CAAC;IACvC,+BAA+B,CAAC,EAAE,OAAO,CAAC;CAC3C,CAAC;AAEF;;GAEG;AACH,qBAAa,oBAAoB;IAI7B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IACnC,QAAQ,CAAC,oBAAoB,EAAE,oBAAoB;IACnD,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;IAZxB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA6B;gBAGxC,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE,QAAQ,EAChB,GAAG,EAAE,SAAS,EACd,KAAK,EAAE,MAAM,EACb,cAAc,EAAE,cAAc,EAC9B,OAAO,EAAE,qBAAqB,EAC9B,kBAAkB,EAAE,kBAAkB,EAC9C,oBAAoB,EAAE,oBAAoB,EAClC,OAAO,EAAE,OAAO,GAAG,IAAI,EACvB,IAAI,CAAC,EAAE,wBAAwB,YAAA;IAmBlD,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI;IAI3C,OAAO,CAAC,qBAAqB,CAmE3B;IAEF;;;;;;;;OAQG;YACW,+BAA+B;IA2D7C;;;;;;;;;OASG;YACW,2BAA2B;IAqDzC;;;;;;;;OAQG;YACW,uCAAuC;CAoEtD"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { isForkPostAltair } from "@lodestar/params";
|
|
2
|
+
import { isSyncCommitteeAggregator } from "@lodestar/state-transition";
|
|
2
3
|
import { sleep } from "@lodestar/utils";
|
|
3
4
|
import { SyncCommitteeDutiesService } from "./syncCommitteeDuties.js";
|
|
4
5
|
import { groupSyncDutiesBySubcommitteeIndex } from "./utils.js";
|
|
@@ -6,6 +7,17 @@ import { groupSyncDutiesBySubcommitteeIndex } from "./utils.js";
|
|
|
6
7
|
* Service that sets up and handles validator sync duties.
|
|
7
8
|
*/
|
|
8
9
|
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;
|
|
9
21
|
constructor(config, logger, api, clock, validatorStore, emitter, chainHeaderTracker, syncingStatusTracker, metrics, opts) {
|
|
10
22
|
this.config = config;
|
|
11
23
|
this.logger = logger;
|
|
@@ -17,55 +29,6 @@ export class SyncCommitteeService {
|
|
|
17
29
|
this.syncingStatusTracker = syncingStatusTracker;
|
|
18
30
|
this.metrics = metrics;
|
|
19
31
|
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
|
-
};
|
|
69
32
|
this.dutiesService = new SyncCommitteeDutiesService(config, logger, api, clock, validatorStore, syncingStatusTracker, metrics, {
|
|
70
33
|
distributedAggregationSelection: opts?.distributedAggregationSelection,
|
|
71
34
|
});
|
|
@@ -75,6 +38,61 @@ export class SyncCommitteeService {
|
|
|
75
38
|
removeDutiesForKey(pubkey) {
|
|
76
39
|
this.dutiesService.removeDutiesForKey(pubkey);
|
|
77
40
|
}
|
|
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
|
+
};
|
|
78
96
|
/**
|
|
79
97
|
* Performs the first step of the attesting process: downloading `SyncCommittee` objects,
|
|
80
98
|
* signing them and returning them to the validator.
|
|
@@ -84,7 +102,7 @@ export class SyncCommitteeService {
|
|
|
84
102
|
* Only one `SyncCommittee` is downloaded from the BN. It is then signed by each
|
|
85
103
|
* validator and the list of individually-signed `SyncCommittee` objects is returned to the BN.
|
|
86
104
|
*/
|
|
87
|
-
async produceAndPublishSyncCommittees(slot, duties) {
|
|
105
|
+
async produceAndPublishSyncCommittees(fork, slot, duties) {
|
|
88
106
|
const logCtx = { slot };
|
|
89
107
|
// /eth/v1/beacon/blocks/:blockId/root -> at slot -1
|
|
90
108
|
// Produce one attestation data per slot and subcommitteeIndex
|
|
@@ -106,13 +124,14 @@ export class SyncCommitteeService {
|
|
|
106
124
|
// by default we want to submit SyncCommitteeSignature asap after we receive block
|
|
107
125
|
// provide a delay option just in case any client implementation validate the existence of block in
|
|
108
126
|
// SyncCommitteeSignature gossip validation.
|
|
109
|
-
const
|
|
127
|
+
const syncMessageDueMs = this.config.getSyncMessageDueMs(fork);
|
|
128
|
+
const msToCutoffTime = syncMessageDueMs - this.clock.msFromSlot(slot);
|
|
110
129
|
const afterBlockDelayMs = 1000 * this.clock.secondsPerSlot * (this.opts?.scAfterBlockDelaySlotFraction ?? 0);
|
|
111
|
-
const toDelayMs = Math.min(
|
|
130
|
+
const toDelayMs = Math.min(msToCutoffTime, afterBlockDelayMs);
|
|
112
131
|
if (toDelayMs > 0) {
|
|
113
132
|
await sleep(toDelayMs);
|
|
114
133
|
}
|
|
115
|
-
this.metrics?.syncCommitteeStepCallPublishMessage.observe(this.clock.secFromSlot(slot
|
|
134
|
+
this.metrics?.syncCommitteeStepCallPublishMessage.observe(this.clock.secFromSlot(slot) - syncMessageDueMs / 1000);
|
|
116
135
|
if (signatures.length > 0) {
|
|
117
136
|
try {
|
|
118
137
|
(await this.api.beacon.submitPoolSyncCommitteeSignatures({ signatures })).assertOk();
|
|
@@ -135,7 +154,7 @@ export class SyncCommitteeService {
|
|
|
135
154
|
* by each validator and the list of individually-signed `SignedAggregateAndProof` objects is
|
|
136
155
|
* returned to the BN.
|
|
137
156
|
*/
|
|
138
|
-
async produceAndPublishAggregates(slot, subcommitteeIndex, beaconBlockRoot, duties) {
|
|
157
|
+
async produceAndPublishAggregates(fork, slot, subcommitteeIndex, beaconBlockRoot, duties) {
|
|
139
158
|
const logCtx = { slot, index: subcommitteeIndex };
|
|
140
159
|
// No validator is aggregator, skip
|
|
141
160
|
if (duties.every(({ selectionProof }) => selectionProof === null)) {
|
|
@@ -157,7 +176,7 @@ export class SyncCommitteeService {
|
|
|
157
176
|
this.logger.error("Error signing SyncCommitteeContribution", logCtxValidator, e);
|
|
158
177
|
}
|
|
159
178
|
}));
|
|
160
|
-
this.metrics?.syncCommitteeStepCallPublishAggregate.observe(this.clock.secFromSlot(slot
|
|
179
|
+
this.metrics?.syncCommitteeStepCallPublishAggregate.observe(this.clock.secFromSlot(slot) - this.config.getSyncContributionDueMs(fork) / 1000);
|
|
161
180
|
if (signedContributions.length > 0) {
|
|
162
181
|
try {
|
|
163
182
|
(await this.api.validator.publishContributionAndProofs({ contributionAndProofs: signedContributions })).assertOk();
|
|
@@ -178,7 +197,7 @@ export class SyncCommitteeService {
|
|
|
178
197
|
*
|
|
179
198
|
* See https://docs.google.com/document/d/1q9jOTPcYQa-3L8luRvQJ-M0eegtba4Nmon3dpO79TMk/mobilebasic
|
|
180
199
|
*/
|
|
181
|
-
async runDistributedAggregationSelectionTasks(duties, slot, signal) {
|
|
200
|
+
async runDistributedAggregationSelectionTasks(fork, duties, slot, signal) {
|
|
182
201
|
const partialSelections = [];
|
|
183
202
|
for (const { duty, selectionProofs } of duties) {
|
|
184
203
|
const validatorSelections = selectionProofs.map(({ subcommitteeIndex, partialSelectionProof }) => ({
|
|
@@ -192,17 +211,17 @@ export class SyncCommitteeService {
|
|
|
192
211
|
this.logger.debug("Submitting partial sync committee selection proofs", { slot, count: partialSelections.length });
|
|
193
212
|
const res = await Promise.race([
|
|
194
213
|
this.api.validator.submitSyncCommitteeSelections({ selections: partialSelections }),
|
|
195
|
-
// Exit sync committee contributions flow if there is no response after
|
|
196
|
-
// This is in contrast to attestations aggregations flow which is already exited at
|
|
214
|
+
// Exit sync committee contributions flow if there is no response after CONTRIBUTION_DUE_BPS of the slot.
|
|
215
|
+
// This is in contrast to attestations aggregations flow which is already exited at ATTESTATION_DUE_BPS of the slot
|
|
197
216
|
// because for sync committee is not required to resubscribe to subnets as beacon node will assume
|
|
198
217
|
// validator always aggregates. This allows us to wait until we have to produce sync committee contributions.
|
|
199
218
|
// Note that the sync committee contributions flow is not explicitly exited but rather will be skipped
|
|
200
219
|
// due to the fact that calculation of `is_sync_committee_aggregator` in SyncCommitteeDutiesService is not done
|
|
201
220
|
// and selectionProof is set to null, meaning no validator will be considered an aggregator.
|
|
202
|
-
sleep(this.clock.
|
|
221
|
+
sleep(this.config.getSyncContributionDueMs(fork) - this.clock.msFromSlot(slot), signal),
|
|
203
222
|
]);
|
|
204
223
|
if (!res) {
|
|
205
|
-
throw new Error("Failed to receive combined selection proofs before
|
|
224
|
+
throw new Error("Failed to receive combined selection proofs before CONTRIBUTION_DUE_BPS of the slot");
|
|
206
225
|
}
|
|
207
226
|
const combinedSelections = res.value();
|
|
208
227
|
this.logger.debug("Received combined sync committee selection proofs", { slot, count: combinedSelections.length });
|