diff --git a/cmd/geth/main.go b/cmd/geth/main.go index edf2a557a7..0a4367d5bc 100644 --- a/cmd/geth/main.go +++ b/cmd/geth/main.go @@ -112,6 +112,7 @@ var ( utils.TestnetFlag, utils.RinkebyFlag, utils.VMEnableDebugFlag, + utils.EVMCPathFlag, utils.NetworkIdFlag, utils.RPCCORSDomainFlag, utils.RPCVirtualHostsFlag, diff --git a/cmd/geth/usage.go b/cmd/geth/usage.go index d934c6b021..3dc4bc4c27 100644 --- a/cmd/geth/usage.go +++ b/cmd/geth/usage.go @@ -201,6 +201,7 @@ var AppHelpFlagGroups = []flagGroup{ Name: "VIRTUAL MACHINE", Flags: []cli.Flag{ utils.VMEnableDebugFlag, + utils.EVMCPathFlag, }, }, { diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go index 41a1ac35fe..e30bd4540b 100644 --- a/cmd/utils/flags.go +++ b/cmd/utils/flags.go @@ -355,6 +355,11 @@ var ( Name: "vmdebug", Usage: "Record information useful for VM and contract debugging", } + EVMCPathFlag = cli.StringFlag{ + Name: "vm", + Usage: "Path to EVMC compatible VM plugin", + } + // Logging and debug settings EthStatsURLFlag = cli.StringFlag{ Name: "ethstats", @@ -1070,6 +1075,9 @@ func SetEthConfig(ctx *cli.Context, stack *node.Node, cfg *eth.Config) { // TODO(fjl): force-enable this in --dev mode cfg.EnablePreimageRecording = ctx.GlobalBool(VMEnableDebugFlag.Name) } + if ctx.GlobalIsSet(EVMCPathFlag.Name) { + cfg.EVMCPath = ctx.GlobalString(EVMCPathFlag.Name) + } // Override any default configs for hard coded networks. switch { @@ -1250,7 +1258,7 @@ func MakeChain(ctx *cli.Context, stack *node.Node) (chain *core.BlockChain, chai if ctx.GlobalIsSet(CacheFlag.Name) || ctx.GlobalIsSet(CacheGCFlag.Name) { cache.TrieNodeLimit = ctx.GlobalInt(CacheFlag.Name) * ctx.GlobalInt(CacheGCFlag.Name) / 100 } - vmcfg := vm.Config{EnablePreimageRecording: ctx.GlobalBool(VMEnableDebugFlag.Name)} + vmcfg := vm.Config{EnablePreimageRecording: ctx.GlobalBool(VMEnableDebugFlag.Name), EVMCPath: ctx.GlobalString(EVMCPathFlag.Name)} chain, err = core.NewBlockChain(chainDb, cache, config, engine, vmcfg) if err != nil { Fatalf("Can't create BlockChain: %v", err) diff --git a/core/vm/interpreter.go b/core/vm/interpreter.go index 7090e0261f..0cf31df366 100644 --- a/core/vm/interpreter.go +++ b/core/vm/interpreter.go @@ -39,6 +39,9 @@ type Config struct { // may be left uninitialised and will be set to the default // table. JumpTable [256]operation + + // Path to EVMC VM module + EVMCPath string } // Interpreter is used to run Ethereum based contracts and will utilise the diff --git a/eth/backend.go b/eth/backend.go index a18abdfb56..5055387287 100644 --- a/eth/backend.go +++ b/eth/backend.go @@ -143,7 +143,7 @@ func New(ctx *node.ServiceContext, config *Config) (*Ethereum, error) { rawdb.WriteDatabaseVersion(chainDb, core.BlockChainVersion) } var ( - vmConfig = vm.Config{EnablePreimageRecording: config.EnablePreimageRecording} + vmConfig = vm.Config{EnablePreimageRecording: config.EnablePreimageRecording, EVMCPath: config.EVMCPath} cacheConfig = &core.CacheConfig{Disabled: config.NoPruning, TrieNodeLimit: config.TrieCache, TrieTimeLimit: config.TrieTimeout} ) eth.blockchain, err = core.NewBlockChain(chainDb, cacheConfig, eth.chainConfig, eth.engine, vmConfig) diff --git a/eth/config.go b/eth/config.go index 426d2bf1ef..383dbdda57 100644 --- a/eth/config.go +++ b/eth/config.go @@ -112,6 +112,9 @@ type Config struct { // Enables tracking of SHA3 preimages in the VM EnablePreimageRecording bool + // Path to EVMC VM module + EVMCPath string + // Miscellaneous options DocRoot string `toml:"-"` }