@lodestar/beacon-node
Version:
A Typescript implementation of the beacon chain
177 lines (159 loc) • 6.12 kB
text/typescript
import {routes} from "@lodestar/api";
import {
CONSOLIDATION_REQUEST_TYPE,
DEPOSIT_REQUEST_TYPE,
ForkName,
ForkPostFulu,
ForkPreFulu,
WITHDRAWAL_REQUEST_TYPE,
} from "@lodestar/params";
import {BlobsBundle, ExecutionPayload, ExecutionRequests, Root, RootHex, Wei, capella} from "@lodestar/types";
import {BlobAndProof} from "@lodestar/types/deneb";
import {BlobAndProofV2} from "@lodestar/types/fulu";
import {PayloadId, PayloadIdCache, WithdrawalV1} from "./payloadIdCache.js";
import {ExecutionPayloadBody} from "./types.js";
import {DATA} from "./utils.js";
export {PayloadIdCache, type PayloadId, type WithdrawalV1};
export type ClientVersion = routes.node.ClientVersion;
export const ClientCode = routes.node.ClientCode;
export enum ExecutionPayloadStatus {
/** given payload is valid */
VALID = "VALID",
/** given payload is invalid */
INVALID = "INVALID",
/** sync process is in progress */
SYNCING = "SYNCING",
/**
* blockHash is valid, but payload is not part of canonical chain and hasn't been fully
* validated
*/
ACCEPTED = "ACCEPTED",
/** blockHash is invalid */
INVALID_BLOCK_HASH = "INVALID_BLOCK_HASH",
/** EL error */
ELERROR = "ELERROR",
/** EL unavailable */
UNAVAILABLE = "UNAVAILABLE",
/** EL replied with SYNCING or ACCEPTED when its not safe to import optimistic blocks */
UNSAFE_OPTIMISTIC_STATUS = "UNSAFE_OPTIMISTIC_STATUS",
}
export enum ExecutionEngineState {
ONLINE = "ONLINE",
OFFLINE = "OFFLINE",
SYNCING = "SYNCING",
SYNCED = "SYNCED",
AUTH_FAILED = "AUTH_FAILED",
}
export type ExecutionRequestType =
| typeof DEPOSIT_REQUEST_TYPE
| typeof WITHDRAWAL_REQUEST_TYPE
| typeof CONSOLIDATION_REQUEST_TYPE;
export function isExecutionRequestType(type: number): type is ExecutionRequestType {
return type === DEPOSIT_REQUEST_TYPE || type === WITHDRAWAL_REQUEST_TYPE || type === CONSOLIDATION_REQUEST_TYPE;
}
export type ExecutePayloadResponse =
| {
status: ExecutionPayloadStatus.SYNCING | ExecutionPayloadStatus.ACCEPTED;
latestValidHash: null;
validationError: null;
}
| {status: ExecutionPayloadStatus.VALID; latestValidHash: RootHex; validationError: null}
| {status: ExecutionPayloadStatus.INVALID; latestValidHash: RootHex | null; validationError: string | null}
| {
status:
| ExecutionPayloadStatus.INVALID_BLOCK_HASH
| ExecutionPayloadStatus.ELERROR
| ExecutionPayloadStatus.UNAVAILABLE;
latestValidHash: null;
validationError: string;
};
export type ForkChoiceUpdateStatus =
| ExecutionPayloadStatus.VALID
| ExecutionPayloadStatus.INVALID
| ExecutionPayloadStatus.SYNCING;
export type PayloadAttributes = {
timestamp: number;
prevRandao: Uint8Array;
// DATA is anyway a hex string, so we can just track it as a hex string to
// avoid any conversions
suggestedFeeRecipient: string;
withdrawals?: capella.Withdrawal[];
parentBeaconBlockRoot?: Uint8Array;
slotNumber?: number; // EIP-7843
};
export type VersionedHashes = Uint8Array[];
/**
* Execution engine represents an abstract protocol to interact with execution clients. Potential transports include:
* - JSON RPC over network
* - IPC
* - Integrated code into the same binary
*/
export interface IExecutionEngine {
readonly state: ExecutionEngineState;
readonly clientVersion?: ClientVersion | null;
payloadIdCache: PayloadIdCache;
/**
* A state transition function which applies changes to the self.execution_state.
* Returns ``True`` iff ``execution_payload`` is valid with respect to ``self.execution_state``.
*
* Required for block processing in the beacon state transition function.
* https://github.com/ethereum/consensus-specs/blob/0eb0a934a3/specs/merge/beacon-chain.md#on_payload
*
* Should be called in advance before, after or in parallel to block processing
*/
notifyNewPayload(
fork: ForkName,
executionPayload: ExecutionPayload,
versionedHashes?: VersionedHashes,
parentBeaconBlockRoot?: Root,
executionRequests?: ExecutionRequests
): Promise<ExecutePayloadResponse>;
/**
* Signal fork choice updates
* This function performs two actions atomically:
* - Re-organizes the execution payload chain and corresponding state to make head_block_hash the head.
* - Applies finality to the execution state: it irreversibly persists the chain of all execution payloads and
* corresponding state, up to and including finalized_block_hash.
*
* The call of the notify_forkchoice_updated function maps on the POS_FORKCHOICE_UPDATED event defined in the EIP-3675.
* https://github.com/ethereum/consensus-specs/blob/v1.1.7/specs/merge/fork-choice.md#notify_forkchoice_updated
*
* Should be called in response to fork-choice head and finalized events
*/
notifyForkchoiceUpdate(
fork: ForkName,
headBlockHash: RootHex,
safeBlockHash: RootHex,
finalizedBlockHash: RootHex,
payloadAttributes?: PayloadAttributes
): Promise<PayloadId | null>;
/**
* Given the payload_id, get_payload returns the most recent version of the execution payload that has been built
* since the corresponding call to prepare_payload method.
*
* Required for block producing
* https://github.com/ethereum/consensus-specs/blob/v1.1.7/specs/merge/validator.md#get_payload
*/
getPayload(
fork: ForkName,
payloadId: PayloadId
): Promise<{
executionPayload: ExecutionPayload;
executionPayloadValue: Wei;
blobsBundle?: BlobsBundle;
executionRequests?: ExecutionRequests;
shouldOverrideBuilder?: boolean;
}>;
getPayloadBodiesByHash(fork: ForkName, blockHash: DATA[]): Promise<(ExecutionPayloadBody | null)[]>;
getPayloadBodiesByRange(fork: ForkName, start: number, count: number): Promise<(ExecutionPayloadBody | null)[]>;
getBlobs(
fork: ForkPostFulu,
versionedHashes: VersionedHashes,
buffers?: Uint8Array[]
): Promise<BlobAndProofV2[] | null>;
getBlobs(
fork: ForkPreFulu,
versionedHashes: VersionedHashes,
buffers?: Uint8Array[]
): Promise<(BlobAndProof | null)[]>;
}