aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--cmd/evm/main.go7
-rw-r--r--cmd/evm/runner.go59
2 files changed, 39 insertions, 27 deletions
diff --git a/cmd/evm/main.go b/cmd/evm/main.go
index 1892ae3d3..a2e3b048e 100644
--- a/cmd/evm/main.go
+++ b/cmd/evm/main.go
@@ -53,7 +53,7 @@ var (
}
CodeFileFlag = cli.StringFlag{
Name: "codefile",
- Usage: "file containing EVM code",
+ Usage: "File containing EVM code. If '-' is specified, code is read from stdin ",
}
GasFlag = cli.Uint64Flag{
Name: "gas",
@@ -102,6 +102,10 @@ var (
Name: "sender",
Usage: "The transaction origin",
}
+ ReceiverFlag = cli.StringFlag{
+ Name: "receiver",
+ Usage: "The transaction receiver (execution context)",
+ }
DisableMemoryFlag = cli.BoolFlag{
Name: "nomemory",
Usage: "disable memory output",
@@ -131,6 +135,7 @@ func init() {
GenesisFlag,
MachineFlag,
SenderFlag,
+ ReceiverFlag,
DisableMemoryFlag,
DisableStackFlag,
}
diff --git a/cmd/evm/runner.go b/cmd/evm/runner.go
index 3f95a0c93..ae5678110 100644
--- a/cmd/evm/runner.go
+++ b/cmd/evm/runner.go
@@ -84,6 +84,7 @@ func runCmd(ctx *cli.Context) error {
statedb *state.StateDB
chainConfig *params.ChainConfig
sender = common.StringToAddress("sender")
+ receiver = common.StringToAddress("receiver")
)
if ctx.GlobalBool(MachineFlag.Name) {
tracer = NewJSONLogger(logconfig, os.Stdout)
@@ -104,46 +105,52 @@ func runCmd(ctx *cli.Context) error {
if ctx.GlobalString(SenderFlag.Name) != "" {
sender = common.HexToAddress(ctx.GlobalString(SenderFlag.Name))
}
-
statedb.CreateAccount(sender)
+ if ctx.GlobalString(ReceiverFlag.Name) != "" {
+ receiver = common.HexToAddress(ctx.GlobalString(ReceiverFlag.Name))
+ }
+
var (
code []byte
ret []byte
err error
)
- if fn := ctx.Args().First(); len(fn) > 0 {
+ // The '--code' or '--codefile' flag overrides code in state
+ if ctx.GlobalString(CodeFileFlag.Name) != "" {
+ var hexcode []byte
+ var err error
+ // If - is specified, it means that code comes from stdin
+ if ctx.GlobalString(CodeFileFlag.Name) == "-" {
+ //Try reading from stdin
+ if hexcode, err = ioutil.ReadAll(os.Stdin); err != nil {
+ fmt.Printf("Could not load code from stdin: %v\n", err)
+ os.Exit(1)
+ }
+ } else {
+ // Codefile with hex assembly
+ if hexcode, err = ioutil.ReadFile(ctx.GlobalString(CodeFileFlag.Name)); err != nil {
+ fmt.Printf("Could not load code from file: %v\n", err)
+ os.Exit(1)
+ }
+ }
+ code = common.Hex2Bytes(string(bytes.TrimRight(hexcode, "\n")))
+
+ } else if ctx.GlobalString(CodeFlag.Name) != "" {
+ code = common.Hex2Bytes(ctx.GlobalString(CodeFlag.Name))
+ } else if fn := ctx.Args().First(); len(fn) > 0 {
+ // EASM-file to compile
src, err := ioutil.ReadFile(fn)
if err != nil {
return err
}
-
bin, err := compiler.Compile(fn, src, false)
if err != nil {
return err
}
code = common.Hex2Bytes(bin)
- } else if ctx.GlobalString(CodeFlag.Name) != "" {
- code = common.Hex2Bytes(ctx.GlobalString(CodeFlag.Name))
- } else {
- var hexcode []byte
- if ctx.GlobalString(CodeFileFlag.Name) != "" {
- var err error
- hexcode, err = ioutil.ReadFile(ctx.GlobalString(CodeFileFlag.Name))
- if err != nil {
- fmt.Printf("Could not load code from file: %v\n", err)
- os.Exit(1)
- }
- } else {
- var err error
- hexcode, err = ioutil.ReadAll(os.Stdin)
- if err != nil {
- fmt.Printf("Could not load code from stdin: %v\n", err)
- os.Exit(1)
- }
- }
- code = common.Hex2Bytes(string(bytes.TrimRight(hexcode, "\n")))
}
+
initialGas := ctx.GlobalUint64(GasFlag.Name)
runtimeConfig := runtime.Config{
Origin: sender,
@@ -180,9 +187,9 @@ func runCmd(ctx *cli.Context) error {
input := append(code, common.Hex2Bytes(ctx.GlobalString(InputFlag.Name))...)
ret, _, leftOverGas, err = runtime.Create(input, &runtimeConfig)
} else {
- receiver := common.StringToAddress("receiver")
- statedb.SetCode(receiver, code)
-
+ if len(code) > 0 {
+ statedb.SetCode(receiver, code)
+ }
ret, leftOverGas, err = runtime.Call(receiver, common.Hex2Bytes(ctx.GlobalString(InputFlag.Name)), &runtimeConfig)
}
execTime := time.Since(tstart)