cmd/evm: add --receiver, support code from stdin (#14873)
This commit is contained in:
parent
9facf6423d
commit
3040243042
@ -53,7 +53,7 @@ var (
|
|||||||
}
|
}
|
||||||
CodeFileFlag = cli.StringFlag{
|
CodeFileFlag = cli.StringFlag{
|
||||||
Name: "codefile",
|
Name: "codefile",
|
||||||
Usage: "file containing EVM code",
|
Usage: "File containing EVM code. If '-' is specified, code is read from stdin ",
|
||||||
}
|
}
|
||||||
GasFlag = cli.Uint64Flag{
|
GasFlag = cli.Uint64Flag{
|
||||||
Name: "gas",
|
Name: "gas",
|
||||||
@ -102,6 +102,10 @@ var (
|
|||||||
Name: "sender",
|
Name: "sender",
|
||||||
Usage: "The transaction origin",
|
Usage: "The transaction origin",
|
||||||
}
|
}
|
||||||
|
ReceiverFlag = cli.StringFlag{
|
||||||
|
Name: "receiver",
|
||||||
|
Usage: "The transaction receiver (execution context)",
|
||||||
|
}
|
||||||
DisableMemoryFlag = cli.BoolFlag{
|
DisableMemoryFlag = cli.BoolFlag{
|
||||||
Name: "nomemory",
|
Name: "nomemory",
|
||||||
Usage: "disable memory output",
|
Usage: "disable memory output",
|
||||||
@ -131,6 +135,7 @@ func init() {
|
|||||||
GenesisFlag,
|
GenesisFlag,
|
||||||
MachineFlag,
|
MachineFlag,
|
||||||
SenderFlag,
|
SenderFlag,
|
||||||
|
ReceiverFlag,
|
||||||
DisableMemoryFlag,
|
DisableMemoryFlag,
|
||||||
DisableStackFlag,
|
DisableStackFlag,
|
||||||
}
|
}
|
||||||
|
@ -84,6 +84,7 @@ func runCmd(ctx *cli.Context) error {
|
|||||||
statedb *state.StateDB
|
statedb *state.StateDB
|
||||||
chainConfig *params.ChainConfig
|
chainConfig *params.ChainConfig
|
||||||
sender = common.StringToAddress("sender")
|
sender = common.StringToAddress("sender")
|
||||||
|
receiver = common.StringToAddress("receiver")
|
||||||
)
|
)
|
||||||
if ctx.GlobalBool(MachineFlag.Name) {
|
if ctx.GlobalBool(MachineFlag.Name) {
|
||||||
tracer = NewJSONLogger(logconfig, os.Stdout)
|
tracer = NewJSONLogger(logconfig, os.Stdout)
|
||||||
@ -104,46 +105,52 @@ func runCmd(ctx *cli.Context) error {
|
|||||||
if ctx.GlobalString(SenderFlag.Name) != "" {
|
if ctx.GlobalString(SenderFlag.Name) != "" {
|
||||||
sender = common.HexToAddress(ctx.GlobalString(SenderFlag.Name))
|
sender = common.HexToAddress(ctx.GlobalString(SenderFlag.Name))
|
||||||
}
|
}
|
||||||
|
|
||||||
statedb.CreateAccount(sender)
|
statedb.CreateAccount(sender)
|
||||||
|
|
||||||
|
if ctx.GlobalString(ReceiverFlag.Name) != "" {
|
||||||
|
receiver = common.HexToAddress(ctx.GlobalString(ReceiverFlag.Name))
|
||||||
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
code []byte
|
code []byte
|
||||||
ret []byte
|
ret []byte
|
||||||
err error
|
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)
|
src, err := ioutil.ReadFile(fn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
bin, err := compiler.Compile(fn, src, false)
|
bin, err := compiler.Compile(fn, src, false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
code = common.Hex2Bytes(bin)
|
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)
|
initialGas := ctx.GlobalUint64(GasFlag.Name)
|
||||||
runtimeConfig := runtime.Config{
|
runtimeConfig := runtime.Config{
|
||||||
Origin: sender,
|
Origin: sender,
|
||||||
@ -180,9 +187,9 @@ func runCmd(ctx *cli.Context) error {
|
|||||||
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")
|
if len(code) > 0 {
|
||||||
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)
|
||||||
|
Loading…
Reference in New Issue
Block a user