@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
package/lib/index.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
+
export { Validator, type ValidatorOptions } from "./validator.js";
|
|
2
|
+
export { ValidatorStore, SignerType, defaultOptions, MAX_BUILDER_BOOST_FACTOR } from "./services/validatorStore.js";
|
|
3
|
+
export type { Signer, SignerLocal, SignerRemote, ValidatorProposerConfig, ProposerConfig, } from "./services/validatorStore.js";
|
|
1
4
|
export { waitForGenesis } from "./genesis.js";
|
|
2
|
-
export { type Metrics
|
|
3
|
-
export
|
|
4
|
-
export type { ProposerConfig, Signer, SignerLocal, SignerRemote, ValidatorProposerConfig, } from "./services/validatorStore.js";
|
|
5
|
-
export { MAX_BUILDER_BOOST_FACTOR, SignerType, ValidatorStore, defaultOptions } from "./services/validatorStore.js";
|
|
6
|
-
export * from "./slashingProtection/index.js";
|
|
5
|
+
export { getMetrics, type Metrics } from "./metrics.js";
|
|
6
|
+
export { externalSignerGetKeys, externalSignerPostSignature, externalSignerUpCheck, SignableMessageType, } from "./util/externalSignerClient.js";
|
|
7
7
|
export type { ProcessShutdownCallback } from "./types.js";
|
|
8
|
-
export
|
|
9
|
-
export
|
|
8
|
+
export * from "./slashingProtection/index.js";
|
|
9
|
+
export * from "./repositories/index.js";
|
|
10
10
|
//# sourceMappingURL=index.d.ts.map
|
package/lib/index.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
+
export { Validator } from "./validator.js";
|
|
2
|
+
export { ValidatorStore, SignerType, defaultOptions, MAX_BUILDER_BOOST_FACTOR } from "./services/validatorStore.js";
|
|
1
3
|
export { waitForGenesis } from "./genesis.js";
|
|
2
4
|
export { getMetrics } from "./metrics.js";
|
|
3
|
-
export * from "./repositories/index.js";
|
|
4
|
-
export { MAX_BUILDER_BOOST_FACTOR, SignerType, ValidatorStore, defaultOptions } from "./services/validatorStore.js";
|
|
5
|
-
export * from "./slashingProtection/index.js";
|
|
6
5
|
// Remote signer client
|
|
7
|
-
export {
|
|
8
|
-
export
|
|
6
|
+
export { externalSignerGetKeys, externalSignerPostSignature, externalSignerUpCheck, SignableMessageType, } from "./util/externalSignerClient.js";
|
|
7
|
+
export * from "./slashingProtection/index.js";
|
|
8
|
+
export * from "./repositories/index.js";
|
|
9
9
|
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAwB,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAC,cAAc,EAAE,UAAU,EAAE,cAAc,EAAE,wBAAwB,EAAC,MAAM,8BAA8B,CAAC;AAQlH,OAAO,EAAC,cAAc,EAAC,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAC,UAAU,EAAe,MAAM,cAAc,CAAC;AAEtD,uBAAuB;AACvB,OAAO,EACL,qBAAqB,EACrB,2BAA2B,EAC3B,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,gCAAgC,CAAC;AAKxC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,yBAAyB,CAAC"}
|
package/lib/metrics.js
CHANGED
|
@@ -29,54 +29,54 @@ export function getMetrics(register, gitData) {
|
|
|
29
29
|
labelNames: ["builderSelection", "broadcastValidation"],
|
|
30
30
|
}),
|
|
31
31
|
// Attestation journey:
|
|
32
|
-
// - Wait for block or
|
|
32
|
+
// - Wait for block or 1/3, call prepare attestation
|
|
33
33
|
// - Get attestation, sign, call publish
|
|
34
|
-
// - Wait
|
|
34
|
+
// - Wait 2/3, call prepare aggregate
|
|
35
35
|
// - Get aggregate, sign, call publish
|
|
36
36
|
attesterStepCallProduceAttestation: register.histogram({
|
|
37
37
|
name: "vc_attester_step_call_produce_attestation_seconds",
|
|
38
|
-
help: "Time between
|
|
39
|
-
// Attester flow can start early if block is imported before
|
|
38
|
+
help: "Time between 1/3 of slot and call produce attestation",
|
|
39
|
+
// Attester flow can start early if block is imported before 1/3 of the slot
|
|
40
40
|
// This measure is critical so we need very good resolution around the 0 second mark
|
|
41
41
|
buckets: [-3, -1, 0, 1, 2, 3, 6, 12],
|
|
42
42
|
}),
|
|
43
43
|
attesterStepCallPublishAttestation: register.histogram({
|
|
44
44
|
name: "vc_attester_step_call_publish_attestation_seconds",
|
|
45
|
-
help: "Time between
|
|
45
|
+
help: "Time between 1/3 of slot and call publish attestation",
|
|
46
46
|
buckets: [-3, -1, 0, 1, 2, 3, 6, 12],
|
|
47
47
|
}),
|
|
48
48
|
attesterStepCallProduceAggregate: register.histogram({
|
|
49
49
|
name: "vc_attester_step_call_produce_aggregate_seconds",
|
|
50
|
-
help: "Time between
|
|
51
|
-
// Aggregate production starts at
|
|
50
|
+
help: "Time between 2/3 of slot and call produce aggregate",
|
|
51
|
+
// Aggregate production starts at 2/3 the earliest.
|
|
52
52
|
// Track values close to 0 (expected) in greater resolution, values over 12 overflow into the next slot.
|
|
53
53
|
buckets: [0.5, 1, 2, 3, 6, 12],
|
|
54
54
|
}),
|
|
55
55
|
attesterStepCallPublishAggregate: register.histogram({
|
|
56
56
|
name: "vc_attester_step_call_publish_aggregate_seconds",
|
|
57
|
-
help: "Time between
|
|
57
|
+
help: "Time between 2/3 of slot and call publish aggregate",
|
|
58
58
|
buckets: [0.5, 1, 2, 3, 6, 12],
|
|
59
59
|
}),
|
|
60
60
|
syncCommitteeStepCallProduceMessage: register.histogram({
|
|
61
61
|
name: "vc_sync_committee_step_call_produce_message_seconds",
|
|
62
|
-
help: "Time between
|
|
63
|
-
// Max wait time is
|
|
62
|
+
help: "Time between 1/3 of slot and call produce message",
|
|
63
|
+
// Max wait time is 1 / 3 of slot
|
|
64
64
|
buckets: [0.5, 1, 2, 3, 6, 12],
|
|
65
65
|
}),
|
|
66
66
|
syncCommitteeStepCallPublishMessage: register.histogram({
|
|
67
67
|
name: "vc_sync_committee_step_call_publish_message_seconds",
|
|
68
|
-
help: "Time between
|
|
68
|
+
help: "Time between 1/3 of slot and call publish message",
|
|
69
69
|
buckets: [0.5, 1, 2, 3, 6, 12],
|
|
70
70
|
}),
|
|
71
71
|
syncCommitteeStepCallProduceAggregate: register.histogram({
|
|
72
72
|
name: "vc_sync_committee_step_call_produce_aggregate_seconds",
|
|
73
|
-
help: "Time between
|
|
74
|
-
// Min wait time is
|
|
73
|
+
help: "Time between 2/3 of slot and call produce aggregate",
|
|
74
|
+
// Min wait time is 2 / 3 of slot
|
|
75
75
|
buckets: [0.5, 1, 2, 3, 6, 12],
|
|
76
76
|
}),
|
|
77
77
|
syncCommitteeStepCallPublishAggregate: register.histogram({
|
|
78
78
|
name: "vc_sync_committee_step_call_publish_aggregate_seconds",
|
|
79
|
-
help: "Time between
|
|
79
|
+
help: "Time between 2/3 of slot and call publish aggregate",
|
|
80
80
|
buckets: [0.5, 1, 2, 3, 6, 12],
|
|
81
81
|
}),
|
|
82
82
|
// Min wait time it 0. CallProduceBlock step is a bit redundant since it must be 0, but let's check
|
package/lib/metrics.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"AAGA,MAAM,CAAN,IAAY,aAGX;AAHD,WAAY,aAAa;IACvB,oCAAmB,CAAA;IACnB,oCAAmB,CAAA;AACrB,CAAC,EAHW,aAAa,KAAb,aAAa,QAGxB;AAED,MAAM,CAAN,IAAY,YAIX;AAJD,WAAY,YAAY;IACtB,iDAAS,CAAA;IACT,qDAAW,CAAA;IACX,iDAAS,CAAA;AACX,CAAC,EAJW,YAAY,KAAZ,YAAY,QAIvB;AAaD;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,QAA8B,EAAE,OAAwB;IACjF,qGAAqG;IAErG,mKAAmK;IACnK,QAAQ;SACL,KAAK,CAAkB;QACtB,IAAI,EAAE,kBAAkB;QACxB,IAAI,EAAE,kBAAkB;QACxB,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAA4B;KAC5D,CAAC;SACD,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAEnB,OAAO;QACL,oBAAoB,EAAE,QAAQ,CAAC,KAAK,CAGjC;YACD,IAAI,EAAE,0BAA0B;YAChC,IAAI,EAAE,iCAAiC;YACvC,UAAU,EAAE,CAAC,kBAAkB,EAAE,qBAAqB,CAAC;SACxD,CAAC;QAEF,uBAAuB;QACvB,
|
|
1
|
+
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,12 +7,11 @@ const GENESIS_TIME = Buffer.from("GENESIS_TIME");
|
|
|
7
7
|
* Store MetaData of validator.
|
|
8
8
|
*/
|
|
9
9
|
export class MetaDataRepository {
|
|
10
|
-
db;
|
|
11
|
-
bucket = Bucket.validator_metaData;
|
|
12
|
-
bucketId = getBucketNameByValue(this.bucket);
|
|
13
|
-
dbReqOpts = { bucketId: this.bucketId };
|
|
14
10
|
constructor(db) {
|
|
15
11
|
this.db = db;
|
|
12
|
+
this.bucket = Bucket.validator_metaData;
|
|
13
|
+
this.bucketId = getBucketNameByValue(this.bucket);
|
|
14
|
+
this.dbReqOpts = { bucketId: this.bucketId };
|
|
16
15
|
this.dbReqOpts = { bucketId: this.bucketId };
|
|
17
16
|
}
|
|
18
17
|
async getGenesisValidatorsRoot() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metaDataRepository.js","sourceRoot":"","sources":["../../src/repositories/metaDataRepository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,SAAS,EAAC,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"metaDataRepository.js","sourceRoot":"","sources":["../../src/repositories/metaDataRepository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,SAAS,EAAC,MAAM,cAAc,CAAC;AAElD,OAAO,EAAC,GAAG,EAAC,MAAM,iBAAiB,CAAC;AACpC,OAAO,EAAC,MAAM,EAAE,oBAAoB,EAAC,MAAM,eAAe,CAAC;AAG3D,MAAM,uBAAuB,GAAG,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;AACvE,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;AAEjD;;GAEG;AACH,MAAM,OAAO,kBAAkB;IAM7B,YAAsB,EAAuC;QAAvC,OAAE,GAAF,EAAE,CAAqC;QALnD,WAAM,GAAG,MAAM,CAAC,kBAAkB,CAAC;QAE5B,aAAQ,GAAG,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC7C,cAAS,GAAc,EAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAC,CAAC;QAGhE,IAAI,CAAC,SAAS,GAAG,EAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAC,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,wBAAwB;QAC5B,OAAO,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IAC9E,CAAC;IAED,KAAK,CAAC,wBAAwB,CAAC,qBAA2B;QACxD,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAAC,EAAE,qBAAqB,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IACpG,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAC9E,OAAO,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,WAAsB;QACzC,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IACxG,CAAC;IAEO,SAAS,CAAC,GAAe;QAC/B,OAAO,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACrC,CAAC;CACF"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ForkSeq } from "@lodestar/params";
|
|
2
2
|
import { computeEpochAtSlot, isAggregatorFromCommitteeLength } from "@lodestar/state-transition";
|
|
3
3
|
import { ssz } from "@lodestar/types";
|
|
4
4
|
import { prettyBytes, sleep, toRootHex } from "@lodestar/utils";
|
|
@@ -16,15 +16,6 @@ const DEFAULT_AFTER_BLOCK_DELAY_SLOT_FRACTION = 0;
|
|
|
16
16
|
* Service that sets up and handles validator attester duties.
|
|
17
17
|
*/
|
|
18
18
|
export class AttestationService {
|
|
19
|
-
logger;
|
|
20
|
-
api;
|
|
21
|
-
clock;
|
|
22
|
-
validatorStore;
|
|
23
|
-
emitter;
|
|
24
|
-
metrics;
|
|
25
|
-
config;
|
|
26
|
-
opts;
|
|
27
|
-
dutiesService;
|
|
28
19
|
constructor(logger, api, clock, validatorStore, emitter, chainHeadTracker, syncingStatusTracker, metrics, config, opts) {
|
|
29
20
|
this.logger = logger;
|
|
30
21
|
this.api = api;
|
|
@@ -34,6 +25,50 @@ export class AttestationService {
|
|
|
34
25
|
this.metrics = metrics;
|
|
35
26
|
this.config = config;
|
|
36
27
|
this.opts = opts;
|
|
28
|
+
this.runAttestationTasks = async (slot, signal) => {
|
|
29
|
+
// Fetch info first so a potential delay is absorbed by the sleep() below
|
|
30
|
+
const duties = this.dutiesService.getDutiesAtSlot(slot);
|
|
31
|
+
if (duties.length === 0) {
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
if (this.opts?.distributedAggregationSelection) {
|
|
35
|
+
// Validator in distributed cluster only has a key share, not the full private key.
|
|
36
|
+
// The partial selection proofs must be exchanged for combined selection proofs by
|
|
37
|
+
// calling submitBeaconCommitteeSelections on the distributed validator middleware client.
|
|
38
|
+
// This will run in parallel to other attestation tasks but must be finished before starting
|
|
39
|
+
// attestation aggregation as it is required to correctly determine if validator is aggregator
|
|
40
|
+
// and to produce a AggregateAndProof that can be threshold aggregated by the middleware client.
|
|
41
|
+
this.runDistributedAggregationSelectionTasks(duties, slot, signal).catch((e) => this.logger.error("Error on attestation aggregation selection", { slot }, e));
|
|
42
|
+
}
|
|
43
|
+
// A validator should create and broadcast the attestation to the associated attestation subnet when either
|
|
44
|
+
// (a) the validator has received a valid block from the expected block proposer for the assigned slot or
|
|
45
|
+
// (b) one-third of the slot has transpired (SECONDS_PER_SLOT / 3 seconds after the start of slot) -- whichever comes first.
|
|
46
|
+
await Promise.race([sleep(this.clock.msToSlot(slot + 1 / 3), signal), this.emitter.waitForBlockSlot(slot)]);
|
|
47
|
+
this.metrics?.attesterStepCallProduceAttestation.observe(this.clock.secFromSlot(slot + 1 / 3));
|
|
48
|
+
// Beacon node's endpoint produceAttestationData return data is not dependent on committeeIndex.
|
|
49
|
+
// Produce a single attestation for all committees and submit unaggregated attestations in one go.
|
|
50
|
+
try {
|
|
51
|
+
// Produce a single attestation for all committees, and clone mutate before signing
|
|
52
|
+
const attestationNoCommittee = await this.produceAttestation(0, slot);
|
|
53
|
+
// Step 1. Mutate, and sign `Attestation` for each validator. Then publish all `Attestations` in one go
|
|
54
|
+
await this.signAndPublishAttestations(slot, attestationNoCommittee, duties);
|
|
55
|
+
// Step 2. after all attestations are submitted, make an aggregate.
|
|
56
|
+
// First, wait until the `aggregation_production_instant` (2/3rds of the way through the slot)
|
|
57
|
+
await sleep(this.clock.msToSlot(slot + 2 / 3), signal);
|
|
58
|
+
this.metrics?.attesterStepCallProduceAggregate.observe(this.clock.secFromSlot(slot + 2 / 3));
|
|
59
|
+
const dutiesByCommitteeIndex = groupAttDutiesByCommitteeIndex(duties);
|
|
60
|
+
const isPostElectra = this.config.getForkSeq(slot) >= ForkSeq.electra;
|
|
61
|
+
// Then download, sign and publish a `SignedAggregateAndProof` for each
|
|
62
|
+
// validator that is elected to aggregate for this `slot` and `committeeIndex`.
|
|
63
|
+
await Promise.all(Array.from(dutiesByCommitteeIndex.entries()).map(([index, dutiesSameCommittee]) => {
|
|
64
|
+
const attestationData = { ...attestationNoCommittee, index: isPostElectra ? 0 : index };
|
|
65
|
+
return this.produceAndPublishAggregates(attestationData, index, dutiesSameCommittee);
|
|
66
|
+
}));
|
|
67
|
+
}
|
|
68
|
+
catch (e) {
|
|
69
|
+
this.logger.error("Error on attestation routine", { slot }, e);
|
|
70
|
+
}
|
|
71
|
+
};
|
|
37
72
|
this.dutiesService = new AttestationDutiesService(logger, api, clock, validatorStore, chainHeadTracker, syncingStatusTracker, metrics, {
|
|
38
73
|
distributedAggregationSelection: opts?.distributedAggregationSelection,
|
|
39
74
|
});
|
|
@@ -43,58 +78,6 @@ export class AttestationService {
|
|
|
43
78
|
removeDutiesForKey(pubkey) {
|
|
44
79
|
this.dutiesService.removeDutiesForKey(pubkey);
|
|
45
80
|
}
|
|
46
|
-
runAttestationTasks = async (slot, signal) => {
|
|
47
|
-
// Fetch info first so a potential delay is absorbed by the sleep() below
|
|
48
|
-
const duties = this.dutiesService.getDutiesAtSlot(slot);
|
|
49
|
-
if (duties.length === 0) {
|
|
50
|
-
return;
|
|
51
|
-
}
|
|
52
|
-
const fork = this.config.getForkName(slot);
|
|
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 submitBeaconCommitteeSelections on the distributed validator middleware client.
|
|
57
|
-
// This will run in parallel to other attestation tasks but must be finished before starting
|
|
58
|
-
// attestation aggregation as it is required to correctly determine if validator is aggregator
|
|
59
|
-
// and to produce a AggregateAndProof that can be threshold aggregated by the middleware client.
|
|
60
|
-
this.runDistributedAggregationSelectionTasks(fork, duties, slot, signal).catch((e) => this.logger.error("Error on attestation aggregation selection", { slot }, e));
|
|
61
|
-
}
|
|
62
|
-
// A validator should create and broadcast the attestation to the associated attestation subnet when either
|
|
63
|
-
// (a) the validator has received a valid block from the expected block proposer for the assigned slot or
|
|
64
|
-
// (b) ATTESTATION_DUE_BPS of the slot has transpired -- whichever comes first.
|
|
65
|
-
const attestationDueMs = this.config.getAttestationDueMs(fork);
|
|
66
|
-
await Promise.race([
|
|
67
|
-
sleep(attestationDueMs - this.clock.msFromSlot(slot), signal),
|
|
68
|
-
this.emitter.waitForBlockSlot(slot),
|
|
69
|
-
]);
|
|
70
|
-
this.metrics?.attesterStepCallProduceAttestation.observe(this.clock.secFromSlot(slot) - attestationDueMs / 1000);
|
|
71
|
-
// Beacon node's endpoint produceAttestationData return data is not dependent on committeeIndex.
|
|
72
|
-
// Produce a single attestation for all committees and submit unaggregated attestations in one go.
|
|
73
|
-
try {
|
|
74
|
-
// Produce a single attestation for all committees, and clone mutate before signing
|
|
75
|
-
const attestationNoCommittee = await this.produceAttestation(0, slot);
|
|
76
|
-
// Step 1. Mutate, and sign `Attestation` for each validator. Then publish all `Attestations` in one go
|
|
77
|
-
await this.signAndPublishAttestations(fork, slot, attestationNoCommittee, duties);
|
|
78
|
-
// Step 2. after all attestations are submitted, make an aggregate.
|
|
79
|
-
// First, wait until the `aggregation_production_instant` (AGGREGATE_DUE_BPS of the way through the slot)
|
|
80
|
-
const aggregateDueMs = this.config.getAggregateDueMs(fork);
|
|
81
|
-
await sleep(aggregateDueMs - this.clock.msFromSlot(slot), signal);
|
|
82
|
-
this.metrics?.attesterStepCallProduceAggregate.observe(this.clock.secFromSlot(slot) - aggregateDueMs / 1000);
|
|
83
|
-
const dutiesByCommitteeIndex = groupAttDutiesByCommitteeIndex(duties);
|
|
84
|
-
// Then download, sign and publish a `SignedAggregateAndProof` for each
|
|
85
|
-
// validator that is elected to aggregate for this `slot` and `committeeIndex`.
|
|
86
|
-
await Promise.all(Array.from(dutiesByCommitteeIndex.entries()).map(([index, dutiesSameCommittee]) => {
|
|
87
|
-
const attestationData = {
|
|
88
|
-
...attestationNoCommittee,
|
|
89
|
-
index: isForkPostElectra(fork) ? 0 : index,
|
|
90
|
-
};
|
|
91
|
-
return this.produceAndPublishAggregates(fork, attestationData, index, dutiesSameCommittee);
|
|
92
|
-
}));
|
|
93
|
-
}
|
|
94
|
-
catch (e) {
|
|
95
|
-
this.logger.error("Error on attestation routine", { slot }, e);
|
|
96
|
-
}
|
|
97
|
-
};
|
|
98
81
|
/**
|
|
99
82
|
* Performs the first step of the attesting process: downloading one `Attestation` object.
|
|
100
83
|
* Beacon node's endpoint produceAttestationData return data is not dependent on committeeIndex.
|
|
@@ -109,12 +92,13 @@ export class AttestationService {
|
|
|
109
92
|
* Only one `Attestation` is downloaded from the BN. It is then signed by each
|
|
110
93
|
* validator and the list of individually-signed `Attestation` objects is returned to the BN.
|
|
111
94
|
*/
|
|
112
|
-
async signAndPublishAttestations(
|
|
95
|
+
async signAndPublishAttestations(slot, attestationNoCommittee, duties) {
|
|
113
96
|
const signedAttestations = [];
|
|
114
97
|
const headRootHex = toRootHex(attestationNoCommittee.beaconBlockRoot);
|
|
115
98
|
const currentEpoch = computeEpochAtSlot(slot);
|
|
99
|
+
const isPostElectra = this.config.getForkSeq(slot) >= ForkSeq.electra;
|
|
116
100
|
await Promise.all(duties.map(async ({ duty }) => {
|
|
117
|
-
const index =
|
|
101
|
+
const index = isPostElectra ? 0 : duty.committeeIndex;
|
|
118
102
|
const attestationData = { ...attestationNoCommittee, index };
|
|
119
103
|
const logCtxValidator = { slot, index, head: headRootHex, validatorIndex: duty.validatorIndex };
|
|
120
104
|
try {
|
|
@@ -126,19 +110,18 @@ export class AttestationService {
|
|
|
126
110
|
this.logger.error("Error signing attestation", logCtxValidator, e);
|
|
127
111
|
}
|
|
128
112
|
}));
|
|
129
|
-
// signAndPublishAttestations() may be called before the
|
|
113
|
+
// signAndPublishAttestations() may be called before the 1/3 cutoff time if the block was received early.
|
|
130
114
|
// If we produced the block or we got the block sooner than our peers, our attestations can be dropped because
|
|
131
115
|
// they reach our peers before the block. To prevent that, we wait 2 extra seconds AFTER block arrival, but
|
|
132
|
-
// never beyond the
|
|
116
|
+
// never beyond the 1/3 cutoff time.
|
|
133
117
|
// https://github.com/status-im/nimbus-eth2/blob/7b64c1dce4392731a4a59ee3a36caef2e0a8357a/beacon_chain/validators/validator_duties.nim#L1123
|
|
134
|
-
const
|
|
135
|
-
|
|
136
|
-
// submitting attestations asap to avoid busy time at around ATTESTATION_DUE_BPS of slot
|
|
118
|
+
const msToOneThirdSlot = this.clock.msToSlot(slot + 1 / 3);
|
|
119
|
+
// submitting attestations asap to avoid busy time at around 1/3 of slot
|
|
137
120
|
const afterBlockDelayMs = 1000 *
|
|
138
121
|
this.clock.secondsPerSlot *
|
|
139
122
|
(this.opts?.afterBlockDelaySlotFraction ?? DEFAULT_AFTER_BLOCK_DELAY_SLOT_FRACTION);
|
|
140
|
-
await sleep(Math.min(
|
|
141
|
-
this.metrics?.attesterStepCallPublishAttestation.observe(this.clock.secFromSlot(slot
|
|
123
|
+
await sleep(Math.min(msToOneThirdSlot, afterBlockDelayMs));
|
|
124
|
+
this.metrics?.attesterStepCallPublishAttestation.observe(this.clock.secFromSlot(slot + 1 / 3));
|
|
142
125
|
// Step 2. Publish all `Attestations` in one go
|
|
143
126
|
try {
|
|
144
127
|
(await this.api.beacon.submitPoolAttestationsV2({ signedAttestations })).assertOk();
|
|
@@ -165,7 +148,7 @@ export class AttestationService {
|
|
|
165
148
|
* by each validator and the list of individually-signed `SignedAggregateAndProof` objects is
|
|
166
149
|
* returned to the BN.
|
|
167
150
|
*/
|
|
168
|
-
async produceAndPublishAggregates(
|
|
151
|
+
async produceAndPublishAggregates(attestation, committeeIndex, duties) {
|
|
169
152
|
const logCtx = { slot: attestation.slot, index: committeeIndex };
|
|
170
153
|
// No validator is aggregator, skip
|
|
171
154
|
if (duties.every(({ selectionProof }) => selectionProof === null)) {
|
|
@@ -193,7 +176,7 @@ export class AttestationService {
|
|
|
193
176
|
this.logger.error("Error signing aggregateAndProofs", logCtxValidator, e);
|
|
194
177
|
}
|
|
195
178
|
}));
|
|
196
|
-
this.metrics?.attesterStepCallPublishAggregate.observe(this.clock.secFromSlot(attestation.slot
|
|
179
|
+
this.metrics?.attesterStepCallPublishAggregate.observe(this.clock.secFromSlot(attestation.slot + 2 / 3));
|
|
197
180
|
if (signedAggregateAndProofs.length > 0) {
|
|
198
181
|
try {
|
|
199
182
|
(await this.api.validator.publishAggregateAndProofsV2({ signedAggregateAndProofs })).assertOk();
|
|
@@ -219,7 +202,7 @@ export class AttestationService {
|
|
|
219
202
|
*
|
|
220
203
|
* See https://docs.google.com/document/d/1q9jOTPcYQa-3L8luRvQJ-M0eegtba4Nmon3dpO79TMk/mobilebasic
|
|
221
204
|
*/
|
|
222
|
-
async runDistributedAggregationSelectionTasks(
|
|
205
|
+
async runDistributedAggregationSelectionTasks(duties, slot, signal) {
|
|
223
206
|
const partialSelections = duties.map(({ duty, partialSelectionProof }) => ({
|
|
224
207
|
validatorIndex: duty.validatorIndex,
|
|
225
208
|
slot,
|
|
@@ -228,15 +211,15 @@ export class AttestationService {
|
|
|
228
211
|
this.logger.debug("Submitting partial beacon committee selection proofs", { slot, count: partialSelections.length });
|
|
229
212
|
const res = await Promise.race([
|
|
230
213
|
this.api.validator.submitBeaconCommitteeSelections({ selections: partialSelections }),
|
|
231
|
-
// Exit attestation aggregation flow if there is no response after
|
|
214
|
+
// Exit attestation aggregation flow if there is no response after 1/3 of slot as
|
|
232
215
|
// beacon node would likely not have enough time to prepare an aggregate attestation.
|
|
233
216
|
// Note that the aggregations flow is not explicitly exited but rather will be skipped
|
|
234
217
|
// due to the fact that calculation of `is_aggregator` in AttestationDutiesService is not done
|
|
235
218
|
// and selectionProof is set to null, meaning no validator will be considered an aggregator.
|
|
236
|
-
sleep(this.
|
|
219
|
+
sleep(this.clock.msToSlot(slot + 1 / 3), signal),
|
|
237
220
|
]);
|
|
238
221
|
if (!res) {
|
|
239
|
-
throw new Error("Failed to receive combined selection proofs before
|
|
222
|
+
throw new Error("Failed to receive combined selection proofs before 1/3 of slot");
|
|
240
223
|
}
|
|
241
224
|
const combinedSelections = res.value();
|
|
242
225
|
this.logger.debug("Received combined beacon committee selection proofs", { slot, count: combinedSelections.length });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attestation.js","sourceRoot":"","sources":["../../src/services/attestation.ts"],"names":[],"mappings":"AAEA,OAAO,
|
|
1
|
+
{"version":3,"file":"attestation.js","sourceRoot":"","sources":["../../src/services/attestation.ts"],"names":[],"mappings":"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"}
|