diff --git a/CHANGELOG.md b/CHANGELOG.md index 414d99aae4da..927be5cfc637 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -218,6 +218,7 @@ functionality that requires an online connection. * (types/rest) [\#5900](https://github.com/cosmos/cosmos-sdk/pull/5900) Add Check*Error function family to spare developers from replicating tons of boilerplate code. * (x/evidence) [\#5952](https://github.com/cosmos/cosmos-sdk/pull/5952) Tendermint Consensus parameters can now be changed via parameter change proposals through `x/gov`. * (x/auth/ante) [\#6040](https://github.com/cosmos/cosmos-sdk/pull/6040) `AccountKeeper` interface used for `NewAnteHandler` and handler's decorators to add support of using custom `AccountKeeper` implementations. +* (simulation) [\#6002](https://github.com/cosmos/cosmos-sdk/pull/6002) Add randomized consensus params into simulation. ## [v0.38.3] - 2020-04-09 diff --git a/client/cmd_test.go b/client/cmd_test.go index 94de383114e6..38e51d27d98b 100644 --- a/client/cmd_test.go +++ b/client/cmd_test.go @@ -37,12 +37,12 @@ func TestValidateCmd(t *testing.T) { args []string wantErr bool }{ - {"misspelled command", []string{"commission"}, true}, // nolint: misspell + {"misspelled command", []string{"COMMISSION"}, true}, {"no command provided", []string{}, false}, - {"help flag", []string{"commission", "--help"}, false}, // nolint: misspell - {"shorthand help flag", []string{"commission", "-h"}, false}, // nolint: misspell + {"help flag", []string{"COMMISSION", "--help"}, false}, + {"shorthand help flag", []string{"COMMISSION", "-h"}, false}, {"flag only, no command provided", []string{"--gas", "1000atom"}, false}, - {"flag and misspelled command", []string{"--gas", "1000atom", "comission"}, true}, // nolint: misspell + {"flag and misspelled command", []string{"--gas", "1000atom", "COMMISSION"}, true}, } for _, tt := range tests { diff --git a/x/ibc/09-localhost/types/localhost_test.go b/x/ibc/09-localhost/types/localhost_test.go index 621a64992d43..fc3a0f6dc0b1 100644 --- a/x/ibc/09-localhost/types/localhost_test.go +++ b/x/ibc/09-localhost/types/localhost_test.go @@ -5,11 +5,12 @@ import ( "github.com/stretchr/testify/suite" + dbm "github.com/tendermint/tm-db" + "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/store/cachekv" "github.com/cosmos/cosmos-sdk/store/dbadapter" commitmenttypes "github.com/cosmos/cosmos-sdk/x/ibc/23-commitment/types" - dbm "github.com/tendermint/tm-db" ) const ( diff --git a/x/simulation/params.go b/x/simulation/params.go index 0c8accd1e28a..d8a647610176 100644 --- a/x/simulation/params.go +++ b/x/simulation/params.go @@ -1,10 +1,18 @@ package simulation import ( + "encoding/json" "fmt" "math/rand" + "github.com/tendermint/tendermint/types" + + "github.com/tendermint/go-amino" + abci "github.com/tendermint/tendermint/abci/types" + + "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/types/simulation" + stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" ) const ( @@ -142,3 +150,33 @@ func (w WeightedProposalContent) DefaultWeight() int { func (w WeightedProposalContent) ContentSimulatorFn() simulation.ContentSimulatorFn { return w.contentSimulatorFn } + +//----------------------------------------------------------------------------- +// Param change proposals + +// RandomParams returns random simulation consensus parameters, it extracts the Evidence from the Staking genesis state. +func RandomConsensusParams(r *rand.Rand, appState json.RawMessage) *abci.ConsensusParams { + cdc := amino.NewCodec() + + var genesisState map[string]json.RawMessage + cdc.UnmarshalJSON(appState, &genesisState) + + stakingGenesisState := stakingtypes.GetGenesisStateFromAppState(cdc, genesisState) + + consensusParams := &abci.ConsensusParams{ + Block: &abci.BlockParams{ + MaxBytes: int64(simulation.RandIntBetween(r, 20000000, 30000000)), + MaxGas: -1, + }, + Validator: &abci.ValidatorParams{ + PubKeyTypes: []string{types.ABCIPubKeyTypeSecp256k1, types.ABCIPubKeyTypeEd25519}, + }, + Evidence: &abci.EvidenceParams{ + MaxAgeNumBlocks: int64(stakingGenesisState.Params.UnbondingTime / AverageBlockTime), + MaxAgeDuration: stakingGenesisState.Params.UnbondingTime, + }, + } + fmt.Printf("Selected randomly generated consensus parameters:\n%s\n", codec.MustMarshalJSONIndent(cdc, consensusParams)) + + return consensusParams +} diff --git a/x/simulation/simulate.go b/x/simulation/simulate.go index 3f5100caa690..333b69f01459 100644 --- a/x/simulation/simulate.go +++ b/x/simulation/simulate.go @@ -17,6 +17,8 @@ import ( "github.com/cosmos/cosmos-sdk/types/simulation" ) +const AverageBlockTime = 6 * time.Second + // initialize the chain for the simulation func initChain( r *rand.Rand, params Params, accounts []simulation.Account, app *baseapp.BaseApp, @@ -25,9 +27,12 @@ func initChain( appState, accounts, chainID, genesisTimestamp := appStateFn(r, accounts, config) + consensusParams := RandomConsensusParams(r, appState) + req := abci.RequestInitChain{ - AppStateBytes: appState, - ChainId: chainID, + AppStateBytes: appState, + ChainId: chainID, + ConsensusParams: consensusParams, } res := app.InitChain(req) validators := newMockValidators(r, res.Validators, params) @@ -108,7 +113,7 @@ func SimulateFromSeed( // These are operations which have been queued by previous operations operationQueue := NewOperationQueue() - timeOperationQueue := []simulation.FutureOperation{} + var timeOperationQueue []simulation.FutureOperation logWriter := NewLogWriter(testingMode) diff --git a/x/staking/types/genesis.go b/x/staking/types/genesis.go index 943ab4fb31f0..21ae1aa5d1ab 100644 --- a/x/staking/types/genesis.go +++ b/x/staking/types/genesis.go @@ -1,6 +1,9 @@ package types import ( + "encoding/json" + + "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" ) @@ -37,3 +40,14 @@ func DefaultGenesisState() GenesisState { Params: DefaultParams(), } } + +// GetGenesisStateFromAppState returns x/staking GenesisState given raw application +// genesis state. +func GetGenesisStateFromAppState(cdc *codec.Codec, appState map[string]json.RawMessage) GenesisState { + var genesisState GenesisState + if appState[ModuleName] != nil { + cdc.MustUnmarshalJSON(appState[ModuleName], &genesisState) + } + + return genesisState +}