add ValidatorSet, remove methods

This commit is contained in:
mossid 2018-05-06 16:18:45 +02:00 committed by rigelrozanski
parent 37156ad192
commit 79fdbe2f3a
3 changed files with 61 additions and 56 deletions

View File

@ -2,15 +2,29 @@ package types
import (
abci "github.com/tendermint/abci/types"
"github.com/tendermint/go-crypto"
)
type Validator = abci.Validator
type Validator interface {
GetAddress() Address
GetPubKey() crypto.PubKey
GetPower() Rat
}
func ABCIValidator(v Validator) abci.Validator {
return abci.Validator{
PubKey: v.GetPubKey().Bytes(),
Power: v.GetPower().Evaluate(),
}
}
type ValidatorSet interface {
Iterate(func(int, Validator))
Size() int
}
type ValidatorSetKeeper interface {
Validators(Context) []*Validator
Size(Context) int
IsValidator(Context, Address) bool
GetByAddress(Context, Address) (int, *Validator)
GetByIndex(Context, int) *Validator
ValidatorSet(Context) ValidatorSet
GetByAddress(Context, Address) Validator
TotalPower(Context) Rat
}

View File

@ -505,50 +505,20 @@ func (k Keeper) setPool(ctx sdk.Context, p Pool) {
var _ sdk.ValidatorSetKeeper = Keeper{}
func (k Keeper) Validators(ctx sdk.Context) []*sdk.Validator {
func (k Keeper) ValidatorSet(ctx sdk.Context) sdk.ValidatorSet {
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
return ValidatorSet(vals)
}
func (k Keeper) Size(ctx sdk.Context) int {
return len(k.GetValidators(ctx))
}
func (k Keeper) IsValidator(ctx sdk.Context, addr sdk.Address) bool {
for _, v := range k.GetValidators(ctx) {
if bytes.Equal(v.Address, addr) {
return true
}
}
return false
}
func (k Keeper) GetByAddress(ctx sdk.Context, addr sdk.Address) (int, *sdk.Validator) {
for i, v := range k.GetValidators(ctx) {
if bytes.Equal(v.Address, addr) {
val := v.abciValidator(k.cdc)
return i, &val
}
}
return -1, nil
}
func (k Keeper) GetByIndex(ctx sdk.Context, index int) *sdk.Validator {
valset := k.GetValidators(ctx)
if index < 0 || index >= len(valset) {
func (k Keeper) GetByAddress(ctx sdk.Context, addr sdk.Address) sdk.Validator {
can, ok := k.GetCandidate(ctx, addr)
if !ok {
return nil
}
val := valset[index].abciValidator(k.cdc)
return &val
if can.Status != Bonded {
return nil
}
return can.validator()
}
func (k Keeper) TotalPower(ctx sdk.Context) sdk.Rat {

View File

@ -4,9 +4,9 @@ import (
"bytes"
sdk "github.com/cosmos/cosmos-sdk/types"
crypto "github.com/tendermint/go-crypto"
"github.com/cosmos/cosmos-sdk/wire"
abci "github.com/tendermint/abci/types"
crypto "github.com/tendermint/go-crypto"
)
// GenesisState - all staking state that must be provided at genesis
@ -292,8 +292,8 @@ func (v Validator) equal(v2 Validator) bool {
}
// abci validator from stake validator type
func (v Validator) abciValidator(cdc *wire.Codec) sdk.Validator {
return sdk.Validator{
func (v Validator) abciValidator(cdc *wire.Codec) abci.Validator {
return abci.Validator{
PubKey: v.PubKey.Bytes(),
Power: v.Power.Evaluate(),
}
@ -301,19 +301,40 @@ func (v Validator) abciValidator(cdc *wire.Codec) sdk.Validator {
// abci validator from stake validator type
// with zero power used for validator updates
func (v Validator) abciValidatorZero(cdc *wire.Codec) sdk.Validator {
return sdk.Validator{
func (v Validator) abciValidatorZero(cdc *wire.Codec) abci.Validator {
return abci.Validator{
PubKey: v.PubKey.Bytes(),
Power: 0,
}
}
// sortable validator list for testing
type validators []Validator
var _ sdk.Validator = Validator{}
func (v validators) Len() int { return len(v) }
func (v validators) Swap(i, j int) { v[i], v[j] = v[j], v[i] }
func (v validators) Less(i, j int) bool { return v[i].Power.LT(v[j].Power) }
func (v Validator) GetAddress() sdk.Address {
return v.Address
}
func (v Validator) GetPubKey() crypto.PubKey {
return v.PubKey
}
func (v Validator) GetPower() sdk.Rat {
return v.Power
}
type ValidatorSet []Validator
var _ sdk.ValidatorSet = ValidatorSet{}
func (vs ValidatorSet) Iterate(fn func(int, sdk.Validator)) {
for i, v := range vs {
fn(i, v)
}
}
func (vs ValidatorSet) Size() int {
return len(vs)
}
//_________________________________________________________________________