Merge PR #5503: use build-in iterator function

This commit is contained in:
Xuefeng Zhu 2020-01-10 08:33:43 -06:00 committed by Alexander Bezobchuk
parent 3df3887597
commit 6024115667
1 changed files with 3 additions and 24 deletions

View File

@ -81,7 +81,6 @@ func (k Keeper) BlockValidatorUpdates(ctx sdk.Context) []abci.ValidatorUpdate {
// are returned to Tendermint.
func (k Keeper) ApplyAndReturnValidatorSetUpdates(ctx sdk.Context) (updates []abci.ValidatorUpdate) {
store := ctx.KVStore(k.storeKey)
maxValidators := k.GetParams(ctx).MaxValidators
totalPower := sdk.ZeroInt()
amtFromBondedToNotBonded, amtFromNotBondedToBonded := sdk.ZeroInt(), sdk.ZeroInt()
@ -92,14 +91,13 @@ func (k Keeper) ApplyAndReturnValidatorSetUpdates(ctx sdk.Context) (updates []ab
last := k.getLastValidatorsByAddr(ctx)
// Iterate over validators, highest power to lowest.
iterator := sdk.KVStoreReversePrefixIterator(store, types.ValidatorsByPowerIndexKey)
iterator := k.ValidatorsPowerStoreIterator(ctx)
defer iterator.Close()
for count := 0; iterator.Valid() && count < int(maxValidators); iterator.Next() {
// everything that is iterated in this loop is becoming or already a
// part of the bonded validator set
// fetch the validator
valAddr := sdk.ValAddress(iterator.Value())
validator := k.mustGetValidator(ctx, valAddr)
@ -132,43 +130,28 @@ func (k Keeper) ApplyAndReturnValidatorSetUpdates(ctx sdk.Context) (updates []ab
copy(valAddrBytes[:], valAddr[:])
oldPowerBytes, found := last[valAddrBytes]
// calculate the new power bytes
newPower := validator.ConsensusPower()
newPowerBytes := k.cdc.MustMarshalBinaryLengthPrefixed(newPower)
// update the validator set if power has changed
if !found || !bytes.Equal(oldPowerBytes, newPowerBytes) {
updates = append(updates, validator.ABCIValidatorUpdate())
// set validator power on lookup index
k.SetLastValidatorPower(ctx, valAddr, newPower)
}
// validator still in the validator set, so delete from the copy
delete(last, valAddrBytes)
// keep count
count++
totalPower = totalPower.Add(sdk.NewInt(newPower))
}
// sort the no-longer-bonded validators
noLongerBonded := sortNoLongerBonded(last)
// iterate through the sorted no-longer-bonded validators
for _, valAddrBytes := range noLongerBonded {
// fetch the validator
validator := k.mustGetValidator(ctx, sdk.ValAddress(valAddrBytes))
// bonded to unbonding
validator = k.bondedToUnbonding(ctx, validator)
amtFromBondedToNotBonded = amtFromBondedToNotBonded.Add(validator.GetTokens())
// delete from the bonded validator index
k.DeleteLastValidatorPower(ctx, validator.GetOperator())
// update the validator set
updates = append(updates, validator.ABCIValidatorUpdateZero())
}
@ -255,7 +238,6 @@ func (k Keeper) bondValidator(ctx sdk.Context, validator types.Validator) types.
// delete the validator by power index, as the key will change
k.DeleteValidatorByPowerIndex(ctx, validator)
// set the status
validator = validator.UpdateStatus(sdk.Bonded)
// save the now bonded validator record to the two referenced stores
@ -284,7 +266,6 @@ func (k Keeper) beginUnbondingValidator(ctx sdk.Context, validator types.Validat
panic(fmt.Sprintf("should not already be unbonded or unbonding, validator: %v\n", validator))
}
// set the status
validator = validator.UpdateStatus(sdk.Unbonding)
// set the unbonding completion time and completion height appropriately
@ -317,15 +298,13 @@ type validatorsByAddr map[[sdk.AddrLen]byte][]byte
// get the last validator set
func (k Keeper) getLastValidatorsByAddr(ctx sdk.Context) validatorsByAddr {
last := make(validatorsByAddr)
store := ctx.KVStore(k.storeKey)
iterator := sdk.KVStorePrefixIterator(store, types.LastValidatorPowerKey)
iterator := k.LastValidatorsIterator(ctx)
defer iterator.Close()
// iterate over the last validator set index
for ; iterator.Valid(); iterator.Next() {
var valAddr [sdk.AddrLen]byte
// extract the validator address from the key (prefix is 1-byte)
copy(valAddr[:], iterator.Key()[1:])
// power bytes is just the value
powerBytes := iterator.Value()
last[valAddr] = make([]byte, len(powerBytes))
copy(last[valAddr], powerBytes)