diff --git a/beacon-chain/rpc/beacon/attestations_test.go b/beacon-chain/rpc/beacon/attestations_test.go index cc1f825984dc..9b5f9aea52ce 100644 --- a/beacon-chain/rpc/beacon/attestations_test.go +++ b/beacon-chain/rpc/beacon/attestations_test.go @@ -612,6 +612,10 @@ func TestServer_ListIndexedAttestations_NewStateManagnmentDisabled(t *testing.T) func TestServer_ListIndexedAttestations_GenesisEpoch(t *testing.T) { params.OverrideBeaconConfig(params.MainnetConfig()) defer params.OverrideBeaconConfig(params.MinimalSpecConfig()) + + featureconfig.Init(&featureconfig.Flags{NewStateMgmt: true}) + defer featureconfig.Init(&featureconfig.Flags{NewStateMgmt: false}) + cfg := assertNewStateMgmtIsEnabled() defer featureconfig.Init(cfg) db := dbTest.SetupDB(t) diff --git a/beacon-chain/rpc/beacon/validators.go b/beacon-chain/rpc/beacon/validators.go index af1549f999ac..6e8eaed6c088 100644 --- a/beacon-chain/rpc/beacon/validators.go +++ b/beacon-chain/rpc/beacon/validators.go @@ -31,6 +31,135 @@ func (bs *Server) ListValidatorBalances( req.PageSize, flags.Get().MaxPageSize) } + if !featureconfig.Get().NewStateMgmt { + return bs.listValidatorsBalancesUsingOldArchival(ctx, req) + } + + currentEpoch := helpers.SlotToEpoch(bs.GenesisTimeFetcher.CurrentSlot()) + requestedEpoch := currentEpoch + switch q := req.QueryFilter.(type) { + case *ethpb.ListValidatorBalancesRequest_Epoch: + requestedEpoch = q.Epoch + case *ethpb.ListValidatorBalancesRequest_Genesis: + requestedEpoch = 0 + default: + requestedEpoch = currentEpoch + } + + if requestedEpoch > currentEpoch { + return nil, status.Errorf( + codes.InvalidArgument, + "Cannot retrieve information about an epoch in the future, current epoch %d, requesting %d", + currentEpoch, + requestedEpoch, + ) + } + res := make([]*ethpb.ValidatorBalances_Balance, 0) + filtered := map[uint64]bool{} // Track filtered validators to prevent duplication in the response. + + requestedState, err := bs.StateGen.StateBySlot(ctx, helpers.StartSlot(requestedEpoch)) + if err != nil { + return nil, status.Errorf(codes.Internal, "Could not get state") + } + + validators := requestedState.Validators() + balances := requestedState.Balances() + balancesCount := len(balances) + for _, pubKey := range req.PublicKeys { + // Skip empty public key. + if len(pubKey) == 0 { + continue + } + pubkeyBytes := bytesutil.ToBytes48(pubKey) + index, ok := requestedState.ValidatorIndexByPubkey(pubkeyBytes) + if !ok { + return nil, status.Errorf(codes.NotFound, "Could not find validator index for public key %#x", pubkeyBytes) + } + + filtered[index] = true + + if int(index) >= len(balances) { + return nil, status.Errorf(codes.OutOfRange, "Validator index %d >= balance list %d", + index, len(balances)) + } + + res = append(res, ðpb.ValidatorBalances_Balance{ + PublicKey: pubKey, + Index: index, + Balance: balances[index], + }) + balancesCount = len(res) + } + + for _, index := range req.Indices { + if int(index) >= len(balances) { + return nil, status.Errorf(codes.OutOfRange, "Validator index %d >= balance list %d", + index, len(balances)) + } + + if !filtered[index] { + res = append(res, ðpb.ValidatorBalances_Balance{ + PublicKey: validators[index].PublicKey, + Index: index, + Balance: balances[index], + }) + } + balancesCount = len(res) + } + // Depending on the indices and public keys given, results might not be sorted. + sort.Slice(res, func(i, j int) bool { + return res[i].Index < res[j].Index + }) + + // If there are no balances, we simply return a response specifying this. + // Otherwise, attempting to paginate 0 balances below would result in an error. + if balancesCount == 0 { + return ðpb.ValidatorBalances{ + Epoch: requestedEpoch, + Balances: make([]*ethpb.ValidatorBalances_Balance, 0), + TotalSize: int32(0), + NextPageToken: strconv.Itoa(0), + }, nil + } + + start, end, nextPageToken, err := pagination.StartAndEndPage(req.PageToken, int(req.PageSize), balancesCount) + if err != nil { + return nil, status.Errorf( + codes.Internal, + "Could not paginate results: %v", + err, + ) + } + + if len(req.Indices) == 0 && len(req.PublicKeys) == 0 { + // Return everything. + for i := start; i < end; i++ { + pubkey := requestedState.PubkeyAtIndex(uint64(i)) + res = append(res, ðpb.ValidatorBalances_Balance{ + PublicKey: pubkey[:], + Index: uint64(i), + Balance: balances[i], + }) + } + return ðpb.ValidatorBalances{ + Epoch: requestedEpoch, + Balances: res, + TotalSize: int32(balancesCount), + NextPageToken: nextPageToken, + }, nil + } + + return ðpb.ValidatorBalances{ + Epoch: requestedEpoch, + Balances: res[start:end], + TotalSize: int32(balancesCount), + NextPageToken: nextPageToken, + }, nil +} + +func (bs *Server) listValidatorsBalancesUsingOldArchival( + ctx context.Context, + req *ethpb.ListValidatorBalancesRequest) (*ethpb.ValidatorBalances, error) { res := make([]*ethpb.ValidatorBalances_Balance, 0) filtered := map[uint64]bool{} // Track filtered validators to prevent duplication in the response. diff --git a/beacon-chain/rpc/beacon/validators_test.go b/beacon-chain/rpc/beacon/validators_test.go index 4ede5e2f555c..c7fa519e4f4f 100644 --- a/beacon-chain/rpc/beacon/validators_test.go +++ b/beacon-chain/rpc/beacon/validators_test.go @@ -71,6 +71,7 @@ func TestServer_ListValidatorBalances_CannotRequestFutureEpoch(t *testing.T) { HeadFetcher: &mock.ChainService{ State: st, }, + GenesisTimeFetcher: &mock.ChainService{}, } wanted := "Cannot retrieve information about an epoch in the future" @@ -78,7 +79,7 @@ func TestServer_ListValidatorBalances_CannotRequestFutureEpoch(t *testing.T) { ctx, ðpb.ListValidatorBalancesRequest{ QueryFilter: ðpb.ListValidatorBalancesRequest_Epoch{ - Epoch: 1, + Epoch: helpers.SlotToEpoch(bs.GenesisTimeFetcher.CurrentSlot()) + 1, }, }, ); err != nil && !strings.Contains(err.Error(), wanted) { @@ -90,17 +91,35 @@ func TestServer_ListValidatorBalances_NoResults(t *testing.T) { db := dbTest.SetupDB(t) defer dbTest.TeardownDB(t, db) + featureconfig.Init(&featureconfig.Flags{NewStateMgmt: true}) + defer featureconfig.Init(&featureconfig.Flags{NewStateMgmt: false}) + ctx := context.Background() st := testutil.NewBeaconState() if err := st.SetSlot(0); err != nil { t.Fatal(err) } bs := &Server{ - BeaconDB: db, - HeadFetcher: &mock.ChainService{ - State: st, - }, + GenesisTimeFetcher: &mock.ChainService{}, + StateGen: stategen.New(db, cache.NewStateSummaryCache()), + } + + headState := testutil.NewBeaconState() + b := ðpb.SignedBeaconBlock{Block: ðpb.BeaconBlock{}} + if err := db.SaveBlock(ctx, b); err != nil { + t.Fatal(err) } + gRoot, err := ssz.HashTreeRoot(b.Block) + if err != nil { + t.Fatal(err) + } + if err := db.SaveGenesisBlockRoot(ctx, gRoot); err != nil { + t.Fatal(err) + } + if err := db.SaveState(ctx, headState, gRoot); err != nil { + t.Fatal(err) + } + wanted := ðpb.ValidatorBalances{ Balances: make([]*ethpb.ValidatorBalances_Balance, 0), TotalSize: int32(0), @@ -153,84 +172,28 @@ func TestServer_ListValidatorBalances_DefaultResponse_NoArchive(t *testing.T) { if err := st.SetBalances(balances); err != nil { t.Fatal(err) } - bs := &Server{ - BeaconDB: db, - HeadFetcher: &mock.ChainService{ - State: st, - }, - } - res, err := bs.ListValidatorBalances( - ctx, - ðpb.ListValidatorBalancesRequest{ - QueryFilter: ðpb.ListValidatorBalancesRequest_Epoch{ - Epoch: 0, - }, - }, - ) - if err != nil { - t.Fatal(err) - } - if !reflect.DeepEqual(balancesResponse, res.Balances) { - t.Errorf("Wanted %v, received %v", balancesResponse, res.Balances) - } -} - -func TestServer_ListValidatorBalances_DefaultResponse_FromArchive(t *testing.T) { - db := dbTest.SetupDB(t) - defer dbTest.TeardownDB(t, db) - - ctx := context.Background() - currentNumValidators := 100 - numOldBalances := 50 - validators := make([]*ethpb.Validator, currentNumValidators) - balances := make([]uint64, currentNumValidators) - oldBalances := make([]uint64, numOldBalances) - balancesResponse := make([]*ethpb.ValidatorBalances_Balance, numOldBalances) - for i := 0; i < currentNumValidators; i++ { - key := make([]byte, 48) - copy(key, strconv.Itoa(i)) - validators[i] = ðpb.Validator{ - PublicKey: key, - WithdrawalCredentials: make([]byte, 32), - } - balances[i] = params.BeaconConfig().MaxEffectiveBalance - } - for i := 0; i < numOldBalances; i++ { - oldBalances[i] = params.BeaconConfig().MaxEffectiveBalance - key := make([]byte, 48) - copy(key, strconv.Itoa(i)) - balancesResponse[i] = ðpb.ValidatorBalances_Balance{ - PublicKey: key, - Index: uint64(i), - Balance: params.BeaconConfig().MaxEffectiveBalance, - } - } - // We archive old balances for epoch 50. - if err := db.SaveArchivedBalances(ctx, 50, oldBalances); err != nil { + b := ðpb.SignedBeaconBlock{Block: ðpb.BeaconBlock{}} + if err := db.SaveBlock(ctx, b); err != nil { t.Fatal(err) } - st := testutil.NewBeaconState() - if err := st.SetSlot(helpers.StartSlot(100) /* epoch 100 */); err != nil { + gRoot, err := ssz.HashTreeRoot(b.Block) + if err != nil { t.Fatal(err) } - if err := st.SetValidators(validators); err != nil { + if err := db.SaveGenesisBlockRoot(ctx, gRoot); err != nil { t.Fatal(err) } - if err := st.SetBalances(balances); err != nil { + if err := db.SaveState(ctx, st, gRoot); err != nil { t.Fatal(err) } bs := &Server{ - BeaconDB: db, - HeadFetcher: &mock.ChainService{ - State: st, - }, + GenesisTimeFetcher: &mock.ChainService{}, + StateGen: stategen.New(db, cache.NewStateSummaryCache()), } res, err := bs.ListValidatorBalances( ctx, ðpb.ListValidatorBalancesRequest{ - QueryFilter: ðpb.ListValidatorBalancesRequest_Epoch{ - Epoch: 50, - }, + QueryFilter: ðpb.ListValidatorBalancesRequest_Epoch{Epoch: 0}, }, ) if err != nil { @@ -244,22 +207,31 @@ func TestServer_ListValidatorBalances_DefaultResponse_FromArchive(t *testing.T) func TestServer_ListValidatorBalances_PaginationOutOfRange(t *testing.T) { db := dbTest.SetupDB(t) defer dbTest.TeardownDB(t, db) - + ctx := context.Background() setupValidators(t, db, 3) - - headState, err := db.HeadState(context.Background()) + st := testutil.NewBeaconState() + b := ðpb.SignedBeaconBlock{Block: ðpb.BeaconBlock{}} + if err := db.SaveBlock(ctx, b); err != nil { + t.Fatal(err) + } + gRoot, err := ssz.HashTreeRoot(b.Block) if err != nil { t.Fatal(err) } + if err := db.SaveGenesisBlockRoot(ctx, gRoot); err != nil { + t.Fatal(err) + } + if err := db.SaveState(ctx, st, gRoot); err != nil { + t.Fatal(err) + } bs := &Server{ - HeadFetcher: &mock.ChainService{ - State: headState, - }, + GenesisTimeFetcher: &mock.ChainService{}, + StateGen: stategen.New(db, cache.NewStateSummaryCache()), } - req := ðpb.ListValidatorBalancesRequest{PageToken: strconv.Itoa(1), PageSize: 100} - wanted := fmt.Sprintf("page start %d >= list %d", req.PageSize, len(headState.Balances())) + req := ðpb.ListValidatorBalancesRequest{PageToken: strconv.Itoa(1), PageSize: 100, QueryFilter: ðpb.ListValidatorBalancesRequest_Epoch{Epoch: 0}} + wanted := fmt.Sprintf("page start %d >= list %d", req.PageSize, len(st.Balances())) if _, err := bs.ListValidatorBalances(context.Background(), req); err != nil && !strings.Contains(err.Error(), wanted) { t.Errorf("Expected error %v, received %v", wanted, err) } @@ -274,7 +246,7 @@ func TestServer_ListValidatorBalances_ExceedsMaxPageSize(t *testing.T) { exceedsMax, flags.Get().MaxPageSize, ) - req := ðpb.ListValidatorBalancesRequest{PageToken: strconv.Itoa(0), PageSize: exceedsMax} + req := ðpb.ListValidatorBalancesRequest{PageSize: exceedsMax} if _, err := bs.ListValidatorBalances(context.Background(), req); err != nil && !strings.Contains(err.Error(), wanted) { t.Errorf("Expected error %v, received %v", wanted, err) } @@ -289,24 +261,37 @@ func pubKey(i uint64) []byte { func TestServer_ListValidatorBalances_Pagination_Default(t *testing.T) { db := dbTest.SetupDB(t) defer dbTest.TeardownDB(t, db) + featureconfig.Init(&featureconfig.Flags{NewStateMgmt: true}) + defer featureconfig.Init(&featureconfig.Flags{NewStateMgmt: false}) + ctx := context.Background() setupValidators(t, db, 100) - headState, err := db.HeadState(context.Background()) if err != nil { t.Fatal(err) } + b := ðpb.SignedBeaconBlock{Block: ðpb.BeaconBlock{}} + gRoot, err := ssz.HashTreeRoot(b.Block) + if err != nil { + t.Fatal(err) + } + if err := db.SaveGenesisBlockRoot(ctx, gRoot); err != nil { + t.Fatal(err) + } + if err := db.SaveState(ctx, headState, gRoot); err != nil { + t.Fatal(err) + } bs := &Server{ - BeaconDB: db, - HeadFetcher: &mock.ChainService{State: headState}, + GenesisTimeFetcher: &mock.ChainService{}, + StateGen: stategen.New(db, cache.NewStateSummaryCache()), } tests := []struct { req *ethpb.ListValidatorBalancesRequest res *ethpb.ValidatorBalances }{ - {req: ðpb.ListValidatorBalancesRequest{PublicKeys: [][]byte{pubKey(99)}}, + {req: ðpb.ListValidatorBalancesRequest{PublicKeys: [][]byte{pubKey(99)}, QueryFilter: ðpb.ListValidatorBalancesRequest_Epoch{Epoch: 0}}, res: ðpb.ValidatorBalances{ Balances: []*ethpb.ValidatorBalances_Balance{ {Index: 99, PublicKey: pubKey(99), Balance: 99}, @@ -315,7 +300,7 @@ func TestServer_ListValidatorBalances_Pagination_Default(t *testing.T) { TotalSize: 1, }, }, - {req: ðpb.ListValidatorBalancesRequest{Indices: []uint64{1, 2, 3}}, + {req: ðpb.ListValidatorBalancesRequest{Indices: []uint64{1, 2, 3}, QueryFilter: ðpb.ListValidatorBalancesRequest_Epoch{Epoch: 0}}, res: ðpb.ValidatorBalances{ Balances: []*ethpb.ValidatorBalances_Balance{ {Index: 1, PublicKey: pubKey(1), Balance: 1}, @@ -326,7 +311,7 @@ func TestServer_ListValidatorBalances_Pagination_Default(t *testing.T) { TotalSize: 3, }, }, - {req: ðpb.ListValidatorBalancesRequest{PublicKeys: [][]byte{pubKey(10), pubKey(11), pubKey(12)}}, + {req: ðpb.ListValidatorBalancesRequest{PublicKeys: [][]byte{pubKey(10), pubKey(11), pubKey(12)}, QueryFilter: ðpb.ListValidatorBalancesRequest_Epoch{Epoch: 0}}, res: ðpb.ValidatorBalances{ Balances: []*ethpb.ValidatorBalances_Balance{ {Index: 10, PublicKey: pubKey(10), Balance: 10}, @@ -336,7 +321,7 @@ func TestServer_ListValidatorBalances_Pagination_Default(t *testing.T) { NextPageToken: "", TotalSize: 3, }}, - {req: ðpb.ListValidatorBalancesRequest{PublicKeys: [][]byte{pubKey(2), pubKey(3)}, Indices: []uint64{3, 4}}, // Duplication + {req: ðpb.ListValidatorBalancesRequest{PublicKeys: [][]byte{pubKey(2), pubKey(3)}, Indices: []uint64{3, 4}, QueryFilter: ðpb.ListValidatorBalancesRequest_Epoch{Epoch: 0}}, // Duplication res: ðpb.ValidatorBalances{ Balances: []*ethpb.ValidatorBalances_Balance{ {Index: 2, PublicKey: pubKey(2), Balance: 2}, @@ -346,7 +331,7 @@ func TestServer_ListValidatorBalances_Pagination_Default(t *testing.T) { NextPageToken: "", TotalSize: 3, }}, - {req: ðpb.ListValidatorBalancesRequest{PublicKeys: [][]byte{{}}, Indices: []uint64{3, 4}}, // Public key has a blank value + {req: ðpb.ListValidatorBalancesRequest{PublicKeys: [][]byte{{}}, Indices: []uint64{3, 4}, QueryFilter: ðpb.ListValidatorBalancesRequest_Epoch{Epoch: 0}}, // Public key has a blank value res: ðpb.ValidatorBalances{ Balances: []*ethpb.ValidatorBalances_Balance{ {Index: 3, PublicKey: pubKey(3), Balance: 3}, @@ -370,26 +355,35 @@ func TestServer_ListValidatorBalances_Pagination_Default(t *testing.T) { func TestServer_ListValidatorBalances_Pagination_CustomPageSizes(t *testing.T) { db := dbTest.SetupDB(t) defer dbTest.TeardownDB(t, db) - + ctx := context.Background() count := 1000 setupValidators(t, db, count) - headState, err := db.HeadState(context.Background()) if err != nil { t.Fatal(err) } + b := ðpb.SignedBeaconBlock{Block: ðpb.BeaconBlock{}} + gRoot, err := ssz.HashTreeRoot(b.Block) + if err != nil { + t.Fatal(err) + } + if err := db.SaveGenesisBlockRoot(ctx, gRoot); err != nil { + t.Fatal(err) + } + if err := db.SaveState(ctx, headState, gRoot); err != nil { + t.Fatal(err) + } bs := &Server{ - HeadFetcher: &mock.ChainService{ - State: headState, - }, + GenesisTimeFetcher: &mock.ChainService{}, + StateGen: stategen.New(db, cache.NewStateSummaryCache()), } tests := []struct { req *ethpb.ListValidatorBalancesRequest res *ethpb.ValidatorBalances }{ - {req: ðpb.ListValidatorBalancesRequest{PageToken: strconv.Itoa(1), PageSize: 3}, + {req: ðpb.ListValidatorBalancesRequest{PageToken: strconv.Itoa(1), PageSize: 3, QueryFilter: ðpb.ListValidatorBalancesRequest_Epoch{Epoch: 0}}, res: ðpb.ValidatorBalances{ Balances: []*ethpb.ValidatorBalances_Balance{ {PublicKey: pubKey(3), Index: 3, Balance: uint64(3)}, @@ -397,7 +391,7 @@ func TestServer_ListValidatorBalances_Pagination_CustomPageSizes(t *testing.T) { {PublicKey: pubKey(5), Index: 5, Balance: uint64(5)}}, NextPageToken: strconv.Itoa(2), TotalSize: int32(count)}}, - {req: ðpb.ListValidatorBalancesRequest{PageToken: strconv.Itoa(10), PageSize: 5}, + {req: ðpb.ListValidatorBalancesRequest{PageToken: strconv.Itoa(10), PageSize: 5, QueryFilter: ðpb.ListValidatorBalancesRequest_Epoch{Epoch: 0}}, res: ðpb.ValidatorBalances{ Balances: []*ethpb.ValidatorBalances_Balance{ {PublicKey: pubKey(50), Index: 50, Balance: uint64(50)}, @@ -407,7 +401,7 @@ func TestServer_ListValidatorBalances_Pagination_CustomPageSizes(t *testing.T) { {PublicKey: pubKey(54), Index: 54, Balance: uint64(54)}}, NextPageToken: strconv.Itoa(11), TotalSize: int32(count)}}, - {req: ðpb.ListValidatorBalancesRequest{PageToken: strconv.Itoa(33), PageSize: 3}, + {req: ðpb.ListValidatorBalancesRequest{PageToken: strconv.Itoa(33), PageSize: 3, QueryFilter: ðpb.ListValidatorBalancesRequest_Epoch{Epoch: 0}}, res: ðpb.ValidatorBalances{ Balances: []*ethpb.ValidatorBalances_Balance{ {PublicKey: pubKey(99), Index: 99, Balance: uint64(99)}, @@ -416,7 +410,7 @@ func TestServer_ListValidatorBalances_Pagination_CustomPageSizes(t *testing.T) { }, NextPageToken: "34", TotalSize: int32(count)}}, - {req: ðpb.ListValidatorBalancesRequest{PageSize: 2}, + {req: ðpb.ListValidatorBalancesRequest{PageSize: 2, QueryFilter: ðpb.ListValidatorBalancesRequest_Epoch{Epoch: 0}}, res: ðpb.ValidatorBalances{ Balances: []*ethpb.ValidatorBalances_Balance{ {PublicKey: pubKey(0), Index: 0, Balance: uint64(0)}, @@ -438,29 +432,76 @@ func TestServer_ListValidatorBalances_Pagination_CustomPageSizes(t *testing.T) { func TestServer_ListValidatorBalances_OutOfRange(t *testing.T) { db := dbTest.SetupDB(t) defer dbTest.TeardownDB(t, db) + ctx := context.Background() setupValidators(t, db, 1) headState, err := db.HeadState(context.Background()) if err != nil { t.Fatal(err) } + b := ðpb.SignedBeaconBlock{Block: ðpb.BeaconBlock{}} + gRoot, err := ssz.HashTreeRoot(b.Block) + if err != nil { + t.Fatal(err) + } + if err := db.SaveGenesisBlockRoot(ctx, gRoot); err != nil { + t.Fatal(err) + } + if err := db.SaveState(ctx, headState, gRoot); err != nil { + t.Fatal(err) + } bs := &Server{ - BeaconDB: db, - HeadFetcher: &mock.ChainService{State: headState}, + GenesisTimeFetcher: &mock.ChainService{}, + StateGen: stategen.New(db, cache.NewStateSummaryCache()), } - req := ðpb.ListValidatorBalancesRequest{Indices: []uint64{uint64(1)}} - wanted := "does not exist" + req := ðpb.ListValidatorBalancesRequest{Indices: []uint64{uint64(1)}, QueryFilter: ðpb.ListValidatorBalancesRequest_Epoch{Epoch: 0}} + wanted := "Validator index 1 >= balance list 1" if _, err := bs.ListValidatorBalances(context.Background(), req); err == nil || !strings.Contains(err.Error(), wanted) { t.Errorf("Expected error %v, received %v", wanted, err) } } +func TestServer_ListValidators_CannotRequestFutureEpoch(t *testing.T) { + db := dbTest.SetupDB(t) + defer dbTest.TeardownDB(t, db) + + ctx := context.Background() + st := testutil.NewBeaconState() + if err := st.SetSlot(0); err != nil { + t.Fatal(err) + } + bs := &Server{ + BeaconDB: db, + HeadFetcher: &mock.ChainService{ + State: st, + }, + } + + wanted := "Cannot retrieve information about an epoch in the future" + if _, err := bs.ListValidators( + ctx, + ðpb.ListValidatorsRequest{ + QueryFilter: ðpb.ListValidatorsRequest_Epoch{ + Epoch: 1, + }, + }, + ); err != nil && !strings.Contains(err.Error(), wanted) { + t.Errorf("Expected error %v, received %v", wanted, err) + } +} + func TestServer_ListValidatorBalances_FromArchive(t *testing.T) { db := dbTest.SetupDB(t) defer dbTest.TeardownDB(t, db) ctx := context.Background() + + config := &featureconfig.Flags{ + NewStateMgmt: false, + } + featureconfig.Init(config) + epoch := uint64(0) validators, balances := setupValidators(t, db, 100) @@ -515,6 +556,12 @@ func TestServer_ListValidatorBalances_FromArchive_NewValidatorNotFound(t *testin db := dbTest.SetupDB(t) defer dbTest.TeardownDB(t, db) ctx := context.Background() + + config := &featureconfig.Flags{ + NewStateMgmt: false, + } + featureconfig.Init(config) + epoch := uint64(0) _, balances := setupValidators(t, db, 100) @@ -549,39 +596,13 @@ func TestServer_ListValidatorBalances_FromArchive_NewValidatorNotFound(t *testin } } -func TestServer_ListValidators_CannotRequestFutureEpoch(t *testing.T) { - db := dbTest.SetupDB(t) - defer dbTest.TeardownDB(t, db) - - ctx := context.Background() - st := testutil.NewBeaconState() - if err := st.SetSlot(0); err != nil { - t.Fatal(err) - } - bs := &Server{ - BeaconDB: db, - HeadFetcher: &mock.ChainService{ - State: st, - }, - } - - wanted := "Cannot retrieve information about an epoch in the future" - if _, err := bs.ListValidators( - ctx, - ðpb.ListValidatorsRequest{ - QueryFilter: ðpb.ListValidatorsRequest_Epoch{ - Epoch: 1, - }, - }, - ); err != nil && !strings.Contains(err.Error(), wanted) { - t.Errorf("Expected error %v, received %v", wanted, err) - } -} - func TestServer_ListValidators_NoResults(t *testing.T) { db := dbTest.SetupDB(t) defer dbTest.TeardownDB(t, db) + featureconfig.Init(&featureconfig.Flags{NewStateMgmt: true}) + defer featureconfig.Init(&featureconfig.Flags{NewStateMgmt: false}) + ctx := context.Background() st := testutil.NewBeaconState() if err := st.SetSlot(0); err != nil { @@ -1148,6 +1169,9 @@ func TestServer_GetValidatorActiveSetChanges(t *testing.T) { db := dbTest.SetupDB(t) defer dbTest.TeardownDB(t, db) + featureconfig.Init(&featureconfig.Flags{NewStateMgmt: true}) + defer featureconfig.Init(&featureconfig.Flags{NewStateMgmt: false}) + ctx := context.Background() validators := make([]*ethpb.Validator, 8) headState := testutil.NewBeaconState() @@ -1606,6 +1630,11 @@ func TestServer_GetValidatorParticipation_CannotRequestFutureEpoch(t *testing.T) db := dbTest.SetupDB(t) defer dbTest.TeardownDB(t, db) + config := &featureconfig.Flags{ + NewStateMgmt: false, + } + featureconfig.Init(config) + ctx := context.Background() headState := testutil.NewBeaconState() if err := headState.SetSlot(0); err != nil { @@ -1636,6 +1665,12 @@ func TestServer_GetValidatorParticipation_FromArchive(t *testing.T) { db := dbTest.SetupDB(t) defer dbTest.TeardownDB(t, db) ctx := context.Background() + + config := &featureconfig.Flags{ + NewStateMgmt: false, + } + featureconfig.Init(config) + epoch := uint64(4) part := ðpb.ValidatorParticipation{ GlobalParticipationRate: 1.0, @@ -1696,6 +1731,8 @@ func TestServer_GetValidatorParticipation_FromArchive(t *testing.T) { func TestServer_GetValidatorParticipation_PrevEpoch(t *testing.T) { db := dbTest.SetupDB(t) defer dbTest.TeardownDB(t, db) + featureconfig.Init(&featureconfig.Flags{NewStateMgmt: true}) + defer featureconfig.Init(&featureconfig.Flags{NewStateMgmt: false}) ctx := context.Background() validatorCount := uint64(100) @@ -1802,6 +1839,12 @@ func TestServer_GetValidatorParticipation_FromArchive_FinalizedEpoch(t *testing. db := dbTest.SetupDB(t) defer dbTest.TeardownDB(t, db) ctx := context.Background() + + config := &featureconfig.Flags{ + NewStateMgmt: false, + } + featureconfig.Init(config) + part := ðpb.ValidatorParticipation{ GlobalParticipationRate: 1.0, VotedEther: 20,