2020-04-29 21:32:39 +00:00
|
|
|
// Package p2putils contains useful helpers for eth2 fork-related functionality.
|
2020-04-19 02:32:53 +00:00
|
|
|
package p2putils
|
|
|
|
|
|
|
|
import (
|
|
|
|
"time"
|
|
|
|
|
|
|
|
"github.com/pkg/errors"
|
|
|
|
"github.com/prysmaticlabs/prysm/beacon-chain/core/helpers"
|
|
|
|
"github.com/prysmaticlabs/prysm/shared/params"
|
|
|
|
)
|
|
|
|
|
|
|
|
// CreateForkDigest creates a fork digest from a genesis time and genesis
|
|
|
|
// validators root, utilizing the current slot to determine
|
|
|
|
// the active fork version in the node.
|
|
|
|
func CreateForkDigest(
|
|
|
|
genesisTime time.Time,
|
|
|
|
genesisValidatorsRoot []byte,
|
|
|
|
) ([4]byte, error) {
|
|
|
|
if genesisTime.IsZero() {
|
|
|
|
return [4]byte{}, errors.New("genesis time is not set")
|
|
|
|
}
|
|
|
|
if len(genesisValidatorsRoot) == 0 {
|
|
|
|
return [4]byte{}, errors.New("genesis validators root is not set")
|
|
|
|
}
|
|
|
|
currentSlot := helpers.SlotsSince(genesisTime)
|
|
|
|
currentEpoch := helpers.SlotToEpoch(currentSlot)
|
|
|
|
|
|
|
|
// We retrieve a list of scheduled forks by epoch.
|
|
|
|
// We loop through the keys in this map to determine the current
|
|
|
|
// fork version based on the current, time-based epoch number
|
|
|
|
// since the genesis time.
|
|
|
|
currentForkVersion := params.BeaconConfig().GenesisForkVersion
|
|
|
|
scheduledForks := params.BeaconConfig().ForkVersionSchedule
|
|
|
|
for epoch, forkVersion := range scheduledForks {
|
|
|
|
if epoch <= currentEpoch {
|
|
|
|
currentForkVersion = forkVersion
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
digest, err := helpers.ComputeForkDigest(currentForkVersion, genesisValidatorsRoot)
|
|
|
|
if err != nil {
|
|
|
|
return [4]byte{}, err
|
|
|
|
}
|
|
|
|
return digest, nil
|
|
|
|
}
|