-
Notifications
You must be signed in to change notification settings - Fork 678
/
sim_test.go
150 lines (123 loc) · 4.09 KB
/
sim_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
package gaia_test
import (
"encoding/json"
"fmt"
"math/rand"
"os"
"testing"
"github.com/stretchr/testify/require"
dbm "github.com/cosmos/cosmos-db"
"cosmossdk.io/log"
"cosmossdk.io/math"
"cosmossdk.io/store"
"github.com/cosmos/cosmos-sdk/baseapp"
"github.com/cosmos/cosmos-sdk/client/flags"
"github.com/cosmos/cosmos-sdk/server"
simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims"
simulation2 "github.com/cosmos/cosmos-sdk/types/simulation"
"github.com/cosmos/cosmos-sdk/x/simulation"
simcli "github.com/cosmos/cosmos-sdk/x/simulation/client/cli"
"github.com/cosmos/gaia/v20/ante"
gaia "github.com/cosmos/gaia/v20/app"
// "github.com/cosmos/gaia/v11/app/helpers"
// "github.com/cosmos/gaia/v11/app/params"
"github.com/cosmos/gaia/v20/app/sim"
)
// AppChainID hardcoded chainID for simulation
const AppChainID = "gaia-app"
func init() {
sim.GetSimulatorFlags()
}
// interBlockCacheOpt returns a BaseApp option function that sets the persistent
// inter-block write-through cache.
func interBlockCacheOpt() func(*baseapp.BaseApp) {
return baseapp.SetInterBlockCache(store.NewCommitKVStoreCacheManager())
}
// TODO: Make another test for the fuzzer itself, which just has noOp txs
// and doesn't depend on the application.
func TestAppStateDeterminism(t *testing.T) {
if !sim.FlagEnabledValue {
t.Skip("skipping application simulation")
}
// since we can't provide tx fees to SimulateFromSeed(), we must switch off the feemarket
ante.UseFeeMarketDecorator = false
config := sim.NewConfigFromFlags()
config.InitialBlockHeight = 1
config.ExportParamsPath = ""
config.OnOperation = false
config.AllInvariants = false
config.ChainID = AppChainID
numSeeds := 3
numTimesToRunPerSeed := 5
// We will be overriding the random seed and just run a single simulation on the provided seed value
if config.Seed != simcli.DefaultSeedValue {
numSeeds = 1
}
appHashList := make([]json.RawMessage, numTimesToRunPerSeed)
appOptions := make(simtestutil.AppOptionsMap, 0)
appOptions[server.FlagInvCheckPeriod] = sim.FlagPeriodValue
for i := 0; i < numSeeds; i++ {
if config.Seed == simcli.DefaultSeedValue {
config.Seed = rand.Int63()
}
fmt.Println("config.Seed: ", config.Seed)
for j := 0; j < numTimesToRunPerSeed; j++ {
var logger log.Logger
if sim.FlagVerboseValue {
logger = log.NewTestLogger(t)
} else {
logger = log.NewNopLogger()
}
db := dbm.NewMemDB()
dir, err := os.MkdirTemp("", "gaia-simulation")
require.NoError(t, err)
appOptions[flags.FlagHome] = dir
app := gaia.NewGaiaApp(
logger,
db,
nil,
true,
map[int64]bool{},
dir,
appOptions,
emptyWasmOption,
interBlockCacheOpt(),
baseapp.SetChainID(AppChainID),
)
// NOTE: setting to zero to avoid failing the simulation
// due to the minimum staked tokens required to submit a vote
ante.SetMinStakedTokens(math.LegacyZeroDec())
// NOTE: setting to zero to avoid failing the simulation
// gaia ante allows only certain proposals to be expedited - the simulation doesn't know about this
ante.SetExpeditedProposalsEnabled(false)
fmt.Printf(
"running non-determinism simulation; seed %d: %d/%d, attempt: %d/%d\n",
config.Seed, i+1, numSeeds, j+1, numTimesToRunPerSeed,
)
blockedAddresses := app.BlockedModuleAccountAddrs(app.ModuleAccountAddrs())
_, _, err = simulation.SimulateFromSeed(
t,
os.Stdout,
app.BaseApp,
simtestutil.AppStateFn(app.AppCodec(), app.SimulationManager(), app.ModuleBasics.DefaultGenesis(app.AppCodec())),
simulation2.RandomAccounts, // Replace with own random account function if using keys other than secp256k1
simtestutil.SimulationOperations(app, app.AppCodec(), config),
blockedAddresses,
config,
app.AppCodec(),
)
require.NoError(t, err)
if config.Commit {
sim.PrintStats(db)
}
appHash := app.LastCommitID().Hash
appHashList[j] = appHash
if j != 0 {
require.Equal(
t, string(appHashList[0]), string(appHashList[j]),
"non-determinism in seed %d: %d/%d, attempt: %d/%d\n", config.Seed, i+1, numSeeds, j+1, numTimesToRunPerSeed,
)
}
}
}
}