@lodestar/validator 1.46.0-dev.e6f04acd82 → 1.46.0-dev.f0f5d069e2
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/services/chainHeaderTracker.d.ts +6 -0
- package/lib/services/chainHeaderTracker.d.ts.map +1 -1
- package/lib/services/chainHeaderTracker.js +9 -2
- package/lib/services/chainHeaderTracker.js.map +1 -1
- package/lib/services/syncCommittee.d.ts +1 -0
- package/lib/services/syncCommittee.d.ts.map +1 -1
- package/lib/services/syncCommittee.js +25 -6
- package/lib/services/syncCommittee.js.map +1 -1
- package/lib/services/syncingStatusTracker.d.ts +8 -0
- package/lib/services/syncingStatusTracker.d.ts.map +1 -1
- package/lib/services/syncingStatusTracker.js +13 -0
- package/lib/services/syncingStatusTracker.js.map +1 -1
- package/package.json +12 -12
- package/src/services/chainHeaderTracker.ts +15 -2
- package/src/services/syncCommittee.ts +29 -7
- package/src/services/syncingStatusTracker.ts +14 -0
|
@@ -13,6 +13,10 @@ export type ExecutionPayloadAvailableEventData = {
|
|
|
13
13
|
slot: Slot;
|
|
14
14
|
blockRoot: RootHex;
|
|
15
15
|
};
|
|
16
|
+
type ChainHead = {
|
|
17
|
+
root: Root;
|
|
18
|
+
executionOptimistic: boolean;
|
|
19
|
+
};
|
|
16
20
|
type RunEveryFn = (event: HeadEventData) => Promise<void>;
|
|
17
21
|
/**
|
|
18
22
|
* Track the head slot/root using the event stream api "head".
|
|
@@ -24,10 +28,12 @@ export declare class ChainHeaderTracker {
|
|
|
24
28
|
private readonly emitter;
|
|
25
29
|
private headBlockSlot;
|
|
26
30
|
private headBlockRoot;
|
|
31
|
+
private headBlockExecutionOptimistic;
|
|
27
32
|
private readonly fns;
|
|
28
33
|
constructor(config: BeaconConfig, logger: Logger, api: ApiClient, emitter: ValidatorEventEmitter);
|
|
29
34
|
start(signal: AbortSignal): void;
|
|
30
35
|
getCurrentChainHead(slot: Slot): Root | null;
|
|
36
|
+
getCurrentChainHeadData(slot: Slot): ChainHead | null;
|
|
31
37
|
runOnNewHead(fn: RunEveryFn): void;
|
|
32
38
|
private onEvent;
|
|
33
39
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chainHeaderTracker.d.ts","sourceRoot":"","sources":["../../src/services/chainHeaderTracker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAS,MAAM,eAAe,CAAC;AAChD,OAAO,EAAC,YAAY,EAAC,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAC,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAC,MAAM,EAAU,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAiB,qBAAqB,EAAC,MAAM,cAAc,CAAC;AAInE,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,IAAI,CAAC;IACX,IAAI,EAAE,OAAO,CAAC;IACd,yBAAyB,EAAE,OAAO,CAAC;IACnC,wBAAwB,EAAE,OAAO,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,kCAAkC,GAAG;IAC/C,IAAI,EAAE,IAAI,CAAC;IACX,SAAS,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,KAAK,UAAU,GAAG,CAAC,KAAK,EAAE,aAAa,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAE1D;;GAEG;AACH,qBAAa,kBAAkB;
|
|
1
|
+
{"version":3,"file":"chainHeaderTracker.d.ts","sourceRoot":"","sources":["../../src/services/chainHeaderTracker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAS,MAAM,eAAe,CAAC;AAChD,OAAO,EAAC,YAAY,EAAC,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAC,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAC,MAAM,EAAU,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAiB,qBAAqB,EAAC,MAAM,cAAc,CAAC;AAInE,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,IAAI,CAAC;IACX,IAAI,EAAE,OAAO,CAAC;IACd,yBAAyB,EAAE,OAAO,CAAC;IACnC,wBAAwB,EAAE,OAAO,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,kCAAkC,GAAG;IAC/C,IAAI,EAAE,IAAI,CAAC;IACX,SAAS,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,KAAK,SAAS,GAAG;IACf,IAAI,EAAE,IAAI,CAAC;IACX,mBAAmB,EAAE,OAAO,CAAC;CAC9B,CAAC;AAEF,KAAK,UAAU,GAAG,CAAC,KAAK,EAAE,aAAa,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAE1D;;GAEG;AACH,qBAAa,kBAAkB;IAO3B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAT1B,OAAO,CAAC,aAAa,CAAsB;IAC3C,OAAO,CAAC,aAAa,CAAqB;IAC1C,OAAO,CAAC,4BAA4B,CAAS;IAC7C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAoB;IAExC,YACmB,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,SAAS,EACd,OAAO,EAAE,qBAAqB,EAC7C;IAEJ,KAAK,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAuB/B;IAED,mBAAmB,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAE3C;IAED,uBAAuB,CAAC,IAAI,EAAE,IAAI,GAAG,SAAS,GAAG,IAAI,CAQpD;IAED,YAAY,CAAC,EAAE,EAAE,UAAU,GAAG,IAAI,CAEjC;IAED,OAAO,CAAC,OAAO,CAqCb;CACH"}
|
|
@@ -13,6 +13,7 @@ export class ChainHeaderTracker {
|
|
|
13
13
|
emitter;
|
|
14
14
|
headBlockSlot = GENESIS_SLOT;
|
|
15
15
|
headBlockRoot = null;
|
|
16
|
+
headBlockExecutionOptimistic = false;
|
|
16
17
|
fns = [];
|
|
17
18
|
constructor(config, logger, api, emitter) {
|
|
18
19
|
this.config = config;
|
|
@@ -43,8 +44,13 @@ export class ChainHeaderTracker {
|
|
|
43
44
|
.catch((e) => this.logger.error("Failed to subscribe to validator events", {}, e));
|
|
44
45
|
}
|
|
45
46
|
getCurrentChainHead(slot) {
|
|
47
|
+
return this.getCurrentChainHeadData(slot)?.root ?? null;
|
|
48
|
+
}
|
|
49
|
+
getCurrentChainHeadData(slot) {
|
|
46
50
|
if (slot >= this.headBlockSlot) {
|
|
47
|
-
return this.headBlockRoot
|
|
51
|
+
return this.headBlockRoot
|
|
52
|
+
? { root: this.headBlockRoot, executionOptimistic: this.headBlockExecutionOptimistic }
|
|
53
|
+
: null;
|
|
48
54
|
}
|
|
49
55
|
// We don't know head of an old block
|
|
50
56
|
return null;
|
|
@@ -55,9 +61,10 @@ export class ChainHeaderTracker {
|
|
|
55
61
|
onEvent = (event) => {
|
|
56
62
|
if (event.type === EventType.head) {
|
|
57
63
|
const { message } = event;
|
|
58
|
-
const { slot, block, previousDutyDependentRoot, currentDutyDependentRoot } = message;
|
|
64
|
+
const { slot, block, previousDutyDependentRoot, currentDutyDependentRoot, executionOptimistic } = message;
|
|
59
65
|
this.headBlockSlot = slot;
|
|
60
66
|
this.headBlockRoot = fromHex(block);
|
|
67
|
+
this.headBlockExecutionOptimistic = executionOptimistic;
|
|
61
68
|
const headEventData = {
|
|
62
69
|
slot: this.headBlockSlot,
|
|
63
70
|
head: block,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chainHeaderTracker.js","sourceRoot":"","sources":["../../src/services/chainHeaderTracker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,MAAM,EAAC,MAAM,eAAe,CAAC;AAEhD,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;
|
|
1
|
+
{"version":3,"file":"chainHeaderTracker.js","sourceRoot":"","sources":["../../src/services/chainHeaderTracker.ts"],"names":[],"mappings":"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"}
|
|
@@ -40,6 +40,7 @@ export declare class SyncCommitteeService {
|
|
|
40
40
|
* validator and the list of individually-signed `SyncCommittee` objects is returned to the BN.
|
|
41
41
|
*/
|
|
42
42
|
private produceAndPublishSyncCommittees;
|
|
43
|
+
private getHeadForSyncCommitteeMessage;
|
|
43
44
|
/**
|
|
44
45
|
* Performs the second step of the attesting process: downloading an aggregated `SyncCommittee`,
|
|
45
46
|
* converting it into a `SignedAggregateAndProof` and returning it to the BN.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"syncCommittee.d.ts","sourceRoot":"","sources":["../../src/services/syncCommittee.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAC,MAAM,eAAe,CAAC;AACxC,OAAO,EAAC,eAAe,EAAC,MAAM,kBAAkB,CAAC;AAEjD,OAAO,EAAC,MAAM,EAAC,MAAM,4BAA4B,CAAC;AAGlD,OAAO,EAAC,OAAO,EAAC,MAAM,eAAe,CAAC;AACtC,OAAO,EAAC,SAAS,EAAC,MAAM,aAAa,CAAC;AACtC,OAAO,EAAC,QAAQ,EAAC,MAAM,kBAAkB,CAAC;AAC1C,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;IAE3D,YACmB,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,EAiBjD;IAED,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAE1C;IAED,OAAO,CAAC,qBAAqB,
|
|
1
|
+
{"version":3,"file":"syncCommittee.d.ts","sourceRoot":"","sources":["../../src/services/syncCommittee.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAC,MAAM,eAAe,CAAC;AACxC,OAAO,EAAC,eAAe,EAAC,MAAM,kBAAkB,CAAC;AAEjD,OAAO,EAAC,MAAM,EAAC,MAAM,4BAA4B,CAAC;AAGlD,OAAO,EAAC,OAAO,EAAC,MAAM,eAAe,CAAC;AACtC,OAAO,EAAC,SAAS,EAAC,MAAM,aAAa,CAAC;AACtC,OAAO,EAAC,QAAQ,EAAC,MAAM,kBAAkB,CAAC;AAC1C,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;IAE3D,YACmB,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,EAiBjD;IAED,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAE1C;IAED,OAAO,CAAC,qBAAqB,CAsE3B;IAEF;;;;;;;;OAQG;YACW,+BAA+B;YAwD/B,8BAA8B;IAU5C;;;;;;;;;OASG;YACW,2BAA2B;CAoD1C"}
|
|
@@ -44,7 +44,15 @@ export class SyncCommitteeService {
|
|
|
44
44
|
if (!isForkPostAltair(fork)) {
|
|
45
45
|
return;
|
|
46
46
|
}
|
|
47
|
-
//
|
|
47
|
+
// An optimistic validator MUST NOT participate in sync committees, since it has not
|
|
48
|
+
// fully verified the execution payload of the head block it would sign over.
|
|
49
|
+
// https://github.com/ethereum/consensus-specs/blob/v1.6.1/sync/optimistic.md#participating-in-sync-committees
|
|
50
|
+
if (this.syncingStatusTracker.isNodeOptimistic() === true) {
|
|
51
|
+
this.logger.debug("Skipping sync committee duties while node is optimistic", { slot });
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
// Fetch info first so a potential delay is absorbed by the sleep() below.
|
|
55
|
+
// This signs selection proofs, so keep it after the optimistic-node gate above.
|
|
48
56
|
const dutiesAtSlot = await this.dutiesService.getDutiesAtSlot(slot);
|
|
49
57
|
if (dutiesAtSlot.length === 0) {
|
|
50
58
|
return;
|
|
@@ -58,9 +66,14 @@ export class SyncCommitteeService {
|
|
|
58
66
|
this.emitter.waitForBlockSlot(slot),
|
|
59
67
|
]);
|
|
60
68
|
this.metrics?.syncCommitteeStepCallProduceMessage.observe(this.clock.secFromSlot(slot) - syncMessageDueMs / 1000);
|
|
61
|
-
|
|
69
|
+
const head = await this.getHeadForSyncCommitteeMessage(slot);
|
|
70
|
+
if (head.executionOptimistic) {
|
|
71
|
+
this.logger.debug("Skipping sync committee duties while head is optimistic", { slot });
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
// Step 1. Sign and publish a `SyncCommitteeMessage` for each validator.
|
|
62
75
|
// Differs from AttestationService, `SyncCommitteeMessage` are equal for all
|
|
63
|
-
const beaconBlockRoot = await this.produceAndPublishSyncCommittees(fork, slot, dutiesAtSlot);
|
|
76
|
+
const beaconBlockRoot = await this.produceAndPublishSyncCommittees(fork, slot, head.root, dutiesAtSlot);
|
|
64
77
|
// Step 2. If an attestation was produced, make an aggregate.
|
|
65
78
|
// First, wait until the `CONTRIBUTION_DUE_BPS` of the slot
|
|
66
79
|
const syncContributionDueMs = this.config.getSyncContributionDueMs(fork);
|
|
@@ -92,14 +105,12 @@ export class SyncCommitteeService {
|
|
|
92
105
|
* Only one `SyncCommittee` is downloaded from the BN. It is then signed by each
|
|
93
106
|
* validator and the list of individually-signed `SyncCommittee` objects is returned to the BN.
|
|
94
107
|
*/
|
|
95
|
-
async produceAndPublishSyncCommittees(fork, slot, duties) {
|
|
108
|
+
async produceAndPublishSyncCommittees(fork, slot, blockRoot, duties) {
|
|
96
109
|
const logCtx = { slot };
|
|
97
110
|
// /eth/v1/beacon/blocks/:blockId/root -> at slot -1
|
|
98
111
|
// Produce one attestation data per slot and subcommitteeIndex
|
|
99
112
|
// Spec: the validator should prepare a SyncCommitteeMessage for the previous slot (slot - 1)
|
|
100
113
|
// as soon as they have determined the head block of slot - 1
|
|
101
|
-
const blockRoot = this.chainHeaderTracker.getCurrentChainHead(slot) ??
|
|
102
|
-
(await this.api.beacon.getBlockRoot({ blockId: "head" })).value().root;
|
|
103
114
|
const signatures = [];
|
|
104
115
|
await Promise.all(duties.map(async ({ duty }) => {
|
|
105
116
|
const logCtxValidator = { ...logCtx, validatorIndex: duty.validatorIndex };
|
|
@@ -134,6 +145,14 @@ export class SyncCommitteeService {
|
|
|
134
145
|
}
|
|
135
146
|
return blockRoot;
|
|
136
147
|
}
|
|
148
|
+
async getHeadForSyncCommitteeMessage(slot) {
|
|
149
|
+
const cachedHead = this.chainHeaderTracker.getCurrentChainHeadData(slot);
|
|
150
|
+
if (cachedHead) {
|
|
151
|
+
return cachedHead;
|
|
152
|
+
}
|
|
153
|
+
const res = await this.api.beacon.getBlockRoot({ blockId: "head" });
|
|
154
|
+
return { root: res.value().root, executionOptimistic: res.meta().executionOptimistic };
|
|
155
|
+
}
|
|
137
156
|
/**
|
|
138
157
|
* Performs the second step of the attesting process: downloading an aggregated `SyncCommittee`,
|
|
139
158
|
* converting it into a `SignedAggregateAndProof` and returning it to the BN.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"syncCommittee.js","sourceRoot":"","sources":["../../src/services/syncCommittee.ts"],"names":[],"mappings":"AAEA,OAAO,EAAW,gBAAgB,EAAC,MAAM,kBAAkB,CAAC;AAG5D,OAAO,EAAC,KAAK,EAAC,MAAM,iBAAiB,CAAC;AAMtC,OAAO,EAAC,0BAA0B,EAAoB,MAAM,0BAA0B,CAAC;AAEvF,OAAO,EAAmB,kCAAkC,EAAC,MAAM,YAAY,CAAC;AAQhF;;GAEG;AACH,MAAM,OAAO,oBAAoB;IAIZ,MAAM;IACN,MAAM;IACN,GAAG;IACH,KAAK;IACL,cAAc;IACd,OAAO;IACP,kBAAkB;IAC1B,oBAAoB;IACZ,OAAO;IACP,IAAI;IAZN,aAAa,CAA6B;IAE3D,YACmB,MAAuB,EACvB,MAAgB,EAChB,GAAc,EACd,KAAa,EACb,cAA8B,EAC9B,OAA8B,EAC9B,kBAAsC,EAC9C,oBAA0C,EAClC,OAAuB,EACvB,IAA+B;sBAT/B,MAAM;sBACN,MAAM;mBACN,GAAG;qBACH,KAAK;8BACL,cAAc;uBACd,OAAO;kCACP,kBAAkB;oCAC1B,oBAAoB;uBACZ,OAAO;oBACP,IAAI;QAErB,IAAI,CAAC,aAAa,GAAG,IAAI,0BAA0B,CACjD,MAAM,EACN,MAAM,EACN,GAAG,EACH,KAAK,EACL,cAAc,EACd,oBAAoB,EACpB,OAAO,EACP;YACE,+BAA+B,EAAE,IAAI,EAAE,+BAA+B;SACvE,CACF,CAAC;QAEF,0FAA0F;QAC1F,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IACjD,CAAC;IAED,kBAAkB,CAAC,MAAiB;QAClC,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAChD,CAAC;IAEO,qBAAqB,GAAG,KAAK,EAAE,IAAU,EAAE,MAAmB,EAAiB,EAAE;QACvF,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAE3C,IAAI,CAAC;YACH,6CAA6C;YAC7C,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC5B,OAAO;YACT,CAAC;YAED,
|
|
1
|
+
{"version":3,"file":"syncCommittee.js","sourceRoot":"","sources":["../../src/services/syncCommittee.ts"],"names":[],"mappings":"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"}
|
|
@@ -23,6 +23,14 @@ export declare class SyncingStatusTracker {
|
|
|
23
23
|
* hence it is not useful to schedule tasks that require a non-optimistic node.
|
|
24
24
|
*/
|
|
25
25
|
runOnResynced(fn: RunOnResyncedFn): void;
|
|
26
|
+
/**
|
|
27
|
+
* Whether the node is currently optimistic (i.e. the head block's execution payload
|
|
28
|
+
* has not yet been validated) based on the last successful syncing status check.
|
|
29
|
+
*
|
|
30
|
+
* Returns `undefined` if the status is not yet known (never fetched or last check
|
|
31
|
+
* errored); callers should not assume the node is optimistic in that case.
|
|
32
|
+
*/
|
|
33
|
+
isNodeOptimistic(): boolean | undefined;
|
|
26
34
|
private checkSyncingStatus;
|
|
27
35
|
}
|
|
28
36
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"syncingStatusTracker.d.ts","sourceRoot":"","sources":["../../src/services/syncingStatusTracker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAE,MAAM,EAAC,MAAM,eAAe,CAAC;AAChD,OAAO,EAAC,MAAM,EAAC,MAAM,4BAA4B,CAAC;AAClD,OAAO,EAAC,IAAI,EAAC,MAAM,iBAAiB,CAAC;AACrC,OAAO,EAAC,MAAM,EAAC,MAAM,iBAAiB,CAAC;AACvC,OAAO,EAAe,OAAO,EAAC,MAAM,eAAe,CAAC;AAEpD,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC;AAEtD,KAAK,eAAe,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAE1E;;GAEG;AACH,qBAAa,oBAAoB;IAM7B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAR1B,OAAO,CAAC,iBAAiB,CAAC,CAAwB;IAElD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAyB;IAE7C,YACmB,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,SAAS,EACd,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,OAAO,GAAG,IAAI,EAGzC;IAED;;;;;OAKG;IACH,aAAa,CAAC,EAAE,EAAE,eAAe,GAAG,IAAI,CAEvC;IAED,OAAO,CAAC,kBAAkB,CAmCxB;CACH"}
|
|
1
|
+
{"version":3,"file":"syncingStatusTracker.d.ts","sourceRoot":"","sources":["../../src/services/syncingStatusTracker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAE,MAAM,EAAC,MAAM,eAAe,CAAC;AAChD,OAAO,EAAC,MAAM,EAAC,MAAM,4BAA4B,CAAC;AAClD,OAAO,EAAC,IAAI,EAAC,MAAM,iBAAiB,CAAC;AACrC,OAAO,EAAC,MAAM,EAAC,MAAM,iBAAiB,CAAC;AACvC,OAAO,EAAe,OAAO,EAAC,MAAM,eAAe,CAAC;AAEpD,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC;AAEtD,KAAK,eAAe,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAE1E;;GAEG;AACH,qBAAa,oBAAoB;IAM7B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAR1B,OAAO,CAAC,iBAAiB,CAAC,CAAwB;IAElD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAyB;IAE7C,YACmB,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,SAAS,EACd,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,OAAO,GAAG,IAAI,EAGzC;IAED;;;;;OAKG;IACH,aAAa,CAAC,EAAE,EAAE,eAAe,GAAG,IAAI,CAEvC;IAED;;;;;;OAMG;IACH,gBAAgB,IAAI,OAAO,GAAG,SAAS,CAKtC;IAED,OAAO,CAAC,kBAAkB,CAmCxB;CACH"}
|
|
@@ -25,6 +25,19 @@ export class SyncingStatusTracker {
|
|
|
25
25
|
runOnResynced(fn) {
|
|
26
26
|
this.fns.push(fn);
|
|
27
27
|
}
|
|
28
|
+
/**
|
|
29
|
+
* Whether the node is currently optimistic (i.e. the head block's execution payload
|
|
30
|
+
* has not yet been validated) based on the last successful syncing status check.
|
|
31
|
+
*
|
|
32
|
+
* Returns `undefined` if the status is not yet known (never fetched or last check
|
|
33
|
+
* errored); callers should not assume the node is optimistic in that case.
|
|
34
|
+
*/
|
|
35
|
+
isNodeOptimistic() {
|
|
36
|
+
if (this.prevSyncingStatus === undefined || this.prevSyncingStatus instanceof Error) {
|
|
37
|
+
return undefined;
|
|
38
|
+
}
|
|
39
|
+
return this.prevSyncingStatus.isOptimistic;
|
|
40
|
+
}
|
|
28
41
|
checkSyncingStatus = async (slot, signal) => {
|
|
29
42
|
try {
|
|
30
43
|
const syncingStatus = (await this.api.node.getSyncingStatus()).value();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"syncingStatusTracker.js","sourceRoot":"","sources":["../../src/services/syncingStatusTracker.ts"],"names":[],"mappings":"AAIA,OAAO,EAAC,YAAY,EAAU,MAAM,eAAe,CAAC;AAMpD;;GAEG;AACH,MAAM,OAAO,oBAAoB;IAMZ,MAAM;IACN,GAAG;IACH,KAAK;IACL,OAAO;IARlB,iBAAiB,CAAyB;IAEjC,GAAG,GAAsB,EAAE,CAAC;IAE7C,YACmB,MAAc,EACd,GAAc,EACd,KAAa,EACb,OAAuB;sBAHvB,MAAM;mBACN,GAAG;qBACH,KAAK;uBACL,OAAO;QAExB,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IACnD,CAAC;IAED;;;;;OAKG;IACH,aAAa,CAAC,EAAmB;QAC/B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC;IAEO,kBAAkB,GAAG,KAAK,EAAE,IAAU,EAAE,MAAmB,EAAiB,EAAE;QACpF,IAAI,CAAC;YACH,MAAM,aAAa,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;YACvE,MAAM,EAAC,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,YAAY,EAAE,SAAS,EAAC,GAAG,aAAa,CAAC;YACnF,MAAM,kBAAkB,GAAG,IAAI,CAAC,iBAAiB,YAAY,KAAK,IAAI,IAAI,CAAC,iBAAiB,EAAE,SAAS,KAAK,IAAI,CAAC;YAEjH,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;gBACvB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAC,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAC,CAAC,CAAC;YACtE,CAAC;iBAAM,IAAI,IAAI,CAAC,iBAAiB,KAAK,SAAS,IAAI,kBAAkB,EAAE,CAAC;gBACtE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAC,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAC,CAAC,CAAC;YAChF,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,qBAAqB,EAAE,EAAC,IAAI,EAAE,GAAG,aAAa,EAAC,CAAC,CAAC;YAErE,IAAI,CAAC,iBAAiB,GAAG,aAAa,CAAC;YAEvC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,GAAG,CAC5B,CAAC,SAAS,IAAI,CAAC,YAAY,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CACtF,CAAC;YAEF,IAAI,kBAAkB,IAAI,SAAS,KAAK,KAAK,EAAE,CAAC;gBAC9C,MAAM,OAAO,CAAC,GAAG,CACf,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAClB,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,sCAAsC,EAAE,CAAC,CAAC,CAAC,CAC5F,CACF,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,yEAAyE;YACzE,sEAAsE;YACtE,IAAI,CAAC,iBAAiB,GAAG,CAAU,CAAC;YAEpC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;YAEnD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,gCAAgC,EAAE,EAAC,IAAI,EAAC,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACtF,CAAC;IACH,CAAC,CAAC;CACH"}
|
|
1
|
+
{"version":3,"file":"syncingStatusTracker.js","sourceRoot":"","sources":["../../src/services/syncingStatusTracker.ts"],"names":[],"mappings":"AAIA,OAAO,EAAC,YAAY,EAAU,MAAM,eAAe,CAAC;AAMpD;;GAEG;AACH,MAAM,OAAO,oBAAoB;IAMZ,MAAM;IACN,GAAG;IACH,KAAK;IACL,OAAO;IARlB,iBAAiB,CAAyB;IAEjC,GAAG,GAAsB,EAAE,CAAC;IAE7C,YACmB,MAAc,EACd,GAAc,EACd,KAAa,EACb,OAAuB;sBAHvB,MAAM;mBACN,GAAG;qBACH,KAAK;uBACL,OAAO;QAExB,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IACnD,CAAC;IAED;;;;;OAKG;IACH,aAAa,CAAC,EAAmB;QAC/B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC;IAED;;;;;;OAMG;IACH,gBAAgB;QACd,IAAI,IAAI,CAAC,iBAAiB,KAAK,SAAS,IAAI,IAAI,CAAC,iBAAiB,YAAY,KAAK,EAAE,CAAC;YACpF,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC;IAC7C,CAAC;IAEO,kBAAkB,GAAG,KAAK,EAAE,IAAU,EAAE,MAAmB,EAAiB,EAAE;QACpF,IAAI,CAAC;YACH,MAAM,aAAa,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;YACvE,MAAM,EAAC,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,YAAY,EAAE,SAAS,EAAC,GAAG,aAAa,CAAC;YACnF,MAAM,kBAAkB,GAAG,IAAI,CAAC,iBAAiB,YAAY,KAAK,IAAI,IAAI,CAAC,iBAAiB,EAAE,SAAS,KAAK,IAAI,CAAC;YAEjH,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;gBACvB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAC,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAC,CAAC,CAAC;YACtE,CAAC;iBAAM,IAAI,IAAI,CAAC,iBAAiB,KAAK,SAAS,IAAI,kBAAkB,EAAE,CAAC;gBACtE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAC,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAC,CAAC,CAAC;YAChF,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,qBAAqB,EAAE,EAAC,IAAI,EAAE,GAAG,aAAa,EAAC,CAAC,CAAC;YAErE,IAAI,CAAC,iBAAiB,GAAG,aAAa,CAAC;YAEvC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,GAAG,CAC5B,CAAC,SAAS,IAAI,CAAC,YAAY,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CACtF,CAAC;YAEF,IAAI,kBAAkB,IAAI,SAAS,KAAK,KAAK,EAAE,CAAC;gBAC9C,MAAM,OAAO,CAAC,GAAG,CACf,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAClB,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,sCAAsC,EAAE,CAAC,CAAC,CAAC,CAC5F,CACF,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,yEAAyE;YACzE,sEAAsE;YACtE,IAAI,CAAC,iBAAiB,GAAG,CAAU,CAAC;YAEpC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;YAEnD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,gCAAgC,EAAE,EAAC,IAAI,EAAC,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACtF,CAAC;IACH,CAAC,CAAC;CACH"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lodestar/validator",
|
|
3
|
-
"version": "1.46.0-dev.
|
|
3
|
+
"version": "1.46.0-dev.f0f5d069e2",
|
|
4
4
|
"description": "A Typescript implementation of the validator client",
|
|
5
5
|
"author": "ChainSafe Systems",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -50,21 +50,21 @@
|
|
|
50
50
|
"dependencies": {
|
|
51
51
|
"@chainsafe/blst": "^2.2.0",
|
|
52
52
|
"@chainsafe/ssz": "^1.6.2",
|
|
53
|
-
"@lodestar/api": "^1.46.0-dev.
|
|
54
|
-
"@lodestar/config": "^1.46.0-dev.
|
|
55
|
-
"@lodestar/db": "^1.46.0-dev.
|
|
56
|
-
"@lodestar/params": "^1.46.0-dev.
|
|
57
|
-
"@lodestar/state-transition": "^1.46.0-dev.
|
|
58
|
-
"@lodestar/types": "^1.46.0-dev.
|
|
59
|
-
"@lodestar/utils": "^1.46.0-dev.
|
|
53
|
+
"@lodestar/api": "^1.46.0-dev.f0f5d069e2",
|
|
54
|
+
"@lodestar/config": "^1.46.0-dev.f0f5d069e2",
|
|
55
|
+
"@lodestar/db": "^1.46.0-dev.f0f5d069e2",
|
|
56
|
+
"@lodestar/params": "^1.46.0-dev.f0f5d069e2",
|
|
57
|
+
"@lodestar/state-transition": "^1.46.0-dev.f0f5d069e2",
|
|
58
|
+
"@lodestar/types": "^1.46.0-dev.f0f5d069e2",
|
|
59
|
+
"@lodestar/utils": "^1.46.0-dev.f0f5d069e2",
|
|
60
60
|
"strict-event-emitter-types": "^2.0.0"
|
|
61
61
|
},
|
|
62
62
|
"devDependencies": {
|
|
63
|
-
"@lodestar/logger": "^1.46.0-dev.
|
|
64
|
-
"@lodestar/spec-test-util": "^1.46.0-dev.
|
|
65
|
-
"@lodestar/test-utils": "^1.46.0-dev.
|
|
63
|
+
"@lodestar/logger": "^1.46.0-dev.f0f5d069e2",
|
|
64
|
+
"@lodestar/spec-test-util": "^1.46.0-dev.f0f5d069e2",
|
|
65
|
+
"@lodestar/test-utils": "^1.46.0-dev.f0f5d069e2",
|
|
66
66
|
"@vekexasia/bigint-buffer2": "^1.1.1",
|
|
67
67
|
"rimraf": "^4.4.1"
|
|
68
68
|
},
|
|
69
|
-
"gitHead": "
|
|
69
|
+
"gitHead": "7b4da150e5f67b4863516f2155e131b99ad1c6c9"
|
|
70
70
|
}
|
|
@@ -19,6 +19,11 @@ export type ExecutionPayloadAvailableEventData = {
|
|
|
19
19
|
blockRoot: RootHex;
|
|
20
20
|
};
|
|
21
21
|
|
|
22
|
+
type ChainHead = {
|
|
23
|
+
root: Root;
|
|
24
|
+
executionOptimistic: boolean;
|
|
25
|
+
};
|
|
26
|
+
|
|
22
27
|
type RunEveryFn = (event: HeadEventData) => Promise<void>;
|
|
23
28
|
|
|
24
29
|
/**
|
|
@@ -27,6 +32,7 @@ type RunEveryFn = (event: HeadEventData) => Promise<void>;
|
|
|
27
32
|
export class ChainHeaderTracker {
|
|
28
33
|
private headBlockSlot: Slot = GENESIS_SLOT;
|
|
29
34
|
private headBlockRoot: Root | null = null;
|
|
35
|
+
private headBlockExecutionOptimistic = false;
|
|
30
36
|
private readonly fns: RunEveryFn[] = [];
|
|
31
37
|
|
|
32
38
|
constructor(
|
|
@@ -62,8 +68,14 @@ export class ChainHeaderTracker {
|
|
|
62
68
|
}
|
|
63
69
|
|
|
64
70
|
getCurrentChainHead(slot: Slot): Root | null {
|
|
71
|
+
return this.getCurrentChainHeadData(slot)?.root ?? null;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
getCurrentChainHeadData(slot: Slot): ChainHead | null {
|
|
65
75
|
if (slot >= this.headBlockSlot) {
|
|
66
|
-
return this.headBlockRoot
|
|
76
|
+
return this.headBlockRoot
|
|
77
|
+
? {root: this.headBlockRoot, executionOptimistic: this.headBlockExecutionOptimistic}
|
|
78
|
+
: null;
|
|
67
79
|
}
|
|
68
80
|
// We don't know head of an old block
|
|
69
81
|
return null;
|
|
@@ -76,9 +88,10 @@ export class ChainHeaderTracker {
|
|
|
76
88
|
private onEvent = (event: routes.events.BeaconEvent): void => {
|
|
77
89
|
if (event.type === EventType.head) {
|
|
78
90
|
const {message} = event;
|
|
79
|
-
const {slot, block, previousDutyDependentRoot, currentDutyDependentRoot} = message;
|
|
91
|
+
const {slot, block, previousDutyDependentRoot, currentDutyDependentRoot, executionOptimistic} = message;
|
|
80
92
|
this.headBlockSlot = slot;
|
|
81
93
|
this.headBlockRoot = fromHex(block);
|
|
94
|
+
this.headBlockExecutionOptimistic = executionOptimistic;
|
|
82
95
|
|
|
83
96
|
const headEventData = {
|
|
84
97
|
slot: this.headBlockSlot,
|
|
@@ -67,7 +67,16 @@ export class SyncCommitteeService {
|
|
|
67
67
|
return;
|
|
68
68
|
}
|
|
69
69
|
|
|
70
|
-
//
|
|
70
|
+
// An optimistic validator MUST NOT participate in sync committees, since it has not
|
|
71
|
+
// fully verified the execution payload of the head block it would sign over.
|
|
72
|
+
// https://github.com/ethereum/consensus-specs/blob/v1.6.1/sync/optimistic.md#participating-in-sync-committees
|
|
73
|
+
if (this.syncingStatusTracker.isNodeOptimistic() === true) {
|
|
74
|
+
this.logger.debug("Skipping sync committee duties while node is optimistic", {slot});
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// Fetch info first so a potential delay is absorbed by the sleep() below.
|
|
79
|
+
// This signs selection proofs, so keep it after the optimistic-node gate above.
|
|
71
80
|
const dutiesAtSlot = await this.dutiesService.getDutiesAtSlot(slot);
|
|
72
81
|
if (dutiesAtSlot.length === 0) {
|
|
73
82
|
return;
|
|
@@ -83,9 +92,15 @@ export class SyncCommitteeService {
|
|
|
83
92
|
]);
|
|
84
93
|
this.metrics?.syncCommitteeStepCallProduceMessage.observe(this.clock.secFromSlot(slot) - syncMessageDueMs / 1000);
|
|
85
94
|
|
|
86
|
-
|
|
95
|
+
const head = await this.getHeadForSyncCommitteeMessage(slot);
|
|
96
|
+
if (head.executionOptimistic) {
|
|
97
|
+
this.logger.debug("Skipping sync committee duties while head is optimistic", {slot});
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// Step 1. Sign and publish a `SyncCommitteeMessage` for each validator.
|
|
87
102
|
// Differs from AttestationService, `SyncCommitteeMessage` are equal for all
|
|
88
|
-
const beaconBlockRoot = await this.produceAndPublishSyncCommittees(fork, slot, dutiesAtSlot);
|
|
103
|
+
const beaconBlockRoot = await this.produceAndPublishSyncCommittees(fork, slot, head.root, dutiesAtSlot);
|
|
89
104
|
|
|
90
105
|
// Step 2. If an attestation was produced, make an aggregate.
|
|
91
106
|
// First, wait until the `CONTRIBUTION_DUE_BPS` of the slot
|
|
@@ -127,6 +142,7 @@ export class SyncCommitteeService {
|
|
|
127
142
|
private async produceAndPublishSyncCommittees(
|
|
128
143
|
fork: ForkName,
|
|
129
144
|
slot: Slot,
|
|
145
|
+
blockRoot: Root,
|
|
130
146
|
duties: SyncDutyAndProofs[]
|
|
131
147
|
): Promise<Root> {
|
|
132
148
|
const logCtx = {slot};
|
|
@@ -137,10 +153,6 @@ export class SyncCommitteeService {
|
|
|
137
153
|
// Spec: the validator should prepare a SyncCommitteeMessage for the previous slot (slot - 1)
|
|
138
154
|
// as soon as they have determined the head block of slot - 1
|
|
139
155
|
|
|
140
|
-
const blockRoot: Uint8Array =
|
|
141
|
-
this.chainHeaderTracker.getCurrentChainHead(slot) ??
|
|
142
|
-
(await this.api.beacon.getBlockRoot({blockId: "head"})).value().root;
|
|
143
|
-
|
|
144
156
|
const signatures: altair.SyncCommitteeMessage[] = [];
|
|
145
157
|
|
|
146
158
|
await Promise.all(
|
|
@@ -183,6 +195,16 @@ export class SyncCommitteeService {
|
|
|
183
195
|
return blockRoot;
|
|
184
196
|
}
|
|
185
197
|
|
|
198
|
+
private async getHeadForSyncCommitteeMessage(slot: Slot): Promise<{root: Root; executionOptimistic: boolean}> {
|
|
199
|
+
const cachedHead = this.chainHeaderTracker.getCurrentChainHeadData(slot);
|
|
200
|
+
if (cachedHead) {
|
|
201
|
+
return cachedHead;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
const res = await this.api.beacon.getBlockRoot({blockId: "head"});
|
|
205
|
+
return {root: res.value().root, executionOptimistic: res.meta().executionOptimistic};
|
|
206
|
+
}
|
|
207
|
+
|
|
186
208
|
/**
|
|
187
209
|
* Performs the second step of the attesting process: downloading an aggregated `SyncCommittee`,
|
|
188
210
|
* converting it into a `SignedAggregateAndProof` and returning it to the BN.
|
|
@@ -35,6 +35,20 @@ export class SyncingStatusTracker {
|
|
|
35
35
|
this.fns.push(fn);
|
|
36
36
|
}
|
|
37
37
|
|
|
38
|
+
/**
|
|
39
|
+
* Whether the node is currently optimistic (i.e. the head block's execution payload
|
|
40
|
+
* has not yet been validated) based on the last successful syncing status check.
|
|
41
|
+
*
|
|
42
|
+
* Returns `undefined` if the status is not yet known (never fetched or last check
|
|
43
|
+
* errored); callers should not assume the node is optimistic in that case.
|
|
44
|
+
*/
|
|
45
|
+
isNodeOptimistic(): boolean | undefined {
|
|
46
|
+
if (this.prevSyncingStatus === undefined || this.prevSyncingStatus instanceof Error) {
|
|
47
|
+
return undefined;
|
|
48
|
+
}
|
|
49
|
+
return this.prevSyncingStatus.isOptimistic;
|
|
50
|
+
}
|
|
51
|
+
|
|
38
52
|
private checkSyncingStatus = async (slot: Slot, signal: AbortSignal): Promise<void> => {
|
|
39
53
|
try {
|
|
40
54
|
const syncingStatus = (await this.api.node.getSyncingStatus()).value();
|