| 
									
										
										
										
											2017-04-14 10:29:00 +02:00
										 |  |  | // Copyright 2017 The go-ethereum Authors | 
					
						
							| 
									
										
										
										
											2017-04-12 16:27:23 +02:00
										 |  |  | // This file is part of go-ethereum. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // go-ethereum is free software: you can redistribute it and/or modify | 
					
						
							|  |  |  | // it under the terms of the GNU General Public License as published by | 
					
						
							|  |  |  | // the Free Software Foundation, either version 3 of the License, or | 
					
						
							|  |  |  | // (at your option) any later version. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // go-ethereum is distributed in the hope that it will be useful, | 
					
						
							|  |  |  | // but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 
					
						
							|  |  |  | // GNU General Public License for more details. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // You should have received a copy of the GNU General Public License | 
					
						
							|  |  |  | // along with go-ethereum. If not, see <http://www.gnu.org/licenses/>. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | package main | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"bufio" | 
					
						
							|  |  |  | 	"errors" | 
					
						
							|  |  |  | 	"fmt" | 
					
						
							| 
									
										
										
										
											2021-02-25 09:10:30 +02:00
										 |  |  | 	"math/big" | 
					
						
							| 
									
										
										
										
											2017-04-12 16:27:23 +02:00
										 |  |  | 	"os" | 
					
						
							|  |  |  | 	"reflect" | 
					
						
							|  |  |  | 	"unicode" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-25 21:00:23 +01:00
										 |  |  | 	"gopkg.in/urfave/cli.v1" | 
					
						
							| 
									
										
										
										
											2017-04-12 16:27:23 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-25 22:34:22 +02:00
										 |  |  | 	"github.com/ethereum/go-ethereum/accounts/external" | 
					
						
							|  |  |  | 	"github.com/ethereum/go-ethereum/accounts/keystore" | 
					
						
							|  |  |  | 	"github.com/ethereum/go-ethereum/accounts/scwallet" | 
					
						
							|  |  |  | 	"github.com/ethereum/go-ethereum/accounts/usbwallet" | 
					
						
							| 
									
										
										
										
											2017-04-12 16:27:23 +02:00
										 |  |  | 	"github.com/ethereum/go-ethereum/cmd/utils" | 
					
						
							| 
									
										
										
										
											2021-04-16 21:29:22 +02:00
										 |  |  | 	"github.com/ethereum/go-ethereum/eth/catalyst" | 
					
						
							| 
									
										
										
										
											2021-02-05 20:51:15 +08:00
										 |  |  | 	"github.com/ethereum/go-ethereum/eth/ethconfig" | 
					
						
							| 
									
										
										
										
											2020-08-03 19:40:46 +02:00
										 |  |  | 	"github.com/ethereum/go-ethereum/internal/ethapi" | 
					
						
							| 
									
										
										
										
											2021-06-30 12:57:32 +02:00
										 |  |  | 	"github.com/ethereum/go-ethereum/log" | 
					
						
							| 
									
										
										
										
											2021-01-18 14:36:05 +01:00
										 |  |  | 	"github.com/ethereum/go-ethereum/metrics" | 
					
						
							| 
									
										
										
										
											2017-04-12 16:27:23 +02:00
										 |  |  | 	"github.com/ethereum/go-ethereum/node" | 
					
						
							|  |  |  | 	"github.com/ethereum/go-ethereum/params" | 
					
						
							|  |  |  | 	"github.com/naoina/toml" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var ( | 
					
						
							|  |  |  | 	dumpConfigCommand = cli.Command{ | 
					
						
							| 
									
										
										
										
											2017-05-03 14:39:07 +02:00
										 |  |  | 		Action:      utils.MigrateFlags(dumpConfig), | 
					
						
							| 
									
										
										
										
											2017-04-12 16:27:23 +02:00
										 |  |  | 		Name:        "dumpconfig", | 
					
						
							|  |  |  | 		Usage:       "Show configuration values", | 
					
						
							|  |  |  | 		ArgsUsage:   "", | 
					
						
							| 
									
										
										
										
											2021-03-03 22:08:14 +08:00
										 |  |  | 		Flags:       append(nodeFlags, rpcFlags...), | 
					
						
							| 
									
										
										
										
											2017-04-12 16:27:23 +02:00
										 |  |  | 		Category:    "MISCELLANEOUS COMMANDS", | 
					
						
							|  |  |  | 		Description: `The dumpconfig command shows configuration values.`, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	configFileFlag = cli.StringFlag{ | 
					
						
							|  |  |  | 		Name:  "config", | 
					
						
							|  |  |  | 		Usage: "TOML configuration file", | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // These settings ensure that TOML keys use the same names as Go struct fields. | 
					
						
							|  |  |  | var tomlSettings = toml.Config{ | 
					
						
							|  |  |  | 	NormFieldName: func(rt reflect.Type, key string) string { | 
					
						
							|  |  |  | 		return key | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	FieldToKey: func(rt reflect.Type, field string) string { | 
					
						
							|  |  |  | 		return field | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	MissingField: func(rt reflect.Type, field string) error { | 
					
						
							| 
									
										
										
										
											2021-06-30 12:57:32 +02:00
										 |  |  | 		id := fmt.Sprintf("%s.%s", rt.String(), field) | 
					
						
							|  |  |  | 		if deprecated(id) { | 
					
						
							|  |  |  | 			log.Warn("Config field is deprecated and won't have an effect", "name", id) | 
					
						
							|  |  |  | 			return nil | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		var link string | 
					
						
							| 
									
										
										
										
											2017-04-12 16:27:23 +02:00
										 |  |  | 		if unicode.IsUpper(rune(rt.Name()[0])) && rt.PkgPath() != "main" { | 
					
						
							|  |  |  | 			link = fmt.Sprintf(", see https://godoc.org/%s#%s for available fields", rt.PkgPath(), rt.Name()) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		return fmt.Errorf("field '%s' is not defined in %s%s", field, rt.String(), link) | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type ethstatsConfig struct { | 
					
						
							|  |  |  | 	URL string `toml:",omitempty"` | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type gethConfig struct { | 
					
						
							| 
									
										
										
										
											2021-02-05 20:51:15 +08:00
										 |  |  | 	Eth      ethconfig.Config | 
					
						
							| 
									
										
										
										
											2019-11-14 10:04:16 +01:00
										 |  |  | 	Node     node.Config | 
					
						
							|  |  |  | 	Ethstats ethstatsConfig | 
					
						
							| 
									
										
										
										
											2021-01-18 14:36:05 +01:00
										 |  |  | 	Metrics  metrics.Config | 
					
						
							| 
									
										
										
										
											2017-04-12 16:27:23 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func loadConfig(file string, cfg *gethConfig) error { | 
					
						
							|  |  |  | 	f, err := os.Open(file) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	defer f.Close() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	err = tomlSettings.NewDecoder(bufio.NewReader(f)).Decode(cfg) | 
					
						
							|  |  |  | 	// Add file name to errors that have a line number. | 
					
						
							|  |  |  | 	if _, ok := err.(*toml.LineError); ok { | 
					
						
							|  |  |  | 		err = errors.New(file + ", " + err.Error()) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return err | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func defaultNodeConfig() node.Config { | 
					
						
							|  |  |  | 	cfg := node.DefaultConfig | 
					
						
							|  |  |  | 	cfg.Name = clientIdentifier | 
					
						
							| 
									
										
										
										
											2019-05-08 08:44:28 -05:00
										 |  |  | 	cfg.Version = params.VersionWithCommit(gitCommit, gitDate) | 
					
						
							| 
									
										
										
										
											2020-01-28 10:37:08 +01:00
										 |  |  | 	cfg.HTTPModules = append(cfg.HTTPModules, "eth") | 
					
						
							|  |  |  | 	cfg.WSModules = append(cfg.WSModules, "eth") | 
					
						
							| 
									
										
										
										
											2017-04-12 16:27:23 +02:00
										 |  |  | 	cfg.IPCPath = "geth.ipc" | 
					
						
							|  |  |  | 	return cfg | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-06 09:24:36 +02:00
										 |  |  | // makeConfigNode loads geth configuration and creates a blank node instance. | 
					
						
							| 
									
										
										
										
											2017-04-12 16:27:23 +02:00
										 |  |  | func makeConfigNode(ctx *cli.Context) (*node.Node, gethConfig) { | 
					
						
							|  |  |  | 	// Load defaults. | 
					
						
							|  |  |  | 	cfg := gethConfig{ | 
					
						
							| 
									
										
										
										
											2021-02-05 20:51:15 +08:00
										 |  |  | 		Eth:     ethconfig.Defaults, | 
					
						
							| 
									
										
										
										
											2021-01-18 14:36:05 +01:00
										 |  |  | 		Node:    defaultNodeConfig(), | 
					
						
							|  |  |  | 		Metrics: metrics.DefaultConfig, | 
					
						
							| 
									
										
										
										
											2017-04-12 16:27:23 +02:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Load config file. | 
					
						
							|  |  |  | 	if file := ctx.GlobalString(configFileFlag.Name); file != "" { | 
					
						
							|  |  |  | 		if err := loadConfig(file, &cfg); err != nil { | 
					
						
							|  |  |  | 			utils.Fatalf("%v", err) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2021-03-03 22:08:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-12 16:27:23 +02:00
										 |  |  | 	// Apply flags. | 
					
						
							|  |  |  | 	utils.SetNodeConfig(ctx, &cfg.Node) | 
					
						
							|  |  |  | 	stack, err := node.New(&cfg.Node) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		utils.Fatalf("Failed to create the protocol stack: %v", err) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2021-08-25 22:34:22 +02:00
										 |  |  | 	// Node doesn't by default populate account manager backends | 
					
						
							|  |  |  | 	if err := setAccountManagerBackends(stack); err != nil { | 
					
						
							|  |  |  | 		utils.Fatalf("Failed to set account manager backends: %v", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-12 16:27:23 +02:00
										 |  |  | 	utils.SetEthConfig(ctx, stack, &cfg.Eth) | 
					
						
							|  |  |  | 	if ctx.GlobalIsSet(utils.EthStatsURLFlag.Name) { | 
					
						
							|  |  |  | 		cfg.Ethstats.URL = ctx.GlobalString(utils.EthStatsURLFlag.Name) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2021-01-18 14:36:05 +01:00
										 |  |  | 	applyMetricConfig(ctx, &cfg) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-12 16:27:23 +02:00
										 |  |  | 	return stack, cfg | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-06 09:24:36 +02:00
										 |  |  | // makeFullNode loads geth configuration and creates the Ethereum backend. | 
					
						
							| 
									
										
										
										
											2020-08-03 19:40:46 +02:00
										 |  |  | func makeFullNode(ctx *cli.Context) (*node.Node, ethapi.Backend) { | 
					
						
							| 
									
										
										
										
											2017-04-12 16:27:23 +02:00
										 |  |  | 	stack, cfg := makeConfigNode(ctx) | 
					
						
							| 
									
										
										
										
											2021-10-28 22:18:14 +02:00
										 |  |  | 	if ctx.GlobalIsSet(utils.OverrideArrowGlacierFlag.Name) { | 
					
						
							|  |  |  | 		cfg.Eth.OverrideArrowGlacier = new(big.Int).SetUint64(ctx.GlobalUint64(utils.OverrideArrowGlacierFlag.Name)) | 
					
						
							| 
									
										
										
										
											2021-02-25 09:10:30 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2021-04-16 21:29:22 +02:00
										 |  |  | 	backend, eth := utils.RegisterEthService(stack, &cfg.Eth) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Configure catalyst. | 
					
						
							|  |  |  | 	if ctx.GlobalBool(utils.CatalystFlag.Name) { | 
					
						
							|  |  |  | 		if eth == nil { | 
					
						
							|  |  |  | 			utils.Fatalf("Catalyst does not work in light client mode.") | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if err := catalyst.Register(stack, eth); err != nil { | 
					
						
							|  |  |  | 			utils.Fatalf("%v", err) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-04-12 16:27:23 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-12 11:24:24 +03:00
										 |  |  | 	// Configure GraphQL if requested | 
					
						
							| 
									
										
										
										
											2019-01-21 06:38:13 -08:00
										 |  |  | 	if ctx.GlobalIsSet(utils.GraphQLEnabledFlag.Name) { | 
					
						
							| 
									
										
										
										
											2020-08-03 19:40:46 +02:00
										 |  |  | 		utils.RegisterGraphQLService(stack, backend, cfg.Node) | 
					
						
							| 
									
										
										
										
											2019-01-21 06:38:13 -08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-04-12 16:27:23 +02:00
										 |  |  | 	// Add the Ethereum Stats daemon if requested. | 
					
						
							|  |  |  | 	if cfg.Ethstats.URL != "" { | 
					
						
							| 
									
										
										
										
											2020-08-03 19:40:46 +02:00
										 |  |  | 		utils.RegisterEthStatsService(stack, backend, cfg.Ethstats.URL) | 
					
						
							| 
									
										
										
										
											2017-04-12 16:27:23 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2020-08-03 19:40:46 +02:00
										 |  |  | 	return stack, backend | 
					
						
							| 
									
										
										
										
											2017-04-12 16:27:23 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // dumpConfig is the dumpconfig command. | 
					
						
							|  |  |  | func dumpConfig(ctx *cli.Context) error { | 
					
						
							|  |  |  | 	_, cfg := makeConfigNode(ctx) | 
					
						
							|  |  |  | 	comment := "" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if cfg.Eth.Genesis != nil { | 
					
						
							|  |  |  | 		cfg.Eth.Genesis = nil | 
					
						
							|  |  |  | 		comment += "# Note: this config doesn't contain the genesis block.\n\n" | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	out, err := tomlSettings.Marshal(&cfg) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2019-01-07 19:56:50 +11:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	dump := os.Stdout | 
					
						
							|  |  |  | 	if ctx.NArg() > 0 { | 
					
						
							|  |  |  | 		dump, err = os.OpenFile(ctx.Args().Get(0), os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0644) | 
					
						
							|  |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		defer dump.Close() | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	dump.WriteString(comment) | 
					
						
							|  |  |  | 	dump.Write(out) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-12 16:27:23 +02:00
										 |  |  | 	return nil | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2021-01-18 14:36:05 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | func applyMetricConfig(ctx *cli.Context, cfg *gethConfig) { | 
					
						
							|  |  |  | 	if ctx.GlobalIsSet(utils.MetricsEnabledFlag.Name) { | 
					
						
							|  |  |  | 		cfg.Metrics.Enabled = ctx.GlobalBool(utils.MetricsEnabledFlag.Name) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if ctx.GlobalIsSet(utils.MetricsEnabledExpensiveFlag.Name) { | 
					
						
							|  |  |  | 		cfg.Metrics.EnabledExpensive = ctx.GlobalBool(utils.MetricsEnabledExpensiveFlag.Name) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if ctx.GlobalIsSet(utils.MetricsHTTPFlag.Name) { | 
					
						
							|  |  |  | 		cfg.Metrics.HTTP = ctx.GlobalString(utils.MetricsHTTPFlag.Name) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if ctx.GlobalIsSet(utils.MetricsPortFlag.Name) { | 
					
						
							|  |  |  | 		cfg.Metrics.Port = ctx.GlobalInt(utils.MetricsPortFlag.Name) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if ctx.GlobalIsSet(utils.MetricsEnableInfluxDBFlag.Name) { | 
					
						
							|  |  |  | 		cfg.Metrics.EnableInfluxDB = ctx.GlobalBool(utils.MetricsEnableInfluxDBFlag.Name) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if ctx.GlobalIsSet(utils.MetricsInfluxDBEndpointFlag.Name) { | 
					
						
							|  |  |  | 		cfg.Metrics.InfluxDBEndpoint = ctx.GlobalString(utils.MetricsInfluxDBEndpointFlag.Name) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if ctx.GlobalIsSet(utils.MetricsInfluxDBDatabaseFlag.Name) { | 
					
						
							|  |  |  | 		cfg.Metrics.InfluxDBDatabase = ctx.GlobalString(utils.MetricsInfluxDBDatabaseFlag.Name) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if ctx.GlobalIsSet(utils.MetricsInfluxDBUsernameFlag.Name) { | 
					
						
							|  |  |  | 		cfg.Metrics.InfluxDBUsername = ctx.GlobalString(utils.MetricsInfluxDBUsernameFlag.Name) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if ctx.GlobalIsSet(utils.MetricsInfluxDBPasswordFlag.Name) { | 
					
						
							|  |  |  | 		cfg.Metrics.InfluxDBPassword = ctx.GlobalString(utils.MetricsInfluxDBPasswordFlag.Name) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if ctx.GlobalIsSet(utils.MetricsInfluxDBTagsFlag.Name) { | 
					
						
							|  |  |  | 		cfg.Metrics.InfluxDBTags = ctx.GlobalString(utils.MetricsInfluxDBTagsFlag.Name) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2021-08-17 18:40:14 +02:00
										 |  |  | 	if ctx.GlobalIsSet(utils.MetricsEnableInfluxDBV2Flag.Name) { | 
					
						
							|  |  |  | 		cfg.Metrics.EnableInfluxDBV2 = ctx.GlobalBool(utils.MetricsEnableInfluxDBV2Flag.Name) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if ctx.GlobalIsSet(utils.MetricsInfluxDBTokenFlag.Name) { | 
					
						
							|  |  |  | 		cfg.Metrics.InfluxDBToken = ctx.GlobalString(utils.MetricsInfluxDBTokenFlag.Name) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if ctx.GlobalIsSet(utils.MetricsInfluxDBBucketFlag.Name) { | 
					
						
							|  |  |  | 		cfg.Metrics.InfluxDBBucket = ctx.GlobalString(utils.MetricsInfluxDBBucketFlag.Name) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if ctx.GlobalIsSet(utils.MetricsInfluxDBOrganizationFlag.Name) { | 
					
						
							|  |  |  | 		cfg.Metrics.InfluxDBOrganization = ctx.GlobalString(utils.MetricsInfluxDBOrganizationFlag.Name) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2021-01-18 14:36:05 +01:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2021-06-30 12:57:32 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | func deprecated(field string) bool { | 
					
						
							| 
									
										
										
										
											2021-07-06 22:03:09 +02:00
										 |  |  | 	switch field { | 
					
						
							|  |  |  | 	case "ethconfig.Config.EVMInterpreter": | 
					
						
							|  |  |  | 		return true | 
					
						
							|  |  |  | 	case "ethconfig.Config.EWASMInterpreter": | 
					
						
							|  |  |  | 		return true | 
					
						
							|  |  |  | 	default: | 
					
						
							|  |  |  | 		return false | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2021-06-30 12:57:32 +02:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2021-08-25 22:34:22 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | func setAccountManagerBackends(stack *node.Node) error { | 
					
						
							|  |  |  | 	conf := stack.Config() | 
					
						
							|  |  |  | 	am := stack.AccountManager() | 
					
						
							|  |  |  | 	keydir := stack.KeyStoreDir() | 
					
						
							|  |  |  | 	scryptN := keystore.StandardScryptN | 
					
						
							|  |  |  | 	scryptP := keystore.StandardScryptP | 
					
						
							|  |  |  | 	if conf.UseLightweightKDF { | 
					
						
							|  |  |  | 		scryptN = keystore.LightScryptN | 
					
						
							|  |  |  | 		scryptP = keystore.LightScryptP | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Assemble the supported backends | 
					
						
							|  |  |  | 	if len(conf.ExternalSigner) > 0 { | 
					
						
							|  |  |  | 		log.Info("Using external signer", "url", conf.ExternalSigner) | 
					
						
							|  |  |  | 		if extapi, err := external.NewExternalBackend(conf.ExternalSigner); err == nil { | 
					
						
							|  |  |  | 			am.AddBackend(extapi) | 
					
						
							|  |  |  | 			return nil | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			return fmt.Errorf("error connecting to external signer: %v", err) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// For now, we're using EITHER external signer OR local signers. | 
					
						
							|  |  |  | 	// If/when we implement some form of lockfile for USB and keystore wallets, | 
					
						
							|  |  |  | 	// we can have both, but it's very confusing for the user to see the same | 
					
						
							|  |  |  | 	// accounts in both externally and locally, plus very racey. | 
					
						
							|  |  |  | 	am.AddBackend(keystore.NewKeyStore(keydir, scryptN, scryptP)) | 
					
						
							|  |  |  | 	if conf.USB { | 
					
						
							|  |  |  | 		// Start a USB hub for Ledger hardware wallets | 
					
						
							|  |  |  | 		if ledgerhub, err := usbwallet.NewLedgerHub(); err != nil { | 
					
						
							|  |  |  | 			log.Warn(fmt.Sprintf("Failed to start Ledger hub, disabling: %v", err)) | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			am.AddBackend(ledgerhub) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		// Start a USB hub for Trezor hardware wallets (HID version) | 
					
						
							|  |  |  | 		if trezorhub, err := usbwallet.NewTrezorHubWithHID(); err != nil { | 
					
						
							|  |  |  | 			log.Warn(fmt.Sprintf("Failed to start HID Trezor hub, disabling: %v", err)) | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			am.AddBackend(trezorhub) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		// Start a USB hub for Trezor hardware wallets (WebUSB version) | 
					
						
							|  |  |  | 		if trezorhub, err := usbwallet.NewTrezorHubWithWebUSB(); err != nil { | 
					
						
							|  |  |  | 			log.Warn(fmt.Sprintf("Failed to start WebUSB Trezor hub, disabling: %v", err)) | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			am.AddBackend(trezorhub) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if len(conf.SmartCardDaemonPath) > 0 { | 
					
						
							|  |  |  | 		// Start a smart card hub | 
					
						
							|  |  |  | 		if schub, err := scwallet.NewHub(conf.SmartCardDaemonPath, scwallet.Scheme, keydir); err != nil { | 
					
						
							|  |  |  | 			log.Warn(fmt.Sprintf("Failed to start smart card hub, disabling: %v", err)) | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			am.AddBackend(schub) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return nil | 
					
						
							|  |  |  | } |