Skip to content

Commit 915248c

Browse files
jwasingerholiman
andauthored
cmd/evm: don't reuse state between iterations, show errors (ethereum#30780)
Reusing state between benchmark iterations resulted in inconsistent results across runs, which surfaced in ethereum#30778 . If these errors are triggered again, they will now trigger panic. --------- Co-authored-by: Martin HS <[email protected]>
1 parent a11b4be commit 915248c

File tree

1 file changed

+14
-9
lines changed

1 file changed

+14
-9
lines changed

cmd/evm/runner.go

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -84,19 +84,20 @@ type execStats struct {
8484

8585
func timedExec(bench bool, execFunc func() ([]byte, uint64, error)) ([]byte, execStats, error) {
8686
if bench {
87+
testing.Init()
8788
// Do one warm-up run
8889
output, gasUsed, err := execFunc()
8990
result := testing.Benchmark(func(b *testing.B) {
9091
for i := 0; i < b.N; i++ {
9192
haveOutput, haveGasUsed, haveErr := execFunc()
9293
if !bytes.Equal(haveOutput, output) {
93-
b.Fatalf("output differs, have\n%x\nwant%x\n", haveOutput, output)
94+
panic(fmt.Sprintf("output differs\nhave %x\nwant %x\n", haveOutput, output))
9495
}
9596
if haveGasUsed != gasUsed {
96-
b.Fatalf("gas differs, have %v want%v", haveGasUsed, gasUsed)
97+
panic(fmt.Sprintf("gas differs, have %v want %v", haveGasUsed, gasUsed))
9798
}
9899
if haveErr != err {
99-
b.Fatalf("err differs, have %v want%v", haveErr, err)
100+
panic(fmt.Sprintf("err differs, have %v want %v", haveErr, err))
100101
}
101102
}
102103
})
@@ -137,7 +138,7 @@ func runCmd(ctx *cli.Context) error {
137138
var (
138139
tracer *tracing.Hooks
139140
debugLogger *logger.StructLogger
140-
statedb *state.StateDB
141+
prestate *state.StateDB
141142
chainConfig *params.ChainConfig
142143
sender = common.BytesToAddress([]byte("sender"))
143144
receiver = common.BytesToAddress([]byte("receiver"))
@@ -174,7 +175,7 @@ func runCmd(ctx *cli.Context) error {
174175
defer triedb.Close()
175176
genesis := genesisConfig.MustCommit(db, triedb)
176177
sdb := state.NewDatabase(triedb, nil)
177-
statedb, _ = state.New(genesis.Root(), sdb)
178+
prestate, _ = state.New(genesis.Root(), sdb)
178179
chainConfig = genesisConfig.Config
179180

180181
if ctx.String(SenderFlag.Name) != "" {
@@ -231,7 +232,7 @@ func runCmd(ctx *cli.Context) error {
231232
}
232233
runtimeConfig := runtime.Config{
233234
Origin: sender,
234-
State: statedb,
235+
State: prestate,
235236
GasLimit: initialGas,
236237
GasPrice: flags.GlobalBig(ctx, PriceFlag.Name),
237238
Value: flags.GlobalBig(ctx, ValueFlag.Name),
@@ -274,14 +275,18 @@ func runCmd(ctx *cli.Context) error {
274275
if ctx.Bool(CreateFlag.Name) {
275276
input = append(code, input...)
276277
execFunc = func() ([]byte, uint64, error) {
278+
// don't mutate the state!
279+
runtimeConfig.State = prestate.Copy()
277280
output, _, gasLeft, err := runtime.Create(input, &runtimeConfig)
278281
return output, gasLeft, err
279282
}
280283
} else {
281284
if len(code) > 0 {
282-
statedb.SetCode(receiver, code)
285+
prestate.SetCode(receiver, code)
283286
}
284287
execFunc = func() ([]byte, uint64, error) {
288+
// don't mutate the state!
289+
runtimeConfig.State = prestate.Copy()
285290
output, gasLeft, err := runtime.Call(receiver, input, &runtimeConfig)
286291
return output, initialGas - gasLeft, err
287292
}
@@ -291,7 +296,7 @@ func runCmd(ctx *cli.Context) error {
291296
output, stats, err := timedExec(bench, execFunc)
292297

293298
if ctx.Bool(DumpFlag.Name) {
294-
root, err := statedb.Commit(genesisConfig.Number, true)
299+
root, err := runtimeConfig.State.Commit(genesisConfig.Number, true)
295300
if err != nil {
296301
fmt.Printf("Failed to commit changes %v\n", err)
297302
return err
@@ -310,7 +315,7 @@ func runCmd(ctx *cli.Context) error {
310315
logger.WriteTrace(os.Stderr, debugLogger.StructLogs())
311316
}
312317
fmt.Fprintln(os.Stderr, "#### LOGS ####")
313-
logger.WriteLogs(os.Stderr, statedb.Logs())
318+
logger.WriteLogs(os.Stderr, runtimeConfig.State.Logs())
314319
}
315320

316321
if bench || ctx.Bool(StatDumpFlag.Name) {

0 commit comments

Comments
 (0)