core/vm/runtime: return tx reverted back

This commit is contained in:
rjl493456442 2017-06-16 16:19:00 +08:00
parent 24c7b58baf
commit a6e5751a9c
5 changed files with 15 additions and 15 deletions

View file

@ -174,12 +174,12 @@ func runCmd(ctx *cli.Context) error {
var leftOverGas uint64 var leftOverGas uint64
if ctx.GlobalBool(CreateFlag.Name) { if ctx.GlobalBool(CreateFlag.Name) {
input := append(code, common.Hex2Bytes(ctx.GlobalString(InputFlag.Name))...) input := append(code, common.Hex2Bytes(ctx.GlobalString(InputFlag.Name))...)
ret, _, leftOverGas, err = runtime.Create(input, &runtimeConfig) ret, _, leftOverGas, _, err = runtime.Create(input, &runtimeConfig)
} else { } else {
receiver := common.StringToAddress("receiver") receiver := common.StringToAddress("receiver")
statedb.SetCode(receiver, code) statedb.SetCode(receiver, code)
ret, leftOverGas, err = runtime.Call(receiver, common.Hex2Bytes(ctx.GlobalString(InputFlag.Name)), &runtimeConfig) ret, leftOverGas, _, err = runtime.Call(receiver, common.Hex2Bytes(ctx.GlobalString(InputFlag.Name)), &runtimeConfig)
} }
execTime := time.Since(tstart) execTime := time.Since(tstart)

View file

@ -23,7 +23,7 @@ package runtime
// This returns 1 for valid parsable/runable code, 0 // This returns 1 for valid parsable/runable code, 0
// for invalid opcode. // for invalid opcode.
func Fuzz(input []byte) int { func Fuzz(input []byte) int {
_, _, err := Execute(input, input, &Config{ _, _, _, err := Execute(input, input, &Config{
GasLimit: 3000000, GasLimit: 3000000,
}) })

View file

@ -94,7 +94,7 @@ func setDefaults(cfg *Config) {
// Executes sets up a in memory, temporarily, environment for the execution of // Executes sets up a in memory, temporarily, environment for the execution of
// the given code. It enabled the JIT by default and make sure that it's restored // the given code. It enabled the JIT by default and make sure that it's restored
// to it's original state afterwards. // to it's original state afterwards.
func Execute(code, input []byte, cfg *Config) ([]byte, *state.StateDB, error) { func Execute(code, input []byte, cfg *Config) ([]byte, *state.StateDB, bool, error) {
if cfg == nil { if cfg == nil {
cfg = new(Config) cfg = new(Config)
} }
@ -113,7 +113,7 @@ func Execute(code, input []byte, cfg *Config) ([]byte, *state.StateDB, error) {
// set the receiver's (the executing contract) code for execution. // set the receiver's (the executing contract) code for execution.
cfg.State.SetCode(address, code) cfg.State.SetCode(address, code)
// Call the code with the given configuration. // Call the code with the given configuration.
ret, _, _, err := vmenv.Call( ret, _, reverted, err := vmenv.Call(
sender, sender,
common.StringToAddress("contract"), common.StringToAddress("contract"),
input, input,
@ -121,11 +121,11 @@ func Execute(code, input []byte, cfg *Config) ([]byte, *state.StateDB, error) {
cfg.Value, cfg.Value,
) )
return ret, cfg.State, err return ret, cfg.State, reverted, err
} }
// Create executes the code using the EVM create method // Create executes the code using the EVM create method
func Create(input []byte, cfg *Config) ([]byte, common.Address, uint64, error) { func Create(input []byte, cfg *Config) ([]byte, common.Address, uint64, bool, error) {
if cfg == nil { if cfg == nil {
cfg = new(Config) cfg = new(Config)
} }
@ -141,13 +141,13 @@ func Create(input []byte, cfg *Config) ([]byte, common.Address, uint64, error) {
) )
// Call the code with the given configuration. // Call the code with the given configuration.
code, address, leftOverGas, _, err := vmenv.Create( code, address, leftOverGas, reverted, err := vmenv.Create(
sender, sender,
input, input,
cfg.GasLimit, cfg.GasLimit,
cfg.Value, cfg.Value,
) )
return code, address, leftOverGas, err return code, address, leftOverGas, reverted, err
} }
// Call executes the code given by the contract's address. It will return the // Call executes the code given by the contract's address. It will return the
@ -155,14 +155,14 @@ func Create(input []byte, cfg *Config) ([]byte, common.Address, uint64, error) {
// //
// Call, unlike Execute, requires a config and also requires the State field to // Call, unlike Execute, requires a config and also requires the State field to
// be set. // be set.
func Call(address common.Address, input []byte, cfg *Config) ([]byte, uint64, error) { func Call(address common.Address, input []byte, cfg *Config) ([]byte, uint64, bool, error) {
setDefaults(cfg) setDefaults(cfg)
vmenv := NewEnv(cfg, cfg.State) vmenv := NewEnv(cfg, cfg.State)
sender := cfg.State.GetOrNewStateObject(cfg.Origin) sender := cfg.State.GetOrNewStateObject(cfg.Origin)
// Call the code with the given configuration. // Call the code with the given configuration.
ret, leftOverGas, _, err := vmenv.Call( ret, leftOverGas, reverted, err := vmenv.Call(
sender, sender,
address, address,
input, input,
@ -170,5 +170,5 @@ func Call(address common.Address, input []byte, cfg *Config) ([]byte, uint64, er
cfg.Value, cfg.Value,
) )
return ret, leftOverGas, err return ret, leftOverGas, reverted, err
} }

View file

@ -24,7 +24,7 @@ import (
) )
func ExampleExecute() { func ExampleExecute() {
ret, _, err := runtime.Execute(common.Hex2Bytes("6060604052600a8060106000396000f360606040526008565b00"), nil, nil) ret, _, _, err := runtime.Execute(common.Hex2Bytes("6060604052600a8060106000396000f360606040526008565b00"), nil, nil)
if err != nil { if err != nil {
fmt.Println(err) fmt.Println(err)
} }

View file

@ -75,7 +75,7 @@ func TestEVM(t *testing.T) {
} }
func TestExecute(t *testing.T) { func TestExecute(t *testing.T) {
ret, _, err := Execute([]byte{ ret, _, _, err := Execute([]byte{
byte(vm.PUSH1), 10, byte(vm.PUSH1), 10,
byte(vm.PUSH1), 0, byte(vm.PUSH1), 0,
byte(vm.MSTORE), byte(vm.MSTORE),
@ -106,7 +106,7 @@ func TestCall(t *testing.T) {
byte(vm.RETURN), byte(vm.RETURN),
}) })
ret, _, err := Call(address, nil, &Config{State: state}) ret, _, _, err := Call(address, nil, &Config{State: state})
if err != nil { if err != nil {
t.Fatal("didn't expect error", err) t.Fatal("didn't expect error", err)
} }