Skip to content

Commit 59c068b

Browse files
committed
gate unreleased forks
1 parent bc0868e commit 59c068b

File tree

7 files changed

+135
-14
lines changed

7 files changed

+135
-14
lines changed

beacon-chain/blockchain/process_block_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2804,7 +2804,7 @@ func TestProcessLightClientUpdate(t *testing.T) {
28042804
require.NoError(t, s.cfg.BeaconDB.SaveState(ctx, headState, [32]byte{1, 2}))
28052805
require.NoError(t, s.cfg.BeaconDB.SaveHeadBlockRoot(ctx, [32]byte{1, 2}))
28062806

2807-
for _, testVersion := range version.All()[1:] {
2807+
for _, testVersion := range version.Released()[1:] {
28082808
t.Run(version.String(testVersion), func(t *testing.T) {
28092809
l := util.NewTestLightClient(t, testVersion)
28102810

beacon-chain/core/validators/slashing_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import (
88
)
99

1010
func TestSlashingParamsPerVersion_NoErrors(t *testing.T) {
11-
for _, v := range version.All() {
11+
for _, v := range version.Released() {
1212
_, _, _, err := validators.SlashingParamsPerVersion(v)
1313
if err != nil {
1414
// If this test is failing, you need to add a case for the version in slashingParamsPerVersion.

beacon-chain/db/kv/lightclient_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ func TestStore_LightClientUpdate_CanSaveRetrieve(t *testing.T) {
215215

216216
db := setupDB(t)
217217
ctx := t.Context()
218-
for _, testVersion := range version.All()[1:] {
218+
for _, testVersion := range version.Released()[1:] {
219219
t.Run(version.String(testVersion), func(t *testing.T) {
220220
update, err := createUpdate(t, testVersion)
221221
require.NoError(t, err)
@@ -571,7 +571,7 @@ func TestStore_LightClientBootstrap_CanSaveRetrieve(t *testing.T) {
571571
require.NoError(t, err)
572572
require.IsNil(t, retrievedBootstrap)
573573
})
574-
for _, testVersion := range version.All()[1:] {
574+
for _, testVersion := range version.Released()[1:] {
575575
t.Run(version.String(testVersion), func(t *testing.T) {
576576
bootstrap, err := createDefaultLightClientBootstrap(primitives.Slot(uint64(params.BeaconConfig().VersionToForkEpochMap()[testVersion]) * uint64(params.BeaconConfig().SlotsPerEpoch)))
577577
require.NoError(t, err)

beacon-chain/light-client/lightclient_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ func TestLightClient_NewLightClientOptimisticUpdateFromBeaconState(t *testing.T)
3232
cfg.FuluForkEpoch = 6
3333
params.OverrideBeaconConfig(cfg)
3434

35-
for _, testVersion := range version.All()[1:] {
35+
for _, testVersion := range version.Released()[1:] {
3636
t.Run(version.String(testVersion), func(t *testing.T) {
3737
l := util.NewTestLightClient(t, testVersion)
3838

beacon-chain/rpc/eth/light-client/handlers_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ func TestLightClientHandler_GetLightClientBootstrap(t *testing.T) {
4646
cfg.FuluForkEpoch = 5
4747
params.OverrideBeaconConfig(cfg)
4848

49-
for _, testVersion := range version.All()[1:] {
49+
for _, testVersion := range version.Released()[1:] {
5050
t.Run(version.String(testVersion), func(t *testing.T) {
5151
l := util.NewTestLightClient(t, testVersion)
5252

@@ -177,7 +177,7 @@ func TestLightClientHandler_GetLightClientByRange(t *testing.T) {
177177
params.OverrideBeaconConfig(config)
178178

179179
t.Run("can save retrieve", func(t *testing.T) {
180-
for _, testVersion := range version.All()[1:] {
180+
for _, testVersion := range version.Released()[1:] {
181181
t.Run(version.String(testVersion), func(t *testing.T) {
182182

183183
slot := primitives.Slot(params.BeaconConfig().VersionToForkEpochMap()[testVersion] * primitives.Epoch(config.SlotsPerEpoch)).Add(1)
@@ -731,7 +731,7 @@ func TestLightClientHandler_GetLightClientFinalityUpdate(t *testing.T) {
731731
require.Equal(t, http.StatusNotFound, writer.Code)
732732
})
733733

734-
for _, testVersion := range version.All()[1:] {
734+
for _, testVersion := range version.Released()[1:] {
735735
t.Run(version.String(testVersion), func(t *testing.T) {
736736
ctx := t.Context()
737737

@@ -826,7 +826,7 @@ func TestLightClientHandler_GetLightClientOptimisticUpdate(t *testing.T) {
826826
require.Equal(t, http.StatusNotFound, writer.Code)
827827
})
828828

829-
for _, testVersion := range version.All()[1:] {
829+
for _, testVersion := range version.Released()[1:] {
830830
t.Run(version.String(testVersion), func(t *testing.T) {
831831
ctx := t.Context()
832832
l := util.NewTestLightClient(t, testVersion)

runtime/version/fork.go

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,19 @@ var versionToString = map[int]string{
2525
Deneb: "deneb",
2626
Electra: "electra",
2727
Fulu: "fulu",
28+
Gloas: "gloas",
2829
}
2930

3031
// stringToVersion and allVersions are populated in init()
3132
var stringToVersion = map[string]int{}
3233
var allVersions []int
34+
var releasedVersions []int
35+
36+
// featureGatedVersions contains fork versions that exist in the enums but are not yet
37+
// enabled on any supported network. These versions are removed from Released().
38+
var featureGatedVersions = []int{Gloas}
39+
40+
var featureGatedVersionSet = map[int]struct{}{}
3341

3442
// ErrUnrecognizedVersionName means a string does not match the list of canonical version names.
3543
var ErrUnrecognizedVersionName = errors.New("version name doesn't map to a known value in the enum")
@@ -58,6 +66,22 @@ func All() []int {
5866
return allVersions
5967
}
6068

69+
// Released returns the list of fork versions that are not feature gated.
70+
func Released() []int {
71+
return releasedVersions
72+
}
73+
74+
// FeatureGated returns fork versions that exist in the enum but are not yet enabled.
75+
func FeatureGated() []int {
76+
return featureGatedVersions
77+
}
78+
79+
// IsFeatureGated reports whether the provided version is currently gate-kept.
80+
func IsFeatureGated(version int) bool {
81+
_, ok := featureGatedVersionSet[version]
82+
return ok
83+
}
84+
6185
func init() {
6286
allVersions = make([]int, len(versionToString))
6387
i := 0
@@ -67,4 +91,18 @@ func init() {
6791
i++
6892
}
6993
sort.Ints(allVersions)
94+
95+
featureGatedVersionSet = make(map[int]struct{}, len(featureGatedVersions))
96+
for _, v := range featureGatedVersions {
97+
featureGatedVersionSet[v] = struct{}{}
98+
}
99+
sort.Ints(featureGatedVersions)
100+
101+
releasedVersions = make([]int, 0, len(allVersions))
102+
for _, v := range allVersions {
103+
if _, skip := featureGatedVersionSet[v]; skip {
104+
continue
105+
}
106+
releasedVersions = append(releasedVersions, v)
107+
}
70108
}

runtime/version/fork_test.go

Lines changed: 88 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
1-
package version
1+
package version_test
22

33
import (
44
"slices"
55
"sort"
66
"testing"
77

8+
"github.com/OffchainLabs/prysm/v7/config/params"
9+
"github.com/OffchainLabs/prysm/v7/consensus-types/primitives"
10+
"github.com/OffchainLabs/prysm/v7/runtime/version"
811
"github.com/stretchr/testify/assert"
12+
"github.com/stretchr/testify/require"
913
)
1014

1115
func TestVersionString(t *testing.T) {
@@ -16,26 +20,26 @@ func TestVersionString(t *testing.T) {
1620
}{
1721
{
1822
name: "phase0",
19-
version: Phase0,
23+
version: version.Phase0,
2024
want: "phase0",
2125
},
2226
{
2327
name: "altair",
24-
version: Altair,
28+
version: version.Altair,
2529
want: "altair",
2630
},
2731
}
2832
for _, tt := range tests {
2933
t.Run(tt.name, func(t *testing.T) {
30-
if got := String(tt.version); got != tt.want {
34+
if got := version.String(tt.version); got != tt.want {
3135
t.Errorf("String() = %v, want %v", got, tt.want)
3236
}
3337
})
3438
}
3539
}
3640

3741
func TestVersionSorting(t *testing.T) {
38-
versions := All()
42+
versions := version.All()
3943
expected := slices.Clone(versions)
4044
sort.Ints(expected)
4145
tests := []struct {
@@ -54,3 +58,82 @@ func TestVersionSorting(t *testing.T) {
5458
})
5559
}
5660
}
61+
62+
func TestReleasedExcludesFeatureGated(t *testing.T) {
63+
released := version.Released()
64+
gated := version.FeatureGated()
65+
66+
for _, v := range gated {
67+
assert.NotContains(t, released, v, "released versions should exclude feature gated fork %s", version.String(v))
68+
}
69+
70+
releasedSet := make(map[int]struct{}, len(released))
71+
for _, v := range released {
72+
releasedSet[v] = struct{}{}
73+
}
74+
75+
gatedSet := make(map[int]struct{}, len(gated))
76+
for _, v := range gated {
77+
gatedSet[v] = struct{}{}
78+
}
79+
80+
for _, v := range version.All() {
81+
if _, skip := gatedSet[v]; skip {
82+
continue
83+
}
84+
if _, ok := releasedSet[v]; !ok {
85+
t.Fatalf("version %s missing from released versions", version.String(v))
86+
}
87+
}
88+
}
89+
90+
func TestFeatureGatedVersionsAreNotScheduledOnTestnets(t *testing.T) {
91+
if len(version.FeatureGated()) == 0 {
92+
t.Skip("no feature gated versions defined")
93+
}
94+
95+
testnetConfigs := []*params.BeaconChainConfig{
96+
params.HoleskyConfig(),
97+
params.SepoliaConfig(),
98+
params.HoodiConfig(),
99+
}
100+
101+
for _, v := range version.FeatureGated() {
102+
for _, cfg := range testnetConfigs {
103+
epoch := forkEpochForVersion(cfg, v)
104+
require.Equalf(
105+
t,
106+
cfg.FarFutureEpoch,
107+
epoch,
108+
"feature gated version %s should not be scheduled on %s (epoch=%d)",
109+
version.String(v),
110+
cfg.ConfigName,
111+
epoch,
112+
)
113+
}
114+
}
115+
}
116+
117+
func forkEpochForVersion(cfg *params.BeaconChainConfig, v int) primitives.Epoch {
118+
switch v {
119+
case version.Phase0:
120+
return cfg.GenesisEpoch
121+
case version.Altair:
122+
return cfg.AltairForkEpoch
123+
case version.Bellatrix:
124+
return cfg.BellatrixForkEpoch
125+
case version.Capella:
126+
return cfg.CapellaForkEpoch
127+
case version.Deneb:
128+
return cfg.DenebForkEpoch
129+
case version.Electra:
130+
return cfg.ElectraForkEpoch
131+
case version.Fulu:
132+
return cfg.FuluForkEpoch
133+
default:
134+
if version.IsFeatureGated(v) {
135+
return cfg.FarFutureEpoch
136+
}
137+
panic("forkEpochForVersion missing version " + version.String(v))
138+
}
139+
}

0 commit comments

Comments
 (0)