core/vm: fix metering contract support

Still some issues for when the creation tx fails
This commit is contained in:
Guillaume Ballet 2018-10-20 17:35:06 +02:00
parent a59a081e4c
commit b2482f5a4a
4 changed files with 14 additions and 6 deletions

View file

@ -95,13 +95,14 @@ func runCmd(ctx *cli.Context) error {
// VM: vm, // 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 { if err != nil {
return err return err
} }
fmt.Printf("Output: %v\n", output) fmt.Println("Output\n", output)
fmt.Println("left over gas: ", leftOver)
return nil return nil
} }

View file

@ -407,7 +407,11 @@ func (evm *EVM) create(caller ContractRef, codeAndHash *codeAndHash, gas uint64,
ret, err := run(evm, contract, nil, false) ret, err := run(evm, contract, nil, false)
/* The new contract needs to be metered after it has executed the constructor */ /* 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 // check whether the max code size has been exceeded
maxCodeSizeExceeded := evm.ChainConfig().IsEIP158(evm.BlockNumber) && len(ret) > params.MaxCodeSize maxCodeSizeExceeded := evm.ChainConfig().IsEIP158(evm.BlockNumber) && len(ret) > params.MaxCodeSize

View file

@ -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)) module, err := wasm.ReadModule(bytes.NewReader(contract.Code), WrappedModuleResolver(in))
if err != nil { 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 // The module should not have any start function

View file

@ -704,8 +704,11 @@ func sentinel(in *InterpreterEWASM, input []byte) ([]byte, error) {
in.contract = in.meteringContract in.contract = in.meteringContract
in.contract.SetCallCode(&meteringContractAddress, crypto.Keccak256Hash(meteringCode), meteringCode) in.contract.SetCallCode(&meteringContractAddress, crypto.Keccak256Hash(meteringCode), meteringCode)
in.vm = in.meteringVM in.vm = in.meteringVM
meteredCode, err := in.meteringVM.ExecCode(0) var asBytes []byte
return meteredCode.([]byte), err 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 { func create(p *exec.Process, in *InterpreterEWASM, valueOffset uint32, codeOffset uint32, length uint32, resultOffset uint32) int32 {