@@ -84,19 +84,20 @@ type execStats struct {
84
84
85
85
func timedExec (bench bool , execFunc func () ([]byte , uint64 , error )) ([]byte , execStats , error ) {
86
86
if bench {
87
+ testing .Init ()
87
88
// Do one warm-up run
88
89
output , gasUsed , err := execFunc ()
89
90
result := testing .Benchmark (func (b * testing.B ) {
90
91
for i := 0 ; i < b .N ; i ++ {
91
92
haveOutput , haveGasUsed , haveErr := execFunc ()
92
93
if ! bytes .Equal (haveOutput , output ) {
93
- b . Fatalf ("output differs, have \n %x\n want%x\n " , haveOutput , output )
94
+ panic ( fmt . Sprintf ("output differs\n have %x\n want %x\n " , haveOutput , output ) )
94
95
}
95
96
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 ) )
97
98
}
98
99
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 ) )
100
101
}
101
102
}
102
103
})
@@ -137,7 +138,7 @@ func runCmd(ctx *cli.Context) error {
137
138
var (
138
139
tracer * tracing.Hooks
139
140
debugLogger * logger.StructLogger
140
- statedb * state.StateDB
141
+ prestate * state.StateDB
141
142
chainConfig * params.ChainConfig
142
143
sender = common .BytesToAddress ([]byte ("sender" ))
143
144
receiver = common .BytesToAddress ([]byte ("receiver" ))
@@ -174,7 +175,7 @@ func runCmd(ctx *cli.Context) error {
174
175
defer triedb .Close ()
175
176
genesis := genesisConfig .MustCommit (db , triedb )
176
177
sdb := state .NewDatabase (triedb , nil )
177
- statedb , _ = state .New (genesis .Root (), sdb )
178
+ prestate , _ = state .New (genesis .Root (), sdb )
178
179
chainConfig = genesisConfig .Config
179
180
180
181
if ctx .String (SenderFlag .Name ) != "" {
@@ -231,7 +232,7 @@ func runCmd(ctx *cli.Context) error {
231
232
}
232
233
runtimeConfig := runtime.Config {
233
234
Origin : sender ,
234
- State : statedb ,
235
+ State : prestate ,
235
236
GasLimit : initialGas ,
236
237
GasPrice : flags .GlobalBig (ctx , PriceFlag .Name ),
237
238
Value : flags .GlobalBig (ctx , ValueFlag .Name ),
@@ -274,14 +275,18 @@ func runCmd(ctx *cli.Context) error {
274
275
if ctx .Bool (CreateFlag .Name ) {
275
276
input = append (code , input ... )
276
277
execFunc = func () ([]byte , uint64 , error ) {
278
+ // don't mutate the state!
279
+ runtimeConfig .State = prestate .Copy ()
277
280
output , _ , gasLeft , err := runtime .Create (input , & runtimeConfig )
278
281
return output , gasLeft , err
279
282
}
280
283
} else {
281
284
if len (code ) > 0 {
282
- statedb .SetCode (receiver , code )
285
+ prestate .SetCode (receiver , code )
283
286
}
284
287
execFunc = func () ([]byte , uint64 , error ) {
288
+ // don't mutate the state!
289
+ runtimeConfig .State = prestate .Copy ()
285
290
output , gasLeft , err := runtime .Call (receiver , input , & runtimeConfig )
286
291
return output , initialGas - gasLeft , err
287
292
}
@@ -291,7 +296,7 @@ func runCmd(ctx *cli.Context) error {
291
296
output , stats , err := timedExec (bench , execFunc )
292
297
293
298
if ctx .Bool (DumpFlag .Name ) {
294
- root , err := statedb .Commit (genesisConfig .Number , true )
299
+ root , err := runtimeConfig . State .Commit (genesisConfig .Number , true )
295
300
if err != nil {
296
301
fmt .Printf ("Failed to commit changes %v\n " , err )
297
302
return err
@@ -310,7 +315,7 @@ func runCmd(ctx *cli.Context) error {
310
315
logger .WriteTrace (os .Stderr , debugLogger .StructLogs ())
311
316
}
312
317
fmt .Fprintln (os .Stderr , "#### LOGS ####" )
313
- logger .WriteLogs (os .Stderr , statedb .Logs ())
318
+ logger .WriteLogs (os .Stderr , runtimeConfig . State .Logs ())
314
319
}
315
320
316
321
if bench || ctx .Bool (StatDumpFlag .Name ) {
0 commit comments