diff --git a/types/validator_set.go b/types/validator_set.go index 4338ec6ad6..4ccd28d7c7 100644 --- a/types/validator_set.go +++ b/types/validator_set.go @@ -16,7 +16,7 @@ func init() { type Validator = abci.Validator type ValidatorSetKeeper interface { - GetValidators(Context) []*Validator + Validators(Context) []*Validator Size(Context) int IsValidator(Context, Address) bool GetByAddress(Context, Address) (int, *Validator) diff --git a/x/stake/keeper.go b/x/stake/keeper.go index f453e42c60..8f416c1a54 100644 --- a/x/stake/keeper.go +++ b/x/stake/keeper.go @@ -171,7 +171,7 @@ func (k Keeper) setCandidate(ctx sdk.Context, candidate Candidate) { setAcc = true } if setAcc { - bz, err = k.cdc.MarshalBinary(validator.ABCIValidator(k.cdc)) + bz, err = k.cdc.MarshalBinary(validator.abciValidator(k.cdc)) if err != nil { panic(err) } @@ -200,7 +200,7 @@ func (k Keeper) removeCandidate(ctx sdk.Context, address sdk.Address) { if store.Get(GetRecentValidatorKey(address)) == nil { return } - bz, err := k.cdc.MarshalBinary(candidate.validator().ABCIValidatorZero(k.cdc)) + bz, err := k.cdc.MarshalBinary(candidate.validator().abciValidatorZero(k.cdc)) if err != nil { panic(err) } @@ -216,7 +216,7 @@ func (k Keeper) removeCandidate(ctx sdk.Context, address sdk.Address) { // records are updated in store with the RecentValidatorsKey. This store is // used to determine if a candidate is a validator without needing to iterate // over the subspace as we do in GetValidators -func (k Keeper) GetValidators(ctx sdk.Context) (validators []sdk.Validator) { +func (k Keeper) GetValidators(ctx sdk.Context) (validators []Validator) { store := ctx.KVStore(k.storeKey) // clear the recent validators store, add to the ToKickOut Temp store @@ -233,7 +233,7 @@ func (k Keeper) GetValidators(ctx sdk.Context) (validators []sdk.Validator) { // add the actual validator power sorted store maxValidators := k.GetParams(ctx).MaxValidators iterator = store.ReverseIterator(subspace(ValidatorsKey)) // largest to smallest - validators = make([]sdk.Validator, maxValidators) + validators = make([]Validator, maxValidators) i := 0 for ; ; i++ { if !iterator.Valid() || i > int(maxValidators-1) { @@ -241,7 +241,7 @@ func (k Keeper) GetValidators(ctx sdk.Context) (validators []sdk.Validator) { break } bz := iterator.Value() - var validator sdk.Validator + var validator Validator err := k.cdc.UnmarshalBinary(bz, &validator) if err != nil { panic(err) @@ -265,12 +265,12 @@ func (k Keeper) GetValidators(ctx sdk.Context) (validators []sdk.Validator) { // get the zero abci validator from the ToKickOut iterator value bz := iterator.Value() - var validator sdk.Validator + var validator Validator err := k.cdc.UnmarshalBinary(bz, &validator) if err != nil { panic(err) } - bz, err = k.cdc.MarshalBinary(validator.ABCIValidatorZero(k.cdc)) + bz, err = k.cdc.MarshalBinary(validator.abciValidatorZero(k.cdc)) if err != nil { panic(err) } @@ -296,7 +296,7 @@ func (k Keeper) isNewValidator(ctx sdk.Context, store sdk.KVStore, address sdk.A break } bz := iterator.Value() - var val sdk.Validator + var val Validator err := k.cdc.UnmarshalBinary(bz, &val) if err != nil { panic(err) @@ -496,7 +496,21 @@ func (k Keeper) setPool(ctx sdk.Context, p Pool) { //__________________________________________________________________________ -// Implements sdk.ValidatorSetKeeper +// Implements ValidatorSetKeeper + +var _ sdk.ValidatorSetKeeper = Keeper{} + +func (k Keeper) Validators(ctx sdk.Context) []*sdk.Validator { + vals := k.GetValidators(ctx) + res := make([]*sdk.Validator, len(vals)) + + for i, val := range vals { + abcival := val.abciValidator(k.cdc) + res[i] = &abcival + } + + return res +} func (k Keeper) Size(ctx sdk.Context) int { return len(k.GetValidators(ctx)) diff --git a/x/stake/keeper_test.go b/x/stake/keeper_test.go index fa76fa15c2..76e69de58f 100644 --- a/x/stake/keeper_test.go +++ b/x/stake/keeper_test.go @@ -474,7 +474,7 @@ func TestGetAccUpdateValidators(t *testing.T) { assert.True(t, candidates[0].Assets.Equal(sdk.NewRat(600))) acc = keeper.getAccUpdateValidators(ctx) require.Equal(t, 1, len(acc)) - assert.Equal(t, candidates[0].validator().ABCIValidator(keeper.cdc), acc[0]) + assert.Equal(t, candidates[0].validator().abciValidator(keeper.cdc), acc[0]) // test multiple value change // candidate set: {c1, c3} -> {c1', c3'} @@ -492,8 +492,8 @@ func TestGetAccUpdateValidators(t *testing.T) { require.Equal(t, 2, len(acc)) candidates = keeper.GetCandidates(ctx, 5) require.Equal(t, 2, len(candidates)) - require.Equal(t, candidates[0].validator().ABCIValidator(keeper.cdc), acc[0]) - require.Equal(t, candidates[1].validator().ABCIValidator(keeper.cdc), acc[1]) + require.Equal(t, candidates[0].validator().abciValidator(keeper.cdc), acc[0]) + require.Equal(t, candidates[1].validator().abciValidator(keeper.cdc), acc[1]) // test validtor added at the beginning // candidate set: {c1, c3} -> {c0, c1, c3} @@ -507,7 +507,7 @@ func TestGetAccUpdateValidators(t *testing.T) { require.Equal(t, 1, len(acc)) candidates = keeper.GetCandidates(ctx, 5) require.Equal(t, 3, len(candidates)) - assert.Equal(t, candidates[0].validator().ABCIValidator(keeper.cdc), acc[0]) + assert.Equal(t, candidates[0].validator().abciValidator(keeper.cdc), acc[0]) // test validator added at the middle // candidate set: {c0, c1, c3} -> {c0, c1, c2, c3] @@ -521,7 +521,7 @@ func TestGetAccUpdateValidators(t *testing.T) { require.Equal(t, 1, len(acc)) candidates = keeper.GetCandidates(ctx, 5) require.Equal(t, 4, len(candidates)) - assert.Equal(t, candidates[2].validator().ABCIValidator(keeper.cdc), acc[0]) + assert.Equal(t, candidates[2].validator().abciValidator(keeper.cdc), acc[0]) // test candidate added at the end but not inserted in the valset // candidate set: {c0, c1, c2, c3} -> {c0, c1, c2, c3, c4} @@ -580,7 +580,7 @@ func TestGetAccUpdateValidators(t *testing.T) { assert.Equal(t, candidatesIn[0].PubKey.Bytes(), acc[0].PubKey) assert.Equal(t, int64(0), acc[0].Power) - assert.Equal(t, vals[0].ABCIValidator(keeper.cdc), acc[1]) + assert.Equal(t, vals[0].abciValidator(keeper.cdc), acc[1]) // test from something to nothing // candidate set: {c0, c1, c2, c3, c4} -> {} @@ -732,50 +732,3 @@ func TestValidatorsetKeeper(t *testing.T) { assert.Equal(t, total, keeper.TotalPower(ctx).Evaluate()) } - -func TestValidatorsetKeeper(t *testing.T) { - ctx, _, keeper := createTestInput(t, false, 0) - - total := int64(0) - amts := []int64{9, 8, 7} - var candidates [3]Candidate - for i, amt := range amts { - candidates[i] = Candidate{ - Address: addrVals[i], - PubKey: pks[i], - Assets: sdk.NewRat(amt), - Liabilities: sdk.NewRat(amt), - } - - keeper.setCandidate(ctx, candidates[i]) - - total += amt - } - - assert.Equal(t, 3, keeper.Size(ctx)) - - for _, addr := range addrVals[:3] { - assert.True(t, keeper.IsValidator(ctx, addr)) - } - for _, addr := range addrVals[3:] { - assert.False(t, keeper.IsValidator(ctx, addr)) - } - - for i, addr := range addrVals[:3] { - index, val := keeper.GetByAddress(ctx, addr) - assert.Equal(t, i, index) - assert.Equal(t, candidates[i].validator(), *val) - } - - for _, addr := range addrVals[3:] { - index, val := keeper.GetByAddress(ctx, addr) - assert.Equal(t, -1, index) - assert.Nil(t, val) - } - - for i, can := range candidates { - assert.Equal(t, can.validator(), *keeper.GetByIndex(ctx, i)) - } - - assert.Equal(t, total, keeper.TotalPower(ctx).Evaluate()) -} diff --git a/x/stake/types.go b/x/stake/types.go index e7668a14f3..ffe2ca4fb4 100644 --- a/x/stake/types.go +++ b/x/stake/types.go @@ -134,8 +134,8 @@ func (c Candidate) delegatorShareExRate() sdk.Rat { // Validator returns a copy of the Candidate as a Validator. // Should only be called when the Candidate qualifies as a validator. -func (c Candidate) validator() sdk.Validator { - return sdk.Validator{ +func (c Candidate) validator() Validator { + return Validator{ Address: c.Address, PubKey: c.PubKey, Power: c.Assets,