Documentation ¶
Overview ¶
Package simapp implements a full fledged Cosmos SDK application used for executing simulation test suites.
Simulation App ¶
The SimApp type defines an application used for running extensive simulation testing suites. It contains all core modules, including governance, staking, slashing, and distribution.
Simulation is executed with various inputs including the number of blocks to simulate, the block size, whether the app should commit or not, the invariant checking period, and a seed which is used as a source of pseudo-randomness.
In addition to the various inputs, simulation runs mainly in three modes:
1. Completely random where the initial state, module parameters and simulation parameters are pseudo-randomly generated.
2. From a genesis file where the initial state and the module parameters are defined. This mode is helpful for running simulations on a known state such as a live network export where a new (mostly likely breaking) version of the application needs to be tested.
3. From a params file where the initial state is pseudo-randomly generated but the module and simulation parameters can be provided manually. This allows for a more controlled and deterministic simulation setup while allowing the state space to still be pseudo-randomly simulated.
The simulation test suite also supports testing determinism and import/export functionality.
Randomness ¶
Currently, simulation uses a single seed (integer) as a source for a PRNG by which all random operations are executed from. Any call to the PRNG changes all future operations as the internal state of the PRNG is modified. For example, if a new message type is created and needs to be simulated, the new introduced PRNG call will change all subsequent operations.
This may can often be problematic when testing fixes to simulation faults. One current solution to this is to use a params file as mentioned above. In the future the simulation suite is expected to support a series of PRNGs that can be used uniquely per module and simulation component so that they will not effect each others state execution outcome.
Usage ¶
To execute a completely pseudo-random simulation:
$ go test -mod=readonly github.com/osiz-blockchainapp/euro-sdk/simapp \ -run=TestFullAppSimulation \ -Enabled=true \ -NumBlocks=100 \ -BlockSize=200 \ -Commit=true \ -Seed=99 \ -Period=5 \ -v -timeout 24h
To execute simulation from a genesis file:
$ go test -mod=readonly github.com/osiz-blockchainapp/euro-sdk/simapp \ -run=TestFullAppSimulation \ -Enabled=true \ -NumBlocks=100 \ -BlockSize=200 \ -Commit=true \ -Seed=99 \ -Period=5 \ -Genesis=/path/to/genesis.json \ -v -timeout 24h
To execute simulation from a simulation params file:
$ go test -mod=readonly github.com/osiz-blockchainapp/euro-sdk/simapp \ -run=TestFullAppSimulation \ -Enabled=true \ -NumBlocks=100 \ -BlockSize=200 \ -Commit=true \ -Seed=99 \ -Period=5 \ -Params=/path/to/params.json \ -v -timeout 24h
To export the simulation params to a file at a given block height:
$ go test -mod=readonly github.com/osiz-blockchainapp/euro-sdk/simapp \ -run=TestFullAppSimulation \ -Enabled=true \ -NumBlocks=100 \ -BlockSize=200 \ -Commit=true \ -Seed=99 \ -Period=5 \ -ExportParamsPath=/path/to/params.json \ -ExportParamsHeight=50 \ -v -timeout 24h
To export the simulation app state (i.e genesis) to a file:
$ go test -mod=readonly github.com/osiz-blockchainapp/euro-sdk/simapp \ -run=TestFullAppSimulation \ -Enabled=true \ -NumBlocks=100 \ -BlockSize=200 \ -Commit=true \ -Seed=99 \ -Period=5 \ -ExportStatePath=/path/to/genesis.json \ v -timeout 24h
Params ¶
Params that are provided to simulation from a JSON file are used to used to set both module parameters and simulation parameters. See sim_test.go for the full set of parameters that can be provided.
nolint
Index ¶
- Constants
- Variables
- func AppStateFromGenesisFileFn(r *rand.Rand) (tmtypes.GenesisDoc, []simulation.Account)
- func DecodeAccountStore(cdcA, cdcB *codec.Codec, kvA, kvB cmn.KVPair) string
- func DecodeDistributionStore(cdcA, cdcB *codec.Codec, kvA, kvB cmn.KVPair) string
- func DecodeGovStore(cdcA, cdcB *codec.Codec, kvA, kvB cmn.KVPair) string
- func DecodeMintStore(cdcA, cdcB *codec.Codec, kvA, kvB cmn.KVPair) string
- func DecodeSlashingStore(cdcA, cdcB *codec.Codec, kvA, kvB cmn.KVPair) string
- func DecodeStakingStore(cdcA, cdcB *codec.Codec, kvA, kvB cmn.KVPair) string
- func DecodeSupplyStore(cdcA, cdcB *codec.Codec, kvA, kvB cmn.KVPair) string
- func GenAuthGenesisState(cdc *codec.Codec, r *rand.Rand, ap simulation.AppParams, ...)
- func GenBankGenesisState(cdc *codec.Codec, r *rand.Rand, ap simulation.AppParams, ...)
- func GenDistrGenesisState(cdc *codec.Codec, r *rand.Rand, ap simulation.AppParams, ...)
- func GenGenesisAccounts(cdc *codec.Codec, r *rand.Rand, accs []simulation.Account, ...)
- func GenGovGenesisState(cdc *codec.Codec, r *rand.Rand, ap simulation.AppParams, ...)
- func GenMintGenesisState(cdc *codec.Codec, r *rand.Rand, ap simulation.AppParams, ...)
- func GenSlashingGenesisState(cdc *codec.Codec, r *rand.Rand, stakingGen staking.GenesisState, ...)
- func GenStakingGenesisState(cdc *codec.Codec, r *rand.Rand, accs []simulation.Account, ...) staking.GenesisState
- func GenSupplyGenesisState(cdc *codec.Codec, amount, numInitiallyBonded, numAccs int64, ...)
- func GetSimulationLog(storeName string, cdcA, cdcB *codec.Codec, kvA, kvB cmn.KVPair) (log string)
- func MakeCodec() *codec.Codec
- type GenesisState
- type SimApp
- func (app *SimApp) BeginBlocker(ctx sdk.Context, req abci.RequestBeginBlock) abci.ResponseBeginBlock
- func (app *SimApp) EndBlocker(ctx sdk.Context, req abci.RequestEndBlock) abci.ResponseEndBlock
- func (app *SimApp) ExportAppStateAndValidators(forZeroHeight bool, jailWhiteList []string) (appState json.RawMessage, validators []tmtypes.GenesisValidator, err error)
- func (app *SimApp) InitChainer(ctx sdk.Context, req abci.RequestInitChain) abci.ResponseInitChain
- func (app *SimApp) LoadHeight(height int64) error
- func (app *SimApp) ModuleAccountAddrs() map[string]bool
Constants ¶
const ( StakePerAccount = "stake_per_account" InitiallyBondedValidators = "initially_bonded_validators" OpWeightDeductFee = "op_weight_deduct_fee" OpWeightMsgSend = "op_weight_msg_send" OpWeightSingleInputMsgMultiSend = "op_weight_single_input_msg_multisend" OpWeightMsgSetWithdrawAddress = "op_weight_msg_set_withdraw_address" OpWeightMsgWithdrawDelegationReward = "op_weight_msg_withdraw_delegation_reward" OpWeightMsgWithdrawValidatorCommission = "op_weight_msg_withdraw_validator_commission" OpWeightSubmitVotingSlashingTextProposal = "op_weight_submit_voting_slashing_text_proposal" OpWeightSubmitVotingSlashingCommunitySpendProposal = "op_weight_submit_voting_slashing_community_spend_proposal" OpWeightSubmitVotingSlashingParamChangeProposal = "op_weight_submit_voting_slashing_param_change_proposal" OpWeightMsgDeposit = "op_weight_msg_deposit" OpWeightMsgCreateValidator = "op_weight_msg_create_validator" OpWeightMsgEditValidator = "op_weight_msg_edit_validator" OpWeightMsgDelegate = "op_weight_msg_delegate" OpWeightMsgUndelegate = "op_weight_msg_undelegate" OpWeightMsgBeginRedelegate = "op_weight_msg_begin_redelegate" OpWeightMsgUnjail = "op_weight_msg_unjail" )
Simulation parameter constants
Variables ¶
var ( // default home directories for the application CLI DefaultCLIHome = os.ExpandEnv("$HOME/.simapp") // default home directories for the application daemon DefaultNodeHome = os.ExpandEnv("$HOME/.simapp") // The module BasicManager is in charge of setting up basic, // non-dependant module elements, such as codec registration // and genesis verification. ModuleBasics = module.NewBasicManager( genaccounts.AppModuleBasic{}, genutil.AppModuleBasic{}, auth.AppModuleBasic{}, bank.AppModuleBasic{}, staking.AppModuleBasic{}, mint.AppModuleBasic{}, distr.AppModuleBasic{}, gov.NewAppModuleBasic(paramsclient.ProposalHandler, distr.ProposalHandler), params.AppModuleBasic{}, crisis.AppModuleBasic{}, slashing.AppModuleBasic{}, supply.AppModuleBasic{}, ) )
Functions ¶
func AppStateFromGenesisFileFn ¶
func AppStateFromGenesisFileFn(r *rand.Rand) (tmtypes.GenesisDoc, []simulation.Account)
AppStateFromGenesisFileFn util function to generate the genesis AppState from a genesis.json file
func DecodeAccountStore ¶
DecodeAccountStore unmarshals the KVPair's Value to the corresponding auth type
func DecodeDistributionStore ¶
DecodeDistributionStore unmarshals the KVPair's Value to the corresponding distribution type
func DecodeGovStore ¶
DecodeGovStore unmarshals the KVPair's Value to the corresponding gov type
func DecodeMintStore ¶
DecodeMintStore unmarshals the KVPair's Value to the corresponding mint type
func DecodeSlashingStore ¶
DecodeSlashingStore unmarshals the KVPair's Value to the corresponding slashing type
func DecodeStakingStore ¶
DecodeStakingStore unmarshals the KVPair's Value to the corresponding staking type
func DecodeSupplyStore ¶
DecodeSupplyStore unmarshals the KVPair's Value to the corresponding supply type
func GenAuthGenesisState ¶
func GenAuthGenesisState(cdc *codec.Codec, r *rand.Rand, ap simulation.AppParams, genesisState map[string]json.RawMessage)
GenAuthGenesisState generates a random GenesisState for auth
func GenBankGenesisState ¶
func GenBankGenesisState(cdc *codec.Codec, r *rand.Rand, ap simulation.AppParams, genesisState map[string]json.RawMessage)
GenBankGenesisState generates a random GenesisState for bank
func GenDistrGenesisState ¶
func GenDistrGenesisState(cdc *codec.Codec, r *rand.Rand, ap simulation.AppParams, genesisState map[string]json.RawMessage)
GenDistrGenesisState generates a random GenesisState for distribution
func GenGenesisAccounts ¶
func GenGenesisAccounts( cdc *codec.Codec, r *rand.Rand, accs []simulation.Account, genesisTimestamp time.Time, amount, numInitiallyBonded int64, genesisState map[string]json.RawMessage, )
GenGenesisAccounts generates a random GenesisState for the genesis accounts
func GenGovGenesisState ¶
func GenGovGenesisState(cdc *codec.Codec, r *rand.Rand, ap simulation.AppParams, genesisState map[string]json.RawMessage)
GenGovGenesisState generates a random GenesisState for gov
func GenMintGenesisState ¶
func GenMintGenesisState(cdc *codec.Codec, r *rand.Rand, ap simulation.AppParams, genesisState map[string]json.RawMessage)
GenMintGenesisState generates a random GenesisState for mint
func GenSlashingGenesisState ¶
func GenSlashingGenesisState( cdc *codec.Codec, r *rand.Rand, stakingGen staking.GenesisState, ap simulation.AppParams, genesisState map[string]json.RawMessage, )
GenSlashingGenesisState generates a random GenesisState for slashing
func GenStakingGenesisState ¶
func GenStakingGenesisState( cdc *codec.Codec, r *rand.Rand, accs []simulation.Account, amount, numAccs, numInitiallyBonded int64, ap simulation.AppParams, genesisState map[string]json.RawMessage, ) staking.GenesisState
GenStakingGenesisState generates a random GenesisState for staking
func GenSupplyGenesisState ¶
func GenSupplyGenesisState(cdc *codec.Codec, amount, numInitiallyBonded, numAccs int64, genesisState map[string]json.RawMessage)
GenSupplyGenesisState generates a random GenesisState for supply
func GetSimulationLog ¶
GetSimulationLog unmarshals the KVPair's Value to the corresponding type based on the each's module store key and the prefix bytes of the KVPair's key.
Types ¶
type GenesisState ¶
type GenesisState map[string]json.RawMessage
The genesis state of the blockchain is represented here as a map of raw json messages key'd by a identifier string. The identifier is used to determine which module genesis information belongs to so it may be appropriately routed during init chain. Within this application default genesis information is retrieved from the ModuleBasicManager which populates json from each BasicModule object provided to it during init.
func NewDefaultGenesisState ¶
func NewDefaultGenesisState() GenesisState
NewDefaultGenesisState generates the default state for the application.
type SimApp ¶
Extended ABCI application
func NewSimApp ¶
func NewSimApp( logger log.Logger, db dbm.DB, traceStore io.Writer, loadLatest bool, invCheckPeriod uint, baseAppOptions ...func(*bam.BaseApp), ) *SimApp
NewSimApp returns a reference to an initialized SimApp.
func NewSimAppUNSAFE ¶
func NewSimAppUNSAFE(logger log.Logger, db dbm.DB, traceStore io.Writer, loadLatest bool, invCheckPeriod uint, baseAppOptions ...func(*baseapp.BaseApp), ) (gapp *SimApp, keyMain, keyStaking *sdk.KVStoreKey, stakingKeeper staking.Keeper)
NewSimAppUNSAFE is used for debugging purposes only.
NOTE: to not use this function with non-test code
func (*SimApp) BeginBlocker ¶
func (app *SimApp) BeginBlocker(ctx sdk.Context, req abci.RequestBeginBlock) abci.ResponseBeginBlock
application updates every begin block
func (*SimApp) EndBlocker ¶
func (app *SimApp) EndBlocker(ctx sdk.Context, req abci.RequestEndBlock) abci.ResponseEndBlock
application updates every end block
func (*SimApp) ExportAppStateAndValidators ¶
func (app *SimApp) ExportAppStateAndValidators( forZeroHeight bool, jailWhiteList []string, ) (appState json.RawMessage, validators []tmtypes.GenesisValidator, err error)
ExportAppStateAndValidators exports the state of the application for a genesis file.
func (*SimApp) InitChainer ¶
func (app *SimApp) InitChainer(ctx sdk.Context, req abci.RequestInitChain) abci.ResponseInitChain
application update at chain initialization
func (*SimApp) LoadHeight ¶
load a particular height
func (*SimApp) ModuleAccountAddrs ¶
ModuleAccountAddrs returns all the app's module account addresses.