diff --git a/cmd/ewasm/main.go b/cmd/ewasm/main.go index 05a1513179..5440c57ff2 100644 --- a/cmd/ewasm/main.go +++ b/cmd/ewasm/main.go @@ -95,13 +95,14 @@ func runCmd(ctx *cli.Context) error { // VM: vm, // } - output, err := evm.Interpreter().Run(contract, []byte(input), false) + output, leftOver, err := evm.Call(coreVM.AccountRef(callerAddr), contractAddr, input, gas, big.NewInt(0)) if err != nil { return err } - fmt.Printf("Output: %v\n", output) + fmt.Println("Output\n", output) + fmt.Println("left over gas: ", leftOver) return nil } diff --git a/core/vm/evm.go b/core/vm/evm.go index f7132ec444..fcf90f906a 100644 --- a/core/vm/evm.go +++ b/core/vm/evm.go @@ -407,7 +407,11 @@ func (evm *EVM) create(caller ContractRef, codeAndHash *codeAndHash, gas uint64, ret, err := run(evm, contract, nil, false) /* The new contract needs to be metered after it has executed the constructor */ - ret = evm.interpreter.PostContractCreation(ret) + for _, interpreter := range evm.interpreters { + if interpreter.CanRun(contract.Code) { + ret = interpreter.PostContractCreation(ret) + } + } // check whether the max code size has been exceeded maxCodeSizeExceeded := evm.ChainConfig().IsEIP158(evm.BlockNumber) && len(ret) > params.MaxCodeSize diff --git a/core/vm/ewasm.go b/core/vm/ewasm.go index acd0a9a29b..0fb93ea38e 100644 --- a/core/vm/ewasm.go +++ b/core/vm/ewasm.go @@ -110,7 +110,7 @@ func (in *InterpreterEWASM) Run(contract *Contract, input []byte, ro bool) ([]by module, err := wasm.ReadModule(bytes.NewReader(contract.Code), WrappedModuleResolver(in)) if err != nil { - return nil, fmt.Errorf("Error decoding module at address %s: %v", contract.Address(), err) + return nil, fmt.Errorf("Error decoding module at address %s: %v", contract.Address().Hex(), err) } // The module should not have any start function diff --git a/core/vm/ewasm_eei.go b/core/vm/ewasm_eei.go index b3aebc0e70..c8c10691bf 100644 --- a/core/vm/ewasm_eei.go +++ b/core/vm/ewasm_eei.go @@ -704,8 +704,11 @@ func sentinel(in *InterpreterEWASM, input []byte) ([]byte, error) { in.contract = in.meteringContract in.contract.SetCallCode(&meteringContractAddress, crypto.Keccak256Hash(meteringCode), meteringCode) in.vm = in.meteringVM - meteredCode, err := in.meteringVM.ExecCode(0) - return meteredCode.([]byte), err + var asBytes []byte + if err == nil { + asBytes = meteredCode.([]byte) + } + return asBytes, err } func create(p *exec.Process, in *InterpreterEWASM, valueOffset uint32, codeOffset uint32, length uint32, resultOffset uint32) int32 {