cleanup handleMsgUnbond and revoke logic

This commit is contained in:
rigelrozanski 2018-05-23 17:06:54 -04:00
parent 7353eb4d1b
commit 5a46f26e86
2 changed files with 30 additions and 20 deletions

View File

@ -226,29 +226,22 @@ func handleMsgUnbond(ctx sdk.Context, msg MsgUnbond, k Keeper) sdk.Result {
// Add the coins // Add the coins
pool := k.GetPool(ctx) pool := k.GetPool(ctx)
validator, pool, returnAmount := validator.removeDelShares(pool, delShares) validator, pool, returnAmount := validator.removeDelShares(pool, delShares)
k.setPool(ctx, pool)
returnCoins := sdk.Coins{{k.GetParams(ctx).BondDenom, returnAmount}} returnCoins := sdk.Coins{{k.GetParams(ctx).BondDenom, returnAmount}}
k.coinKeeper.AddCoins(ctx, bond.DelegatorAddr, returnCoins) k.coinKeeper.AddCoins(ctx, bond.DelegatorAddr, returnCoins)
///////////////////////////////////// /////////////////////////////////////
// revoke validator if necessary // revoke validator if necessary
if revokeCandidacy { if revokeCandidacy {
// change the share types to unbonded if they were not already
if validator.Status() == sdk.Bonded {
validator, pool = validator.UpdateStatus(pool, sdk.Unbonded)
}
validator.Revoked = true validator.Revoked = true
} }
// deduct shares from the validator validator = k.updateValidator(ctx, validator)
if validator.DelegatorShares.IsZero() { if validator.DelegatorShares.IsZero() {
k.removeValidator(ctx, validator.Owner) k.removeValidator(ctx, validator.Owner)
} else {
k.updateValidator(ctx, validator)
} }
k.setPool(ctx, pool)
tags := sdk.NewTags("action", []byte("unbond"), "delegator", msg.DelegatorAddr.Bytes(), "validator", msg.ValidatorAddr.Bytes()) tags := sdk.NewTags("action", []byte("unbond"), "delegator", msg.DelegatorAddr.Bytes(), "validator", msg.ValidatorAddr.Bytes())
return sdk.Result{ return sdk.Result{
Tags: tags, Tags: tags,

View File

@ -202,6 +202,11 @@ func (k Keeper) updateValidator(ctx sdk.Context, validator Validator) Validator
// retreive the old validator record // retreive the old validator record
oldValidator, oldFound := k.GetValidator(ctx, ownerAddr) oldValidator, oldFound := k.GetValidator(ctx, ownerAddr)
if validator.Revoked && oldValidator.Status() == sdk.Bonded {
validator, pool = validator.UpdateStatus(pool, sdk.Unbonded)
k.setPool(ctx, pool)
}
powerIncreasing := false powerIncreasing := false
if oldFound && oldValidator.PoolShares.Bonded().LT(validator.PoolShares.Bonded()) { if oldFound && oldValidator.PoolShares.Bonded().LT(validator.PoolShares.Bonded()) {
powerIncreasing = true powerIncreasing = true
@ -227,7 +232,7 @@ func (k Keeper) updateValidator(ctx sdk.Context, validator Validator) Validator
// efficiency case: // efficiency case:
// if already bonded and power increasing only need to update tendermint // if already bonded and power increasing only need to update tendermint
if powerIncreasing && oldValidator.Status() == sdk.Bonded { if powerIncreasing && !validator.Revoked && oldValidator.Status() == sdk.Bonded {
bz := k.cdc.MustMarshalBinary(validator.abciValidator(k.cdc)) bz := k.cdc.MustMarshalBinary(validator.abciValidator(k.cdc))
store.Set(GetTendermintUpdatesKey(ownerAddr), bz) store.Set(GetTendermintUpdatesKey(ownerAddr), bz)
return validator return validator
@ -274,13 +279,13 @@ func (k Keeper) updateBondedValidators(ctx sdk.Context, store sdk.KVStore,
// add the actual validator power sorted store // add the actual validator power sorted store
maxValidators := k.GetParams(ctx).MaxValidators maxValidators := k.GetParams(ctx).MaxValidators
iterator := store.ReverseSubspaceIterator(ValidatorsByPowerKey) // largest to smallest iterator := store.ReverseSubspaceIterator(ValidatorsByPowerKey) // largest to smallest
i := 0 bondedValidatorsCount := 0
var validator Validator var validator Validator
for ; ; i++ { for {
if !iterator.Valid() || i > int(maxValidators-1) { if !iterator.Valid() || bondedValidatorsCount > int(maxValidators-1) {
// TODO benchmark if we should read the current power and not write if it's the same // TODO benchmark if we should read the current power and not write if it's the same
if i-1 == int(maxValidators-1) { if bondedValidatorsCount == int(maxValidators) { // is cliff validator
k.setCliffValidator(ctx, validator, k.GetPool(ctx)) k.setCliffValidator(ctx, validator, k.GetPool(ctx))
} }
iterator.Close() iterator.Close()
@ -313,6 +318,12 @@ func (k Keeper) updateBondedValidators(ctx sdk.Context, store sdk.KVStore,
} }
} }
if validator.Revoked && validator.Status() == sdk.Bonded {
panic(fmt.Sprintf("revoked validator cannot be bonded, address: %v\n", ownerAddr))
} else {
bondedValidatorsCount++
}
iterator.Next() iterator.Next()
} }
@ -342,12 +353,12 @@ func (k Keeper) updateBondedValidatorsFull(ctx sdk.Context, store sdk.KVStore) {
// add the actual validator power sorted store // add the actual validator power sorted store
maxValidators := k.GetParams(ctx).MaxValidators maxValidators := k.GetParams(ctx).MaxValidators
iterator = store.ReverseSubspaceIterator(ValidatorsByPowerKey) // largest to smallest iterator = store.ReverseSubspaceIterator(ValidatorsByPowerKey) // largest to smallest
i := 0 bondedValidatorsCount := 0
var validator Validator var validator Validator
for ; ; i++ { for {
if !iterator.Valid() || i > int(maxValidators-1) { if !iterator.Valid() || bondedValidatorsCount > int(maxValidators-1) {
if i-1 == int(maxValidators-1) { if bondedValidatorsCount == int(maxValidators) { // is cliff validator
k.setCliffValidator(ctx, validator, k.GetPool(ctx)) k.setCliffValidator(ctx, validator, k.GetPool(ctx))
} }
iterator.Close() iterator.Close()
@ -376,6 +387,12 @@ func (k Keeper) updateBondedValidatorsFull(ctx sdk.Context, store sdk.KVStore) {
validator = k.bondValidator(ctx, store, validator) validator = k.bondValidator(ctx, store, validator)
} }
if validator.Revoked && validator.Status() == sdk.Bonded {
panic(fmt.Sprintf("revoked validator cannot be bonded, address: %v\n", ownerAddr))
} else {
bondedValidatorsCount++
}
iterator.Next() iterator.Next()
} }