From 986551d3a2ca4e717206e6935ae3b34cbd65af0d Mon Sep 17 00:00:00 2001 From: Cayman Date: Sun, 4 May 2025 12:56:45 -0400 Subject: [PATCH] feat: fulu types (#7774) **Motivation** - prep for block input refactor - **Description** - pull fulu types out of `peerDAS` branch --------- Co-authored-by: Nico Flaig Co-authored-by: Matthew Keil --- .../config/src/chainConfig/configs/mainnet.ts | 10 +++ .../config/src/chainConfig/configs/minimal.ts | 10 +++ packages/config/src/chainConfig/types.ts | 16 ++++ packages/config/src/forkConfig/index.ts | 9 ++- packages/params/src/forkName.ts | 14 ++++ packages/params/src/index.ts | 17 +++++ packages/params/src/presets/mainnet.ts | 6 ++ packages/params/src/presets/minimal.ts | 10 ++- packages/params/src/types.ts | 12 +++ .../test/e2e/ensure-config-is-synced.test.ts | 15 ++-- packages/params/test/unit/forkName.test.ts | 8 +- packages/types/src/fulu/index.ts | 4 + packages/types/src/fulu/sszTypes.ts | 75 +++++++++++++++++++ packages/types/src/fulu/types.ts | 16 ++++ packages/types/src/primitive/sszTypes.ts | 3 + packages/types/src/primitive/types.ts | 3 + packages/types/src/sszTypes.ts | 39 ++++++---- packages/types/src/types.ts | 8 +- packages/validator/src/util/params.ts | 13 ++++ 19 files changed, 255 insertions(+), 33 deletions(-) create mode 100644 packages/types/src/fulu/index.ts create mode 100644 packages/types/src/fulu/sszTypes.ts create mode 100644 packages/types/src/fulu/types.ts diff --git a/packages/config/src/chainConfig/configs/mainnet.ts b/packages/config/src/chainConfig/configs/mainnet.ts index 0847465f8f..4368509c6d 100644 --- a/packages/config/src/chainConfig/configs/mainnet.ts +++ b/packages/config/src/chainConfig/configs/mainnet.ts @@ -121,4 +121,14 @@ export const chainConfig: ChainConfig = { MAX_BLOBS_PER_BLOCK_ELECTRA: 9, // MAX_REQUEST_BLOCKS_DENEB * MAX_BLOBS_PER_BLOCK_ELECTRA MAX_REQUEST_BLOB_SIDECARS_ELECTRA: 1152, + + // Fulu + // `2**12` (= 4096 epochs, ~18 days) + MIN_EPOCHS_FOR_DATA_COLUMN_SIDECARS_REQUESTS: 4096, + SAMPLES_PER_SLOT: 8, + CUSTODY_REQUIREMENT: 4, + NODE_CUSTODY_REQUIREMENT: 1, + VALIDATOR_CUSTODY_REQUIREMENT: 8, + BALANCE_PER_ADDITIONAL_CUSTODY_GROUP: 32000000000, + MAX_BLOBS_PER_BLOCK_FULU: 12, }; diff --git a/packages/config/src/chainConfig/configs/minimal.ts b/packages/config/src/chainConfig/configs/minimal.ts index b38c4e37f9..b82c119464 100644 --- a/packages/config/src/chainConfig/configs/minimal.ts +++ b/packages/config/src/chainConfig/configs/minimal.ts @@ -117,4 +117,14 @@ export const chainConfig: ChainConfig = { MAX_BLOBS_PER_BLOCK_ELECTRA: 9, // MAX_REQUEST_BLOCKS_DENEB * MAX_BLOBS_PER_BLOCK_ELECTRA MAX_REQUEST_BLOB_SIDECARS_ELECTRA: 1152, + + // Fulu + // `2**12` (= 4096 epochs, ~18 days) + MIN_EPOCHS_FOR_DATA_COLUMN_SIDECARS_REQUESTS: 4096, + SAMPLES_PER_SLOT: 8, + CUSTODY_REQUIREMENT: 4, + NODE_CUSTODY_REQUIREMENT: 1, + VALIDATOR_CUSTODY_REQUIREMENT: 8, + BALANCE_PER_ADDITIONAL_CUSTODY_GROUP: 32000000000, + MAX_BLOBS_PER_BLOCK_FULU: 12, }; diff --git a/packages/config/src/chainConfig/types.ts b/packages/config/src/chainConfig/types.ts index 00cfac6099..048cf3818a 100644 --- a/packages/config/src/chainConfig/types.ts +++ b/packages/config/src/chainConfig/types.ts @@ -76,12 +76,20 @@ export type ChainConfig = { // Networking MIN_EPOCHS_FOR_BLOCK_REQUESTS: number; MIN_EPOCHS_FOR_BLOB_SIDECARS_REQUESTS: number; + MIN_EPOCHS_FOR_DATA_COLUMN_SIDECARS_REQUESTS: number; BLOB_SIDECAR_SUBNET_COUNT: number; MAX_BLOBS_PER_BLOCK: number; MAX_REQUEST_BLOB_SIDECARS: number; BLOB_SIDECAR_SUBNET_COUNT_ELECTRA: number; MAX_BLOBS_PER_BLOCK_ELECTRA: number; MAX_REQUEST_BLOB_SIDECARS_ELECTRA: number; + + SAMPLES_PER_SLOT: number; + CUSTODY_REQUIREMENT: number; + NODE_CUSTODY_REQUIREMENT: number; + VALIDATOR_CUSTODY_REQUIREMENT: number; + BALANCE_PER_ADDITIONAL_CUSTODY_GROUP: number; + MAX_BLOBS_PER_BLOCK_FULU: number; }; export const chainConfigTypes: SpecTypes = { @@ -150,12 +158,20 @@ export const chainConfigTypes: SpecTypes = { // Networking MIN_EPOCHS_FOR_BLOCK_REQUESTS: "number", MIN_EPOCHS_FOR_BLOB_SIDECARS_REQUESTS: "number", + MIN_EPOCHS_FOR_DATA_COLUMN_SIDECARS_REQUESTS: "number", BLOB_SIDECAR_SUBNET_COUNT: "number", MAX_BLOBS_PER_BLOCK: "number", MAX_REQUEST_BLOB_SIDECARS: "number", BLOB_SIDECAR_SUBNET_COUNT_ELECTRA: "number", MAX_BLOBS_PER_BLOCK_ELECTRA: "number", MAX_REQUEST_BLOB_SIDECARS_ELECTRA: "number", + + SAMPLES_PER_SLOT: "number", + CUSTODY_REQUIREMENT: "number", + NODE_CUSTODY_REQUIREMENT: "number", + VALIDATOR_CUSTODY_REQUIREMENT: "number", + BALANCE_PER_ADDITIONAL_CUSTODY_GROUP: "number", + MAX_BLOBS_PER_BLOCK_FULU: "number", }; /** Allows values in a Spec file */ diff --git a/packages/config/src/forkConfig/index.ts b/packages/config/src/forkConfig/index.ts index f004fb5924..fba258d97e 100644 --- a/packages/config/src/forkConfig/index.ts +++ b/packages/config/src/forkConfig/index.ts @@ -139,7 +139,14 @@ export function createForkConfig(config: ChainConfig): ForkConfig { return sszTypesFor(forkName); }, getMaxBlobsPerBlock(fork: ForkName): number { - return isForkPostElectra(fork) ? config.MAX_BLOBS_PER_BLOCK_ELECTRA : config.MAX_BLOBS_PER_BLOCK; + switch (fork) { + case ForkName.fulu: + return config.MAX_BLOBS_PER_BLOCK_FULU; + case ForkName.electra: + return config.MAX_BLOBS_PER_BLOCK_ELECTRA; + default: + return config.MAX_BLOBS_PER_BLOCK; + } }, getMaxRequestBlobSidecars(fork: ForkName): number { return isForkPostElectra(fork) ? config.MAX_REQUEST_BLOB_SIDECARS_ELECTRA : config.MAX_REQUEST_BLOB_SIDECARS; diff --git a/packages/params/src/forkName.ts b/packages/params/src/forkName.ts index 66181447eb..cd2d380713 100644 --- a/packages/params/src/forkName.ts +++ b/packages/params/src/forkName.ts @@ -96,6 +96,20 @@ export function isForkPostElectra(fork: ForkName): fork is ForkPostElectra { return isForkPostDeneb(fork) && fork !== ForkName.deneb; } +export type ForkPreFulu = ForkPreElectra | ForkName.electra; +export type ForkPostFulu = Exclude; +export const forkPostFulu = exclude(forkAll, [ + ForkName.phase0, + ForkName.altair, + ForkName.bellatrix, + ForkName.capella, + ForkName.deneb, + ForkName.electra, +]); +export function isForkPostFulu(fork: ForkName): fork is ForkPostFulu { + return isForkPostElectra(fork) && fork !== ForkName.electra; +} + /* * Aliases only exported for backwards compatibility. This will be removed in * lodestar v2.0. The types and guards above should be used in all places as diff --git a/packages/params/src/index.ts b/packages/params/src/index.ts index 838624e29f..87d4406cbf 100644 --- a/packages/params/src/index.ts +++ b/packages/params/src/index.ts @@ -108,6 +108,10 @@ export const { MAX_PENDING_PARTIALS_PER_WITHDRAWALS_SWEEP, MAX_PENDING_DEPOSITS_PER_EPOCH, WHISTLEBLOWER_REWARD_QUOTIENT_ELECTRA, + + FIELD_ELEMENTS_PER_CELL, + FIELD_ELEMENTS_PER_EXT_BLOB, + KZG_COMMITMENTS_INCLUSION_PROOF_DEPTH, } = activePreset; //////////// @@ -273,3 +277,16 @@ export const NEXT_SYNC_COMMITTEE_INDEX_ELECTRA = 23; export const DEPOSIT_REQUEST_TYPE = 0x00; export const WITHDRAWAL_REQUEST_TYPE = 0x01; export const CONSOLIDATION_REQUEST_TYPE = 0x02; + +// 128 +export const NUMBER_OF_COLUMNS = (FIELD_ELEMENTS_PER_BLOB * 2) / FIELD_ELEMENTS_PER_CELL; +export const BYTES_PER_CELL = FIELD_ELEMENTS_PER_CELL * BYTES_PER_FIELD_ELEMENT; +export const CELLS_PER_EXT_BLOB = FIELD_ELEMENTS_PER_EXT_BLOB / FIELD_ELEMENTS_PER_CELL; + +// ssz.fulu.BeaconBlockBody.getPathInfo(['blobKzgCommitments']).gindex +export const KZG_COMMITMENTS_GINDEX = 27; +export const KZG_COMMITMENTS_SUBTREE_INDEX = KZG_COMMITMENTS_GINDEX - 2 ** KZG_COMMITMENTS_INCLUSION_PROOF_DEPTH; + +export const MAX_REQUEST_DATA_COLUMN_SIDECARS = MAX_REQUEST_BLOCKS_DENEB * NUMBER_OF_COLUMNS; // 16384 +export const DATA_COLUMN_SIDECAR_SUBNET_COUNT = 128; +export const NUMBER_OF_CUSTODY_GROUPS = 128; diff --git a/packages/params/src/presets/mainnet.ts b/packages/params/src/presets/mainnet.ts index b4136f83da..eeb411b278 100644 --- a/packages/params/src/presets/mainnet.ts +++ b/packages/params/src/presets/mainnet.ts @@ -133,4 +133,10 @@ export const mainnetPreset: BeaconPreset = { PENDING_CONSOLIDATIONS_LIMIT: 262144, MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD: 2, WHISTLEBLOWER_REWARD_QUOTIENT_ELECTRA: 4096, + + // FULU + /////////// + FIELD_ELEMENTS_PER_CELL: 64, + FIELD_ELEMENTS_PER_EXT_BLOB: 8192, + KZG_COMMITMENTS_INCLUSION_PROOF_DEPTH: 4, }; diff --git a/packages/params/src/presets/minimal.ts b/packages/params/src/presets/minimal.ts index 4595ee9ee8..ca29dd7b3a 100644 --- a/packages/params/src/presets/minimal.ts +++ b/packages/params/src/presets/minimal.ts @@ -115,8 +115,6 @@ export const minimalPreset: BeaconPreset = { // DENEB /////////// FIELD_ELEMENTS_PER_BLOB: 4096, - MAX_BLOB_COMMITMENTS_PER_BLOCK: 32, - KZG_COMMITMENT_INCLUSION_PROOF_DEPTH: 10, // ELECTRA MAX_DEPOSIT_REQUESTS_PER_PAYLOAD: 4, @@ -134,4 +132,12 @@ export const minimalPreset: BeaconPreset = { PENDING_CONSOLIDATIONS_LIMIT: 64, MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD: 2, WHISTLEBLOWER_REWARD_QUOTIENT_ELECTRA: 4096, + MAX_BLOB_COMMITMENTS_PER_BLOCK: 32, + KZG_COMMITMENT_INCLUSION_PROOF_DEPTH: 10, + + // FULU + /////////// + FIELD_ELEMENTS_PER_CELL: 64, + FIELD_ELEMENTS_PER_EXT_BLOB: 8192, + KZG_COMMITMENTS_INCLUSION_PROOF_DEPTH: 4, }; diff --git a/packages/params/src/types.ts b/packages/params/src/types.ts index e641e0f052..6b0e050837 100644 --- a/packages/params/src/types.ts +++ b/packages/params/src/types.ts @@ -95,6 +95,12 @@ export type BeaconPreset = { PENDING_CONSOLIDATIONS_LIMIT: number; MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD: number; WHISTLEBLOWER_REWARD_QUOTIENT_ELECTRA: number; + + // FULU + /////////// + FIELD_ELEMENTS_PER_CELL: number; + FIELD_ELEMENTS_PER_EXT_BLOB: number; + KZG_COMMITMENTS_INCLUSION_PROOF_DEPTH: number; }; /** @@ -195,6 +201,12 @@ export const beaconPresetTypes: BeaconPresetTypes = { PENDING_CONSOLIDATIONS_LIMIT: "number", MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD: "number", WHISTLEBLOWER_REWARD_QUOTIENT_ELECTRA: "number", + + // FULU + /////////// + FIELD_ELEMENTS_PER_CELL: "number", + FIELD_ELEMENTS_PER_EXT_BLOB: "number", + KZG_COMMITMENTS_INCLUSION_PROOF_DEPTH: "number", }; type BeaconPresetTypes = { diff --git a/packages/params/test/e2e/ensure-config-is-synced.test.ts b/packages/params/test/e2e/ensure-config-is-synced.test.ts index 02a59acc95..d8034f60eb 100644 --- a/packages/params/test/e2e/ensure-config-is-synced.test.ts +++ b/packages/params/test/e2e/ensure-config-is-synced.test.ts @@ -53,15 +53,12 @@ function assertCorrectPreset(localPreset: BeaconPreset, remotePreset: BeaconPres async function downloadRemoteConfig(preset: "mainnet" | "minimal", commit: string): Promise { const downloadedParams = await Promise.all( - Object.values(ForkName) - // TODO Fulu: check against remote presets - .filter((forkName) => forkName !== ForkName.fulu) - .map((forkName) => - axios({ - url: `https://raw.githubusercontent.com/ethereum/consensus-specs/${commit}/presets/${preset}/${forkName}.yaml`, - timeout: 30 * 1000, - }).then((response) => loadConfigYaml(response.data)) - ) + Object.values(ForkName).map((forkName) => + axios({ + url: `https://raw.githubusercontent.com/ethereum/consensus-specs/${commit}/presets/${preset}/${forkName}.yaml`, + timeout: 30 * 1000, + }).then((response) => loadConfigYaml(response.data)) + ) ); // Merge all the fetched yamls for the different forks diff --git a/packages/params/test/unit/forkName.test.ts b/packages/params/test/unit/forkName.test.ts index c4c14e81f2..58e8328c08 100644 --- a/packages/params/test/unit/forkName.test.ts +++ b/packages/params/test/unit/forkName.test.ts @@ -15,14 +15,14 @@ describe("forkName", () => { expect(forkAll).toMatchSnapshot(); }); - it("should have valid post-bellatrix forks", () => { - expect(forkPostBellatrix).toMatchSnapshot(); - }); - it("should have valid post-altair forks", () => { expect(forkPostAltair).toMatchSnapshot(); }); + it("should have valid post-bellatrix forks", () => { + expect(forkPostBellatrix).toMatchSnapshot(); + }); + it("should have valid post-capella forks", () => { expect(forkPostCapella).toMatchSnapshot(); }); diff --git a/packages/types/src/fulu/index.ts b/packages/types/src/fulu/index.ts new file mode 100644 index 0000000000..31c28a0d36 --- /dev/null +++ b/packages/types/src/fulu/index.ts @@ -0,0 +1,4 @@ +export * from "./types.js"; +import * as ssz from "./sszTypes.js"; +import * as ts from "./types.js"; +export {ts, ssz}; diff --git a/packages/types/src/fulu/sszTypes.ts b/packages/types/src/fulu/sszTypes.ts new file mode 100644 index 0000000000..6f05e4ea1a --- /dev/null +++ b/packages/types/src/fulu/sszTypes.ts @@ -0,0 +1,75 @@ +import {ByteVectorType, ContainerType, ListBasicType, ListCompositeType, VectorCompositeType} from "@chainsafe/ssz"; +import { + BYTES_PER_FIELD_ELEMENT, + FIELD_ELEMENTS_PER_CELL, + KZG_COMMITMENTS_INCLUSION_PROOF_DEPTH, + MAX_BLOB_COMMITMENTS_PER_BLOCK, + MAX_REQUEST_DATA_COLUMN_SIDECARS, + NUMBER_OF_COLUMNS, +} from "@lodestar/params"; + +import {ssz as altairSsz} from "../altair/index.js"; +import {ssz as denebSsz} from "../deneb/index.js"; +import {ssz as phase0Ssz} from "../phase0/index.js"; +import {ssz as primitiveSsz} from "../primitive/index.js"; + +const {Root, ColumnIndex, RowIndex, Bytes32, Slot, UintNum64} = primitiveSsz; + +export const Metadata = new ContainerType( + { + ...altairSsz.Metadata.fields, + custodyGroupCount: UintNum64, + }, + {typeName: "Metadata", jsonCase: "eth2"} +); + +export const Cell = new ByteVectorType(BYTES_PER_FIELD_ELEMENT * FIELD_ELEMENTS_PER_CELL); +export const DataColumn = new ListCompositeType(Cell, MAX_BLOB_COMMITMENTS_PER_BLOCK); +export const ExtendedMatrix = new ListCompositeType(Cell, MAX_BLOB_COMMITMENTS_PER_BLOCK * NUMBER_OF_COLUMNS); +export const KzgCommitmentsInclusionProof = new VectorCompositeType(Bytes32, KZG_COMMITMENTS_INCLUSION_PROOF_DEPTH); + +export const DataColumnSidecar = new ContainerType( + { + index: ColumnIndex, + column: DataColumn, + kzgCommitments: denebSsz.BlobKzgCommitments, + kzgProofs: denebSsz.KZGProofs, + signedBlockHeader: phase0Ssz.SignedBeaconBlockHeader, + kzgCommitmentsInclusionProof: KzgCommitmentsInclusionProof, + }, + {typeName: "DataColumnSidecar", jsonCase: "eth2"} +); + +export const DataColumnSidecars = new ListCompositeType(DataColumnSidecar, NUMBER_OF_COLUMNS); + +export const MatrixEntry = new ContainerType( + { + cell: Cell, + kzgProof: denebSsz.KZGProof, + columnIndex: ColumnIndex, + rowIndex: RowIndex, + }, + {typeName: "MatrixEntry", jsonCase: "eth2"} +); + +export const DataColumnIdentifier = new ContainerType( + { + blockRoot: Root, + index: ColumnIndex, + }, + {typeName: "DataColumnIdentifier", jsonCase: "eth2"} +); + +export const DataColumnSidecarsByRootRequest = new ListCompositeType( + DataColumnIdentifier, + MAX_REQUEST_DATA_COLUMN_SIDECARS +); + +export const DataColumnSidecarsByRangeRequest = new ContainerType( + { + startSlot: Slot, + count: UintNum64, + columns: new ListBasicType(ColumnIndex, NUMBER_OF_COLUMNS), + }, + {typeName: "DataColumnSidecarsByRangeRequest", jsonCase: "eth2"} +); diff --git a/packages/types/src/fulu/types.ts b/packages/types/src/fulu/types.ts new file mode 100644 index 0000000000..3554f161da --- /dev/null +++ b/packages/types/src/fulu/types.ts @@ -0,0 +1,16 @@ +import {ValueOf} from "@chainsafe/ssz"; +import * as ssz from "./sszTypes.js"; + +export type Metadata = ValueOf; + +export type Cell = ValueOf; +export type DataColumn = ValueOf; +export type ExtendedMatrix = ValueOf; +export type KzgCommitmentsInclusionProof = ValueOf; +export type DataColumnSidecar = ValueOf; +export type DataColumnSidecars = ValueOf; +export type MatrixEntry = ValueOf; + +export type DataColumnIdentifier = ValueOf; +export type DataColumnSidecarsByRootRequest = ValueOf; +export type DataColumnSidecarsByRangeRequest = ValueOf; diff --git a/packages/types/src/primitive/sszTypes.ts b/packages/types/src/primitive/sszTypes.ts index d7c7485707..b939f43c22 100644 --- a/packages/types/src/primitive/sszTypes.ts +++ b/packages/types/src/primitive/sszTypes.ts @@ -65,3 +65,6 @@ export const BLSSignature = Bytes96; export const Domain = Bytes32; export const ParticipationFlags = new UintNumberType(1, {setBitwiseOR: true}); export const ExecutionAddress = new ExecutionAddressType(); +export const ColumnIndex = UintNum64; +export const CustodyIndex = UintNum64; +export const RowIndex = UintNum64; diff --git a/packages/types/src/primitive/types.ts b/packages/types/src/primitive/types.ts index d0eef61984..7b0fac5096 100644 --- a/packages/types/src/primitive/types.ts +++ b/packages/types/src/primitive/types.ts @@ -48,3 +48,6 @@ export type ExecutionAddress = Bytes20; export type RootHex = string; /** Non-spec type to signal time is represented in seconds */ export type TimeSeconds = number; +export type ColumnIndex = UintNum64; +export type CustodyIndex = UintNum64; +export type RowIndex = UintNum64; diff --git a/packages/types/src/sszTypes.ts b/packages/types/src/sszTypes.ts index 68063b7137..60df4cb543 100644 --- a/packages/types/src/sszTypes.ts +++ b/packages/types/src/sszTypes.ts @@ -1,29 +1,40 @@ import {CompositeType, CompositeView, CompositeViewDU, ContainerType, ValueOf} from "@chainsafe/ssz"; import {ForkName} from "@lodestar/params"; -import {ssz as altair} from "./altair/index.js"; -import {ssz as bellatrix} from "./bellatrix/index.js"; -import {ssz as capella} from "./capella/index.js"; -import {ssz as deneb} from "./deneb/index.js"; -import {ssz as electra} from "./electra/index.js"; -import {ssz as phase0} from "./phase0/index.js"; +import {ssz as altairSsz} from "./altair/index.js"; +import {ssz as bellatrixSsz} from "./bellatrix/index.js"; +import {ssz as capellaSsz} from "./capella/index.js"; +import {ssz as denebSsz} from "./deneb/index.js"; +import {ssz as electraSsz} from "./electra/index.js"; +import {ssz as fuluSsz} from "./fulu/index.js"; +import {ssz as phase0Ssz} from "./phase0/index.js"; export * from "./primitive/sszTypes.js"; -export {phase0, altair, bellatrix, capella, deneb, electra, electra as fulu}; /** * Index the ssz types that differ by fork * A record of AllForksSSZTypes indexed by fork */ const typesByFork = { - [ForkName.phase0]: {...phase0}, - [ForkName.altair]: {...phase0, ...altair}, - [ForkName.bellatrix]: {...phase0, ...altair, ...bellatrix}, - [ForkName.capella]: {...phase0, ...altair, ...bellatrix, ...capella}, - [ForkName.deneb]: {...phase0, ...altair, ...bellatrix, ...capella, ...deneb}, - [ForkName.electra]: {...phase0, ...altair, ...bellatrix, ...capella, ...deneb, ...electra}, - [ForkName.fulu]: {...phase0, ...altair, ...bellatrix, ...capella, ...deneb, ...electra}, + [ForkName.phase0]: {...phase0Ssz}, + [ForkName.altair]: {...phase0Ssz, ...altairSsz}, + [ForkName.bellatrix]: {...phase0Ssz, ...altairSsz, ...bellatrixSsz}, + [ForkName.capella]: {...phase0Ssz, ...altairSsz, ...bellatrixSsz, ...capellaSsz}, + [ForkName.deneb]: {...phase0Ssz, ...altairSsz, ...bellatrixSsz, ...capellaSsz, ...denebSsz}, + [ForkName.electra]: {...phase0Ssz, ...altairSsz, ...bellatrixSsz, ...capellaSsz, ...denebSsz, ...electraSsz}, + [ForkName.fulu]: {...phase0Ssz, ...altairSsz, ...bellatrixSsz, ...capellaSsz, ...denebSsz, ...electraSsz, ...fuluSsz}, }; +// Export these types to ensure that each fork is a superset of the previous one (with overridden types obviously) +// This allows us to only declare types that change in each fork in each fork subdirectory + +export const phase0 = typesByFork[ForkName.phase0]; +export const altair = typesByFork[ForkName.altair]; +export const bellatrix = typesByFork[ForkName.bellatrix]; +export const capella = typesByFork[ForkName.capella]; +export const deneb = typesByFork[ForkName.deneb]; +export const electra = typesByFork[ForkName.electra]; +export const fulu = typesByFork[ForkName.fulu]; + /** * A type of union of forks must accept as any parameter the UNION of all fork types. */ diff --git a/packages/types/src/types.ts b/packages/types/src/types.ts index f0a7ac1743..206e94d998 100644 --- a/packages/types/src/types.ts +++ b/packages/types/src/types.ts @@ -12,6 +12,7 @@ import {ts as bellatrix} from "./bellatrix/index.js"; import {ts as capella} from "./capella/index.js"; import {ts as deneb} from "./deneb/index.js"; import {ts as electra} from "./electra/index.js"; +import {ts as fulu} from "./fulu/index.js"; import {ts as phase0} from "./phase0/index.js"; import {Slot} from "./primitive/types.js"; @@ -22,6 +23,7 @@ export {ts as bellatrix} from "./bellatrix/index.js"; export {ts as capella} from "./capella/index.js"; export {ts as deneb} from "./deneb/index.js"; export {ts as electra} from "./electra/index.js"; +export {ts as fulu} from "./fulu/index.js"; /** Common non-spec type to represent roots as strings */ export type RootHex = string; @@ -234,7 +236,7 @@ type TypesByFork = { BeaconBlockBody: electra.BeaconBlockBody; BeaconState: electra.BeaconState; SignedBeaconBlock: electra.SignedBeaconBlock; - Metadata: altair.Metadata; + Metadata: fulu.Metadata; LightClientHeader: deneb.LightClientHeader; LightClientBootstrap: electra.LightClientBootstrap; LightClientUpdate: electra.LightClientUpdate; @@ -244,8 +246,8 @@ type TypesByFork = { BlindedBeaconBlock: electra.BlindedBeaconBlock; BlindedBeaconBlockBody: electra.BlindedBeaconBlockBody; SignedBlindedBeaconBlock: electra.SignedBlindedBeaconBlock; - ExecutionPayload: deneb.ExecutionPayload; - ExecutionPayloadHeader: deneb.ExecutionPayloadHeader; + ExecutionPayload: electra.ExecutionPayload; + ExecutionPayloadHeader: electra.ExecutionPayloadHeader; BuilderBid: electra.BuilderBid; SignedBuilderBid: electra.SignedBuilderBid; SSEPayloadAttributes: electra.SSEPayloadAttributes; diff --git a/packages/validator/src/util/params.ts b/packages/validator/src/util/params.ts index e4184257ad..c120ceeb5f 100644 --- a/packages/validator/src/util/params.ts +++ b/packages/validator/src/util/params.ts @@ -141,6 +141,7 @@ function getSpecCriticalParams(localConfig: ChainConfig): Record