@lodestar/beacon-node
Version:
A Typescript implementation of the beacon chain
86 lines • 3.04 kB
JavaScript
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