@lodestar/beacon-node
Version:
A Typescript implementation of the beacon chain
165 lines (135 loc) • 4.54 kB
text/typescript
import {ForkName} from "@lodestar/params";
import {ColumnIndex, DataColumnSidecar, RootHex, SignedBeaconBlock, Slot, deneb, fulu} from "@lodestar/types";
import {VersionedHashes} from "../../../execution/index.js";
export enum DAType {
PreData = "pre-data",
Blobs = "blobs",
Columns = "columns",
NoData = "no-data",
}
export type DAData = null | deneb.BlobSidecars | fulu.DataColumnSidecar[];
/**
* Represents were input originated. Blocks and Data can come from different
* sources so each should be labelled individually.
*/
export enum BlockInputSource {
network_processor = "network_processor",
gossip = "gossip",
api = "api",
engine = "engine",
byRange = "req_resp_by_range",
byRoot = "req_resp_by_root",
recovery = "recovery",
}
export type PromiseParts<T> = {
promise: Promise<T>;
resolve: (value: T) => void;
reject: (e: Error) => void;
};
export type LogMetaBasic = {
slot: number;
blockRoot: string;
timeCreatedSec: number;
};
export type LogMetaBlobs = LogMetaBasic & {
expectedBlobs: number | string;
receivedBlobs: number;
};
export type LogMetaColumns = LogMetaBasic & {
expectedColumns: number;
receivedColumns: number;
};
export type SourceMeta = {
source: BlockInputSource;
seenTimestampSec: number;
peerIdStr?: string;
};
export type BlockWithSource = SourceMeta & {block: SignedBeaconBlock; blockRootHex: RootHex};
export type BlobWithSource = SourceMeta & {blobSidecar: deneb.BlobSidecar};
export type ColumnWithSource = SourceMeta & {columnSidecar: fulu.DataColumnSidecar};
export type BlockHeaderMeta = {
forkName: ForkName;
slot: Slot;
blockRootHex: string;
parentRootHex: string;
};
export type CreateBlockInputMeta = {
daOutOfRange: boolean;
forkName: ForkName;
blockRootHex: string;
};
export type BlockInputInit = BlockHeaderMeta & {
daOutOfRange: boolean;
timeCreated: number;
};
export type AddBlock<F extends ForkName = ForkName> = SourceMeta & {
block: SignedBeaconBlock<F>;
blockRootHex: string;
};
export type AddBlob = BlobWithSource & {
blockRootHex: RootHex;
};
export type AddColumn = ColumnWithSource & {
blockRootHex: RootHex;
};
export type BlobMeta = {
index: number;
blockRoot: Uint8Array;
versionedHash: Uint8Array;
};
export type MissingColumnMeta = {
missing: ColumnIndex[];
versionedHashes: VersionedHashes;
};
/**
* Minimal interface required to write data columns to the DB.
* Used by `writeDataColumnsToDb` and designed to be reusable across forks (e.g. Fulu, Gloas).
*/
export interface IDataColumnsInput {
readonly slot: Slot;
readonly blockRootHex: string;
getCustodyColumns(): DataColumnSidecar[];
hasComputedAllData(): boolean;
waitForComputedAllData(timeout: number, signal?: AbortSignal): Promise<DataColumnSidecar[]>;
}
/**
* This is used to validate that BlockInput implementations follow some minimal subset of operations
* and that adding a new implementation won't break consumers that rely on this subset.
*
* Practically speaking, this interface is only used internally.
*/
export interface IBlockInput<F extends ForkName = ForkName, TData extends DAData = DAData> {
type: DAType;
/** validator activities can't be performed on out of range data */
daOutOfRange: boolean;
timeCreatedSec: number;
// block header metadata
forkName: ForkName;
slot: Slot;
blockRootHex: string;
parentRootHex: string;
addBlock(props: AddBlock<F>, opts?: {throwOnDuplicateAdd: boolean}): void;
/** Whether the block has been seen and validated. If true, `getBlock` is guaranteed to not throw */
hasBlock(): boolean;
getBlock(): SignedBeaconBlock<F>;
getBlockSource(): SourceMeta;
/** Whether all expected DA data has been seen and validated. */
hasAllData(): boolean;
/**
* Whether the block and all DA data retrieved.
* If true, `getBlock` is guaranteed to not throw,
* and `getDAStatus` is guaranteed to be DAStatus.Complete
*/
hasBlockAndAllData(): boolean;
getLogMeta(): LogMetaBasic;
/** Only safe to call when `hasBlockAndAllData` is true */
getTimeComplete(): number;
/**
* Return object references used as keys in `SerializedCache` that can be safely removed
* once this block input lifecycle has completed.
*/
getSerializedCacheKeys(): object[];
waitForBlock(timeout: number, signal?: AbortSignal): Promise<SignedBeaconBlock<F>>;
waitForAllData(timeout: number, signal?: AbortSignal): Promise<TData>;
waitForBlockAndAllData(timeout: number, signal?: AbortSignal): Promise<this>;
}