@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.
@@ -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;IAM3B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAR1B,OAAO,CAAC,aAAa,CAAsB;IAC3C,OAAO,CAAC,aAAa,CAAqB;IAC1C,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,CAM3C;IAED,YAAY,CAAC,EAAE,EAAE,UAAU,GAAG,IAAI,CAEjC;IAED,OAAO,CAAC,OAAO,CAoCb;CACH"}
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":"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"}
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,CAuD3B;IAEF;;;;;;;;OAQG;YACW,+BAA+B;IA2D7C;;;;;;;;;OASG;YACW,2BAA2B;CAoD1C"}
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
- // Fetch info first so a potential delay is absorbed by the sleep() below
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
- // Step 1. Download, sign and publish an `SyncCommitteeMessage` for each validator.
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,yEAAyE;YACzE,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YACpE,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC9B,OAAO;YACT,CAAC;YAED,qEAAqE;YACrE,8EAA8E;YAC9E,wDAAwD;YACxD,MAAM,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;YAC/D,MAAM,OAAO,CAAC,IAAI,CAAC;gBACjB,KAAK,CAAC,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;gBAC7D,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC;aACpC,CAAC,CAAC;YACH,IAAI,CAAC,OAAO,EAAE,mCAAmC,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,gBAAgB,GAAG,IAAI,CAAC,CAAC;YAElH,mFAAmF;YACnF,oFAAoF;YACpF,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,+BAA+B,CAAC,IAAI,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC;YAE7F,6DAA6D;YAC7D,2DAA2D;YAC3D,MAAM,qBAAqB,GAAG,IAAI,CAAC,MAAM,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC;YACzE,MAAM,KAAK,CAAC,qBAAqB,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;YACzE,IAAI,CAAC,OAAO,EAAE,qCAAqC,CAAC,OAAO,CACzD,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,qBAAqB,GAAG,IAAI,CAC5D,CAAC;YAEF,sEAAsE;YACtE,wEAAwE;YACxE,MAAM,yBAAyB,GAAG,kCAAkC,CAAC,YAAY,CAAC,CAAC;YACnF,MAAM,OAAO,CAAC,GAAG,CACf,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,iBAAiB,EAAE,MAAM,CAAC,EAAE,EAAE;gBACxF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;oBAAE,OAAO;gBAChC,uEAAuE;gBACvE,kFAAkF;gBAClF,MAAM,IAAI,CAAC,2BAA2B,CAAC,IAAI,EAAE,IAAI,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,CAAC,CAAC,KAAK,CAClG,CAAC,CAAQ,EAAE,EAAE;oBACX,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,oCAAoC,EAAE,EAAC,IAAI,EAAE,KAAK,EAAE,iBAAiB,EAAC,EAAE,CAAC,CAAC,CAAC;gBAC/F,CAAC,CACF,CAAC;YACJ,CAAC,CAAC,CACH,CAAC;QACJ,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,gCAAgC,EAAE,EAAC,IAAI,EAAC,EAAE,CAAU,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC,CAAC;IAEF;;;;;;;;OAQG;IACK,KAAK,CAAC,+BAA+B,CAC3C,IAAc,EACd,IAAU,EACV,MAA2B;QAE3B,MAAM,MAAM,GAAG,EAAC,IAAI,EAAC,CAAC;QAEtB,oDAAoD;QAEpD,8DAA8D;QAC9D,6FAA6F;QAC7F,6DAA6D;QAE7D,MAAM,SAAS,GACb,IAAI,CAAC,kBAAkB,CAAC,mBAAmB,CAAC,IAAI,CAAC;YACjD,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,EAAC,OAAO,EAAE,MAAM,EAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC;QAEvE,MAAM,UAAU,GAAkC,EAAE,CAAC;QAErD,MAAM,OAAO,CAAC,GAAG,CACf,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,EAAC,IAAI,EAAC,EAAE,EAAE;YAC1B,MAAM,eAAe,GAAG,EAAC,GAAG,MAAM,EAAE,cAAc,EAAE,IAAI,CAAC,cAAc,EAAC,CAAC;YACzE,IAAI,CAAC;gBACH,UAAU,CAAC,IAAI,CACb,MAAM,IAAI,CAAC,cAAc,CAAC,0BAA0B,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,EAAE,SAAS,CAAC,CACxG,CAAC;gBACF,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,6BAA6B,EAAE,eAAe,CAAC,CAAC;YACpE,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,oCAAoC,EAAE,eAAe,EAAE,CAAU,CAAC,CAAC;YACvF,CAAC;QACH,CAAC,CAAC,CACH,CAAC;QAEF,kFAAkF;QAClF,mGAAmG;QACnG,4CAA4C;QAC5C,MAAM,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;QAC/D,MAAM,cAAc,GAAG,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACtE,MAAM,iBAAiB,GAAG,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,6BAA6B,IAAI,CAAC,CAAC,CAAC;QAC7G,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,iBAAiB,CAAC,CAAC;QAC9D,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;YAClB,MAAM,KAAK,CAAC,SAAS,CAAC,CAAC;QACzB,CAAC;QAED,IAAI,CAAC,OAAO,EAAE,mCAAmC,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,gBAAgB,GAAG,IAAI,CAAC,CAAC;QAElH,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,IAAI,CAAC;gBACH,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,iCAAiC,CAAC,EAAC,UAAU,EAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;gBACnF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,gCAAgC,EAAE,EAAC,GAAG,MAAM,EAAE,KAAK,EAAE,UAAU,CAAC,MAAM,EAAC,CAAC,CAAC;gBAC1F,IAAI,CAAC,OAAO,EAAE,6BAA6B,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YACrE,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,uCAAuC,EAAE,MAAM,EAAE,CAAU,CAAC,CAAC;YACjF,CAAC;QACH,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;;;;;;;;OASG;IACK,KAAK,CAAC,2BAA2B,CACvC,IAAc,EACd,IAAU,EACV,iBAAiC,EACjC,eAAqB,EACrB,MAA0B;QAE1B,MAAM,MAAM,GAAG,EAAC,IAAI,EAAE,KAAK,EAAE,iBAAiB,EAAC,CAAC;QAEhD,mCAAmC;QACnC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,EAAC,cAAc,EAAC,EAAE,EAAE,CAAC,cAAc,KAAK,IAAI,CAAC,EAAE,CAAC;YAChE,OAAO;QACT,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,qCAAqC,EAAE,MAAM,CAAC,CAAC;QACnE,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,gCAAgC,CAAC,EAAC,IAAI,EAAE,iBAAiB,EAAE,eAAe,EAAC,CAAC,CAAC;QAElH,MAAM,mBAAmB,GAAwC,EAAE,CAAC;QAEpE,MAAM,OAAO,CAAC,GAAG,CACf,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,EAAC,IAAI,EAAE,cAAc,EAAC,EAAE,EAAE;YAC1C,MAAM,eAAe,GAAG,EAAC,GAAG,MAAM,EAAE,cAAc,EAAE,IAAI,CAAC,cAAc,EAAC,CAAC;YACzE,IAAI,CAAC;gBACH,oFAAoF;gBACpF,IAAI,cAAc,KAAK,IAAI,EAAE,CAAC;oBAC5B,mBAAmB,CAAC,IAAI,CACtB,MAAM,IAAI,CAAC,cAAc,CAAC,wBAAwB,CAAC,IAAI,EAAE,cAAc,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CACtF,CAAC;oBACF,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,kCAAkC,EAAE,eAAe,CAAC,CAAC;gBACzE,CAAC;YACH,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,yCAAyC,EAAE,eAAe,EAAE,CAAU,CAAC,CAAC;YAC5F,CAAC;QACH,CAAC,CAAC,CACH,CAAC;QAEF,IAAI,CAAC,OAAO,EAAE,qCAAqC,CAAC,OAAO,CACzD,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,wBAAwB,CAAC,IAAI,CAAC,GAAG,IAAI,CACjF,CAAC;QAEF,IAAI,mBAAmB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnC,IAAI,CAAC;gBACH,CACE,MAAM,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,4BAA4B,CAAC,EAAC,qBAAqB,EAAE,mBAAmB,EAAC,CAAC,CACpG,CAAC,QAAQ,EAAE,CAAC;gBACb,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,qCAAqC,EAAE,EAAC,GAAG,MAAM,EAAE,KAAK,EAAE,mBAAmB,CAAC,MAAM,EAAC,CAAC,CAAC;gBACxG,IAAI,CAAC,OAAO,EAAE,kCAAkC,CAAC,GAAG,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;YACnF,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,4CAA4C,EAAE,MAAM,EAAE,CAAU,CAAC,CAAC;YACtF,CAAC;QACH,CAAC;IACH,CAAC;CACF"}
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.e6f04acd82",
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.e6f04acd82",
54
- "@lodestar/config": "^1.46.0-dev.e6f04acd82",
55
- "@lodestar/db": "^1.46.0-dev.e6f04acd82",
56
- "@lodestar/params": "^1.46.0-dev.e6f04acd82",
57
- "@lodestar/state-transition": "^1.46.0-dev.e6f04acd82",
58
- "@lodestar/types": "^1.46.0-dev.e6f04acd82",
59
- "@lodestar/utils": "^1.46.0-dev.e6f04acd82",
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.e6f04acd82",
64
- "@lodestar/spec-test-util": "^1.46.0-dev.e6f04acd82",
65
- "@lodestar/test-utils": "^1.46.0-dev.e6f04acd82",
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": "402a1913262b99cdeb71922eb306786e1a590e5e"
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
- // Fetch info first so a potential delay is absorbed by the sleep() below
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
- // Step 1. Download, sign and publish an `SyncCommitteeMessage` for each validator.
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();