UNPKG

@lodestar/beacon-node

Version:

A Typescript implementation of the beacon chain

42 lines 1.65 kB
import { computeStartSlotAtEpoch } from "@lodestar/state-transition"; import { MapDef } from "@lodestar/utils"; /** * Keeps a cache to filter block proposals from the same validator in the same slot. * * This cache is not bounded and for extremely long periods of non-finality it can grow a lot. However it's practically * limited by the possible shufflings in those epochs, and the stored data is very cheap */ export class SeenBlockProposers { constructor() { this.proposerIndexesBySlot = new MapDef(() => new Set()); this.finalizedSlot = 0; } isKnown(blockSlot, proposerIndex) { return this.proposerIndexesBySlot.get(blockSlot)?.has(proposerIndex) === true; } add(blockSlot, proposerIndex) { if (blockSlot < this.finalizedSlot) { throw Error(`blockSlot ${blockSlot} < finalizedSlot ${this.finalizedSlot}`); } this.proposerIndexesBySlot.getOrDefault(blockSlot).add(proposerIndex); } prune(finalizedSlot) { this.finalizedSlot = finalizedSlot; for (const slot of this.proposerIndexesBySlot.keys()) { if (slot < finalizedSlot) { this.proposerIndexesBySlot.delete(slot); } } } seenAtEpoch(epoch, index) { const fromSlot = computeStartSlotAtEpoch(epoch); const toSlot = computeStartSlotAtEpoch(epoch + 1); for (let slot = fromSlot; slot < toSlot; slot++) { if (this.proposerIndexesBySlot.get(slot)?.has(index) === true) { return true; } } return false; } } //# sourceMappingURL=seenBlockProposers.js.map