Skip to content

Commit a391ec8

Browse files
committed
EVMC support
1 parent 6d74d1e commit a391ec8

File tree

7 files changed

+419
-24
lines changed

7 files changed

+419
-24
lines changed

cmd/evm/runner.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,10 @@ func runCmd(ctx *cli.Context) error {
215215
},
216216
}
217217

218+
if runtimeConfig.EVMConfig.EVMInterpreter != "" {
219+
vm.InitEVMCEVM(runtimeConfig.EVMConfig.EVMInterpreter)
220+
}
221+
218222
if cpuProfilePath := ctx.GlobalString(CPUProfileFlag.Name); cpuProfilePath != "" {
219223
f, err := os.Create(cpuProfilePath)
220224
if err != nil {

cmd/utils/flags.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1539,10 +1539,12 @@ func SetEthConfig(ctx *cli.Context, stack *node.Node, cfg *eth.Config) {
15391539

15401540
if ctx.GlobalIsSet(EWASMInterpreterFlag.Name) {
15411541
cfg.EWASMInterpreter = ctx.GlobalString(EWASMInterpreterFlag.Name)
1542+
vm.InitEVMCEwasm(cfg.EWASMInterpreter)
15421543
}
15431544

15441545
if ctx.GlobalIsSet(EVMInterpreterFlag.Name) {
15451546
cfg.EVMInterpreter = ctx.GlobalString(EVMInterpreterFlag.Name)
1547+
vm.InitEVMCEVM(cfg.EVMInterpreter)
15461548
}
15471549
if ctx.GlobalIsSet(RPCGlobalGasCap.Name) {
15481550
cfg.RPCGasCap = new(big.Int).SetUint64(ctx.GlobalUint64(RPCGlobalGasCap.Name))

core/vm/evm.go

Lines changed: 22 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ import (
2222
"sync/atomic"
2323
"time"
2424

25+
"github.com/ethereum/evmc/v7/bindings/go/evmc"
26+
2527
"github.com/ethereum/go-ethereum/common"
2628
"github.com/ethereum/go-ethereum/crypto"
2729
"github.com/ethereum/go-ethereum/params"
@@ -135,33 +137,29 @@ type EVM struct {
135137
// only ever be used *once*.
136138
func NewEVM(ctx Context, statedb StateDB, chainConfig *params.ChainConfig, vmConfig Config) *EVM {
137139
evm := &EVM{
138-
Context: ctx,
139-
StateDB: statedb,
140-
vmConfig: vmConfig,
141-
chainConfig: chainConfig,
142-
chainRules: chainConfig.Rules(ctx.BlockNumber),
143-
interpreters: make([]Interpreter, 0, 1),
140+
Context: ctx,
141+
StateDB: statedb,
142+
vmConfig: vmConfig,
143+
chainConfig: chainConfig,
144+
chainRules: chainConfig.Rules(ctx.BlockNumber),
145+
// The list of interpreters, space reserved for both EVM and EWASM ones.
146+
interpreters: make([]Interpreter, 0, 2),
144147
}
145148

146149
if chainConfig.IsEWASM(ctx.BlockNumber) {
147-
// to be implemented by EVM-C and Wagon PRs.
148-
// if vmConfig.EWASMInterpreter != "" {
149-
// extIntOpts := strings.Split(vmConfig.EWASMInterpreter, ":")
150-
// path := extIntOpts[0]
151-
// options := []string{}
152-
// if len(extIntOpts) > 1 {
153-
// options = extIntOpts[1..]
154-
// }
155-
// evm.interpreters = append(evm.interpreters, NewEVMVCInterpreter(evm, vmConfig, options))
156-
// } else {
157-
// evm.interpreters = append(evm.interpreters, NewEWASMInterpreter(evm, vmConfig))
158-
// }
159-
panic("No supported ewasm interpreter yet.")
160-
}
161-
162-
// vmConfig.EVMInterpreter will be used by EVM-C, it won't be checked here
163-
// as we always want to have the built-in EVM as the failover option.
164-
evm.interpreters = append(evm.interpreters, NewEVMInterpreter(evm, vmConfig))
150+
if vmConfig.EWASMInterpreter != "" {
151+
evm.interpreters = append(evm.interpreters, &EVMC{ewasmModule, evm, evmc.CapabilityEWASM, false})
152+
} else {
153+
panic("The default ewasm interpreter not supported yet.")
154+
}
155+
}
156+
157+
if vmConfig.EVMInterpreter != "" {
158+
evm.interpreters = append(evm.interpreters, &EVMC{evmModule, evm, evmc.CapabilityEVM1, false})
159+
} else {
160+
evm.interpreters = append(evm.interpreters, NewEVMInterpreter(evm, vmConfig))
161+
}
162+
165163
evm.interpreter = evm.interpreters[0]
166164

167165
return evm

0 commit comments

Comments
 (0)