accumulated validator updates now type abcivalidator
This commit is contained in:
parent
ccb71a2afa
commit
6a10283eaa
|
@ -96,7 +96,7 @@ func (k Keeper) setCandidate(ctx sdk.Context, candidate Candidate) {
|
|||
store.Set(GetCandidateKey(candidate.Address), bz)
|
||||
|
||||
// mashal the new validator record
|
||||
validator := Validator{address, candidate.Assets}
|
||||
validator := candidate.validator()
|
||||
bz, err = k.cdc.MarshalBinary(validator)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
|
@ -124,6 +124,10 @@ func (k Keeper) setCandidate(ctx sdk.Context, candidate Candidate) {
|
|||
setAcc = true
|
||||
}
|
||||
if setAcc {
|
||||
bz, err = k.cdc.MarshalBinary(validator.abciValidator(k.cdc))
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
store.Set(GetAccUpdateValidatorKey(validator.Address), bz)
|
||||
}
|
||||
return
|
||||
|
@ -132,7 +136,7 @@ func (k Keeper) setCandidate(ctx sdk.Context, candidate Candidate) {
|
|||
func (k Keeper) removeCandidate(ctx sdk.Context, address sdk.Address) {
|
||||
|
||||
// first retreive the old candidate record
|
||||
oldCandidate, found := k.GetCandidate(ctx, address)
|
||||
candidate, found := k.GetCandidate(ctx, address)
|
||||
if !found {
|
||||
return
|
||||
}
|
||||
|
@ -140,14 +144,14 @@ func (k Keeper) removeCandidate(ctx sdk.Context, address sdk.Address) {
|
|||
// delete the old candidate record
|
||||
store := ctx.KVStore(k.storeKey)
|
||||
store.Delete(GetCandidateKey(address))
|
||||
store.Delete(GetValidatorKey(address, oldCandidate.Assets, k.cdc))
|
||||
store.Delete(GetValidatorKey(address, candidate.Assets, k.cdc))
|
||||
|
||||
// delete from recent and power weighted validator groups if the validator
|
||||
// exists and add validator with zero power to the validator updates
|
||||
if store.Get(GetRecentValidatorKey(address)) == nil {
|
||||
return
|
||||
}
|
||||
bz, err := k.cdc.MarshalBinary(abci.Validator{address, 0})
|
||||
bz, err := k.cdc.MarshalBinary(candidate.validator().abciValidatorZero(k.cdc))
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
@ -168,34 +172,36 @@ func (k Keeper) GetValidators(ctx sdk.Context) (validators []Validator) {
|
|||
iterator := store.Iterator(subspace(RecentValidatorsKey))
|
||||
for ; iterator.Valid(); iterator.Next() {
|
||||
addr := AddrFromKey(iterator.Key())
|
||||
store.Set(GetToKickOutValidatorKey(addr), iterator.Value()) // iterator.Value is the validator pubkey
|
||||
|
||||
// iterator.Value is the validator object
|
||||
store.Set(GetToKickOutValidatorKey(addr), iterator.Value())
|
||||
store.Delete(iterator.Key())
|
||||
}
|
||||
iterator.Close()
|
||||
|
||||
// add the actual validator power sorted store
|
||||
maxVal := k.GetParams(ctx).MaxValidators
|
||||
maxValidators := k.GetParams(ctx).MaxValidators
|
||||
iterator = store.ReverseIterator(subspace(ValidatorsKey)) // largest to smallest
|
||||
validators = make([]Validator, maxVal)
|
||||
validators = make([]Validator, maxValidators)
|
||||
i := 0
|
||||
for ; ; i++ {
|
||||
if !iterator.Valid() || i > int(maxVal-1) {
|
||||
if !iterator.Valid() || i > int(maxValidators-1) {
|
||||
iterator.Close()
|
||||
break
|
||||
}
|
||||
bz := iterator.Value()
|
||||
var val Validator
|
||||
err := k.cdc.UnmarshalBinary(bz, &val)
|
||||
var validator Validator
|
||||
err := k.cdc.UnmarshalBinary(bz, &validator)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
validators[i] = val
|
||||
validators[i] = validator
|
||||
|
||||
// remove from ToKickOut group
|
||||
store.Delete(GetToKickOutValidatorKey(val.Address))
|
||||
store.Delete(GetToKickOutValidatorKey(validator.Address))
|
||||
|
||||
// also add to the recent validators group
|
||||
store.Set(GetRecentValidatorKey(val.Address), bz)
|
||||
store.Set(GetRecentValidatorKey(validator.Address), bz)
|
||||
|
||||
iterator.Next()
|
||||
}
|
||||
|
@ -203,14 +209,23 @@ func (k Keeper) GetValidators(ctx sdk.Context) (validators []Validator) {
|
|||
// add any kicked out validators to the acc change
|
||||
iterator = store.Iterator(subspace(ToKickOutValidatorsKey))
|
||||
for ; iterator.Valid(); iterator.Next() {
|
||||
addr := AddrFromKey(iterator.Key())
|
||||
validator = iterator.Key()
|
||||
bz, err := k.cdc.MarshalBinary(abci.Validator{addr, 0})
|
||||
key := iterator.Key()
|
||||
addr := AddrFromKey(key)
|
||||
|
||||
// get the zero abci validator from the ToKickOut iterator value
|
||||
bz := iterator.Value()
|
||||
var validator Validator
|
||||
err := k.cdc.UnmarshalBinary(bz, &validator)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
bz, err = k.cdc.MarshalBinary(validator.abciValidatorZero(k.cdc))
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
store.Set(GetAccUpdateValidatorKey(addr), bz)
|
||||
store.Delete(iterator.Key())
|
||||
store.Delete(key)
|
||||
}
|
||||
iterator.Close()
|
||||
|
||||
|
@ -263,7 +278,7 @@ func (k Keeper) getAccUpdateValidators(ctx sdk.Context) (updates []abci.Validato
|
|||
iterator := store.Iterator(subspace(AccUpdateValidatorsKey)) //smallest to largest
|
||||
for ; iterator.Valid(); iterator.Next() {
|
||||
valBytes := iterator.Value()
|
||||
var val Validator
|
||||
var val abci.Validator
|
||||
err := k.cdc.UnmarshalBinary(valBytes, &val)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
|
|
|
@ -6,6 +6,7 @@ import (
|
|||
"testing"
|
||||
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
crypto "github.com/tendermint/go-crypto"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
|
@ -315,6 +316,15 @@ func TestGetAccUpdateValidators(t *testing.T) {
|
|||
}
|
||||
}
|
||||
|
||||
// to compare pubkeys between abci pubkey and crypto.PubKey
|
||||
wirePK := func(pk crypto.PubKey) []byte {
|
||||
pkBytes, err := keeper.cdc.MarshalBinary(pk)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return pkBytes
|
||||
}
|
||||
|
||||
// test from nothing to something
|
||||
// candidate set: {} -> {c1, c3}
|
||||
// validator set: {} -> {c1, c3}
|
||||
|
@ -332,8 +342,8 @@ func TestGetAccUpdateValidators(t *testing.T) {
|
|||
require.Equal(t, 2, len(acc))
|
||||
candidates := keeper.GetCandidates(ctx, 5)
|
||||
require.Equal(t, 2, len(candidates))
|
||||
assert.Equal(t, candidates[0].validator(), acc[0])
|
||||
assert.Equal(t, candidates[1].validator(), acc[1])
|
||||
assert.Equal(t, candidates[0].validator().abciValidator(keeper.cdc), acc[0])
|
||||
assert.Equal(t, candidates[1].validator().abciValidator(keeper.cdc), acc[1])
|
||||
assert.Equal(t, candidates[0].validator(), vals[1])
|
||||
assert.Equal(t, candidates[1].validator(), vals[0])
|
||||
|
||||
|
@ -365,7 +375,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(), acc[0])
|
||||
assert.Equal(t, candidates[0].validator().abciValidator(keeper.cdc), acc[0])
|
||||
|
||||
// test multiple value change
|
||||
// candidate set: {c1, c3} -> {c1', c3'}
|
||||
|
@ -383,8 +393,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(), acc[0])
|
||||
require.Equal(t, candidates[1].validator(), 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}
|
||||
|
@ -398,7 +408,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(), 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]
|
||||
|
@ -412,7 +422,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(), 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}
|
||||
|
@ -469,9 +479,9 @@ func TestGetAccUpdateValidators(t *testing.T) {
|
|||
acc = keeper.getAccUpdateValidators(ctx)
|
||||
require.Equal(t, 2, len(acc), "%v", acc)
|
||||
|
||||
assert.Equal(t, candidatesIn[0].Address, acc[0].Address)
|
||||
assert.Equal(t, int64(0), acc[0].VotingPower.Evaluate())
|
||||
assert.Equal(t, vals[0], acc[1])
|
||||
assert.Equal(t, wirePK(candidatesIn[0].PubKey), acc[0].PubKey)
|
||||
assert.Equal(t, int64(0), acc[0].Power)
|
||||
assert.Equal(t, vals[0].abciValidator(keeper.cdc), acc[1])
|
||||
|
||||
// test from something to nothing
|
||||
// candidate set: {c0, c1, c2, c3, c4} -> {}
|
||||
|
@ -494,14 +504,14 @@ func TestGetAccUpdateValidators(t *testing.T) {
|
|||
require.Equal(t, 0, len(candidates))
|
||||
acc = keeper.getAccUpdateValidators(ctx)
|
||||
require.Equal(t, 4, len(acc))
|
||||
assert.Equal(t, candidatesIn[1].Address, acc[0].Address)
|
||||
assert.Equal(t, candidatesIn[2].Address, acc[1].Address)
|
||||
assert.Equal(t, candidatesIn[3].Address, acc[2].Address)
|
||||
assert.Equal(t, candidatesIn[4].Address, acc[3].Address)
|
||||
assert.Equal(t, int64(0), acc[0].VotingPower.Evaluate())
|
||||
assert.Equal(t, int64(0), acc[1].VotingPower.Evaluate())
|
||||
assert.Equal(t, int64(0), acc[2].VotingPower.Evaluate())
|
||||
assert.Equal(t, int64(0), acc[3].VotingPower.Evaluate())
|
||||
assert.Equal(t, wirePK(candidatesIn[1].PubKey), acc[0].PubKey)
|
||||
assert.Equal(t, wirePK(candidatesIn[2].PubKey), acc[1].PubKey)
|
||||
assert.Equal(t, wirePK(candidatesIn[3].PubKey), acc[2].PubKey)
|
||||
assert.Equal(t, wirePK(candidatesIn[4].PubKey), acc[3].PubKey)
|
||||
assert.Equal(t, int64(0), acc[0].Power)
|
||||
assert.Equal(t, int64(0), acc[1].Power)
|
||||
assert.Equal(t, int64(0), acc[2].Power)
|
||||
assert.Equal(t, int64(0), acc[3].Power)
|
||||
}
|
||||
|
||||
// test if is a validator from the last update
|
||||
|
|
|
@ -119,14 +119,14 @@ func (c Candidate) validator() Validator {
|
|||
|
||||
// Validator is one of the top Candidates
|
||||
type Validator struct {
|
||||
Address sdk.Address `json:"address"`
|
||||
PubKey sdk.PubKey `json:"PubKey"`
|
||||
VotingPower sdk.Rat `json:"voting_power"`
|
||||
Address sdk.Address `json:"address"`
|
||||
PubKey crypto.PubKey `json:"PubKey"`
|
||||
VotingPower sdk.Rat `json:"voting_power"`
|
||||
}
|
||||
|
||||
// ABCIValidator - Get the validator from a bond value
|
||||
func (v Validator) ABCIValidator() abci.Validator {
|
||||
pkBytes, err := wire.MarshalBinary(v.PubKey)
|
||||
// abci validator from stake validator type
|
||||
func (v Validator) abciValidator(cdc *wire.Codec) abci.Validator {
|
||||
pkBytes, err := cdc.MarshalBinary(v.PubKey)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
@ -136,6 +136,19 @@ func (v Validator) ABCIValidator() abci.Validator {
|
|||
}
|
||||
}
|
||||
|
||||
// abci validator from stake validator type
|
||||
// with zero power used for validator updates
|
||||
func (v Validator) abciValidatorZero(cdc *wire.Codec) abci.Validator {
|
||||
pkBytes, err := cdc.MarshalBinary(v.PubKey)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return abci.Validator{
|
||||
PubKey: pkBytes,
|
||||
Power: 0,
|
||||
}
|
||||
}
|
||||
|
||||
//_________________________________________________________________________
|
||||
|
||||
// Candidates - list of Candidates
|
||||
|
|
Loading…
Reference in New Issue