mirror of
https://github.com/OffchainLabs/prysm.git
synced 2026-01-06 22:23:56 -05:00
* Ran gopls modernize to fix everything go run golang.org/x/tools/gopls/internal/analysis/modernize/cmd/modernize@latest -fix -test ./... * Override rules_go provided dependency for golang.org/x/tools to v0.38.0. To update this, checked out rules_go, then ran `bazel run //go/tools/releaser -- upgrade-dep -mirror=false org_golang_x_tools` and copied the patches. * Fix buildtag violations and ignore buildtag violations in external * Introduce modernize analyzer package. * Add modernize "any" analyzer. * Fix violations of any analyzer * Add modernize "appendclipped" analyzer. * Fix violations of appendclipped * Add modernize "bloop" analyzer. * Add modernize "fmtappendf" analyzer. * Add modernize "forvar" analyzer. * Add modernize "mapsloop" analyzer. * Add modernize "minmax" analyzer. * Fix violations of minmax analyzer * Add modernize "omitzero" analyzer. * Add modernize "rangeint" analyzer. * Fix violations of rangeint. * Add modernize "reflecttypefor" analyzer. * Fix violations of reflecttypefor analyzer. * Add modernize "slicescontains" analyzer. * Add modernize "slicessort" analyzer. * Add modernize "slicesdelete" analyzer. This is disabled by default for now. See https://go.dev/issue/73686. * Add modernize "stringscutprefix" analyzer. * Add modernize "stringsbuilder" analyzer. * Fix violations of stringsbuilder analyzer. * Add modernize "stringsseq" analyzer. * Add modernize "testingcontext" analyzer. * Add modernize "waitgroup" analyzer. * Changelog fragment * gofmt * gazelle * Add modernize "newexpr" analyzer. * Disable newexpr until go1.26 * Add more details in WORKSPACE on how to update the override * @nalepae feedback on min() * gofmt * Fix violations of forvar
488 lines
17 KiB
Go
488 lines
17 KiB
Go
package helpers_test
|
|
|
|
import (
|
|
"math/rand"
|
|
"strconv"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/OffchainLabs/prysm/v7/beacon-chain/cache"
|
|
"github.com/OffchainLabs/prysm/v7/beacon-chain/core/helpers"
|
|
state_native "github.com/OffchainLabs/prysm/v7/beacon-chain/state/state-native"
|
|
"github.com/OffchainLabs/prysm/v7/config/params"
|
|
"github.com/OffchainLabs/prysm/v7/consensus-types/primitives"
|
|
"github.com/OffchainLabs/prysm/v7/encoding/bytesutil"
|
|
ethpb "github.com/OffchainLabs/prysm/v7/proto/prysm/v1alpha1"
|
|
"github.com/OffchainLabs/prysm/v7/testing/assert"
|
|
"github.com/OffchainLabs/prysm/v7/testing/require"
|
|
)
|
|
|
|
func TestCurrentPeriodPositions(t *testing.T) {
|
|
helpers.ClearCache()
|
|
|
|
validators := make([]*ethpb.Validator, params.BeaconConfig().SyncCommitteeSize)
|
|
syncCommittee := ðpb.SyncCommittee{
|
|
Pubkeys: make([][]byte, params.BeaconConfig().SyncCommitteeSize),
|
|
}
|
|
for i := range validators {
|
|
k := make([]byte, 48)
|
|
copy(k, strconv.Itoa(i))
|
|
validators[i] = ðpb.Validator{
|
|
PublicKey: k,
|
|
}
|
|
syncCommittee.Pubkeys[i] = bytesutil.PadTo(k, 48)
|
|
}
|
|
state, err := state_native.InitializeFromProtoAltair(ðpb.BeaconStateAltair{
|
|
Validators: validators,
|
|
})
|
|
require.NoError(t, err)
|
|
require.NoError(t, state.SetCurrentSyncCommittee(syncCommittee))
|
|
require.NoError(t, state.SetNextSyncCommittee(syncCommittee))
|
|
require.NoError(t, err, helpers.SyncCommitteeCache().UpdatePositionsInCommittee([32]byte{}, state))
|
|
|
|
positions, err := helpers.CurrentPeriodPositions(state, []primitives.ValidatorIndex{0, 1})
|
|
require.NoError(t, err)
|
|
require.Equal(t, 2, len(positions))
|
|
require.Equal(t, 1, len(positions[0]))
|
|
assert.Equal(t, primitives.CommitteeIndex(0), positions[0][0])
|
|
require.Equal(t, 1, len(positions[1]))
|
|
assert.Equal(t, primitives.CommitteeIndex(1), positions[1][0])
|
|
}
|
|
|
|
func TestIsCurrentEpochSyncCommittee_UsingCache(t *testing.T) {
|
|
helpers.ClearCache()
|
|
|
|
validators := make([]*ethpb.Validator, params.BeaconConfig().SyncCommitteeSize)
|
|
syncCommittee := ðpb.SyncCommittee{
|
|
AggregatePubkey: bytesutil.PadTo([]byte{}, params.BeaconConfig().BLSPubkeyLength),
|
|
}
|
|
for i := range validators {
|
|
k := make([]byte, 48)
|
|
copy(k, strconv.Itoa(i))
|
|
validators[i] = ðpb.Validator{
|
|
PublicKey: k,
|
|
}
|
|
syncCommittee.Pubkeys = append(syncCommittee.Pubkeys, bytesutil.PadTo(k, 48))
|
|
}
|
|
|
|
state, err := state_native.InitializeFromProtoAltair(ðpb.BeaconStateAltair{
|
|
Validators: validators,
|
|
})
|
|
require.NoError(t, err)
|
|
require.NoError(t, state.SetCurrentSyncCommittee(syncCommittee))
|
|
require.NoError(t, state.SetNextSyncCommittee(syncCommittee))
|
|
|
|
r := [32]byte{'a'}
|
|
require.NoError(t, err, helpers.SyncCommitteeCache().UpdatePositionsInCommittee(r, state))
|
|
|
|
ok, err := helpers.IsCurrentPeriodSyncCommittee(state, 0)
|
|
require.NoError(t, err)
|
|
require.Equal(t, true, ok)
|
|
}
|
|
|
|
func TestIsCurrentEpochSyncCommittee_UsingCommittee(t *testing.T) {
|
|
helpers.ClearCache()
|
|
|
|
validators := make([]*ethpb.Validator, params.BeaconConfig().SyncCommitteeSize)
|
|
syncCommittee := ðpb.SyncCommittee{
|
|
AggregatePubkey: bytesutil.PadTo([]byte{}, params.BeaconConfig().BLSPubkeyLength),
|
|
}
|
|
for i := range validators {
|
|
k := make([]byte, 48)
|
|
copy(k, strconv.Itoa(i))
|
|
validators[i] = ðpb.Validator{
|
|
PublicKey: k,
|
|
}
|
|
syncCommittee.Pubkeys = append(syncCommittee.Pubkeys, bytesutil.PadTo(k, 48))
|
|
}
|
|
|
|
state, err := state_native.InitializeFromProtoAltair(ðpb.BeaconStateAltair{
|
|
Validators: validators,
|
|
})
|
|
require.NoError(t, err)
|
|
require.NoError(t, state.SetCurrentSyncCommittee(syncCommittee))
|
|
require.NoError(t, state.SetNextSyncCommittee(syncCommittee))
|
|
|
|
ok, err := helpers.IsCurrentPeriodSyncCommittee(state, 0)
|
|
require.NoError(t, err)
|
|
require.Equal(t, true, ok)
|
|
}
|
|
|
|
func TestIsCurrentEpochSyncCommittee_DoesNotExist(t *testing.T) {
|
|
helpers.ClearCache()
|
|
params.SetupTestConfigCleanup(t)
|
|
|
|
validators := make([]*ethpb.Validator, params.BeaconConfig().SyncCommitteeSize)
|
|
syncCommittee := ðpb.SyncCommittee{
|
|
AggregatePubkey: bytesutil.PadTo([]byte{}, params.BeaconConfig().BLSPubkeyLength),
|
|
}
|
|
for i := range validators {
|
|
k := make([]byte, 48)
|
|
copy(k, strconv.Itoa(i))
|
|
validators[i] = ðpb.Validator{
|
|
PublicKey: k,
|
|
}
|
|
syncCommittee.Pubkeys = append(syncCommittee.Pubkeys, bytesutil.PadTo(k, 48))
|
|
}
|
|
|
|
state, err := state_native.InitializeFromProtoAltair(ðpb.BeaconStateAltair{
|
|
Validators: validators,
|
|
})
|
|
require.NoError(t, err)
|
|
require.NoError(t, state.SetCurrentSyncCommittee(syncCommittee))
|
|
require.NoError(t, state.SetNextSyncCommittee(syncCommittee))
|
|
|
|
ok, err := helpers.IsCurrentPeriodSyncCommittee(state, 12390192)
|
|
require.ErrorContains(t, "index 12390192 out of bounds", err)
|
|
require.Equal(t, false, ok)
|
|
}
|
|
|
|
func TestIsNextEpochSyncCommittee_UsingCache(t *testing.T) {
|
|
helpers.ClearCache()
|
|
|
|
validators := make([]*ethpb.Validator, params.BeaconConfig().SyncCommitteeSize)
|
|
syncCommittee := ðpb.SyncCommittee{
|
|
AggregatePubkey: bytesutil.PadTo([]byte{}, params.BeaconConfig().BLSPubkeyLength),
|
|
}
|
|
for i := range validators {
|
|
k := make([]byte, 48)
|
|
copy(k, strconv.Itoa(i))
|
|
validators[i] = ðpb.Validator{
|
|
PublicKey: k,
|
|
}
|
|
syncCommittee.Pubkeys = append(syncCommittee.Pubkeys, bytesutil.PadTo(k, 48))
|
|
}
|
|
|
|
state, err := state_native.InitializeFromProtoAltair(ðpb.BeaconStateAltair{
|
|
Validators: validators,
|
|
})
|
|
require.NoError(t, err)
|
|
require.NoError(t, state.SetCurrentSyncCommittee(syncCommittee))
|
|
require.NoError(t, state.SetNextSyncCommittee(syncCommittee))
|
|
|
|
r := [32]byte{'a'}
|
|
require.NoError(t, err, helpers.SyncCommitteeCache().UpdatePositionsInCommittee(r, state))
|
|
|
|
ok, err := helpers.IsNextPeriodSyncCommittee(state, 0)
|
|
require.NoError(t, err)
|
|
require.Equal(t, true, ok)
|
|
}
|
|
|
|
func TestIsNextEpochSyncCommittee_UsingCommittee(t *testing.T) {
|
|
helpers.ClearCache()
|
|
|
|
validators := make([]*ethpb.Validator, params.BeaconConfig().SyncCommitteeSize)
|
|
syncCommittee := ðpb.SyncCommittee{
|
|
AggregatePubkey: bytesutil.PadTo([]byte{}, params.BeaconConfig().BLSPubkeyLength),
|
|
}
|
|
for i := range validators {
|
|
k := make([]byte, 48)
|
|
copy(k, strconv.Itoa(i))
|
|
validators[i] = ðpb.Validator{
|
|
PublicKey: k,
|
|
}
|
|
syncCommittee.Pubkeys = append(syncCommittee.Pubkeys, bytesutil.PadTo(k, 48))
|
|
}
|
|
|
|
state, err := state_native.InitializeFromProtoAltair(ðpb.BeaconStateAltair{
|
|
Validators: validators,
|
|
})
|
|
require.NoError(t, err)
|
|
require.NoError(t, state.SetCurrentSyncCommittee(syncCommittee))
|
|
require.NoError(t, state.SetNextSyncCommittee(syncCommittee))
|
|
|
|
ok, err := helpers.IsNextPeriodSyncCommittee(state, 0)
|
|
require.NoError(t, err)
|
|
require.Equal(t, true, ok)
|
|
}
|
|
|
|
func TestIsNextEpochSyncCommittee_DoesNotExist(t *testing.T) {
|
|
helpers.ClearCache()
|
|
|
|
validators := make([]*ethpb.Validator, params.BeaconConfig().SyncCommitteeSize)
|
|
syncCommittee := ðpb.SyncCommittee{
|
|
AggregatePubkey: bytesutil.PadTo([]byte{}, params.BeaconConfig().BLSPubkeyLength),
|
|
}
|
|
for i := range validators {
|
|
k := make([]byte, 48)
|
|
copy(k, strconv.Itoa(i))
|
|
validators[i] = ðpb.Validator{
|
|
PublicKey: k,
|
|
}
|
|
syncCommittee.Pubkeys = append(syncCommittee.Pubkeys, bytesutil.PadTo(k, 48))
|
|
}
|
|
|
|
state, err := state_native.InitializeFromProtoAltair(ðpb.BeaconStateAltair{
|
|
Validators: validators,
|
|
})
|
|
require.NoError(t, err)
|
|
require.NoError(t, state.SetCurrentSyncCommittee(syncCommittee))
|
|
require.NoError(t, state.SetNextSyncCommittee(syncCommittee))
|
|
|
|
ok, err := helpers.IsNextPeriodSyncCommittee(state, 120391029)
|
|
require.ErrorContains(t, "index 120391029 out of bounds", err)
|
|
require.Equal(t, false, ok)
|
|
}
|
|
|
|
func TestCurrentEpochSyncSubcommitteeIndices_UsingCache(t *testing.T) {
|
|
helpers.ClearCache()
|
|
|
|
validators := make([]*ethpb.Validator, params.BeaconConfig().SyncCommitteeSize)
|
|
syncCommittee := ðpb.SyncCommittee{
|
|
AggregatePubkey: bytesutil.PadTo([]byte{}, params.BeaconConfig().BLSPubkeyLength),
|
|
}
|
|
for i := range validators {
|
|
k := make([]byte, 48)
|
|
copy(k, strconv.Itoa(i))
|
|
validators[i] = ðpb.Validator{
|
|
PublicKey: k,
|
|
}
|
|
syncCommittee.Pubkeys = append(syncCommittee.Pubkeys, bytesutil.PadTo(k, 48))
|
|
}
|
|
|
|
state, err := state_native.InitializeFromProtoAltair(ðpb.BeaconStateAltair{
|
|
Validators: validators,
|
|
})
|
|
require.NoError(t, err)
|
|
require.NoError(t, state.SetCurrentSyncCommittee(syncCommittee))
|
|
require.NoError(t, state.SetNextSyncCommittee(syncCommittee))
|
|
|
|
r := [32]byte{'a'}
|
|
require.NoError(t, err, helpers.SyncCommitteeCache().UpdatePositionsInCommittee(r, state))
|
|
|
|
index, err := helpers.CurrentPeriodSyncSubcommitteeIndices(state, 0)
|
|
require.NoError(t, err)
|
|
require.DeepEqual(t, []primitives.CommitteeIndex{0}, index)
|
|
}
|
|
|
|
func TestCurrentEpochSyncSubcommitteeIndices_UsingCommittee(t *testing.T) {
|
|
helpers.ClearCache()
|
|
|
|
validators := make([]*ethpb.Validator, params.BeaconConfig().SyncCommitteeSize)
|
|
syncCommittee := ðpb.SyncCommittee{
|
|
AggregatePubkey: bytesutil.PadTo([]byte{}, params.BeaconConfig().BLSPubkeyLength),
|
|
}
|
|
for i := range validators {
|
|
k := make([]byte, 48)
|
|
copy(k, strconv.Itoa(i))
|
|
validators[i] = ðpb.Validator{
|
|
PublicKey: k,
|
|
}
|
|
syncCommittee.Pubkeys = append(syncCommittee.Pubkeys, bytesutil.PadTo(k, 48))
|
|
}
|
|
|
|
state, err := state_native.InitializeFromProtoAltair(ðpb.BeaconStateAltair{
|
|
Validators: validators,
|
|
})
|
|
require.NoError(t, err)
|
|
require.NoError(t, state.SetCurrentSyncCommittee(syncCommittee))
|
|
require.NoError(t, state.SetNextSyncCommittee(syncCommittee))
|
|
root, err := helpers.SyncPeriodBoundaryRoot(state)
|
|
require.NoError(t, err)
|
|
|
|
// Test that cache was empty.
|
|
_, err = helpers.SyncCommitteeCache().CurrentPeriodIndexPosition(root, 0)
|
|
require.Equal(t, cache.ErrNonExistingSyncCommitteeKey, err)
|
|
|
|
// Test that helper can retrieve the index given empty cache.
|
|
index, err := helpers.CurrentPeriodSyncSubcommitteeIndices(state, 0)
|
|
require.NoError(t, err)
|
|
require.DeepEqual(t, []primitives.CommitteeIndex{0}, index)
|
|
|
|
// Test that cache was able to fill on miss.
|
|
time.Sleep(100 * time.Millisecond)
|
|
index, err = helpers.SyncCommitteeCache().CurrentPeriodIndexPosition(root, 0)
|
|
require.NoError(t, err)
|
|
require.DeepEqual(t, []primitives.CommitteeIndex{0}, index)
|
|
}
|
|
|
|
func TestCurrentEpochSyncSubcommitteeIndices_DoesNotExist(t *testing.T) {
|
|
params.SetupTestConfigCleanup(t)
|
|
helpers.ClearCache()
|
|
|
|
validators := make([]*ethpb.Validator, params.BeaconConfig().SyncCommitteeSize)
|
|
syncCommittee := ðpb.SyncCommittee{
|
|
AggregatePubkey: bytesutil.PadTo([]byte{}, params.BeaconConfig().BLSPubkeyLength),
|
|
}
|
|
for i := range validators {
|
|
k := make([]byte, 48)
|
|
copy(k, strconv.Itoa(i))
|
|
validators[i] = ðpb.Validator{
|
|
PublicKey: k,
|
|
}
|
|
syncCommittee.Pubkeys = append(syncCommittee.Pubkeys, bytesutil.PadTo(k, 48))
|
|
}
|
|
|
|
state, err := state_native.InitializeFromProtoAltair(ðpb.BeaconStateAltair{
|
|
Validators: validators,
|
|
})
|
|
require.NoError(t, err)
|
|
require.NoError(t, state.SetCurrentSyncCommittee(syncCommittee))
|
|
require.NoError(t, state.SetNextSyncCommittee(syncCommittee))
|
|
|
|
index, err := helpers.CurrentPeriodSyncSubcommitteeIndices(state, 129301923)
|
|
require.ErrorContains(t, "index 129301923 out of bounds", err)
|
|
require.DeepEqual(t, []primitives.CommitteeIndex(nil), index)
|
|
}
|
|
|
|
func TestNextEpochSyncSubcommitteeIndices_UsingCache(t *testing.T) {
|
|
helpers.ClearCache()
|
|
|
|
validators := make([]*ethpb.Validator, params.BeaconConfig().SyncCommitteeSize)
|
|
syncCommittee := ðpb.SyncCommittee{
|
|
AggregatePubkey: bytesutil.PadTo([]byte{}, params.BeaconConfig().BLSPubkeyLength),
|
|
}
|
|
for i := range validators {
|
|
k := make([]byte, 48)
|
|
copy(k, strconv.Itoa(i))
|
|
validators[i] = ðpb.Validator{
|
|
PublicKey: k,
|
|
}
|
|
syncCommittee.Pubkeys = append(syncCommittee.Pubkeys, bytesutil.PadTo(k, 48))
|
|
}
|
|
|
|
state, err := state_native.InitializeFromProtoAltair(ðpb.BeaconStateAltair{
|
|
Validators: validators,
|
|
})
|
|
require.NoError(t, err)
|
|
require.NoError(t, state.SetCurrentSyncCommittee(syncCommittee))
|
|
require.NoError(t, state.SetNextSyncCommittee(syncCommittee))
|
|
|
|
r := [32]byte{'a'}
|
|
require.NoError(t, err, helpers.SyncCommitteeCache().UpdatePositionsInCommittee(r, state))
|
|
|
|
index, err := helpers.NextPeriodSyncSubcommitteeIndices(state, 0)
|
|
require.NoError(t, err)
|
|
require.DeepEqual(t, []primitives.CommitteeIndex{0}, index)
|
|
}
|
|
|
|
func TestNextEpochSyncSubcommitteeIndices_UsingCommittee(t *testing.T) {
|
|
helpers.ClearCache()
|
|
|
|
validators := make([]*ethpb.Validator, params.BeaconConfig().SyncCommitteeSize)
|
|
syncCommittee := ðpb.SyncCommittee{
|
|
AggregatePubkey: bytesutil.PadTo([]byte{}, params.BeaconConfig().BLSPubkeyLength),
|
|
}
|
|
for i := range validators {
|
|
k := make([]byte, 48)
|
|
copy(k, strconv.Itoa(i))
|
|
validators[i] = ðpb.Validator{
|
|
PublicKey: k,
|
|
}
|
|
syncCommittee.Pubkeys = append(syncCommittee.Pubkeys, bytesutil.PadTo(k, 48))
|
|
}
|
|
|
|
state, err := state_native.InitializeFromProtoAltair(ðpb.BeaconStateAltair{
|
|
Validators: validators,
|
|
})
|
|
require.NoError(t, err)
|
|
require.NoError(t, state.SetCurrentSyncCommittee(syncCommittee))
|
|
require.NoError(t, state.SetNextSyncCommittee(syncCommittee))
|
|
|
|
index, err := helpers.NextPeriodSyncSubcommitteeIndices(state, 0)
|
|
require.NoError(t, err)
|
|
require.DeepEqual(t, []primitives.CommitteeIndex{0}, index)
|
|
}
|
|
|
|
func TestNextEpochSyncSubcommitteeIndices_DoesNotExist(t *testing.T) {
|
|
helpers.ClearCache()
|
|
|
|
validators := make([]*ethpb.Validator, params.BeaconConfig().SyncCommitteeSize)
|
|
syncCommittee := ðpb.SyncCommittee{
|
|
AggregatePubkey: bytesutil.PadTo([]byte{}, params.BeaconConfig().BLSPubkeyLength),
|
|
}
|
|
for i := range validators {
|
|
k := make([]byte, 48)
|
|
copy(k, strconv.Itoa(i))
|
|
validators[i] = ðpb.Validator{
|
|
PublicKey: k,
|
|
}
|
|
syncCommittee.Pubkeys = append(syncCommittee.Pubkeys, bytesutil.PadTo(k, 48))
|
|
}
|
|
|
|
state, err := state_native.InitializeFromProtoAltair(ðpb.BeaconStateAltair{
|
|
Validators: validators,
|
|
})
|
|
require.NoError(t, err)
|
|
require.NoError(t, state.SetCurrentSyncCommittee(syncCommittee))
|
|
require.NoError(t, state.SetNextSyncCommittee(syncCommittee))
|
|
|
|
index, err := helpers.NextPeriodSyncSubcommitteeIndices(state, 21093019)
|
|
require.ErrorContains(t, "index 21093019 out of bounds", err)
|
|
require.DeepEqual(t, []primitives.CommitteeIndex(nil), index)
|
|
}
|
|
|
|
func TestUpdateSyncCommitteeCache_BadSlot(t *testing.T) {
|
|
helpers.ClearCache()
|
|
|
|
state, err := state_native.InitializeFromProtoPhase0(ðpb.BeaconState{
|
|
Slot: 1,
|
|
})
|
|
require.NoError(t, err)
|
|
err = helpers.UpdateSyncCommitteeCache(state)
|
|
require.ErrorContains(t, "not at the end of the epoch to update cache", err)
|
|
|
|
state, err = state_native.InitializeFromProtoPhase0(ðpb.BeaconState{
|
|
Slot: params.BeaconConfig().SlotsPerEpoch - 1,
|
|
})
|
|
require.NoError(t, err)
|
|
err = helpers.UpdateSyncCommitteeCache(state)
|
|
require.ErrorContains(t, "not at sync committee period boundary to update cache", err)
|
|
}
|
|
|
|
func TestUpdateSyncCommitteeCache_BadRoot(t *testing.T) {
|
|
helpers.ClearCache()
|
|
|
|
state, err := state_native.InitializeFromProtoPhase0(ðpb.BeaconState{
|
|
Slot: primitives.Slot(params.BeaconConfig().EpochsPerSyncCommitteePeriod)*params.BeaconConfig().SlotsPerEpoch - 1,
|
|
LatestBlockHeader: ðpb.BeaconBlockHeader{StateRoot: params.BeaconConfig().ZeroHash[:]},
|
|
})
|
|
require.NoError(t, err)
|
|
err = helpers.UpdateSyncCommitteeCache(state)
|
|
require.ErrorContains(t, "zero hash state root can't be used to update cache", err)
|
|
}
|
|
|
|
func TestIsCurrentEpochSyncCommittee_SameBlockRoot(t *testing.T) {
|
|
helpers.ClearCache()
|
|
|
|
validators := make([]*ethpb.Validator, params.BeaconConfig().SyncCommitteeSize)
|
|
syncCommittee := ðpb.SyncCommittee{
|
|
AggregatePubkey: bytesutil.PadTo([]byte{}, params.BeaconConfig().BLSPubkeyLength),
|
|
}
|
|
for i := range validators {
|
|
k := make([]byte, 48)
|
|
copy(k, strconv.Itoa(i))
|
|
validators[i] = ðpb.Validator{
|
|
PublicKey: k,
|
|
}
|
|
syncCommittee.Pubkeys = append(syncCommittee.Pubkeys, bytesutil.PadTo(k, 48))
|
|
}
|
|
|
|
blockRoots := make([][]byte, params.BeaconConfig().SlotsPerHistoricalRoot)
|
|
for i := range blockRoots {
|
|
blockRoots[i] = make([]byte, 32)
|
|
}
|
|
state, err := state_native.InitializeFromProtoAltair(ðpb.BeaconStateAltair{
|
|
Validators: validators,
|
|
BlockRoots: blockRoots,
|
|
})
|
|
require.NoError(t, err)
|
|
require.NoError(t, state.SetCurrentSyncCommittee(syncCommittee))
|
|
require.NoError(t, state.SetNextSyncCommittee(syncCommittee))
|
|
|
|
comIdxs, err := helpers.CurrentPeriodSyncSubcommitteeIndices(state, 200)
|
|
require.NoError(t, err)
|
|
|
|
wantedSlot := params.BeaconConfig().EpochsPerSyncCommitteePeriod.Mul(uint64(params.BeaconConfig().SlotsPerEpoch))
|
|
assert.NoError(t, state.SetSlot(primitives.Slot(wantedSlot)))
|
|
syncCommittee, err = state.CurrentSyncCommittee()
|
|
assert.NoError(t, err)
|
|
rand.Shuffle(len(syncCommittee.Pubkeys), func(i, j int) {
|
|
syncCommittee.Pubkeys[i], syncCommittee.Pubkeys[j] = syncCommittee.Pubkeys[j], syncCommittee.Pubkeys[i]
|
|
})
|
|
require.NoError(t, state.SetCurrentSyncCommittee(syncCommittee))
|
|
newIdxs, err := helpers.CurrentPeriodSyncSubcommitteeIndices(state, 200)
|
|
require.NoError(t, err)
|
|
require.DeepNotEqual(t, comIdxs, newIdxs)
|
|
}
|