@lodestar/fork-choice 1.42.0-rc.0 → 1.43.0-dev.07452fe3b7
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/forkChoice/errors.d.ts +8 -1
- package/lib/forkChoice/errors.d.ts.map +1 -1
- package/lib/forkChoice/errors.js +4 -0
- package/lib/forkChoice/errors.js.map +1 -1
- package/lib/forkChoice/forkChoice.d.ts +27 -20
- package/lib/forkChoice/forkChoice.d.ts.map +1 -1
- package/lib/forkChoice/forkChoice.js +102 -84
- package/lib/forkChoice/forkChoice.js.map +1 -1
- package/lib/forkChoice/interface.d.ts +27 -8
- package/lib/forkChoice/interface.d.ts.map +1 -1
- package/lib/forkChoice/store.d.ts +16 -40
- package/lib/forkChoice/store.d.ts.map +1 -1
- package/lib/forkChoice/store.js +4 -22
- package/lib/forkChoice/store.js.map +1 -1
- package/lib/index.d.ts +3 -3
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib/protoArray/interface.d.ts +7 -8
- package/lib/protoArray/interface.d.ts.map +1 -1
- package/lib/protoArray/interface.js +3 -4
- package/lib/protoArray/interface.js.map +1 -1
- package/lib/protoArray/protoArray.d.ts +10 -2
- package/lib/protoArray/protoArray.d.ts.map +1 -1
- package/lib/protoArray/protoArray.js +77 -39
- package/lib/protoArray/protoArray.js.map +1 -1
- package/package.json +8 -8
- package/src/forkChoice/errors.ts +6 -1
- package/src/forkChoice/forkChoice.ts +119 -132
- package/src/forkChoice/interface.ts +28 -9
- package/src/forkChoice/store.ts +20 -52
- package/src/index.ts +3 -9
- package/src/protoArray/interface.ts +8 -7
- package/src/protoArray/protoArray.ts +90 -41
|
@@ -65,7 +65,11 @@ export declare enum InvalidAttestationCode {
|
|
|
65
65
|
/**
|
|
66
66
|
* The attestation data index is invalid for a Gloas block (must be 0 or 1).
|
|
67
67
|
*/
|
|
68
|
-
INVALID_DATA_INDEX = "INVALID_DATA_INDEX"
|
|
68
|
+
INVALID_DATA_INDEX = "INVALID_DATA_INDEX",
|
|
69
|
+
/**
|
|
70
|
+
* The attestation votes for a full payload (index=1) but the payload status is not known.
|
|
71
|
+
*/
|
|
72
|
+
UNKNOWN_PAYLOAD_STATUS = "UNKNOWN_PAYLOAD_STATUS"
|
|
69
73
|
}
|
|
70
74
|
export type InvalidAttestation = {
|
|
71
75
|
code: InvalidAttestationCode.EMPTY_AGGREGATION_BITFIELD;
|
|
@@ -102,6 +106,9 @@ export type InvalidAttestation = {
|
|
|
102
106
|
} | {
|
|
103
107
|
code: InvalidAttestationCode.INVALID_DATA_INDEX;
|
|
104
108
|
index: number;
|
|
109
|
+
} | {
|
|
110
|
+
code: InvalidAttestationCode.UNKNOWN_PAYLOAD_STATUS;
|
|
111
|
+
beaconBlockRoot: RootHex;
|
|
105
112
|
};
|
|
106
113
|
export declare enum ForkChoiceErrorCode {
|
|
107
114
|
INVALID_ATTESTATION = "FORKCHOICE_ERROR_INVALID_ATTESTATION",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/forkChoice/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAC,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAC,aAAa,EAAC,MAAM,iBAAiB,CAAC;AAE9C,oBAAY,gBAAgB;IAC1B,cAAc,mBAAmB;IACjC,WAAW,gBAAgB;IAC3B,cAAc,mBAAmB;IACjC,wBAAwB,6BAA6B;CACtD;AAED,MAAM,MAAM,YAAY,GACpB;IAAC,IAAI,EAAE,gBAAgB,CAAC,cAAc,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAAA;CAAC,GAC5E;IAAC,IAAI,EAAE,gBAAgB,CAAC,WAAW,CAAC;IAAC,WAAW,EAAE,IAAI,CAAC;IAAC,SAAS,EAAE,IAAI,CAAA;CAAC,GACxE;IAAC,IAAI,EAAE,gBAAgB,CAAC,cAAc,CAAC;IAAC,aAAa,EAAE,IAAI,CAAC;IAAC,SAAS,EAAE,IAAI,CAAA;CAAC,GAC7E;IAAC,IAAI,EAAE,gBAAgB,CAAC,wBAAwB,CAAC;IAAC,aAAa,EAAE,OAAO,CAAC;IAAC,aAAa,CAAC,EAAE,OAAO,CAAA;CAAC,CAAC;AAEvG,oBAAY,sBAAsB;IAChC;;OAEG;IACH,0BAA0B,+BAA+B;IACzD;;OAEG;IACH,kBAAkB,uBAAuB;IACzC;;;OAGG;IACH,gBAAgB,qBAAqB;IACrC;;OAEG;IACH,mBAAmB,wBAAwB;IAC3C;;OAEG;IACH,YAAY,iBAAiB;IAC7B;;OAEG;IACH,UAAU,eAAe;IACzB;;OAEG;IACH,cAAc,mBAAmB;IACjC;;OAEG;IACH,uBAAuB,4BAA4B;IACnD;;;OAGG;IACH,WAAW,gBAAgB;IAC3B;;OAEG;IACH,kBAAkB,uBAAuB;
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/forkChoice/errors.ts"],"names":[],"mappings":"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"}
|
package/lib/forkChoice/errors.js
CHANGED
|
@@ -52,6 +52,10 @@ var InvalidAttestationCode;
|
|
|
52
52
|
* The attestation data index is invalid for a Gloas block (must be 0 or 1).
|
|
53
53
|
*/
|
|
54
54
|
InvalidAttestationCode["INVALID_DATA_INDEX"] = "INVALID_DATA_INDEX";
|
|
55
|
+
/**
|
|
56
|
+
* The attestation votes for a full payload (index=1) but the payload status is not known.
|
|
57
|
+
*/
|
|
58
|
+
InvalidAttestationCode["UNKNOWN_PAYLOAD_STATUS"] = "UNKNOWN_PAYLOAD_STATUS";
|
|
55
59
|
})(InvalidAttestationCode || (InvalidAttestationCode = {}));
|
|
56
60
|
export { ForkChoiceErrorCode };
|
|
57
61
|
var ForkChoiceErrorCode;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/forkChoice/errors.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,aAAa,EAAC,MAAM,iBAAiB,CAAC;SAElC,gBAAgB;AAA5B,IAAY,gBAKX;AALD,WAAY,gBAAgB;IAC1B,qDAAiC,CAAA;IACjC,+CAA2B,CAAA;IAC3B,qDAAiC,CAAA;IACjC,yEAAqD,CAAA;AAAC,CACxD,EALY,gBAAgB,KAAhB,gBAAgB,QAK3B;SAQW,sBAAsB;AAAlC,IAAY,
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/forkChoice/errors.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,aAAa,EAAC,MAAM,iBAAiB,CAAC;SAElC,gBAAgB;AAA5B,IAAY,gBAKX;AALD,WAAY,gBAAgB;IAC1B,qDAAiC,CAAA;IACjC,+CAA2B,CAAA;IAC3B,qDAAiC,CAAA;IACjC,yEAAqD,CAAA;AAAC,CACxD,EALY,gBAAgB,KAAhB,gBAAgB,QAK3B;SAQW,sBAAsB;AAAlC,IAAY,sBA+CX;AA/CD,WAAY,sBAAsB;IAChC;;OAEG;IACH,mFAAyD,CAAA;IACzD;;OAEG;IACH,mEAAyC,CAAA;IACzC;;;OAGG;IACH,+DAAqC,CAAA;IACrC;;OAEG;IACH,qEAA2C,CAAA;IAC3C;;OAEG;IACH,uDAA6B,CAAA;IAC7B;;OAEG;IACH,mDAAyB,CAAA;IACzB;;OAEG;IACH,2DAAiC,CAAA;IACjC;;OAEG;IACH,6EAAmD,CAAA;IACnD;;;OAGG;IACH,qDAA2B,CAAA;IAC3B;;OAEG;IACH,mEAAyC,CAAA;IACzC;;OAEG;IACH,2EAAiD,CAAA;AAAC,CACpD,EA/CY,sBAAsB,KAAtB,sBAAsB,QA+CjC;SAeW,mBAAmB;AAA/B,IAAY,mBAaX;AAbD,WAAY,mBAAmB;IAC7B,mFAA4D,CAAA;IAC5D,uEAAgD,CAAA;IAChD,+EAAwD,CAAA;IACxD,+FAAwE,CAAA;IACxE,+FAAwE,CAAA;IACxE,6EAAsD,CAAA;IACtD,qFAA8D,CAAA;IAC9D,iFAA0D,CAAA;IAC1D,2GAAoF,CAAA;IACpF,2FAAoE,CAAA;IACpE,iHAA0F,CAAA;IAC1F,iFAA0D,CAAA;AAAC,CAC7D,EAbY,mBAAmB,KAAnB,mBAAmB,QAa9B;AAgBD,MAAM,OAAO,eAAgB,SAAQ,aAAkC;CAAG"}
|
|
@@ -6,7 +6,7 @@ import { ForkChoiceMetrics } from "../metrics.js";
|
|
|
6
6
|
import { BlockExecutionStatus, LVHExecResponse, PayloadExecutionStatus, PayloadStatus, ProtoBlock, ProtoNode } from "../protoArray/interface.js";
|
|
7
7
|
import { ProtoArray } from "../protoArray/protoArray.js";
|
|
8
8
|
import { AncestorResult, EpochDifference, IForkChoice, NotReorgedReason, ShouldOverrideForkChoiceUpdateResult } from "./interface.js";
|
|
9
|
-
import {
|
|
9
|
+
import { CheckpointWithHex, IForkChoiceStore } from "./store.js";
|
|
10
10
|
export type ForkChoiceOpts = {
|
|
11
11
|
proposerBoost?: boolean;
|
|
12
12
|
proposerBoostReorg?: boolean;
|
|
@@ -142,6 +142,11 @@ export declare class ForkChoice implements IForkChoice {
|
|
|
142
142
|
* Get the proposer boost root
|
|
143
143
|
*/
|
|
144
144
|
getProposerBoostRoot(): RootHex;
|
|
145
|
+
/**
|
|
146
|
+
* Decides whether to extend an available payload from the previous slot,
|
|
147
|
+
* corresponding to the beacon block `blockRoot`.
|
|
148
|
+
*/
|
|
149
|
+
shouldExtendPayload(blockRoot: RootHex): boolean;
|
|
145
150
|
/**
|
|
146
151
|
* To predict the proposer head of the next slot. That is, to predict if proposer-boost-reorg could happen.
|
|
147
152
|
* Reason why we can't be certain is because information of the head block is not fully available yet
|
|
@@ -189,8 +194,8 @@ export declare class ForkChoice implements IForkChoice {
|
|
|
189
194
|
getHeads(): ProtoBlock[];
|
|
190
195
|
/** This is for the debug API only */
|
|
191
196
|
getAllNodes(): ProtoNode[];
|
|
192
|
-
getFinalizedCheckpoint():
|
|
193
|
-
getJustifiedCheckpoint():
|
|
197
|
+
getFinalizedCheckpoint(): CheckpointWithHex;
|
|
198
|
+
getJustifiedCheckpoint(): CheckpointWithHex;
|
|
194
199
|
/**
|
|
195
200
|
* Add `block` to the fork choice DAG.
|
|
196
201
|
*
|
|
@@ -247,7 +252,7 @@ export declare class ForkChoice implements IForkChoice {
|
|
|
247
252
|
* Creates the FULL variant of a Gloas block when the payload becomes available
|
|
248
253
|
* Spec: gloas/fork-choice.md#new-on_execution_payload
|
|
249
254
|
*/
|
|
250
|
-
onExecutionPayload(blockRoot: RootHex, executionPayloadBlockHash: RootHex, executionPayloadNumber: number,
|
|
255
|
+
onExecutionPayload(blockRoot: RootHex, executionPayloadBlockHash: RootHex, executionPayloadNumber: number, executionStatus: PayloadExecutionStatus, dataAvailabilityStatus: DataAvailabilityStatus): void;
|
|
251
256
|
/**
|
|
252
257
|
* Call `onTick` for all slots between `fcStore.getCurrentSlot()` and the provided `currentSlot`.
|
|
253
258
|
* This should only be called once per slot because:
|
|
@@ -285,6 +290,7 @@ export declare class ForkChoice implements IForkChoice {
|
|
|
285
290
|
* Same as hasPayloadUnsafe but accepts a hex-encoded block root.
|
|
286
291
|
*/
|
|
287
292
|
hasPayloadHexUnsafe(blockRoot: RootHex): boolean;
|
|
293
|
+
getPTCVotes(blockRootHex: RootHex): (boolean | null)[] | null;
|
|
288
294
|
/**
|
|
289
295
|
* Returns a MUTABLE `ProtoBlock` if the block is known **and** a descendant of the finalized root.
|
|
290
296
|
*/
|
|
@@ -323,8 +329,9 @@ export declare class ForkChoice implements IForkChoice {
|
|
|
323
329
|
*/
|
|
324
330
|
iterateAncestorBlocks(blockRoot: RootHex, payloadStatus: PayloadStatus): IterableIterator<ProtoBlock>;
|
|
325
331
|
/**
|
|
326
|
-
*
|
|
327
|
-
*
|
|
332
|
+
* Raw ancestor walk from `blockRoot` back toward the previous finalized block. Includes both
|
|
333
|
+
* `blockRoot` and the previous-finalized boundary as last element. Mirrors the semantics of
|
|
334
|
+
* `getAllAncestorAndNonAncestorBlocks.ancestors`
|
|
328
335
|
*/
|
|
329
336
|
getAllAncestorBlocks(blockRoot: RootHex, payloadStatus: PayloadStatus): ProtoBlock[];
|
|
330
337
|
/**
|
|
@@ -333,17 +340,29 @@ export declare class ForkChoice implements IForkChoice {
|
|
|
333
340
|
getAllNonAncestorBlocks(blockRoot: RootHex, payloadStatus: PayloadStatus): ProtoBlock[];
|
|
334
341
|
/**
|
|
335
342
|
* Returns both ancestor and non-ancestor blocks in a single traversal.
|
|
343
|
+
*
|
|
344
|
+
* `ancestors` is the raw walk and includes the previous finalized block as its last element —
|
|
345
|
+
* callers that don't want the boundary should slice it off themselves.
|
|
346
|
+
* Post-gloas for each block root, it returns exactly one variant of it.
|
|
336
347
|
*/
|
|
337
348
|
getAllAncestorAndNonAncestorBlocks(blockRoot: RootHex, payloadStatus: PayloadStatus): {
|
|
338
349
|
ancestors: ProtoBlock[];
|
|
339
350
|
nonAncestors: ProtoBlock[];
|
|
340
351
|
};
|
|
352
|
+
/**
|
|
353
|
+
* Same to getAllAncestorAndNonAncestorBlocks with default variant of ${blockRoot} to start with
|
|
354
|
+
*/
|
|
355
|
+
getAllAncestorAndNonAncestorBlocksDefaultStatus(blockRoot: RootHex): {
|
|
356
|
+
ancestors: ProtoBlock[];
|
|
357
|
+
nonAncestors: ProtoBlock[];
|
|
358
|
+
};
|
|
341
359
|
getCanonicalBlockByRoot(blockRoot: Root): ProtoBlock | null;
|
|
342
360
|
getCanonicalBlockAtSlot(slot: Slot): ProtoBlock | null;
|
|
343
361
|
getCanonicalBlockClosestLteSlot(slot: Slot): ProtoBlock | null;
|
|
344
362
|
/** Very expensive function, iterates the entire ProtoArray. TODO: Is this function even necessary? */
|
|
345
363
|
forwarditerateAncestorBlocks(): ProtoBlock[];
|
|
346
364
|
forwardIterateDescendants(blockRoot: RootHex, payloadStatus: PayloadStatus): IterableIterator<ProtoBlock>;
|
|
365
|
+
forwardIterateDescendantsDefaultStatus(blockRoot: RootHex): IterableIterator<ProtoBlock>;
|
|
347
366
|
/** Very expensive function, iterates the entire ProtoArray. TODO: Is this function even necessary? */
|
|
348
367
|
getBlockSummariesByParentRoot(parentRoot: RootHex): ProtoBlock[];
|
|
349
368
|
/** Very expensive function, iterates the entire ProtoArray. TODO: Is this function even necessary? */
|
|
@@ -386,8 +405,7 @@ export declare class ForkChoice implements IForkChoice {
|
|
|
386
405
|
private isProposingOnTime;
|
|
387
406
|
private getPreMergeExecStatus;
|
|
388
407
|
private getPreMergeDataStatus;
|
|
389
|
-
private
|
|
390
|
-
private getPostGloasExecStatus;
|
|
408
|
+
private getPostMergeExecStatus;
|
|
391
409
|
/**
|
|
392
410
|
* Why `getJustifiedBalances` getter?
|
|
393
411
|
* - updateCheckpoints() is called in both on_block and on_tick.
|
|
@@ -405,7 +423,7 @@ export declare class ForkChoice implements IForkChoice {
|
|
|
405
423
|
*
|
|
406
424
|
* **`on_tick`**
|
|
407
425
|
* May need the justified balances of:
|
|
408
|
-
* - unrealizedJustified: Already available in `
|
|
426
|
+
* - unrealizedJustified: Already available in `CheckpointWithBalance`
|
|
409
427
|
* Since this balances are already available the getter is just `() => balances`, without cache interaction
|
|
410
428
|
*/
|
|
411
429
|
private updateCheckpoints;
|
|
@@ -463,15 +481,4 @@ export declare function getCommitteeFraction(justifiedTotalActiveBalanceByIncrem
|
|
|
463
481
|
slotsPerEpoch: number;
|
|
464
482
|
committeePercent: number;
|
|
465
483
|
}): number;
|
|
466
|
-
/**
|
|
467
|
-
* Get the payload status for a checkpoint.
|
|
468
|
-
*
|
|
469
|
-
* Pre-Gloas: always FULL (payload embedded in block)
|
|
470
|
-
* Gloas: determined by state.execution_payload_availability
|
|
471
|
-
*
|
|
472
|
-
* @param config - The chain fork config to determine fork at checkpoint slot
|
|
473
|
-
* @param state - The state to check execution_payload_availability
|
|
474
|
-
* @param checkpointEpoch - The epoch of the checkpoint
|
|
475
|
-
*/
|
|
476
|
-
export declare function getCheckpointPayloadStatus(config: ChainForkConfig, state: IBeaconStateView, checkpointEpoch: number): PayloadStatus;
|
|
477
484
|
//# sourceMappingURL=forkChoice.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"forkChoice.d.ts","sourceRoot":"","sources":["../../src/forkChoice/forkChoice.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,eAAe,EAAC,MAAM,kBAAkB,CAAC;AAEjD,OAAO,EACL,sBAAsB,EAEtB,gBAAgB,
|
|
1
|
+
{"version":3,"file":"forkChoice.d.ts","sourceRoot":"","sources":["../../src/forkChoice/forkChoice.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { DataAvailabilityStatus, ZERO_HASH, computeEpochAtSlot, computeSlotsSinceEpochStart, computeStartSlotAtEpoch, getAttesterSlashableIndices, isExecutionBlockBodyType, } from "@lodestar/state-transition";
|
|
1
|
+
import { SLOTS_PER_EPOCH } from "@lodestar/params";
|
|
2
|
+
import { DataAvailabilityStatus, ZERO_HASH, computeEpochAtSlot, computeSlotsSinceEpochStart, computeStartSlotAtEpoch, getAttesterSlashableIndices, isExecutionBlockBodyType, isStatePostBellatrix, } from "@lodestar/state-transition";
|
|
3
3
|
import { isGloasBeaconBlock, ssz, } from "@lodestar/types";
|
|
4
4
|
import { MapDef, fromHex, toRootHex } from "@lodestar/utils";
|
|
5
5
|
import { computeDeltas } from "../protoArray/computeDeltas.js";
|
|
@@ -7,7 +7,7 @@ import { ProtoArrayError, ProtoArrayErrorCode } from "../protoArray/errors.js";
|
|
|
7
7
|
import { ExecutionStatus, HEX_ZERO_HASH, NULL_VOTE_INDEX, PayloadStatus, isGloasBlock, } from "../protoArray/interface.js";
|
|
8
8
|
import { ForkChoiceError, ForkChoiceErrorCode, InvalidAttestationCode, InvalidBlockCode } from "./errors.js";
|
|
9
9
|
import { AncestorStatus, NotReorgedReason, } from "./interface.js";
|
|
10
|
-
import {
|
|
10
|
+
import { toCheckpointWithHex } from "./store.js";
|
|
11
11
|
export { UpdateHeadOpt };
|
|
12
12
|
var UpdateHeadOpt;
|
|
13
13
|
(function (UpdateHeadOpt) {
|
|
@@ -215,6 +215,13 @@ export class ForkChoice {
|
|
|
215
215
|
getProposerBoostRoot() {
|
|
216
216
|
return this.proposerBoostRoot ?? HEX_ZERO_HASH;
|
|
217
217
|
}
|
|
218
|
+
/**
|
|
219
|
+
* Decides whether to extend an available payload from the previous slot,
|
|
220
|
+
* corresponding to the beacon block `blockRoot`.
|
|
221
|
+
*/
|
|
222
|
+
shouldExtendPayload(blockRoot) {
|
|
223
|
+
return this.protoArray.shouldExtendPayload(blockRoot, this.proposerBoostRoot);
|
|
224
|
+
}
|
|
218
225
|
/**
|
|
219
226
|
* To predict the proposer head of the next slot. That is, to predict if proposer-boost-reorg could happen.
|
|
220
227
|
* Reason why we can't be certain is because information of the head block is not fully available yet
|
|
@@ -481,8 +488,7 @@ export class ForkChoice {
|
|
|
481
488
|
// Check block is a descendant of the finalized block at the checkpoint finalized slot.
|
|
482
489
|
const blockAncestorNode = this.getAncestor(parentRootHex, finalizedSlot);
|
|
483
490
|
const fcStoreFinalized = this.fcStore.finalizedCheckpoint;
|
|
484
|
-
if (blockAncestorNode.blockRoot !== fcStoreFinalized.rootHex
|
|
485
|
-
blockAncestorNode.payloadStatus !== fcStoreFinalized.payloadStatus) {
|
|
491
|
+
if (blockAncestorNode.blockRoot !== fcStoreFinalized.rootHex) {
|
|
486
492
|
throw new ForkChoiceError({
|
|
487
493
|
code: ForkChoiceErrorCode.INVALID_BLOCK,
|
|
488
494
|
err: {
|
|
@@ -503,13 +509,9 @@ export class ForkChoice {
|
|
|
503
509
|
this.proposerBoostRoot === null) {
|
|
504
510
|
this.proposerBoostRoot = blockRootHex;
|
|
505
511
|
}
|
|
506
|
-
|
|
507
|
-
const justifiedPayloadStatus = getCheckpointPayloadStatus(this.config, state, state.currentJustifiedCheckpoint.epoch);
|
|
508
|
-
const justifiedCheckpoint = toCheckpointWithPayload(state.currentJustifiedCheckpoint, justifiedPayloadStatus);
|
|
512
|
+
const justifiedCheckpoint = toCheckpointWithHex(state.currentJustifiedCheckpoint);
|
|
509
513
|
const stateJustifiedEpoch = justifiedCheckpoint.epoch;
|
|
510
|
-
|
|
511
|
-
const finalizedPayloadStatus = getCheckpointPayloadStatus(this.config, state, state.finalizedCheckpoint.epoch);
|
|
512
|
-
const finalizedCheckpoint = toCheckpointWithPayload(state.finalizedCheckpoint, finalizedPayloadStatus);
|
|
514
|
+
const finalizedCheckpoint = toCheckpointWithHex(state.finalizedCheckpoint);
|
|
513
515
|
// Justified balances for `justifiedCheckpoint` are new to the fork-choice. Compute them on demand only if
|
|
514
516
|
// the justified checkpoint changes
|
|
515
517
|
this.updateCheckpoints(justifiedCheckpoint, finalizedCheckpoint, () => this.fcStore.justifiedBalancesGetter(justifiedCheckpoint, state));
|
|
@@ -532,32 +534,22 @@ export class ForkChoice {
|
|
|
532
534
|
if (parentBlock.unrealizedJustifiedEpoch === blockEpoch &&
|
|
533
535
|
parentBlock.unrealizedFinalizedEpoch + 1 >= blockEpoch) {
|
|
534
536
|
// reuse from parent, happens at 1/3 last blocks of epoch as monitored in mainnet
|
|
535
|
-
// Get payload status for unrealized justified checkpoint
|
|
536
|
-
const unrealizedJustifiedPayloadStatus = getCheckpointPayloadStatus(this.config, state, parentBlock.unrealizedJustifiedEpoch);
|
|
537
537
|
unrealizedJustifiedCheckpoint = {
|
|
538
538
|
epoch: parentBlock.unrealizedJustifiedEpoch,
|
|
539
539
|
root: fromHex(parentBlock.unrealizedJustifiedRoot),
|
|
540
540
|
rootHex: parentBlock.unrealizedJustifiedRoot,
|
|
541
|
-
payloadStatus: unrealizedJustifiedPayloadStatus,
|
|
542
541
|
};
|
|
543
|
-
// Get payload status for unrealized finalized checkpoint
|
|
544
|
-
const unrealizedFinalizedPayloadStatus = getCheckpointPayloadStatus(this.config, state, parentBlock.unrealizedFinalizedEpoch);
|
|
545
542
|
unrealizedFinalizedCheckpoint = {
|
|
546
543
|
epoch: parentBlock.unrealizedFinalizedEpoch,
|
|
547
544
|
root: fromHex(parentBlock.unrealizedFinalizedRoot),
|
|
548
545
|
rootHex: parentBlock.unrealizedFinalizedRoot,
|
|
549
|
-
payloadStatus: unrealizedFinalizedPayloadStatus,
|
|
550
546
|
};
|
|
551
547
|
}
|
|
552
548
|
else {
|
|
553
549
|
// compute new, happens 2/3 first blocks of epoch as monitored in mainnet
|
|
554
550
|
const unrealized = state.computeUnrealizedCheckpoints();
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
unrealizedJustifiedCheckpoint = toCheckpointWithPayload(unrealized.justifiedCheckpoint, unrealizedJustifiedPayloadStatus);
|
|
558
|
-
// Get payload status for unrealized finalized checkpoint
|
|
559
|
-
const unrealizedFinalizedPayloadStatus = getCheckpointPayloadStatus(this.config, state, unrealized.finalizedCheckpoint.epoch);
|
|
560
|
-
unrealizedFinalizedCheckpoint = toCheckpointWithPayload(unrealized.finalizedCheckpoint, unrealizedFinalizedPayloadStatus);
|
|
551
|
+
unrealizedJustifiedCheckpoint = toCheckpointWithHex(unrealized.justifiedCheckpoint);
|
|
552
|
+
unrealizedFinalizedCheckpoint = toCheckpointWithHex(unrealized.finalizedCheckpoint);
|
|
561
553
|
}
|
|
562
554
|
}
|
|
563
555
|
else {
|
|
@@ -612,14 +604,17 @@ export class ForkChoice {
|
|
|
612
604
|
// Fallback to parent block's number (we know it's post-merge from check above)
|
|
613
605
|
return parentBlock.executionPayloadNumber;
|
|
614
606
|
})(),
|
|
615
|
-
executionStatus: this.
|
|
607
|
+
executionStatus: this.getPostMergeExecStatus(executionStatus),
|
|
616
608
|
dataAvailabilityStatus,
|
|
617
609
|
}
|
|
618
|
-
: isExecutionBlockBodyType(block.body) &&
|
|
610
|
+
: isExecutionBlockBodyType(block.body) &&
|
|
611
|
+
isStatePostBellatrix(state) &&
|
|
612
|
+
state.isExecutionStateType &&
|
|
613
|
+
state.isExecutionEnabled(block)
|
|
619
614
|
? {
|
|
620
615
|
executionPayloadBlockHash: toRootHex(block.body.executionPayload.blockHash),
|
|
621
616
|
executionPayloadNumber: block.body.executionPayload.blockNumber,
|
|
622
|
-
executionStatus: this.
|
|
617
|
+
executionStatus: this.getPostMergeExecStatus(executionStatus),
|
|
623
618
|
dataAvailabilityStatus,
|
|
624
619
|
}
|
|
625
620
|
: {
|
|
@@ -757,8 +752,8 @@ export class ForkChoice {
|
|
|
757
752
|
* Creates the FULL variant of a Gloas block when the payload becomes available
|
|
758
753
|
* Spec: gloas/fork-choice.md#new-on_execution_payload
|
|
759
754
|
*/
|
|
760
|
-
onExecutionPayload(blockRoot, executionPayloadBlockHash, executionPayloadNumber,
|
|
761
|
-
this.protoArray.onExecutionPayload(blockRoot, this.fcStore.currentSlot, executionPayloadBlockHash, executionPayloadNumber,
|
|
755
|
+
onExecutionPayload(blockRoot, executionPayloadBlockHash, executionPayloadNumber, executionStatus, dataAvailabilityStatus) {
|
|
756
|
+
this.protoArray.onExecutionPayload(blockRoot, this.fcStore.currentSlot, executionPayloadBlockHash, executionPayloadNumber, this.proposerBoostRoot, executionStatus, dataAvailabilityStatus);
|
|
762
757
|
}
|
|
763
758
|
/**
|
|
764
759
|
* Call `onTick` for all slots between `fcStore.getCurrentSlot()` and the provided `currentSlot`.
|
|
@@ -832,6 +827,12 @@ export class ForkChoice {
|
|
|
832
827
|
hasPayloadHexUnsafe(blockRoot) {
|
|
833
828
|
return this.protoArray.hasPayload(blockRoot);
|
|
834
829
|
}
|
|
830
|
+
getPTCVotes(blockRootHex) {
|
|
831
|
+
const votes = this.protoArray.getPTCVotes(blockRootHex);
|
|
832
|
+
if (votes === null)
|
|
833
|
+
return null;
|
|
834
|
+
return votes.toBoolArray().map((v) => v ?? null);
|
|
835
|
+
}
|
|
835
836
|
/**
|
|
836
837
|
* Returns a MUTABLE `ProtoBlock` if the block is known **and** a descendant of the finalized root.
|
|
837
838
|
*/
|
|
@@ -869,8 +870,8 @@ export class ForkChoice {
|
|
|
869
870
|
return this.protoArray.getBlockHexAndBlockHash(blockRoot, blockHash);
|
|
870
871
|
}
|
|
871
872
|
getJustifiedBlock() {
|
|
872
|
-
const { rootHex
|
|
873
|
-
const block = this.
|
|
873
|
+
const { rootHex } = this.fcStore.justified.checkpoint;
|
|
874
|
+
const block = this.getBlockHexDefaultStatus(rootHex);
|
|
874
875
|
if (!block) {
|
|
875
876
|
throw new ForkChoiceError({
|
|
876
877
|
code: ForkChoiceErrorCode.MISSING_PROTO_ARRAY_BLOCK,
|
|
@@ -880,8 +881,8 @@ export class ForkChoice {
|
|
|
880
881
|
return block;
|
|
881
882
|
}
|
|
882
883
|
getFinalizedBlock() {
|
|
883
|
-
const { rootHex
|
|
884
|
-
const block = this.
|
|
884
|
+
const { rootHex } = this.fcStore.finalizedCheckpoint;
|
|
885
|
+
const block = this.getBlockHexDefaultStatus(rootHex);
|
|
885
886
|
if (!block) {
|
|
886
887
|
throw new ForkChoiceError({
|
|
887
888
|
code: ForkChoiceErrorCode.MISSING_PROTO_ARRAY_BLOCK,
|
|
@@ -944,13 +945,12 @@ export class ForkChoice {
|
|
|
944
945
|
return this.protoArray.iterateAncestorNodes(blockRoot, payloadStatus);
|
|
945
946
|
}
|
|
946
947
|
/**
|
|
947
|
-
*
|
|
948
|
-
*
|
|
948
|
+
* Raw ancestor walk from `blockRoot` back toward the previous finalized block. Includes both
|
|
949
|
+
* `blockRoot` and the previous-finalized boundary as last element. Mirrors the semantics of
|
|
950
|
+
* `getAllAncestorAndNonAncestorBlocks.ancestors`
|
|
949
951
|
*/
|
|
950
952
|
getAllAncestorBlocks(blockRoot, payloadStatus) {
|
|
951
|
-
|
|
952
|
-
// the last node is the previous finalized one, it's there to check onBlock finalized checkpoint only.
|
|
953
|
-
return blocks.slice(0, blocks.length - 1);
|
|
953
|
+
return this.protoArray.getAllAncestorNodes(blockRoot, payloadStatus);
|
|
954
954
|
}
|
|
955
955
|
/**
|
|
956
956
|
* The same to iterateAncestorBlocks but this gets non-ancestor nodes instead of ancestor nodes.
|
|
@@ -960,14 +960,26 @@ export class ForkChoice {
|
|
|
960
960
|
}
|
|
961
961
|
/**
|
|
962
962
|
* Returns both ancestor and non-ancestor blocks in a single traversal.
|
|
963
|
+
*
|
|
964
|
+
* `ancestors` is the raw walk and includes the previous finalized block as its last element —
|
|
965
|
+
* callers that don't want the boundary should slice it off themselves.
|
|
966
|
+
* Post-gloas for each block root, it returns exactly one variant of it.
|
|
963
967
|
*/
|
|
964
968
|
getAllAncestorAndNonAncestorBlocks(blockRoot, payloadStatus) {
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
969
|
+
return this.protoArray.getAllAncestorAndNonAncestorNodes(blockRoot, payloadStatus);
|
|
970
|
+
}
|
|
971
|
+
/**
|
|
972
|
+
* Same to getAllAncestorAndNonAncestorBlocks with default variant of ${blockRoot} to start with
|
|
973
|
+
*/
|
|
974
|
+
getAllAncestorAndNonAncestorBlocksDefaultStatus(blockRoot) {
|
|
975
|
+
const defaultStatus = this.protoArray.getDefaultVariant(blockRoot);
|
|
976
|
+
if (defaultStatus === undefined) {
|
|
977
|
+
throw new ForkChoiceError({
|
|
978
|
+
code: ForkChoiceErrorCode.MISSING_PROTO_ARRAY_BLOCK,
|
|
979
|
+
root: blockRoot,
|
|
980
|
+
});
|
|
981
|
+
}
|
|
982
|
+
return this.getAllAncestorAndNonAncestorBlocks(blockRoot, defaultStatus);
|
|
971
983
|
}
|
|
972
984
|
getCanonicalBlockByRoot(blockRoot) {
|
|
973
985
|
const blockRootHex = toRootHex(blockRoot);
|
|
@@ -1027,6 +1039,16 @@ export class ForkChoice {
|
|
|
1027
1039
|
}
|
|
1028
1040
|
}
|
|
1029
1041
|
}
|
|
1042
|
+
forwardIterateDescendantsDefaultStatus(blockRoot) {
|
|
1043
|
+
const defaultStatus = this.protoArray.getDefaultVariant(blockRoot);
|
|
1044
|
+
if (defaultStatus === undefined) {
|
|
1045
|
+
throw new ForkChoiceError({
|
|
1046
|
+
code: ForkChoiceErrorCode.MISSING_PROTO_ARRAY_BLOCK,
|
|
1047
|
+
root: blockRoot,
|
|
1048
|
+
});
|
|
1049
|
+
}
|
|
1050
|
+
return this.forwardIterateDescendants(blockRoot, defaultStatus);
|
|
1051
|
+
}
|
|
1030
1052
|
/** Very expensive function, iterates the entire ProtoArray. TODO: Is this function even necessary? */
|
|
1031
1053
|
getBlockSummariesByParentRoot(parentRoot) {
|
|
1032
1054
|
return this.protoArray.nodes.filter((node) => node.parentRoot === parentRoot);
|
|
@@ -1159,16 +1181,11 @@ export class ForkChoice {
|
|
|
1159
1181
|
throw Error(`Invalid pre-merge data status: expected: ${DataAvailabilityStatus.PreData}, got ${dataAvailabilityStatus}`);
|
|
1160
1182
|
return dataAvailabilityStatus;
|
|
1161
1183
|
}
|
|
1162
|
-
|
|
1163
|
-
if (executionStatus === ExecutionStatus.PreMerge
|
|
1184
|
+
getPostMergeExecStatus(executionStatus) {
|
|
1185
|
+
if (executionStatus === ExecutionStatus.PreMerge)
|
|
1164
1186
|
throw Error(`Invalid post-merge execution status: expected: ${ExecutionStatus.Syncing} or ${ExecutionStatus.Valid}, got ${executionStatus}`);
|
|
1165
1187
|
return executionStatus;
|
|
1166
1188
|
}
|
|
1167
|
-
getPostGloasExecStatus(executionStatus) {
|
|
1168
|
-
if (executionStatus !== ExecutionStatus.PayloadSeparated)
|
|
1169
|
-
throw Error(`Invalid post-gloas execution status: expected: ${ExecutionStatus.PayloadSeparated}, got ${executionStatus}`);
|
|
1170
|
-
return executionStatus;
|
|
1171
|
-
}
|
|
1172
1189
|
/**
|
|
1173
1190
|
* Why `getJustifiedBalances` getter?
|
|
1174
1191
|
* - updateCheckpoints() is called in both on_block and on_tick.
|
|
@@ -1186,7 +1203,7 @@ export class ForkChoice {
|
|
|
1186
1203
|
*
|
|
1187
1204
|
* **`on_tick`**
|
|
1188
1205
|
* May need the justified balances of:
|
|
1189
|
-
* - unrealizedJustified: Already available in `
|
|
1206
|
+
* - unrealizedJustified: Already available in `CheckpointWithBalance`
|
|
1190
1207
|
* Since this balances are already available the getter is just `() => balances`, without cache interaction
|
|
1191
1208
|
*/
|
|
1192
1209
|
updateCheckpoints(justifiedCheckpoint, finalizedCheckpoint, getJustifiedBalances) {
|
|
@@ -1340,15 +1357,40 @@ export class ForkChoice {
|
|
|
1340
1357
|
},
|
|
1341
1358
|
});
|
|
1342
1359
|
}
|
|
1343
|
-
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
|
-
|
|
1347
|
-
|
|
1348
|
-
|
|
1349
|
-
|
|
1350
|
-
|
|
1351
|
-
|
|
1360
|
+
if (isGloasBlock(block)) {
|
|
1361
|
+
// For Gloas blocks, attestation index must be 0 or 1
|
|
1362
|
+
if (attestationData.index !== 0 && attestationData.index !== 1) {
|
|
1363
|
+
throw new ForkChoiceError({
|
|
1364
|
+
code: ForkChoiceErrorCode.INVALID_ATTESTATION,
|
|
1365
|
+
err: {
|
|
1366
|
+
code: InvalidAttestationCode.INVALID_DATA_INDEX,
|
|
1367
|
+
index: attestationData.index,
|
|
1368
|
+
},
|
|
1369
|
+
});
|
|
1370
|
+
}
|
|
1371
|
+
// Same-slot attestations can only vote for the PENDING variant
|
|
1372
|
+
if (block.slot === slot && attestationData.index !== 0) {
|
|
1373
|
+
throw new ForkChoiceError({
|
|
1374
|
+
code: ForkChoiceErrorCode.INVALID_ATTESTATION,
|
|
1375
|
+
err: {
|
|
1376
|
+
code: InvalidAttestationCode.INVALID_DATA_INDEX,
|
|
1377
|
+
index: attestationData.index,
|
|
1378
|
+
},
|
|
1379
|
+
});
|
|
1380
|
+
}
|
|
1381
|
+
// If attesting for a full node, the payload must be known
|
|
1382
|
+
if (attestationData.index === 1) {
|
|
1383
|
+
const fullNodeIndex = this.protoArray.getNodeIndexByRootAndStatus(beaconBlockRootHex, PayloadStatus.FULL);
|
|
1384
|
+
if (fullNodeIndex === undefined) {
|
|
1385
|
+
throw new ForkChoiceError({
|
|
1386
|
+
code: ForkChoiceErrorCode.INVALID_ATTESTATION,
|
|
1387
|
+
err: {
|
|
1388
|
+
code: InvalidAttestationCode.UNKNOWN_PAYLOAD_STATUS,
|
|
1389
|
+
beaconBlockRoot: beaconBlockRootHex,
|
|
1390
|
+
},
|
|
1391
|
+
});
|
|
1392
|
+
}
|
|
1393
|
+
}
|
|
1352
1394
|
}
|
|
1353
1395
|
this.validatedAttestationDatas.add(attDataRoot);
|
|
1354
1396
|
}
|
|
@@ -1492,28 +1534,4 @@ export function getCommitteeFraction(justifiedTotalActiveBalanceByIncrement, con
|
|
|
1492
1534
|
const committeeWeight = Math.floor(justifiedTotalActiveBalanceByIncrement / config.slotsPerEpoch);
|
|
1493
1535
|
return Math.floor((committeeWeight * config.committeePercent) / 100);
|
|
1494
1536
|
}
|
|
1495
|
-
/**
|
|
1496
|
-
* Get the payload status for a checkpoint.
|
|
1497
|
-
*
|
|
1498
|
-
* Pre-Gloas: always FULL (payload embedded in block)
|
|
1499
|
-
* Gloas: determined by state.execution_payload_availability
|
|
1500
|
-
*
|
|
1501
|
-
* @param config - The chain fork config to determine fork at checkpoint slot
|
|
1502
|
-
* @param state - The state to check execution_payload_availability
|
|
1503
|
-
* @param checkpointEpoch - The epoch of the checkpoint
|
|
1504
|
-
*/
|
|
1505
|
-
export function getCheckpointPayloadStatus(config, state, checkpointEpoch) {
|
|
1506
|
-
// Compute checkpoint slot first to determine the correct fork
|
|
1507
|
-
const checkpointSlot = computeStartSlotAtEpoch(checkpointEpoch);
|
|
1508
|
-
const fork = config.getForkSeq(checkpointSlot);
|
|
1509
|
-
// Pre-Gloas: always FULL
|
|
1510
|
-
if (fork < ForkSeq.gloas) {
|
|
1511
|
-
return PayloadStatus.FULL;
|
|
1512
|
-
}
|
|
1513
|
-
// For Gloas, check state.execution_payload_availability
|
|
1514
|
-
// - For non-skipped slots at checkpoint: returns false (EMPTY) since payload hasn't arrived yet
|
|
1515
|
-
// - For skipped slots at checkpoint: returns the actual availability status from state
|
|
1516
|
-
const payloadAvailable = state.executionPayloadAvailability.get(checkpointSlot % SLOTS_PER_HISTORICAL_ROOT);
|
|
1517
|
-
return payloadAvailable ? PayloadStatus.FULL : PayloadStatus.EMPTY;
|
|
1518
|
-
}
|
|
1519
1537
|
//# sourceMappingURL=forkChoice.js.map
|