core/vm: Add support for --vm.ewasm option for EVMC

This commit is contained in:
Paweł Bylica 2018-10-18 19:50:59 +02:00
parent abe7715f1f
commit 651c2a9b89
No known key found for this signature in database
GPG key ID: 7A0C037434FE77EF
2 changed files with 22 additions and 19 deletions

View file

@ -19,6 +19,7 @@ package vm
import ( import (
"math/big" "math/big"
"os" "os"
"strings"
"sync/atomic" "sync/atomic"
"time" "time"
@ -141,23 +142,21 @@ func NewEVM(ctx Context, statedb StateDB, chainConfig *params.ChainConfig, vmCon
} }
if chainConfig.IsEWASM(ctx.BlockNumber) { if chainConfig.IsEWASM(ctx.BlockNumber) {
// to be implemented by EVM-C and Wagon PRs. if vmConfig.EWASMInterpreter != "" {
// if vmConfig.EWASMInterpreter != "" { extIntOpts := strings.Split(vmConfig.EWASMInterpreter, ":")
// extIntOpts := strings.Split(vmConfig.EWASMInterpreter, ":") path := extIntOpts[0]
// path := extIntOpts[0] options := []string{}
// options := []string{} if len(extIntOpts) > 1 {
// if len(extIntOpts) > 1 { options = extIntOpts[1:]
// options = extIntOpts[1..] }
// } evm.interpreters = append(evm.interpreters, NewEVMC(path, options, evm))
// evm.interpreters = append(evm.interpreters, NewEVMVCInterpreter(evm, vmConfig, options)) } else {
// } else {
// evm.interpreters = append(evm.interpreters, NewEWASMInterpreter(evm, vmConfig))
// }
panic("No supported ewasm interpreter yet.") panic("No supported ewasm interpreter yet.")
} }
}
if len(vmConfig.EVMInterpreter) != 0 || len(os.Getenv("EVMC_PATH")) != 0 { if len(vmConfig.EVMInterpreter) != 0 || len(os.Getenv("EVMC_PATH")) != 0 {
evm.interpreters = append(evm.interpreters, NewEVMC(vmConfig.EVMInterpreter, evm)) evm.interpreters = append(evm.interpreters, NewEVMC(vmConfig.EVMInterpreter, nil, evm))
} }
// vmConfig.EVMInterpreter will be used by EVM-C, it won't be checked here // vmConfig.EVMInterpreter will be used by EVM-C, it won't be checked here

View file

@ -42,7 +42,7 @@ var (
evmcInstance *evmc.Instance evmcInstance *evmc.Instance
) )
func createVM(path string) *evmc.Instance { func createVM(path string, options []string) *evmc.Instance {
createMu.Lock() createMu.Lock()
defer createMu.Unlock() defer createMu.Unlock()
@ -62,7 +62,10 @@ func createVM(path string) *evmc.Instance {
} }
log.Info("EVMC VM loaded", "name", evmcInstance.Name(), "version", evmcInstance.Version(), "path", vmPath) log.Info("EVMC VM loaded", "name", evmcInstance.Name(), "version", evmcInstance.Version(), "path", vmPath)
for _, option := range strings.Split(os.Getenv("EVMC_OPTIONS"), " ") { opts := strings.Split(os.Getenv("EVMC_OPTIONS"), " ")
opts = append(opts, options...)
for _, option := range opts {
if idx := strings.Index(option, "="); idx >= 0 { if idx := strings.Index(option, "="); idx >= 0 {
name := option[:idx] name := option[:idx]
value := option[idx+1:] value := option[idx+1:]
@ -78,8 +81,8 @@ func createVM(path string) *evmc.Instance {
return evmcInstance return evmcInstance
} }
func NewEVMC(path string, env *EVM) *EVMC { func NewEVMC(path string, options []string, env *EVM) *EVMC {
return &EVMC{createVM(path), env, false} return &EVMC{createVM(path, options), env, false}
} }
// Implements evmc.HostContext interface. // Implements evmc.HostContext interface.
@ -309,7 +312,8 @@ func (evm *EVMC) Run(contract *Contract, input []byte, readOnly bool) (ret []byt
func (evm *EVMC) CanRun(code []byte) bool { func (evm *EVMC) CanRun(code []byte) bool {
cap := evmc.CapabilityEVM1 cap := evmc.CapabilityEVM1
if (bytes.Equal(code[0:4], []byte("\x00asm"))) { wasmPreamble := []byte("\x00asm\x01\x00\x00\x00")
if (bytes.HasPrefix(code, wasmPreamble)) {
cap = evmc.CapabilityEWASM cap = evmc.CapabilityEWASM
} }
// FIXME: Optimize. Access capabilities once. // FIXME: Optimize. Access capabilities once.