@lodestar/beacon-node
Version:
A Typescript implementation of the beacon chain
54 lines • 2.41 kB
JavaScript
import { MapDef } from "@lodestar/utils";
// How many *non future* epochs we intend to keep for SeenAttesters.
// Pre and post deneb specs require us to accept attestations from current and
// previous epoch.
//
// Pre-deneb:
// - `attestation.data.slot + ATTESTATION_PROPAGATION_SLOT_RANGE >= current_slot >= attestation.data.slot`
//
// Post-deneb:
// - `attestation.data.slot <= current_slot`
// - `compute_epoch_at_slot(attestation.data.slot) in (get_previous_epoch(state), get_current_epoch(state))`
//
// When factored in MAXIMUM_GOSSIP_CLOCK_DISPARITY, it is possible we keep 3 epochs of SeenAttesters:
// previous, current and future epoch. This constant is solely used to calculate `lowestPermissibleEpoch`
// which prunes anything older than it.
//
// Assuming we're at epoch 100 while all other nodes at epoch 99, they all accept attestations at epoch 98, 99.
// If MAX_RETAINED_EPOCH = 2 then our lowestPermissibleEpoch is 98 which is fine
//
// Assuming we're at epoch 99 while all other nodes at epoch 100, they all accept attestations at epoch 99, 100.
// If MAX_RETAINED_EPOCH = 2 then lowestPermissibleEpoch is 97 which is more than enough
const EPOCH_LOOKBACK_LIMIT = 2;
/**
* Keeps a cache to filter unaggregated attestations from the same validator in the same epoch.
*/
export class SeenAttesters {
constructor() {
this.validatorIndexesByEpoch = new MapDef(() => new Set());
this.lowestPermissibleEpoch = 0;
}
isKnown(targetEpoch, validatorIndex) {
return this.validatorIndexesByEpoch.get(targetEpoch)?.has(validatorIndex) === true;
}
add(targetEpoch, validatorIndex) {
if (targetEpoch < this.lowestPermissibleEpoch) {
throw Error(`EpochTooLow ${targetEpoch} < ${this.lowestPermissibleEpoch}`);
}
this.validatorIndexesByEpoch.getOrDefault(targetEpoch).add(validatorIndex);
}
prune(currentEpoch) {
this.lowestPermissibleEpoch = Math.max(currentEpoch - EPOCH_LOOKBACK_LIMIT, 0);
for (const epoch of this.validatorIndexesByEpoch.keys()) {
if (epoch < this.lowestPermissibleEpoch) {
this.validatorIndexesByEpoch.delete(epoch);
}
}
}
}
/**
* Keeps a cache to filter aggregated attestations from the same aggregators in the same epoch
*/
export class SeenAggregators extends SeenAttesters {
}
//# sourceMappingURL=seenAttesters.js.map