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:
parent
f82bc19b99
commit
550c3e9ef0
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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")
|
||||||
}
|
}
|
||||||
|
|
|
@ -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) })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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")
|
||||||
|
|
||||||
|
|
|
@ -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 (
|
||||||
|
|
|
@ -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
|
||||||
|
}
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue