UNPKG

@lodestar/beacon-node

Version:

A Typescript implementation of the beacon chain

86 lines 3.04 kB
import { bytesToInt } from "@lodestar/utils"; import { getSlotFromSignedBeaconBlockSerialized } from "./sszBytes.js"; /** * Slot uint64 */ const SLOT_BYTE_COUNT = 8; /** * SSZ offset uint32 */ const OFFSET_BYTE_COUNT = 4; /** * 8 + 32 = 40 * ``` * class BeaconState(Container): * genesis_time: uint64 [fixed - 8 bytes] * genesis_validators_root: Root [fixed - 32 bytes] * slot: Slot [fixed - 8 bytes] * ... * ``` */ const SLOT_BYTES_POSITION_IN_STATE = 40; export function getSignedBlockTypeFromBytes(config, bytes) { const slot = getSlotFromSignedBeaconBlockSerialized(bytes); if (slot === null) { throw Error("getSignedBlockTypeFromBytes: invalid bytes"); } return config.getForkTypes(slot).SignedBeaconBlock; } export function getStateTypeFromBytes(config, bytes) { const slot = getStateSlotFromBytes(bytes); return config.getForkTypes(slot).BeaconState; } export function getStateSlotFromBytes(bytes) { return bytesToInt(bytes.subarray(SLOT_BYTES_POSITION_IN_STATE, SLOT_BYTES_POSITION_IN_STATE + SLOT_BYTE_COUNT)); } /** * First field in update is beacon, first field in beacon is slot * * header = { * beacon: { * slot * ... * } * ... * } * ... */ const SLOT_BYTES_POSITION_IN_LIGHTCLIENTHEADER = 0; export function getLightClientHeaderTypeFromBytes(config, bytes) { const slot = bytesToInt(bytes.subarray(SLOT_BYTES_POSITION_IN_LIGHTCLIENTHEADER, SLOT_BYTES_POSITION_IN_LIGHTCLIENTHEADER + SLOT_BYTE_COUNT)); return config.getPostAltairForkTypes(slot).LightClientHeader; } /** * Position of first offset in DataColumnSidecar (after index field) * * Fulu DataColumnSidecar (6 fields): * index: uint64 [fixed - 8 bytes] * column: List [variable - 4-byte offset] * kzgCommitments: List [variable - 4-byte offset] * kzgProofs: List [variable - 4-byte offset] * signedBlockHeader: Container [fixed - 208 bytes] * kzgCommitmentsInclusionProof: Vector[Bytes32, 4] [fixed - 128 bytes] * => First offset value = 8 + 4 + 4 + 4 + 208 + 128 = 356 * * Gloas DataColumnSidecar (5 fields): * index: uint64 [fixed - 8 bytes] * column: List [variable - 4-byte offset] * kzgProofs: List [variable - 4-byte offset] * slot: uint64 [fixed - 8 bytes] * beaconBlockRoot: Bytes32 [fixed - 32 bytes] * => First offset value = 8 + 4 + 4 + 8 + 32 = 56 */ const FIRST_OFFSET_POSITION_IN_DATA_COLUMN_SIDECAR = 8; const GLOAS_DATA_COLUMN_SIDECAR_FIRST_OFFSET = 56; /** * Determines if DataColumnSidecar bytes are from Gloas fork by checking the SSZ offset structure. * * The first offset (bytes 8-12) indicates where variable-size data begins: * - Gloas: 56 (small fixed section) * - Fulu: 356 */ export function isGloasDataColumnSidecarBytes(bytes) { const firstOffset = bytesToInt(bytes.subarray(FIRST_OFFSET_POSITION_IN_DATA_COLUMN_SIDECAR, FIRST_OFFSET_POSITION_IN_DATA_COLUMN_SIDECAR + OFFSET_BYTE_COUNT)); return firstOffset === GLOAS_DATA_COLUMN_SIDECAR_FIRST_OFFSET; } //# sourceMappingURL=multifork.js.map