diff --git a/types/stake.go b/types/stake.go index 0e7310962a..d8334448b9 100644 --- a/types/stake.go +++ b/types/stake.go @@ -35,9 +35,16 @@ func ABCIValidator(v Validator) abci.Validator { // properties for the set of all validators type ValidatorSet interface { - IterateValidatorsBonded(Context, func(index int64, validator Validator)) // execute arbitrary logic for each validator - Validator(Context, Address) Validator // get a particular validator by owner address - TotalPower(Context) Rat // total power of the validator set + // iterate through validator by owner-address, execute func for each validator + IterateValidators(Context, + func(index int64, validator Validator) (stop bool)) + + // iterate through bonded validator by pubkey-address, execute func for each validator + IterateValidatorsBonded(Context, + func(index int64, validator Validator) (stop bool)) + + Validator(Context, Address) Validator // get a particular validator by owner address + TotalPower(Context) Rat // total power of the validator set } //_______________________________________________________________________________ @@ -52,6 +59,8 @@ type Delegation interface { // properties for the set of all delegations for a particular type DelegationSet interface { - // execute arbitrary logic for each validator which a delegator has a delegation for - IterateDelegators(Context, delegator Address, fn func(index int64, delegation Delegation)) + // iterate through all delegations from one delegator by validator-address, + // execute func for each validator + IterateDelegators(Context, delegator Address, + fn func(index int64, delegation Delegation) (stop bool)) } diff --git a/x/stake/genesis.go b/x/stake/genesis.go index 62fdeeeaa9..505f0c2045 100644 --- a/x/stake/genesis.go +++ b/x/stake/genesis.go @@ -43,8 +43,8 @@ func InitGenesis(ctx sdk.Context, k Keeper, data GenesisState) { func WriteGenesis(ctx sdk.Context, k Keeper) GenesisState { pool := k.GetPool(ctx) params := k.GetParams(ctx) - validators := k.GetValidators(ctx, 32767) - bonds := k.getBonds(ctx, 32767) + validators := k.getAllValidators(ctx) + bonds := k.getAllDelegations(ctx) return GenesisState{ pool, params, diff --git a/x/stake/keeper.go b/x/stake/keeper.go index 80c1ad4ca3..32d0331f84 100644 --- a/x/stake/keeper.go +++ b/x/stake/keeper.go @@ -46,6 +46,26 @@ func (k Keeper) GetValidator(ctx sdk.Context, addr sdk.Address) (validator Valid return validator, true } +// Get the set of all validators with no limits, used during genesis dump +func (k Keeper) getAllValidators(ctx sdk.Context) (validators Validators) { + store := ctx.KVStore(k.storeKey) + iterator := store.SubspaceIterator(ValidatorsKey) + + i := 0 + for ; ; i++ { + if !iterator.Valid() { + iterator.Close() + break + } + bz := iterator.Value() + var validator Validator + k.cdc.MustUnmarshalBinary(bz, &validator) + validators = append(validators, validator) + iterator.Next() + } + return validators[:i] // trim +} + // Get the set of all validators, retrieve a maxRetrieve number of records func (k Keeper) GetValidators(ctx sdk.Context, maxRetrieve int16) (validators Validators) { store := ctx.KVStore(k.storeKey) @@ -364,25 +384,24 @@ func (k Keeper) GetDelegation(ctx sdk.Context, return bond, true } -// load all bonds -func (k Keeper) getBonds(ctx sdk.Context, maxRetrieve int16) (bonds []Delegation) { +// load all delegations used during genesis dump +func (k Keeper) getAllDelegations(ctx sdk.Context) (delegations []Delegation) { store := ctx.KVStore(k.storeKey) iterator := store.SubspaceIterator(DelegationKey) - bonds = make([]Delegation, maxRetrieve) i := 0 for ; ; i++ { - if !iterator.Valid() || i > int(maxRetrieve-1) { + if !iterator.Valid() { iterator.Close() break } bondBytes := iterator.Value() - var bond Delegation - k.cdc.MustUnmarshalBinary(bondBytes, &bond) - bonds[i] = bond + var delegation Delegation + k.cdc.MustUnmarshalBinary(bondBytes, &delegation) + delegations = append(delegations, delegation) iterator.Next() } - return bonds[:i] // trim + return delegations[:i] // trim } // load all bonds of a delegator @@ -476,12 +495,51 @@ func (k Keeper) setPool(ctx sdk.Context, p Pool) { //__________________________________________________________________________ +// get the current in-block validator operation counter +func (k Keeper) getIntraTxCounter(ctx sdk.Context) int16 { + store := ctx.KVStore(k.storeKey) + b := store.Get(IntraTxCounterKey) + if b == nil { + return 0 + } + var counter int16 + k.cdc.MustUnmarshalBinary(b, &counter) + return counter +} + +// set the current in-block validator operation counter +func (k Keeper) setIntraTxCounter(ctx sdk.Context, counter int16) { + store := ctx.KVStore(k.storeKey) + bz := k.cdc.MustMarshalBinary(counter) + store.Set(IntraTxCounterKey, bz) +} + +//__________________________________________________________________________ + // Implements ValidatorSet var _ sdk.ValidatorSet = Keeper{} // iterate through the active validator set and perform the provided function -func (k Keeper) IterateValidatorsBonded(ctx sdk.Context, fn func(index int64, validator sdk.Validator)) { +func (k Keeper) IterateValidators(ctx sdk.Context, fn func(index int64, validator sdk.Validator) (stop bool)) { + store := ctx.KVStore(k.storeKey) + iterator := store.SubspaceIterator(ValidatorsKey) + i := int64(0) + for ; iterator.Valid(); iterator.Next() { + bz := iterator.Value() + var validator Validator + k.cdc.MustUnmarshalBinary(bz, &validator) + stop := fn(i, validator) // XXX is this safe will the validator unexposed fields be able to get written to? + if stop { + break + } + i++ + } + iterator.Close() +} + +// iterate through the active validator set and perform the provided function +func (k Keeper) IterateValidatorsBonded(ctx sdk.Context, fn func(index int64, validator sdk.Validator) (stop bool)) { store := ctx.KVStore(k.storeKey) iterator := store.SubspaceIterator(ValidatorsBondedKey) i := int64(0) @@ -489,7 +547,10 @@ func (k Keeper) IterateValidatorsBonded(ctx sdk.Context, fn func(index int64, va bz := iterator.Value() var validator Validator k.cdc.MustUnmarshalBinary(bz, &validator) - fn(i, validator) // XXX is this safe will the validator unexposed fields be able to get written to? + stop := fn(i, validator) // XXX is this safe will the validator unexposed fields be able to get written to? + if stop { + break + } i++ } iterator.Close() @@ -526,7 +587,7 @@ func (k Keeper) Delegation(ctx sdk.Context, addrDel sdk.Address, addrVal sdk.Add } // iterate through the active validator set and perform the provided function -func (k Keeper) IterateDelegators(ctx sdk.Context, delAddr sdk.Address, fn func(index int64, delegation sdk.Delegation)) { +func (k Keeper) IterateDelegators(ctx sdk.Context, delAddr sdk.Address, fn func(index int64, delegation sdk.Delegation) (stop bool)) { store := ctx.KVStore(k.storeKey) key := GetDelegationsKey(delAddr, k.cdc) iterator := store.SubspaceIterator(key) @@ -535,29 +596,11 @@ func (k Keeper) IterateDelegators(ctx sdk.Context, delAddr sdk.Address, fn func( bz := iterator.Value() var delegation Delegation k.cdc.MustUnmarshalBinary(bz, &delegation) - fn(i, delegation) // XXX is this safe will the fields be able to get written to? + stop := fn(i, delegation) // XXX is this safe will the fields be able to get written to? + if stop { + break + } i++ } iterator.Close() } - -//__________________________________________________________________________ - -// get the current in-block validator operation counter -func (k Keeper) getIntraTxCounter(ctx sdk.Context) int16 { - store := ctx.KVStore(k.storeKey) - b := store.Get(IntraTxCounterKey) - if b == nil { - return 0 - } - var counter int16 - k.cdc.MustUnmarshalBinary(b, &counter) - return counter -} - -// set the current in-block validator operation counter -func (k Keeper) setIntraTxCounter(ctx sdk.Context, counter int16) { - store := ctx.KVStore(k.storeKey) - bz := k.cdc.MustMarshalBinary(counter) - store.Set(IntraTxCounterKey, bz) -} diff --git a/x/stake/keeper_test.go b/x/stake/keeper_test.go index 6bded8ccb0..c7e2f66595 100644 --- a/x/stake/keeper_test.go +++ b/x/stake/keeper_test.go @@ -673,7 +673,7 @@ func TestBond(t *testing.T) { assert.True(t, bond2to1.equal(resBonds[0])) assert.True(t, bond2to2.equal(resBonds[1])) assert.True(t, bond2to3.equal(resBonds[2])) - allBonds := keeper.getBonds(ctx, 1000) + allBonds := keeper.getAllDelegations(ctx) require.Equal(t, 6, len(allBonds)) assert.True(t, bond1to1.equal(allBonds[0])) assert.True(t, bond1to2.equal(allBonds[1]))