UNPKG

@lodestar/beacon-node

Version:

A Typescript implementation of the beacon chain

55 lines (44 loc) 2.07 kB
import {SLOTS_PER_EPOCH} from "@lodestar/params"; import {pruneSetToMax} from "@lodestar/utils"; import {PayloadAttributesRpc} from "./types.js"; import {DATA, QUANTITY} from "./utils.js"; // Idealy this only need to be set to the max head reorgs number const MAX_PAYLOAD_IDS = SLOTS_PER_EPOCH; // An execution engine can produce a payload id anywhere the uint64 range // Since we do no processing with this id, we have no need to deserialize it export type PayloadId = string; export type WithdrawalV1 = { index: QUANTITY; validatorIndex: QUANTITY; address: DATA; amount: QUANTITY; }; type FcuAttributes = {headBlockHash: DATA; finalizedBlockHash: DATA} & Omit<PayloadAttributesRpc, "withdrawals">; export class PayloadIdCache { private readonly payloadIdByFcuAttributes = new Map<string, {payloadId: PayloadId; fullKey: string}>(); getFullKey({headBlockHash, finalizedBlockHash, timestamp, prevRandao, suggestedFeeRecipient}: FcuAttributes): string { return `${headBlockHash}-${finalizedBlockHash}-${timestamp}-${prevRandao}-${suggestedFeeRecipient}`; } getKey({timestamp}: Pick<FcuAttributes, "timestamp">): string { return timestamp; } hasPayload(fcuAttributes: Pick<FcuAttributes, "timestamp">): boolean { const key = this.getKey(fcuAttributes); return this.payloadIdByFcuAttributes.get(key) !== undefined; } add(fcuAttributes: FcuAttributes, payloadId: PayloadId): void { const key = this.getKey(fcuAttributes); const fullKey = this.getFullKey(fcuAttributes); this.payloadIdByFcuAttributes.set(key, {payloadId, fullKey}); } prune(): void { // This is not so optimized function, but could maintain a 2d array may be? pruneSetToMax(this.payloadIdByFcuAttributes, MAX_PAYLOAD_IDS); } get(fcuAttributes: FcuAttributes): PayloadId | undefined { const key = this.getKey(fcuAttributes); const fullKey = this.getFullKey(fcuAttributes); const payloadInfo = this.payloadIdByFcuAttributes.get(key); return payloadInfo?.fullKey === fullKey ? payloadInfo.payloadId : undefined; } }