Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: proposer boost reorg #6298

Closed
wants to merge 45 commits into from
Closed
Show file tree
Hide file tree
Changes from 20 commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
6473e0b
Add presets
ensi321 Dec 15, 2023
87a0b6d
Add timeliness to protoBlock
ensi321 Jan 3, 2024
f0581bf
Rename proposerBoostScore to committeeFraction
ensi321 Jan 4, 2024
2da8dfc
Implement getProposerHead
ensi321 Jan 4, 2024
1d0d2f7
Add proposerBoostReorgEnabled flag
ensi321 Jan 4, 2024
c9d7582
Add updateAndGetHead
ensi321 Jan 9, 2024
16c056b
Add predictProposerHead()
ensi321 Jan 9, 2024
5d4fc9b
Refactor forkChoice. Add comment
ensi321 Jan 9, 2024
7d0095c
Predict proposer head if proposing next slot
ensi321 Jan 9, 2024
7ea9e02
Add todo
ensi321 Jan 9, 2024
b9aee5c
Lint
ensi321 Jan 9, 2024
90cb85a
Add logger to forkChoice
ensi321 Jan 15, 2024
a031b40
newHead calculation varies depending if we are proposer
ensi321 Jan 15, 2024
bd1fd42
Add timeliness to tests
ensi321 Jan 15, 2024
01609e8
Merge branch 'unstable' into proposer-boost-reorg
ensi321 Jan 15, 2024
a2b06a2
Lint
ensi321 Jan 15, 2024
2124d27
Fix getProposerHead
ensi321 Jan 16, 2024
d341d02
Add test
ensi321 Jan 16, 2024
b1b1eaa
Lint
ensi321 Jan 16, 2024
d6a73e7
Fix
ensi321 Jan 16, 2024
d273339
Lint
ensi321 Jan 17, 2024
3037e54
Merge branch 'unstable' into proposer-boost-reorg
ensi321 Jan 17, 2024
a7b9d44
Fix consensusBlockValue unit in debug log
ensi321 Jan 22, 2024
a50c276
lint
ensi321 Jan 22, 2024
b8ec80f
Fix typo
ensi321 Jan 24, 2024
8d44cfd
Merge branch 'unstable' into proposer-boost-reorg
ensi321 Jan 30, 2024
feb6de7
Fix naming conflict
ensi321 Jan 30, 2024
5d0990d
Revert changes in `importBlock` as per suggestion
ensi321 Jan 30, 2024
9a1d577
Merge branch 'unstable' into proposer-boost-reorg
ensi321 Mar 5, 2024
439f7e9
Update test
ensi321 Mar 6, 2024
b805fd2
fix test
ensi321 Mar 7, 2024
0ee4dff
Disable reorg by default
ensi321 Mar 18, 2024
e542037
updatedHeadRoot
ensi321 Mar 18, 2024
a7bd0f8
Split recomputeForkChoiceHead into 3 fns
ensi321 Mar 18, 2024
5e75849
Improve metrics
ensi321 Mar 18, 2024
04f83a2
Avoid setting forkchoice.head in getProposerHead
ensi321 Mar 18, 2024
944f234
Use the correct commonBlockBody to produce block
ensi321 Mar 18, 2024
1b233c3
Lint
ensi321 Mar 18, 2024
e55fa43
Fix unit test
ensi321 Mar 18, 2024
39b1113
Fix unit test
ensi321 Mar 19, 2024
7d02297
Remove extra update forkchoice head
ensi321 Mar 19, 2024
a5c4bce
fix: refactor and e2e test
twoeths Mar 21, 2024
852220c
chore: address PR comment
twoeths Mar 22, 2024
3fef364
Update packages/beacon-node/test/e2e/chain/proposerBoostReorg.test.ts
ensi321 Mar 22, 2024
07a11d5
Merge pull request #3 from tuyennhv/proposer-boost-reorg-e2e-test
ensi321 Mar 22, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions packages/api/src/beacon/routes/debug.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ const protoNodeSszType = new ContainerType(
parentRoot: stringType,
stateRoot: stringType,
targetRoot: stringType,
timeliness: ssz.Boolean,
justifiedEpoch: ssz.Epoch,
justifiedRoot: stringType,
finalizedEpoch: ssz.Epoch,
Expand Down
1 change: 1 addition & 0 deletions packages/api/test/unit/beacon/testData/debug.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ export const testData: GenericServerTestCases<Api> = {
weight: 1,
bestChild: "1",
bestDescendant: "1",
timeliness: false,
},
],
},
Expand Down
8 changes: 4 additions & 4 deletions packages/beacon-node/src/api/impl/validator/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ import {
isBlockContents,
phase0,
} from "@lodestar/types";
import {ExecutionStatus} from "@lodestar/fork-choice";
import {ExecutionStatus, UpdateHeadOpt} from "@lodestar/fork-choice";
import {toHex, racePromisesWithCutoff, RaceEvent, gweiToWei} from "@lodestar/utils";
import {AttestationError, AttestationErrorCode, GossipAction, SyncCommitteeError} from "../../../chain/errors/index.js";
import {validateApiAggregateAndProof} from "../../../chain/validation/index.js";
Expand Down Expand Up @@ -317,7 +317,7 @@ export function getValidatorApi({
// forkChoice.updateTime() might have already been called by the onSlot clock
// handler, in which case this should just return.
chain.forkChoice.updateTime(slot);
chain.recomputeForkChoiceHead();
chain.recomputeForkChoiceHead(UpdateHeadOpt.GetProposerHead, slot);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

need to get the result (proposer head) from this function, put it in chain.produceBlindedBlock() in order to build block with expected parent_root
same to the other 2 chain.recomputeForkChoiceHead () calls below

}

let timer;
Expand Down Expand Up @@ -374,7 +374,7 @@ export function getValidatorApi({
// forkChoice.updateTime() might have already been called by the onSlot clock
// handler, in which case this should just return.
chain.forkChoice.updateTime(slot);
chain.recomputeForkChoiceHead();
chain.recomputeForkChoiceHead(UpdateHeadOpt.GetProposerHead, slot);
}

let timer;
Expand Down Expand Up @@ -449,7 +449,7 @@ export function getValidatorApi({
// forkChoice.updateTime() might have already been called by the onSlot clock
// handler, in which case this should just return.
chain.forkChoice.updateTime(slot);
chain.recomputeForkChoiceHead();
chain.recomputeForkChoiceHead(UpdateHeadOpt.GetProposerHead, slot);

const fork = config.getForkName(slot);
// set some sensible opts
Expand Down
14 changes: 12 additions & 2 deletions packages/beacon-node/src/chain/blocks/importBlock.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,13 @@ import {
RootCache,
} from "@lodestar/state-transition";
import {routes} from "@lodestar/api";
import {ForkChoiceError, ForkChoiceErrorCode, EpochDifference, AncestorStatus} from "@lodestar/fork-choice";
import {
ForkChoiceError,
ForkChoiceErrorCode,
EpochDifference,
AncestorStatus,
UpdateHeadOpt,
} from "@lodestar/fork-choice";
import {isErrorAborted} from "@lodestar/utils";
import {ZERO_HASH_HEX} from "../../constants/index.js";
import {toCheckpointHex} from "../stateCache/index.js";
Expand Down Expand Up @@ -221,8 +227,12 @@ export async function importBlock(

// 5. Compute head. If new head, immediately stateCache.setHeadState()

const {proposerIndex, slot} = block.message;
const useProposerHead = this.beaconProposerCache.get(proposerIndex) !== undefined; // If the block is proposed by us, we calculate newHead using GetProposerHead, else GetCanonicialHead
ensi321 marked this conversation as resolved.
Show resolved Hide resolved
const oldHead = this.forkChoice.getHead();
const newHead = this.recomputeForkChoiceHead();
const newHead = useProposerHead
? this.recomputeForkChoiceHead(UpdateHeadOpt.GetPredictedProposerHead, slot)
: this.recomputeForkChoiceHead();
const currFinalizedEpoch = this.forkChoice.getFinalizedCheckpoint().epoch;

if (newHead.blockRoot !== oldHead.blockRoot) {
Expand Down
9 changes: 5 additions & 4 deletions packages/beacon-node/src/chain/chain.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ import {
isBlindedBeaconBlock,
Gwei,
} from "@lodestar/types";
import {CheckpointWithHex, ExecutionStatus, IForkChoice, ProtoBlock} from "@lodestar/fork-choice";
import {CheckpointWithHex, ExecutionStatus, IForkChoice, ProtoBlock, UpdateHeadOpt} from "@lodestar/fork-choice";
import {ProcessShutdownCallback} from "@lodestar/validator";
import {Logger, isErrorAborted, pruneSetToMax, sleep, toHex} from "@lodestar/utils";
import {ForkSeq, SLOTS_PER_EPOCH} from "@lodestar/params";
Expand Down Expand Up @@ -252,7 +252,8 @@ export class BeaconChain implements IBeaconChain {
clock.currentSlot,
cachedState,
opts,
this.justifiedBalancesGetter.bind(this)
this.justifiedBalancesGetter.bind(this),
logger
);
const regen = new QueuedStateRegenerator({
config,
Expand Down Expand Up @@ -642,12 +643,12 @@ export class BeaconChain implements IBeaconChain {
};
}

recomputeForkChoiceHead(): ProtoBlock {
recomputeForkChoiceHead(mode: UpdateHeadOpt = UpdateHeadOpt.GetCanonicialHead, slot?: Slot): ProtoBlock {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it takes me a while to figure out the use of different params here. I prefer to keep this function as is and add:

  • predictProposerHead: to be used in prepareNextSlot.ts
  • getProposerHead when we produce a block

that'd be cleaner to me, each function has its own purpose. Would like to know opinions from @wemeetagain @g11tech too

this.metrics?.forkChoice.requests.inc();
const timer = this.metrics?.forkChoice.findHead.startTimer();

try {
return this.forkChoice.updateHead();
return this.forkChoice.updateAndGetHead(mode, slot);
} catch (e) {
this.metrics?.forkChoice.errors.inc();
throw e;
Expand Down
6 changes: 5 additions & 1 deletion packages/beacon-node/src/chain/forkChoice/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import {
isMergeTransitionComplete,
} from "@lodestar/state-transition";

import {Logger} from "@lodestar/utils";
import {computeAnchorCheckpoint} from "../initState.js";
import {ChainEventEmitter} from "../emitter.js";
import {ChainEvent} from "../emitter.js";
Expand All @@ -32,7 +33,8 @@ export function initializeForkChoice(
currentSlot: Slot,
state: CachedBeaconStateAllForks,
opts: ForkChoiceOpts,
justifiedBalancesGetter: JustifiedBalancesGetter
justifiedBalancesGetter: JustifiedBalancesGetter,
logger?: Logger
): ForkChoice {
const {blockHeader, checkpoint} = computeAnchorCheckpoint(config, state);
const finalizedCheckpoint = {...checkpoint};
Expand Down Expand Up @@ -68,6 +70,7 @@ export function initializeForkChoice(
parentRoot: toHexString(blockHeader.parentRoot),
stateRoot: toHexString(blockHeader.stateRoot),
blockRoot: toHexString(checkpoint.root),
timeliness: true, // Optimisitcally assume is timely

justifiedEpoch: justifiedCheckpoint.epoch,
justifiedRoot: toHexString(justifiedCheckpoint.root),
Expand All @@ -89,6 +92,7 @@ export function initializeForkChoice(
currentSlot
),

logger,
opts
);
}
4 changes: 2 additions & 2 deletions packages/beacon-node/src/chain/interface.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ import {
import {BeaconConfig} from "@lodestar/config";
import {Logger} from "@lodestar/utils";

import {IForkChoice, ProtoBlock} from "@lodestar/fork-choice";
import {IForkChoice, ProtoBlock, UpdateHeadOpt} from "@lodestar/fork-choice";
import {IEth1ForBlockProduction} from "../eth1/index.js";
import {IExecutionEngine, IExecutionBuilder} from "../execution/index.js";
import {Metrics} from "../metrics/metrics.js";
Expand Down Expand Up @@ -176,7 +176,7 @@ export interface IBeaconChain {

getStatus(): phase0.Status;

recomputeForkChoiceHead(): ProtoBlock;
recomputeForkChoiceHead(mode?: UpdateHeadOpt, slot?: Slot): ProtoBlock;

waitForBlock(slot: Slot, root: RootHex): Promise<boolean>;

Expand Down
1 change: 1 addition & 0 deletions packages/beacon-node/src/chain/options.ts
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@ export const defaultChainOptions: IChainOptions = {
blsVerifyAllMultiThread: false,
disableBlsBatchVerify: false,
proposerBoostEnabled: true,
proposerBoostReorgEnabled: true,
ensi321 marked this conversation as resolved.
Show resolved Hide resolved
computeUnrealized: true,
safeSlotsToImportOptimistically: SAFE_SLOTS_TO_IMPORT_OPTIMISTICALLY,
suggestedFeeRecipient: defaultValidatorOptions.suggestedFeeRecipient,
Expand Down
28 changes: 26 additions & 2 deletions packages/beacon-node/src/chain/prepareNextSlot.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,15 @@ import {
computeEpochAtSlot,
isExecutionStateType,
computeTimeAtSlot,
CachedBeaconStateExecutions,
StateHashTreeRootSource,
} from "@lodestar/state-transition";
import {ChainForkConfig} from "@lodestar/config";
import {ForkSeq, SLOTS_PER_EPOCH, ForkExecution} from "@lodestar/params";
import {Slot} from "@lodestar/types";
import {Logger, sleep, fromHex, isErrorAborted} from "@lodestar/utils";
import {routes} from "@lodestar/api";
import {UpdateHeadOpt} from "@lodestar/fork-choice";
import {GENESIS_SLOT, ZERO_HASH_HEX} from "../constants/constants.js";
import {Metrics} from "../metrics/index.js";
import {ClockEvent} from "../util/clock.js";
Expand Down Expand Up @@ -143,7 +145,29 @@ export class PrepareNextSlotScheduler {
if (isExecutionStateType(prepareState)) {
const proposerIndex = prepareState.epochCtx.getBeaconProposer(prepareSlot);
const feeRecipient = this.chain.beaconProposerCache.get(proposerIndex);
let updatedPrepareState = prepareState;

if (feeRecipient) {
// If we are proposing next slot, we need to predict if we can proposer-boost-reorg or not
const {slot: proposerHeadSlot, blockRoot: proposerHeadRoot} = this.chain.recomputeForkChoiceHead(
UpdateHeadOpt.GetPredictedProposerHead,
clockSlot
);

// If we predict we can reorg, update prepareState with proposer head block
if (proposerHeadRoot !== headRoot || proposerHeadSlot !== headSlot) {
this.logger.verbose("Weak head detected. May build on this block instead:", {
ensi321 marked this conversation as resolved.
Show resolved Hide resolved
proposerHeadSlot,
proposerHeadRoot,
});
updatedPrepareState = (await this.chain.regen.getBlockSlotState(
proposerHeadRoot,
prepareSlot,
{dontTransferCache: !isEpochTransition},
RegenCaller.precomputeEpoch
)) as CachedBeaconStateExecutions;
}

// Update the builder status, if enabled shoot an api call to check status
this.chain.updateBuilderStatus(clockSlot);
if (this.chain.executionBuilder?.status) {
Expand All @@ -169,7 +193,7 @@ export class PrepareNextSlotScheduler {
fromHex(headRoot),
ensi321 marked this conversation as resolved.
Show resolved Hide resolved
safeBlockHash,
finalizedBlockHash,
prepareState,
updatedPrepareState,
feeRecipient
);
this.logger.verbose("PrepareNextSlotScheduler prepared new payload", {
Expand All @@ -182,7 +206,7 @@ export class PrepareNextSlotScheduler {
// If emitPayloadAttributes is true emit a SSE payloadAttributes event
if (this.chain.opts.emitPayloadAttributes === true) {
const data = await getPayloadAttributesForSSE(fork as ForkExecution, this.chain, {
prepareState,
prepareState: updatedPrepareState,
prepareSlot,
parentBlockRoot: fromHex(headRoot),
// The likely consumers of this API are builders and will anyway ignore the
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,8 @@ describe("getAttestationsForBlock", () => {
unrealizedFinalizedRoot: toHexString(finalizedCheckpoint.root),
executionPayloadBlockHash: null,
executionStatus: ExecutionStatus.PreMerge,

timeliness: false,
},
originalState.slot
);
Expand All @@ -98,6 +100,7 @@ describe("getAttestationsForBlock", () => {
unrealizedFinalizedRoot: toHexString(finalizedCheckpoint.root),
executionPayloadBlockHash: null,
executionStatus: ExecutionStatus.PreMerge,
timeliness: false,
},
slot
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ describe("produceBlockBody", () => {
chain = new BeaconChain(
{
proposerBoostEnabled: true,
proposerBoostReorgEnabled: true,
computeUnrealized: false,
safeSlotsToImportOptimistically: SAFE_SLOTS_TO_IMPORT_OPTIMISTICALLY,
disableArchiveOnCheckpoint: true,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@ describe.skip("verify+import blocks - range sync perf test", () => {
const chain = new BeaconChain(
{
proposerBoostEnabled: true,
proposerBoostReorgEnabled: true,
computeUnrealized: false,
safeSlotsToImportOptimistically: SAFE_SLOTS_TO_IMPORT_OPTIMISTICALLY,
disableArchiveOnCheckpoint: true,
Expand Down
2 changes: 2 additions & 0 deletions packages/beacon-node/test/utils/mocks/chain.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,5 +29,7 @@ export const zeroProtoBlock: ProtoBlock = {
unrealizedFinalizedEpoch: 0,
unrealizedFinalizedRoot: ZERO_HASH_HEX,

timeliness: false,

...{executionPayloadBlockHash: null, executionStatus: ExecutionStatus.PreMerge},
};
2 changes: 2 additions & 0 deletions packages/beacon-node/test/utils/typeGenerator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@ export function generateProtoBlock(overrides: Partial<ProtoBlock> = {}): ProtoBl
unrealizedFinalizedEpoch: 0,
unrealizedFinalizedRoot: ZERO_HASH_HEX,

timeliness: false,

...{executionPayloadBlockHash: null, executionStatus: ExecutionStatus.PreMerge},

...overrides,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,8 @@ export function getAttestationValidData(opts: AttestationValidDataOpts): {
unrealizedFinalizedEpoch: 0,
unrealizedFinalizedRoot: ZERO_HASH_HEX,

timeliness: false,

...{executionPayloadBlockHash: null, executionStatus: ExecutionStatus.PreMerge},
};

Expand Down
10 changes: 10 additions & 0 deletions packages/cli/src/options/beaconNodeOptions/chain.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ export type ChainArgs = {
// as this is defined as part of BeaconPaths
// "chain.persistInvalidSszObjectsDir": string;
"chain.proposerBoostEnabled"?: boolean;
"chain.proposerBoostReorgEnabled"?: boolean;
"chain.disableImportExecutionFcU"?: boolean;
"chain.preaggregateSlotDistance"?: number;
"chain.attDataCacheSlotDistance"?: number;
Expand All @@ -39,6 +40,7 @@ export function parseArgs(args: ChainArgs): IBeaconNodeOptions["chain"] {
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-explicit-any
persistInvalidSszObjectsDir: undefined as any,
proposerBoostEnabled: args["chain.proposerBoostEnabled"],
proposerBoostReorgEnabled: args["chain.proposerBoostReorgEnabled"],
disableImportExecutionFcU: args["chain.disableImportExecutionFcU"],
preaggregateSlotDistance: args["chain.preaggregateSlotDistance"],
attDataCacheSlotDistance: args["chain.attDataCacheSlotDistance"],
Expand Down Expand Up @@ -120,6 +122,14 @@ Will double processing times. Use only for debugging purposes.",
group: "chain",
},

"chain.proposerBoostReorgEnabled": {
hidden: true,
type: "boolean",
description: "Enable proposer boost reorg to reorg out a late block",
defaultDescription: String(defaultOptions.chain.proposerBoostReorgEnabled),
group: "chain",
},

"chain.disableImportExecutionFcU": {
hidden: true,
type: "boolean",
Expand Down
2 changes: 2 additions & 0 deletions packages/cli/test/unit/options/beaconNodeOptions.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ describe("options / beaconNodeOptions", () => {
"chain.persistProducedBlocks": true,
"chain.persistInvalidSszObjects": true,
"chain.proposerBoostEnabled": false,
"chain.proposerBoostReorgEnabled": false,
"chain.disableImportExecutionFcU": false,
"chain.preaggregateSlotDistance": 1,
"chain.attDataCacheSlotDistance": 2,
Expand Down Expand Up @@ -126,6 +127,7 @@ describe("options / beaconNodeOptions", () => {
persistProducedBlocks: true,
persistInvalidSszObjects: true,
proposerBoostEnabled: false,
proposerBoostReorgEnabled: false,
disableImportExecutionFcU: false,
preaggregateSlotDistance: 1,
attDataCacheSlotDistance: 2,
Expand Down
3 changes: 3 additions & 0 deletions packages/config/src/chainConfig/presets/mainnet.ts
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,9 @@ export const chainConfig: ChainConfig = {
// 2**16 (= 65,536)
CHURN_LIMIT_QUOTIENT: 65536,
PROPOSER_SCORE_BOOST: 40,
REORG_HEAD_WEIGHT_THRESHOLD: 20,
REORG_PARENT_WEIGHT_THRESHOLD: 160,
REORG_MAX_EPOCHS_SINCE_FINALIZATION: 2,

// Deposit contract
// ---------------------------------------------------------------
Expand Down
3 changes: 3 additions & 0 deletions packages/config/src/chainConfig/presets/minimal.ts
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,9 @@ export const chainConfig: ChainConfig = {
// [customized] scale queue churn at much lower validator counts for testing
CHURN_LIMIT_QUOTIENT: 32,
PROPOSER_SCORE_BOOST: 40,
REORG_HEAD_WEIGHT_THRESHOLD: 20,
REORG_PARENT_WEIGHT_THRESHOLD: 160,
REORG_MAX_EPOCHS_SINCE_FINALIZATION: 2,

// Deposit contract
// ---------------------------------------------------------------
Expand Down
6 changes: 6 additions & 0 deletions packages/config/src/chainConfig/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,9 @@ export type ChainConfig = {

// Proposer boost
PROPOSER_SCORE_BOOST: number;
REORG_HEAD_WEIGHT_THRESHOLD: number;
REORG_PARENT_WEIGHT_THRESHOLD: number;
REORG_MAX_EPOCHS_SINCE_FINALIZATION: number;

// Deposit contract
DEPOSIT_CHAIN_ID: number;
Expand Down Expand Up @@ -111,6 +114,9 @@ export const chainConfigTypes: SpecTypes<ChainConfig> = {

// Proposer boost
PROPOSER_SCORE_BOOST: "number",
REORG_HEAD_WEIGHT_THRESHOLD: "number",
REORG_PARENT_WEIGHT_THRESHOLD: "number",
REORG_MAX_EPOCHS_SINCE_FINALIZATION: "number",

// Deposit contract
DEPOSIT_CHAIN_ID: "number",
Expand Down
Loading
Loading