UNPKG

@lodestar/beacon-node

Version:

A Typescript implementation of the beacon chain

57 lines 2.4 kB
import { MapDef, toRootHex } from "@lodestar/utils"; import { InsertOutcome } from "./types.js"; import { pruneBySlot } from "./utils.js"; /** * TODO GLOAS: Revisit this value and add rational for choosing it */ const SLOTS_RETAINED = 2; /** * Store the best execution payload bid per slot / (parent block root, parent block hash). */ export class ExecutionPayloadBidPool { bidByParentHashByParentRootBySlot = new MapDef(() => new MapDef(() => new Map())); lowestPermissibleSlot = 0; get size() { let count = 0; for (const byParentRoot of this.bidByParentHashByParentRootBySlot.values()) { for (const byParentHash of byParentRoot.values()) { count += byParentHash.size; } } return count; } add(bid) { const { slot, parentBlockRoot, parentBlockHash, value } = bid; const lowestPermissibleSlot = this.lowestPermissibleSlot; if (slot < lowestPermissibleSlot) { return InsertOutcome.Old; } const parentRootHex = toRootHex(parentBlockRoot); const parentHashHex = toRootHex(parentBlockHash); const bidByParentHash = this.bidByParentHashByParentRootBySlot.getOrDefault(slot).getOrDefault(parentRootHex); const existing = bidByParentHash.get(parentHashHex); if (existing) { const existingValue = existing.value; const newValue = value; if (newValue > existingValue) { bidByParentHash.set(parentHashHex, bid); return InsertOutcome.NewData; } return newValue === existingValue ? InsertOutcome.AlreadyKnown : InsertOutcome.NotBetterThan; } bidByParentHash.set(parentHashHex, bid); return InsertOutcome.NewData; } /** * Return the highest-value bid matching slot, parent block hash, and parent block root. * Used for gossip validation and block production. */ getBestBid(slot, parentBlockHash, parentBlockRoot) { const bidByParentHash = this.bidByParentHashByParentRootBySlot.get(slot)?.get(parentBlockRoot); return bidByParentHash?.get(parentBlockHash) ?? null; } prune(clockSlot) { this.lowestPermissibleSlot = pruneBySlot(this.bidByParentHashByParentRootBySlot, clockSlot, SLOTS_RETAINED); } } //# sourceMappingURL=executionPayloadBidPool.js.map