mirror of
https://github.com/OffchainLabs/prysm.git
synced 2026-01-09 15:37:56 -05:00
* fork/version detection and unmarshaling support * Update config/params/config.go Co-authored-by: Radosław Kapka <rkapka@wp.pl> * Update proto/detect/configfork.go Co-authored-by: Radosław Kapka <rkapka@wp.pl> * PR feedback * move ssz initialization into the detect package * clarify comment * VersionForEpoch is much simpler/clearer in reverse * simpler VersionForEpoch; build AllConfigs in init * use fieldparams for Version * Update proto/detect/configfork_test.go Co-authored-by: Radosław Kapka <rkapka@wp.pl> * remove custom ForkName type, use runtime/version * pr cleanup * random fix from bad gh ui suggestion; privatize * privatize fieldSpec methods; + unit tests * Update proto/detect/configfork.go Co-authored-by: Potuz <potuz@prysmaticlabs.com> * fix bad github ui suggestion * ensure unique versions for simpler config match * fmt & adding unit test for ByState() * table-driven unit test for ByState * TestUnmarshalState * OrderedSchedule -> network/forks per PR feedback * goimports * lint fixes * move proto/detect -> ssz/encoding/detect * use typeUndefined in String * backport config tests from e2e PR * fix config parity test; make debugging it easier * lint * fix fork schedule initialization * cleanup * fix build * fix big ole derp * anything for you, deep source * goimportsss * InitializeForkSchedule in LoadChainConfigFile * PR feedback Co-authored-by: kasey <kasey@users.noreply.github.com> Co-authored-by: Radosław Kapka <rkapka@wp.pl> Co-authored-by: Potuz <potuz@prysmaticlabs.com>
55 lines
1.8 KiB
Go
55 lines
1.8 KiB
Go
package forks
|
|
|
|
import (
|
|
"sort"
|
|
|
|
"github.com/pkg/errors"
|
|
types "github.com/prysmaticlabs/eth2-types"
|
|
fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams"
|
|
"github.com/prysmaticlabs/prysm/config/params"
|
|
)
|
|
|
|
// ForkScheduleEntry is a Version+Epoch tuple for sorted storage in an OrderedSchedule
|
|
type ForkScheduleEntry struct {
|
|
Version [fieldparams.VersionLength]byte
|
|
Epoch types.Epoch
|
|
}
|
|
|
|
// OrderedSchedule provides a type that can be used to sort the fork schedule and find the Version
|
|
// the chain should be at for a given epoch (via VersionForEpoch).
|
|
type OrderedSchedule []ForkScheduleEntry
|
|
|
|
// Len implements the Len method of sort.Interface
|
|
func (o OrderedSchedule) Len() int { return len(o) }
|
|
|
|
// Swap implements the Swap method of sort.Interface
|
|
func (o OrderedSchedule) Swap(i, j int) { o[i], o[j] = o[j], o[i] }
|
|
|
|
// Less implements the Less method of sort.Interface
|
|
func (o OrderedSchedule) Less(i, j int) bool { return o[i].Epoch < o[j].Epoch }
|
|
|
|
// VersionForEpoch finds the Version with the highest epoch <= the given epoch
|
|
func (o OrderedSchedule) VersionForEpoch(epoch types.Epoch) ([fieldparams.VersionLength]byte, error) {
|
|
for i := len(o) - 1; i >= 0; i-- {
|
|
if o[i].Epoch <= epoch {
|
|
return o[i].Version, nil
|
|
}
|
|
}
|
|
return [fieldparams.VersionLength]byte{}, errors.Wrapf(ErrVersionNotFound, "no epoch in list <= %d", epoch)
|
|
}
|
|
|
|
// Converts the ForkVersionSchedule map into a list of Version+Epoch values, ordered by Epoch from lowest to highest.
|
|
// See docs for OrderedSchedule for more detail on what you can do with this type.
|
|
func NewOrderedSchedule(b *params.BeaconChainConfig) OrderedSchedule {
|
|
ofs := make(OrderedSchedule, 0)
|
|
for version, epoch := range b.ForkVersionSchedule {
|
|
fse := ForkScheduleEntry{
|
|
Version: version,
|
|
Epoch: epoch,
|
|
}
|
|
ofs = append(ofs, fse)
|
|
}
|
|
sort.Sort(ofs)
|
|
return ofs
|
|
}
|