Jonathan/5988 sim params consensus 2 (#6051)

* temporal commit

* add random consensus params

* make format

* make random pass

* remove comment

* revert change

* update ub key types

* extract Evidence params from state

* extract the random parameters from state

* clean the code

* update imports!

* mispelled back

* mispelled back

* add misspelled command

* update changelog

* remove useless linter to avoid misspell

* remove function

* use tendermint constants

* update import test

* remove debug comment

* Update baseapp/baseapp.go

Co-Authored-By: Federico Kunze <31522760+fedekunze@users.noreply.github.com>

Co-authored-by: Alexander Bezobchuk <alexanderbez@users.noreply.github.com>
Co-authored-by: Federico Kunze <31522760+fedekunze@users.noreply.github.com>
This commit is contained in:
Jonathan Gimeno 2020-04-22 20:24:13 +02:00 committed by GitHub
parent f82bc19b99
commit 550c3e9ef0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 76 additions and 15 deletions

View File

@ -220,6 +220,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. * (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/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. * (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 ## [v0.38.3] - 2020-04-09

View File

@ -27,7 +27,7 @@ func (app *BaseApp) InitChain(req abci.RequestInitChain) (res abci.ResponseInitC
// done after the deliver state and context have been set as it's persisted // done after the deliver state and context have been set as it's persisted
// to state. // to state.
if req.ConsensusParams != nil { if req.ConsensusParams != nil {
app.storeConsensusParams(app.deliverState.ctx, req.ConsensusParams) app.StoreConsensusParams(app.deliverState.ctx, req.ConsensusParams)
} }
if app.initChainer == nil { if app.initChainer == nil {

View File

@ -345,7 +345,8 @@ func (app *BaseApp) GetConsensusParams(ctx sdk.Context) *abci.ConsensusParams {
return cp return cp
} }
func (app *BaseApp) storeConsensusParams(ctx sdk.Context, cp *abci.ConsensusParams) { // StoreConsensusParams sets the consensus parameters to the baseapp's param store.
func (app *BaseApp) StoreConsensusParams(ctx sdk.Context, cp *abci.ConsensusParams) {
if app.paramStore == nil { if app.paramStore == nil {
panic("cannot store consensus params with no params store set") panic("cannot store consensus params with no params store set")
} }

View File

@ -1501,16 +1501,16 @@ func TestGetMaximumBlockGas(t *testing.T) {
app.InitChain(abci.RequestInitChain{}) app.InitChain(abci.RequestInitChain{})
ctx := app.NewContext(true, abci.Header{}) ctx := app.NewContext(true, abci.Header{})
app.storeConsensusParams(ctx, &abci.ConsensusParams{Block: &abci.BlockParams{MaxGas: 0}}) app.StoreConsensusParams(ctx, &abci.ConsensusParams{Block: &abci.BlockParams{MaxGas: 0}})
require.Equal(t, uint64(0), app.getMaximumBlockGas(ctx)) require.Equal(t, uint64(0), app.getMaximumBlockGas(ctx))
app.storeConsensusParams(ctx, &abci.ConsensusParams{Block: &abci.BlockParams{MaxGas: -1}}) app.StoreConsensusParams(ctx, &abci.ConsensusParams{Block: &abci.BlockParams{MaxGas: -1}})
require.Equal(t, uint64(0), app.getMaximumBlockGas(ctx)) require.Equal(t, uint64(0), app.getMaximumBlockGas(ctx))
app.storeConsensusParams(ctx, &abci.ConsensusParams{Block: &abci.BlockParams{MaxGas: 5000000}}) app.StoreConsensusParams(ctx, &abci.ConsensusParams{Block: &abci.BlockParams{MaxGas: 5000000}})
require.Equal(t, uint64(5000000), app.getMaximumBlockGas(ctx)) require.Equal(t, uint64(5000000), app.getMaximumBlockGas(ctx))
app.storeConsensusParams(ctx, &abci.ConsensusParams{Block: &abci.BlockParams{MaxGas: -5000000}}) app.StoreConsensusParams(ctx, &abci.ConsensusParams{Block: &abci.BlockParams{MaxGas: -5000000}})
require.Panics(t, func() { app.getMaximumBlockGas(ctx) }) require.Panics(t, func() { app.getMaximumBlockGas(ctx) })
} }

View File

@ -37,12 +37,12 @@ func TestValidateCmd(t *testing.T) {
args []string args []string
wantErr bool wantErr bool
}{ }{
{"misspelled command", []string{"commission"}, true}, // nolint: misspell {"misspelled command", []string{"COMMISSION"}, true},
{"no command provided", []string{}, false}, {"no command provided", []string{}, false},
{"help flag", []string{"commission", "--help"}, false}, // nolint: misspell {"help flag", []string{"COMMISSION", "--help"}, false},
{"shorthand help flag", []string{"commission", "-h"}, false}, // nolint: misspell {"shorthand help flag", []string{"COMMISSION", "-h"}, false},
{"flag only, no command provided", []string{"--gas", "1000atom"}, 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 { for _, tt := range tests {

View File

@ -116,7 +116,7 @@ func TestAppImportExport(t *testing.T) {
fmt.Printf("exporting genesis...\n") fmt.Printf("exporting genesis...\n")
appState, _, _, err := app.ExportAppStateAndValidators(false, []string{}) appState, _, consensusParams, err := app.ExportAppStateAndValidators(false, []string{})
require.NoError(t, err) require.NoError(t, err)
fmt.Printf("importing genesis...\n") fmt.Printf("importing genesis...\n")
@ -139,6 +139,7 @@ func TestAppImportExport(t *testing.T) {
ctxA := app.NewContext(true, abci.Header{Height: app.LastBlockHeight()}) ctxA := app.NewContext(true, abci.Header{Height: app.LastBlockHeight()})
ctxB := newApp.NewContext(true, abci.Header{Height: app.LastBlockHeight()}) ctxB := newApp.NewContext(true, abci.Header{Height: app.LastBlockHeight()})
newApp.mm.InitGenesis(ctxB, app.Codec(), genesisState) newApp.mm.InitGenesis(ctxB, app.Codec(), genesisState)
newApp.StoreConsensusParams(ctxB, consensusParams)
fmt.Printf("comparing stores...\n") fmt.Printf("comparing stores...\n")

View File

@ -5,11 +5,12 @@ import (
"github.com/stretchr/testify/suite" "github.com/stretchr/testify/suite"
dbm "github.com/tendermint/tm-db"
"github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/codec"
"github.com/cosmos/cosmos-sdk/store/cachekv" "github.com/cosmos/cosmos-sdk/store/cachekv"
"github.com/cosmos/cosmos-sdk/store/dbadapter" "github.com/cosmos/cosmos-sdk/store/dbadapter"
commitmenttypes "github.com/cosmos/cosmos-sdk/x/ibc/23-commitment/types" commitmenttypes "github.com/cosmos/cosmos-sdk/x/ibc/23-commitment/types"
dbm "github.com/tendermint/tm-db"
) )
const ( const (

View File

@ -1,10 +1,18 @@
package simulation package simulation
import ( import (
"encoding/json"
"fmt" "fmt"
"math/rand" "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" "github.com/cosmos/cosmos-sdk/types/simulation"
stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types"
) )
const ( const (
@ -142,3 +150,33 @@ func (w WeightedProposalContent) DefaultWeight() int {
func (w WeightedProposalContent) ContentSimulatorFn() simulation.ContentSimulatorFn { func (w WeightedProposalContent) ContentSimulatorFn() simulation.ContentSimulatorFn {
return w.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
}

View File

@ -17,6 +17,8 @@ import (
"github.com/cosmos/cosmos-sdk/types/simulation" "github.com/cosmos/cosmos-sdk/types/simulation"
) )
const AverageBlockTime = 6 * time.Second
// initialize the chain for the simulation // initialize the chain for the simulation
func initChain( func initChain(
r *rand.Rand, params Params, accounts []simulation.Account, app *baseapp.BaseApp, 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) appState, accounts, chainID, genesisTimestamp := appStateFn(r, accounts, config)
consensusParams := RandomConsensusParams(r, appState)
req := abci.RequestInitChain{ req := abci.RequestInitChain{
AppStateBytes: appState, AppStateBytes: appState,
ChainId: chainID, ChainId: chainID,
ConsensusParams: consensusParams,
} }
res := app.InitChain(req) res := app.InitChain(req)
validators := newMockValidators(r, res.Validators, params) validators := newMockValidators(r, res.Validators, params)
@ -108,7 +113,7 @@ func SimulateFromSeed(
// These are operations which have been queued by previous operations // These are operations which have been queued by previous operations
operationQueue := NewOperationQueue() operationQueue := NewOperationQueue()
timeOperationQueue := []simulation.FutureOperation{} var timeOperationQueue []simulation.FutureOperation
logWriter := NewLogWriter(testingMode) logWriter := NewLogWriter(testingMode)

View File

@ -1,6 +1,9 @@
package types package types
import ( import (
"encoding/json"
"github.com/cosmos/cosmos-sdk/codec"
sdk "github.com/cosmos/cosmos-sdk/types" sdk "github.com/cosmos/cosmos-sdk/types"
) )
@ -37,3 +40,14 @@ func DefaultGenesisState() GenesisState {
Params: DefaultParams(), 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
}