@@ -84,19 +84,20 @@ type execStats struct {
8484
8585func 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\n want%x\n " , haveOutput , output )
94+ panic ( fmt . Sprintf ("output differs\n have %x\n want %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