From 6da65c2173e6da457423d67e958ce153c5598a17 Mon Sep 17 00:00:00 2001 From: Aaron Buchwald Date: Tue, 20 Oct 2020 11:57:31 -0400 Subject: Add CLI config to coreth plugin --- plugin/evm/config.go | 35 +++++++++++++++++++++++++++ plugin/evm/service.go | 67 ++------------------------------------------------- plugin/evm/vm.go | 19 ++++++++++----- plugin/main.go | 7 +++++- plugin/params.go | 30 +++++++++++++++++++++++ 5 files changed, 86 insertions(+), 72 deletions(-) create mode 100644 plugin/evm/config.go create mode 100644 plugin/params.go (limited to 'plugin') diff --git a/plugin/evm/config.go b/plugin/evm/config.go new file mode 100644 index 0000000..909992a --- /dev/null +++ b/plugin/evm/config.go @@ -0,0 +1,35 @@ +package evm + +// CommandLineConfig ... +type CommandLineConfig struct { + // Coreth APIs + SnowmanAPIEnabled bool `json:"snowmanAPIEnabled"` + Web3APIEnabled bool `json:"web3APIEnabled"` + CorethAdminAPIEnabled bool `json:"corethAdminAPIEnabled"` + + // Eth APIs + EthAPIEnabled bool `json:"ethAPIEnabled"` + PersonalAPIEnabled bool `json:"personalAPIEnabled"` + TxPoolAPIEnabled bool `json:"txPoolAPIEnabled"` + DebugAPIEnabled bool `json:"debugAPIEnabled"` +} + +// EthAPIs returns an array of strings representing the Eth APIs that should be enabled +func (c CommandLineConfig) EthAPIs() []string { + ethAPIs := make([]string, 0) + + if c.EthAPIEnabled { + ethAPIs = append(ethAPIs, "eth") + } + if c.PersonalAPIEnabled { + ethAPIs = append(ethAPIs, "personal") + } + if c.TxPoolAPIEnabled { + ethAPIs = append(ethAPIs, "txpool") + } + if c.DebugAPIEnabled { + ethAPIs = append(ethAPIs, "debug") + } + + return ethAPIs +} diff --git a/plugin/evm/service.go b/plugin/evm/service.go index a844f10..128b98e 100644 --- a/plugin/evm/service.go +++ b/plugin/evm/service.go @@ -5,22 +5,18 @@ package evm import ( "context" - "crypto/rand" "errors" "fmt" "math/big" "net/http" "strings" - "github.com/ava-labs/coreth" - "github.com/ava-labs/avalanchego/api" "github.com/ava-labs/avalanchego/ids" "github.com/ava-labs/avalanchego/utils/constants" "github.com/ava-labs/avalanchego/utils/crypto" "github.com/ava-labs/avalanchego/utils/formatting" "github.com/ava-labs/avalanchego/utils/json" - "github.com/ava-labs/coreth/core/types" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" ethcrypto "github.com/ethereum/go-ethereum/crypto" @@ -28,7 +24,7 @@ import ( ) const ( - version = "Athereum 1.0" + version = "coreth-v0.3.7" ) // test constants @@ -37,30 +33,12 @@ const ( GenesisTestKey = "0xabd71b35d559563fea757f0f5edbde286fb8c043105b15abb7cd57189306d7d1" ) -// DebugAPI introduces helper functions for debuging -type DebugAPI struct{ vm *VM } - // SnowmanAPI introduces snowman specific functionality to the evm type SnowmanAPI struct{ vm *VM } -// NetAPI offers network related API methods -type NetAPI struct{ vm *VM } - // AvaxAPI offers Avalanche network related API methods type AvaxAPI struct{ vm *VM } -// NewNetAPI creates a new net API instance. -func NewNetAPI(vm *VM) *NetAPI { return &NetAPI{vm} } - -// Listening returns an indication if the node is listening for network connections. -func (s *NetAPI) Listening() bool { return true } // always listening - -// PeerCount returns the number of connected peers -func (s *NetAPI) PeerCount() hexutil.Uint { return hexutil.Uint(0) } // TODO: report number of connected peers - -// Version returns the current ethereum protocol version. -func (s *NetAPI) Version() string { return fmt.Sprintf("%d", s.vm.networkID) } - // Web3API offers helper API methods type Web3API struct{} @@ -86,49 +64,8 @@ func (api *SnowmanAPI) GetAcceptedFront(ctx context.Context) (*GetAcceptedFrontR }, nil } -// GetGenesisBalance returns the current funds in the genesis -func (api *DebugAPI) GetGenesisBalance(ctx context.Context) (*hexutil.Big, error) { - lastAccepted := api.vm.getLastAccepted() - log.Trace(fmt.Sprintf("Currently accepted block front: %s", lastAccepted.ethBlock.Hash().Hex())) - state, err := api.vm.chain.BlockState(lastAccepted.ethBlock) - if err != nil { - return nil, err - } - return (*hexutil.Big)(state.GetBalance(common.HexToAddress(GenesisTestAddr))), nil -} - -// SpendGenesis funds -func (api *DebugAPI) SpendGenesis(ctx context.Context, nonce uint64) error { - log.Info("Spending the genesis") - - value := big.NewInt(1000000000000) - gasLimit := 21000 - gasPrice := big.NewInt(1000000000) - - genPrivateKey, err := ethcrypto.HexToECDSA(GenesisTestKey[2:]) - if err != nil { - return err - } - bob, err := coreth.NewKey(rand.Reader) - if err != nil { - return err - } - - tx := types.NewTransaction(nonce, bob.Address, value, uint64(gasLimit), gasPrice, nil) - signedTx, err := types.SignTx(tx, types.NewEIP155Signer(api.vm.chainID), genPrivateKey) - if err != nil { - return err - } - - if err := api.vm.issueRemoteTxs([]*types.Transaction{signedTx}); err != nil { - return err - } - - return nil -} - // IssueBlock to the chain -func (api *DebugAPI) IssueBlock(ctx context.Context) error { +func (api *SnowmanAPI) IssueBlock(ctx context.Context) error { log.Info("Issuing a new block") return api.vm.tryBlockGen() diff --git a/plugin/evm/vm.go b/plugin/evm/vm.go index f19c105..a6370e1 100644 --- a/plugin/evm/vm.go +++ b/plugin/evm/vm.go @@ -154,6 +154,8 @@ func init() { type VM struct { ctx *snow.Context + CLIConfig CommandLineConfig + chainID *big.Int networkID uint64 genesisHash common.Hash @@ -512,12 +514,17 @@ func newHandler(name string, service interface{}, lockOption ...commonEng.LockOp // CreateHandlers makes new http handlers that can handle API calls func (vm *VM) CreateHandlers() map[string]*commonEng.HTTPHandler { handler := vm.chain.NewRPCHandler() - vm.chain.AttachEthService(handler, []string{"eth", "personal", "txpool"}) - handler.RegisterName("net", &NetAPI{vm}) - handler.RegisterName("snowman", &SnowmanAPI{vm}) - handler.RegisterName("web3", &Web3API{}) - handler.RegisterName("debug", &DebugAPI{vm}) - handler.RegisterName("admin", &admin.Performance{}) + vm.chain.AttachEthService(handler, vm.CLIConfig.EthAPIs()) + + if vm.CLIConfig.SnowmanAPIEnabled { + handler.RegisterName("snowman", &SnowmanAPI{vm}) + } + if vm.CLIConfig.Web3APIEnabled { + handler.RegisterName("web3", &Web3API{}) + } + if vm.CLIConfig.CorethAdminAPIEnabled { + handler.RegisterName("admin", &admin.Performance{}) + } return map[string]*commonEng.HTTPHandler{ "/rpc": {LockOptions: commonEng.NoLock, Handler: handler}, diff --git a/plugin/main.go b/plugin/main.go index c79a305..b42ba14 100644 --- a/plugin/main.go +++ b/plugin/main.go @@ -1,6 +1,8 @@ package main import ( + "fmt" + "github.com/hashicorp/go-plugin" "github.com/ava-labs/avalanchego/vms/rpcchainvm" @@ -9,10 +11,13 @@ import ( ) func main() { + if errs.Errored() { + panic(fmt.Sprintf("Errored while parsing Coreth CLI Config: %w", errs.Err)) + } plugin.Serve(&plugin.ServeConfig{ HandshakeConfig: rpcchainvm.Handshake, Plugins: map[string]plugin.Plugin{ - "vm": rpcchainvm.New(&evm.VM{}), + "vm": rpcchainvm.New(&evm.VM{CLIConfig: cliConfig}), }, // A non-nil value here enables gRPC serving for this plugin... diff --git a/plugin/params.go b/plugin/params.go new file mode 100644 index 0000000..403424c --- /dev/null +++ b/plugin/params.go @@ -0,0 +1,30 @@ +package main + +import ( + "encoding/json" + "flag" + + "github.com/ava-labs/avalanchego/utils/wrappers" + "github.com/ava-labs/coreth/plugin/evm" +) + +const ( + name = "coreth" +) + +var ( + cliConfig evm.CommandLineConfig + errs wrappers.Errs +) + +func init() { + errs := wrappers.Errs{} + fs := flag.NewFlagSet(name, flag.ContinueOnError) + + config := fs.String("coreth-config", "default", "Pass in CLI Config to set runtime attributes for Coreth") + if *config == "default" { + cliConfig.EthAPIEnabled = true + } else { + errs.Add(json.Unmarshal([]byte(*config), &cliConfig)) + } +} -- cgit v1.2.3-70-g09d2 From 77681f0af89a2c22ed24b4a7edb1f7b3d3a6c442 Mon Sep 17 00:00:00 2001 From: Aaron Buchwald Date: Tue, 20 Oct 2020 12:06:08 -0400 Subject: Set txpool API to be enabled by default --- plugin/params.go | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'plugin') diff --git a/plugin/params.go b/plugin/params.go index 403424c..9881551 100644 --- a/plugin/params.go +++ b/plugin/params.go @@ -3,6 +3,7 @@ package main import ( "encoding/json" "flag" + "os" "github.com/ava-labs/avalanchego/utils/wrappers" "github.com/ava-labs/coreth/plugin/evm" @@ -22,8 +23,15 @@ func init() { fs := flag.NewFlagSet(name, flag.ContinueOnError) config := fs.String("coreth-config", "default", "Pass in CLI Config to set runtime attributes for Coreth") + + if err := fs.Parse(os.Args[1:]); err != nil { + errs.Add(err) + return + } + if *config == "default" { cliConfig.EthAPIEnabled = true + cliConfig.TxPoolAPIEnabled = true } else { errs.Add(json.Unmarshal([]byte(*config), &cliConfig)) } -- cgit v1.2.3-70-g09d2 From cccb47666b2bccce378a9a56824061ea3a9a95fa Mon Sep 17 00:00:00 2001 From: Aaron Buchwald Date: Tue, 20 Oct 2020 12:20:49 -0400 Subject: Add RPC GasCap and TxFeeCap to CLI config --- plugin/evm/config.go | 4 ++++ plugin/evm/vm.go | 4 ++-- plugin/params.go | 3 +++ 3 files changed, 9 insertions(+), 2 deletions(-) (limited to 'plugin') diff --git a/plugin/evm/config.go b/plugin/evm/config.go index 909992a..4669807 100644 --- a/plugin/evm/config.go +++ b/plugin/evm/config.go @@ -7,6 +7,10 @@ type CommandLineConfig struct { Web3APIEnabled bool `json:"web3APIEnabled"` CorethAdminAPIEnabled bool `json:"corethAdminAPIEnabled"` + // Coreth API Gas/Price Caps + RPCGasCap uint64 `json:"rpcGasCap"` + RPCTxFeeCap float64 `json:"rpcTxFeeCap"` + // Eth APIs EthAPIEnabled bool `json:"ethAPIEnabled"` PersonalAPIEnabled bool `json:"personalAPIEnabled"` diff --git a/plugin/evm/vm.go b/plugin/evm/vm.go index a6370e1..c429bca 100644 --- a/plugin/evm/vm.go +++ b/plugin/evm/vm.go @@ -261,8 +261,8 @@ func (vm *VM) Initialize( // Set minimum price for mining and default gas price oracle value to the min // gas price to prevent so transactions and blocks all use the correct fees config.Miner.GasPrice = params.MinGasPrice - config.RPCGasCap = 2500000000 // 25000000 x 100 - config.RPCTxFeeCap = 100 // 100 AVAX + config.RPCGasCap = vm.CLIConfig.RPCGasCap + config.RPCTxFeeCap = vm.CLIConfig.RPCTxFeeCap config.GPO.Default = params.MinGasPrice config.TxPool.PriceLimit = params.MinGasPrice.Uint64() config.TxPool.NoLocals = true diff --git a/plugin/params.go b/plugin/params.go index 9881551..1810295 100644 --- a/plugin/params.go +++ b/plugin/params.go @@ -32,7 +32,10 @@ func init() { if *config == "default" { cliConfig.EthAPIEnabled = true cliConfig.TxPoolAPIEnabled = true + cliConfig.RPCGasCap = 2500000000 // 25000000 x 100 + cliConfig.RPCTxFeeCap = 100 // 100 AVAX } else { + // TODO only overwrite values that were explicitly set errs.Add(json.Unmarshal([]byte(*config), &cliConfig)) } } -- cgit v1.2.3-70-g09d2