Skip to content

Commit be29e41

Browse files
obscurenkaralabe
authored andcommitted
[release/1.4.7] cmd/evm: added --create flag indicating the exec code is to be created
This fixes an issue if you wanted to test out code deployment rather than running a piece of code with an argument. This solves it by adding a --create flag that indicates the Create function should be used rather than the Call function. This also adds a statedb.commit call so that the proper state can be dumped when requested using the --dump flag. (cherry picked from commit e5165ae)
1 parent 4796593 commit be29e41

File tree

1 file changed

+34
-11
lines changed

1 file changed

+34
-11
lines changed

cmd/evm/main.go

Lines changed: 34 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -84,11 +84,16 @@ var (
8484
Name: "verbosity",
8585
Usage: "sets the verbosity level",
8686
}
87+
CreateFlag = cli.BoolFlag{
88+
Name: "create",
89+
Usage: "indicates the action should be create rather than call",
90+
}
8791
)
8892

8993
func init() {
9094
app = utils.NewApp("0.2", "the evm command line interface")
9195
app.Flags = []cli.Flag{
96+
CreateFlag,
9297
DebugFlag,
9398
VerbosityFlag,
9499
ForceJitFlag,
@@ -111,8 +116,6 @@ func run(ctx *cli.Context) error {
111116
db, _ := ethdb.NewMemDatabase()
112117
statedb, _ := state.New(common.Hash{}, db)
113118
sender := statedb.CreateAccount(common.StringToAddress("sender"))
114-
receiver := statedb.CreateAccount(common.StringToAddress("receiver"))
115-
receiver.SetCode(common.Hex2Bytes(ctx.GlobalString(CodeFlag.Name)))
116119

117120
vmenv := NewEnv(statedb, common.StringToAddress("evmuser"), common.Big(ctx.GlobalString(ValueFlag.Name)), vm.Config{
118121
Debug: ctx.GlobalBool(DebugFlag.Name),
@@ -121,17 +124,37 @@ func run(ctx *cli.Context) error {
121124
})
122125

123126
tstart := time.Now()
124-
ret, e := vmenv.Call(
125-
sender,
126-
receiver.Address(),
127-
common.Hex2Bytes(ctx.GlobalString(InputFlag.Name)),
128-
common.Big(ctx.GlobalString(GasFlag.Name)),
129-
common.Big(ctx.GlobalString(PriceFlag.Name)),
130-
common.Big(ctx.GlobalString(ValueFlag.Name)),
127+
128+
var (
129+
ret []byte
130+
err error
131131
)
132+
133+
if ctx.GlobalBool(CreateFlag.Name) {
134+
input := append(common.Hex2Bytes(ctx.GlobalString(CodeFlag.Name)), common.Hex2Bytes(ctx.GlobalString(InputFlag.Name))...)
135+
ret, _, err = vmenv.Create(
136+
sender,
137+
input,
138+
common.Big(ctx.GlobalString(GasFlag.Name)),
139+
common.Big(ctx.GlobalString(PriceFlag.Name)),
140+
common.Big(ctx.GlobalString(ValueFlag.Name)),
141+
)
142+
} else {
143+
receiver := statedb.CreateAccount(common.StringToAddress("receiver"))
144+
receiver.SetCode(common.Hex2Bytes(ctx.GlobalString(CodeFlag.Name)))
145+
ret, err = vmenv.Call(
146+
sender,
147+
receiver.Address(),
148+
common.Hex2Bytes(ctx.GlobalString(InputFlag.Name)),
149+
common.Big(ctx.GlobalString(GasFlag.Name)),
150+
common.Big(ctx.GlobalString(PriceFlag.Name)),
151+
common.Big(ctx.GlobalString(ValueFlag.Name)),
152+
)
153+
}
132154
vmdone := time.Since(tstart)
133155

134156
if ctx.GlobalBool(DumpFlag.Name) {
157+
statedb.Commit()
135158
fmt.Println(string(statedb.Dump()))
136159
}
137160
vm.StdErrFormat(vmenv.StructLogs())
@@ -150,8 +173,8 @@ num gc: %d
150173
}
151174

152175
fmt.Printf("OUT: 0x%x", ret)
153-
if e != nil {
154-
fmt.Printf(" error: %v", e)
176+
if err != nil {
177+
fmt.Printf(" error: %v", err)
155178
}
156179
fmt.Println()
157180
return nil

0 commit comments

Comments
 (0)