@lodestar/beacon-node
Version:
A Typescript implementation of the beacon chain
43 lines • 2.16 kB
JavaScript
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