UNPKG

@lodestar/beacon-node

Version:

A Typescript implementation of the beacon chain

43 lines 2.16 kB
import { EpochDifference } from "@lodestar/fork-choice"; /** * Get dependent root of a shuffling given attestation epoch and head block. */ export function getShufflingDependentRoot(forkChoice, attEpoch, blockEpoch, attHeadBlock) { let shufflingDependentRoot; if (blockEpoch === attEpoch) { // current shuffling, this is equivalent to `headState.currentShuffling` // given blockEpoch = attEpoch = n // epoch: (n-2) (n-1) n (n+1) // |-------|-------|-------|-------| // attHeadBlock ------------------------^ // shufflingDependentRoot ------^ shufflingDependentRoot = forkChoice.getDependentRoot(attHeadBlock, EpochDifference.previous); } else if (blockEpoch === attEpoch - 1) { // next shuffling, this is equivalent to `headState.nextShuffling` // given blockEpoch = n-1, attEpoch = n // epoch: (n-2) (n-1) n (n+1) // |-------|-------|-------|-------| // attHeadBlock -------------------^ // shufflingDependentRoot ------^ shufflingDependentRoot = forkChoice.getDependentRoot(attHeadBlock, EpochDifference.current); } else if (blockEpoch < attEpoch - 1) { // this never happens with default chain option of maxSkipSlots = 32, however we still need to handle it // check the verifyHeadBlockAndTargetRoot() function above // given blockEpoch = n-2, attEpoch = n // epoch: (n-2) (n-1) n (n+1) // |-------|-------|-------|-------| // attHeadBlock -----------^ // shufflingDependentRoot -----^ shufflingDependentRoot = attHeadBlock.blockRoot; // use lodestar_gossip_attestation_head_slot_to_attestation_slot metric to track this case } else { // blockEpoch > attEpoch // should not happen, handled in verifyAttestationTargetRoot throw Error(`attestation epoch ${attEpoch} is before head block epoch ${blockEpoch}`); } return shufflingDependentRoot; } //# sourceMappingURL=dependentRoot.js.map