| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | // Copyright 2014 The go-ethereum Authors | 
					
						
							|  |  |  | // 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 | 
					
						
							| 
									
										
										
										
											2015-07-22 18:48:40 +02:00
										 |  |  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 
					
						
							| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | // GNU General Public License for more details. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // You should have received a copy of the GNU General Public License | 
					
						
							| 
									
										
										
										
											2015-07-22 18:48:40 +02:00
										 |  |  | // along with go-ethereum. If not, see <http://www.gnu.org/licenses/>. | 
					
						
							| 
									
										
										
										
											2014-10-23 15:48:53 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-07 05:08:16 +02:00
										 |  |  | // geth is the official command-line client for Ethereum. | 
					
						
							| 
									
										
										
										
											2014-06-23 12:20:59 +01:00
										 |  |  | package main | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							| 
									
										
										
										
											2014-08-06 09:53:12 +02:00
										 |  |  | 	"fmt" | 
					
						
							|  |  |  | 	"os" | 
					
						
							| 
									
										
										
										
											2014-07-30 01:05:40 +02:00
										 |  |  | 	"runtime" | 
					
						
							| 
									
										
										
										
											2015-05-05 08:24:15 +02:00
										 |  |  | 	"strings" | 
					
						
							| 
									
										
										
										
											2015-06-25 13:47:06 +03:00
										 |  |  | 	"time" | 
					
						
							| 
									
										
										
										
											2014-07-30 01:05:40 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-08 20:25:52 +02:00
										 |  |  | 	"github.com/ethereum/go-ethereum/accounts" | 
					
						
							| 
									
										
										
										
											2017-01-24 11:49:20 +02:00
										 |  |  | 	"github.com/ethereum/go-ethereum/accounts/keystore" | 
					
						
							| 
									
										
										
										
											2014-10-31 14:20:11 +01:00
										 |  |  | 	"github.com/ethereum/go-ethereum/cmd/utils" | 
					
						
							| 
									
										
										
										
											2015-03-16 22:49:39 +07:00
										 |  |  | 	"github.com/ethereum/go-ethereum/common" | 
					
						
							| 
									
										
										
										
											2016-05-06 12:40:23 +03:00
										 |  |  | 	"github.com/ethereum/go-ethereum/console" | 
					
						
							| 
									
										
										
										
											2015-01-04 14:20:16 +01:00
										 |  |  | 	"github.com/ethereum/go-ethereum/eth" | 
					
						
							| 
									
										
										
										
											2017-02-08 20:25:52 +02:00
										 |  |  | 	"github.com/ethereum/go-ethereum/ethclient" | 
					
						
							| 
									
										
										
										
											2016-01-26 14:39:21 +01:00
										 |  |  | 	"github.com/ethereum/go-ethereum/internal/debug" | 
					
						
							| 
									
										
										
										
											2017-02-22 14:10:07 +02:00
										 |  |  | 	"github.com/ethereum/go-ethereum/log" | 
					
						
							| 
									
										
										
										
											2015-06-27 18:12:58 +03:00
										 |  |  | 	"github.com/ethereum/go-ethereum/metrics" | 
					
						
							| 
									
										
										
										
											2015-11-17 18:33:25 +02:00
										 |  |  | 	"github.com/ethereum/go-ethereum/node" | 
					
						
							| 
									
										
										
										
											2016-06-09 11:44:42 +02:00
										 |  |  | 	"gopkg.in/urfave/cli.v1" | 
					
						
							| 
									
										
										
										
											2014-06-23 12:20:59 +01:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-03 17:36:24 +01:00
										 |  |  | const ( | 
					
						
							| 
									
										
										
										
											2016-08-18 13:28:17 +02:00
										 |  |  | 	clientIdentifier = "geth" // Client identifier to advertise over the network | 
					
						
							| 
									
										
										
										
											2014-07-03 17:36:24 +01:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-28 13:14:53 +02:00
										 |  |  | var ( | 
					
						
							| 
									
										
										
										
											2016-09-05 13:08:41 +02:00
										 |  |  | 	// Git SHA1 commit hash of the release (set via linker flags) | 
					
						
							|  |  |  | 	gitCommit = "" | 
					
						
							|  |  |  | 	// Ethereum address of the Geth release oracle. | 
					
						
							|  |  |  | 	relOracle = common.HexToAddress("0xfa7b9770ca4cb04296cac84f37736d4041251cdf") | 
					
						
							|  |  |  | 	// The app that holds all commands and flags. | 
					
						
							|  |  |  | 	app = utils.NewApp(gitCommit, "the go-ethereum command line interface") | 
					
						
							| 
									
										
										
										
											2015-04-28 13:14:53 +02:00
										 |  |  | ) | 
					
						
							| 
									
										
										
										
											2014-06-23 12:20:59 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-06 03:00:41 +01:00
										 |  |  | func init() { | 
					
						
							| 
									
										
										
										
											2016-04-28 12:00:11 +03:00
										 |  |  | 	// Initialize the CLI app and start Geth | 
					
						
							| 
									
										
										
										
											2015-11-17 18:33:25 +02:00
										 |  |  | 	app.Action = geth | 
					
						
							| 
									
										
										
										
											2015-03-06 03:00:41 +01:00
										 |  |  | 	app.HideVersion = true // we have a command to print the version | 
					
						
							| 
									
										
										
										
											2017-04-13 17:12:37 +03:00
										 |  |  | 	app.Copyright = "Copyright 2013-2017 The go-ethereum Authors" | 
					
						
							| 
									
										
										
										
											2015-03-06 03:00:41 +01:00
										 |  |  | 	app.Commands = []cli.Command{ | 
					
						
							| 
									
										
										
										
											2016-11-30 13:34:24 +02:00
										 |  |  | 		// See chaincmd.go: | 
					
						
							|  |  |  | 		initCommand, | 
					
						
							| 
									
										
										
										
											2015-05-27 13:43:49 +02:00
										 |  |  | 		importCommand, | 
					
						
							|  |  |  | 		exportCommand, | 
					
						
							|  |  |  | 		removedbCommand, | 
					
						
							|  |  |  | 		dumpCommand, | 
					
						
							| 
									
										
										
										
											2016-11-30 13:34:24 +02:00
										 |  |  | 		// See monitorcmd.go: | 
					
						
							| 
									
										
										
										
											2015-06-25 10:36:47 +03:00
										 |  |  | 		monitorCommand, | 
					
						
							| 
									
										
										
										
											2016-11-30 13:34:24 +02:00
										 |  |  | 		// See accountcmd.go: | 
					
						
							| 
									
										
										
										
											2016-03-17 13:09:18 +01:00
										 |  |  | 		accountCommand, | 
					
						
							|  |  |  | 		walletCommand, | 
					
						
							| 
									
										
										
										
											2016-11-30 13:34:24 +02:00
										 |  |  | 		// See consolecmd.go: | 
					
						
							| 
									
										
										
										
											2016-05-06 12:40:23 +03:00
										 |  |  | 		consoleCommand, | 
					
						
							|  |  |  | 		attachCommand, | 
					
						
							|  |  |  | 		javascriptCommand, | 
					
						
							| 
									
										
										
										
											2016-11-30 13:34:24 +02:00
										 |  |  | 		// See misccmd.go: | 
					
						
							|  |  |  | 		makedagCommand, | 
					
						
							|  |  |  | 		versionCommand, | 
					
						
							| 
									
										
										
										
											2017-02-20 14:26:21 +01:00
										 |  |  | 		bugCommand, | 
					
						
							| 
									
										
										
										
											2016-11-30 13:34:24 +02:00
										 |  |  | 		licenseCommand, | 
					
						
							| 
									
										
										
										
											2017-04-12 16:27:23 +02:00
										 |  |  | 		// See config.go | 
					
						
							|  |  |  | 		dumpConfigCommand, | 
					
						
							| 
									
										
										
										
											2015-03-06 03:00:41 +01:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-03-17 13:09:18 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-06 03:00:41 +01:00
										 |  |  | 	app.Flags = []cli.Flag{ | 
					
						
							| 
									
										
										
										
											2015-04-18 23:53:30 +02:00
										 |  |  | 		utils.IdentityFlag, | 
					
						
							| 
									
										
										
										
											2015-03-11 01:08:42 +01:00
										 |  |  | 		utils.UnlockedAccountFlag, | 
					
						
							| 
									
										
										
										
											2015-03-23 13:00:06 +00:00
										 |  |  | 		utils.PasswordFileFlag, | 
					
						
							| 
									
										
										
										
											2015-03-06 03:00:41 +01:00
										 |  |  | 		utils.BootnodesFlag, | 
					
						
							|  |  |  | 		utils.DataDirFlag, | 
					
						
							| 
									
										
										
										
											2016-03-07 14:38:56 -08:00
										 |  |  | 		utils.KeyStoreDirFlag, | 
					
						
							| 
									
										
										
										
											2017-03-06 11:37:32 +02:00
										 |  |  | 		utils.EthashCacheDirFlag, | 
					
						
							|  |  |  | 		utils.EthashCachesInMemoryFlag, | 
					
						
							|  |  |  | 		utils.EthashCachesOnDiskFlag, | 
					
						
							|  |  |  | 		utils.EthashDatasetDirFlag, | 
					
						
							| 
									
										
										
										
											2017-03-06 17:20:25 +02:00
										 |  |  | 		utils.EthashDatasetsInMemoryFlag, | 
					
						
							| 
									
										
										
										
											2017-03-06 11:37:32 +02:00
										 |  |  | 		utils.EthashDatasetsOnDiskFlag, | 
					
						
							| 
									
										
										
										
											2015-10-09 18:36:31 +03:00
										 |  |  | 		utils.FastSyncFlag, | 
					
						
							| 
									
										
										
										
											2016-01-13 19:35:48 +01:00
										 |  |  | 		utils.LightModeFlag, | 
					
						
							| 
									
										
										
										
											2017-04-12 16:27:23 +02:00
										 |  |  | 		utils.SyncModeFlag, | 
					
						
							| 
									
										
										
										
											2016-01-13 19:35:48 +01:00
										 |  |  | 		utils.LightServFlag, | 
					
						
							|  |  |  | 		utils.LightPeersFlag, | 
					
						
							| 
									
										
										
										
											2015-11-10 15:47:19 +02:00
										 |  |  | 		utils.LightKDFFlag, | 
					
						
							| 
									
										
										
										
											2016-11-09 19:18:20 +02:00
										 |  |  | 		utils.CacheFlag, | 
					
						
							| 
									
										
										
										
											2016-10-19 14:55:13 +03:00
										 |  |  | 		utils.TrieCacheGenFlag, | 
					
						
							| 
									
										
										
										
											2015-03-15 13:31:40 +07:00
										 |  |  | 		utils.JSpathFlag, | 
					
						
							| 
									
										
										
										
											2015-03-06 03:00:41 +01:00
										 |  |  | 		utils.ListenPortFlag, | 
					
						
							|  |  |  | 		utils.MaxPeersFlag, | 
					
						
							| 
									
										
										
										
											2015-05-04 17:35:49 +03:00
										 |  |  | 		utils.MaxPendingPeersFlag, | 
					
						
							| 
									
										
										
										
											2015-03-26 21:49:22 +00:00
										 |  |  | 		utils.EtherbaseFlag, | 
					
						
							| 
									
										
										
										
											2015-05-09 12:00:51 +02:00
										 |  |  | 		utils.GasPriceFlag, | 
					
						
							| 
									
										
										
										
											2015-03-06 03:00:41 +01:00
										 |  |  | 		utils.MinerThreadsFlag, | 
					
						
							|  |  |  | 		utils.MiningEnabledFlag, | 
					
						
							| 
									
										
										
										
											2016-04-04 12:04:04 +03:00
										 |  |  | 		utils.TargetGasLimitFlag, | 
					
						
							| 
									
										
										
										
											2015-03-06 03:00:41 +01:00
										 |  |  | 		utils.NATFlag, | 
					
						
							| 
									
										
										
										
											2015-05-26 19:07:24 +03:00
										 |  |  | 		utils.NoDiscoverFlag, | 
					
						
							| 
									
										
										
										
											2016-10-19 13:04:55 +02:00
										 |  |  | 		utils.DiscoveryV5Flag, | 
					
						
							| 
									
										
										
										
											2016-11-22 20:52:31 +01:00
										 |  |  | 		utils.NetrestrictFlag, | 
					
						
							| 
									
										
										
										
											2015-03-06 03:00:41 +01:00
										 |  |  | 		utils.NodeKeyFileFlag, | 
					
						
							|  |  |  | 		utils.NodeKeyHexFlag, | 
					
						
							|  |  |  | 		utils.RPCEnabledFlag, | 
					
						
							|  |  |  | 		utils.RPCListenAddrFlag, | 
					
						
							|  |  |  | 		utils.RPCPortFlag, | 
					
						
							| 
									
										
										
										
											2015-12-16 10:58:01 +01:00
										 |  |  | 		utils.RPCApiFlag, | 
					
						
							|  |  |  | 		utils.WSEnabledFlag, | 
					
						
							|  |  |  | 		utils.WSListenAddrFlag, | 
					
						
							|  |  |  | 		utils.WSPortFlag, | 
					
						
							|  |  |  | 		utils.WSApiFlag, | 
					
						
							| 
									
										
										
										
											2016-03-14 09:38:54 +01:00
										 |  |  | 		utils.WSAllowedOriginsFlag, | 
					
						
							| 
									
										
										
										
											2015-06-08 11:01:02 +02:00
										 |  |  | 		utils.IPCDisabledFlag, | 
					
						
							|  |  |  | 		utils.IPCPathFlag, | 
					
						
							| 
									
										
										
										
											2015-06-19 14:04:18 +02:00
										 |  |  | 		utils.ExecFlag, | 
					
						
							| 
									
										
										
										
											2016-05-06 12:40:23 +03:00
										 |  |  | 		utils.PreloadJSFlag, | 
					
						
							| 
									
										
										
										
											2015-04-20 18:45:37 +03:00
										 |  |  | 		utils.WhisperEnabledFlag, | 
					
						
							| 
									
										
										
										
											2015-09-06 15:46:54 +02:00
										 |  |  | 		utils.DevModeFlag, | 
					
						
							| 
									
										
										
										
											2015-10-05 13:01:34 +02:00
										 |  |  | 		utils.TestNetFlag, | 
					
						
							| 
									
										
										
										
											2017-01-17 11:19:50 +00:00
										 |  |  | 		utils.VMEnableDebugFlag, | 
					
						
							| 
									
										
										
										
											2015-03-18 14:44:58 +07:00
										 |  |  | 		utils.NetworkIdFlag, | 
					
						
							| 
									
										
										
										
											2015-03-29 21:21:14 +02:00
										 |  |  | 		utils.RPCCORSDomainFlag, | 
					
						
							| 
									
										
										
										
											2016-11-25 17:55:06 +02:00
										 |  |  | 		utils.EthStatsURLFlag, | 
					
						
							| 
									
										
										
										
											2015-06-29 16:11:01 +03:00
										 |  |  | 		utils.MetricsEnabledFlag, | 
					
						
							| 
									
										
										
										
											2016-04-21 12:14:57 +03:00
										 |  |  | 		utils.FakePoWFlag, | 
					
						
							| 
									
										
										
										
											2017-03-08 12:26:19 +01:00
										 |  |  | 		utils.NoCompactionFlag, | 
					
						
							| 
									
										
										
										
											2017-04-06 16:20:42 +02:00
										 |  |  | 		utils.GpoBlocksFlag, | 
					
						
							|  |  |  | 		utils.GpoPercentileFlag, | 
					
						
							| 
									
										
										
										
											2015-09-22 10:34:58 +02:00
										 |  |  | 		utils.ExtraDataFlag, | 
					
						
							| 
									
										
										
										
											2017-04-12 16:27:23 +02:00
										 |  |  | 		configFileFlag, | 
					
						
							| 
									
										
										
										
											2015-03-06 03:00:41 +01:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-01-26 14:39:21 +01:00
										 |  |  | 	app.Flags = append(app.Flags, debug.Flags...) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-20 18:59:41 +03:00
										 |  |  | 	app.Before = func(ctx *cli.Context) error { | 
					
						
							| 
									
										
										
										
											2015-12-08 18:05:43 +02:00
										 |  |  | 		runtime.GOMAXPROCS(runtime.NumCPU()) | 
					
						
							| 
									
										
										
										
											2016-01-26 14:39:21 +01:00
										 |  |  | 		if err := debug.Setup(ctx); err != nil { | 
					
						
							|  |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		// Start system runtime metrics collection | 
					
						
							|  |  |  | 		go metrics.CollectProcessMetrics(3 * time.Second) | 
					
						
							| 
									
										
										
										
											2015-12-08 18:05:43 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-07 18:21:13 +03:00
										 |  |  | 		utils.SetupNetwork(ctx) | 
					
						
							| 
									
										
										
										
											2015-04-20 18:59:41 +03:00
										 |  |  | 		return nil | 
					
						
							| 
									
										
										
										
											2015-03-06 03:00:41 +01:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-01-26 14:39:21 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	app.After = func(ctx *cli.Context) error { | 
					
						
							|  |  |  | 		debug.Exit() | 
					
						
							| 
									
										
										
										
											2016-05-30 17:30:17 +03:00
										 |  |  | 		console.Stdin.Close() // Resets terminal mode. | 
					
						
							| 
									
										
										
										
											2016-01-26 14:39:21 +01:00
										 |  |  | 		return nil | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-03-06 03:00:41 +01:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2014-12-23 14:33:15 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-06 03:00:41 +01:00
										 |  |  | func main() { | 
					
						
							|  |  |  | 	if err := app.Run(os.Args); err != nil { | 
					
						
							|  |  |  | 		fmt.Fprintln(os.Stderr, err) | 
					
						
							|  |  |  | 		os.Exit(1) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2014-06-26 10:47:45 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-17 18:33:25 +02:00
										 |  |  | // geth is the main entry point into the system if no special subcommand is ran. | 
					
						
							|  |  |  | // It creates a default node based on the command line arguments and runs it in | 
					
						
							|  |  |  | // blocking mode, waiting for it to be shut down. | 
					
						
							| 
									
										
										
										
											2016-06-10 11:23:00 +03:00
										 |  |  | func geth(ctx *cli.Context) error { | 
					
						
							| 
									
										
										
										
											2016-08-15 18:38:32 +02:00
										 |  |  | 	node := makeFullNode(ctx) | 
					
						
							| 
									
										
										
										
											2015-11-17 18:33:25 +02:00
										 |  |  | 	startNode(ctx, node) | 
					
						
							|  |  |  | 	node.Wait() | 
					
						
							| 
									
										
										
										
											2016-06-10 11:23:00 +03:00
										 |  |  | 	return nil | 
					
						
							| 
									
										
										
										
											2015-03-06 03:00:41 +01:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2014-07-11 16:04:27 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-17 18:33:25 +02:00
										 |  |  | // startNode boots up the system node and all registered protocols, after which | 
					
						
							|  |  |  | // it unlocks any requested accounts, and starts the RPC/IPC interfaces and the | 
					
						
							|  |  |  | // miner. | 
					
						
							|  |  |  | func startNode(ctx *cli.Context, stack *node.Node) { | 
					
						
							|  |  |  | 	// Start up the node itself | 
					
						
							|  |  |  | 	utils.StartNode(stack) | 
					
						
							| 
									
										
										
										
											2015-07-01 16:15:02 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-17 18:33:25 +02:00
										 |  |  | 	// Unlock any account specifically requested | 
					
						
							| 
									
										
										
										
											2017-02-07 12:47:34 +02:00
										 |  |  | 	ks := stack.AccountManager().Backends(keystore.KeyStoreType)[0].(*keystore.KeyStore) | 
					
						
							| 
									
										
										
										
											2017-01-24 11:49:20 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-17 18:33:25 +02:00
										 |  |  | 	passwords := utils.MakePasswordList(ctx) | 
					
						
							| 
									
										
										
										
											2017-02-08 20:25:52 +02:00
										 |  |  | 	unlocks := strings.Split(ctx.GlobalString(utils.UnlockedAccountFlag.Name), ",") | 
					
						
							|  |  |  | 	for i, account := range unlocks { | 
					
						
							| 
									
										
										
										
											2015-11-17 18:33:25 +02:00
										 |  |  | 		if trimmed := strings.TrimSpace(account); trimmed != "" { | 
					
						
							| 
									
										
										
										
											2017-01-24 11:49:20 +02:00
										 |  |  | 			unlockAccount(ctx, ks, trimmed, i, passwords) | 
					
						
							| 
									
										
										
										
											2015-03-24 12:37:00 +00:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-03-23 13:00:06 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-02-08 20:25:52 +02:00
										 |  |  | 	// Register wallet event handlers to open and auto-derive wallets | 
					
						
							|  |  |  | 	events := make(chan accounts.WalletEvent, 16) | 
					
						
							|  |  |  | 	stack.AccountManager().Subscribe(events) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	go func() { | 
					
						
							|  |  |  | 		// Create an chain state reader for self-derivation | 
					
						
							|  |  |  | 		rpcClient, err := stack.Attach() | 
					
						
							|  |  |  | 		if err != nil { | 
					
						
							| 
									
										
										
										
											2017-02-22 17:22:50 +02:00
										 |  |  | 			utils.Fatalf("Failed to attach to self: %v", err) | 
					
						
							| 
									
										
										
										
											2017-02-08 20:25:52 +02:00
										 |  |  | 		} | 
					
						
							|  |  |  | 		stateReader := ethclient.NewClient(rpcClient) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-09 14:39:26 +02:00
										 |  |  | 		// Open and self derive any wallets already attached | 
					
						
							|  |  |  | 		for _, wallet := range stack.AccountManager().Wallets() { | 
					
						
							|  |  |  | 			if err := wallet.Open(""); err != nil { | 
					
						
							| 
									
										
										
										
											2017-03-02 15:06:16 +02:00
										 |  |  | 				log.Warn("Failed to open wallet", "url", wallet.URL(), "err", err) | 
					
						
							| 
									
										
										
										
											2017-02-11 17:02:00 +02:00
										 |  |  | 			} else { | 
					
						
							|  |  |  | 				wallet.SelfDerive(accounts.DefaultBaseDerivationPath, stateReader) | 
					
						
							| 
									
										
										
										
											2017-02-09 14:39:26 +02:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2017-02-08 20:25:52 +02:00
										 |  |  | 		// Listen for wallet event till termination | 
					
						
							|  |  |  | 		for event := range events { | 
					
						
							|  |  |  | 			if event.Arrive { | 
					
						
							|  |  |  | 				if err := event.Wallet.Open(""); err != nil { | 
					
						
							| 
									
										
										
										
											2017-03-02 15:06:16 +02:00
										 |  |  | 					log.Warn("New wallet appeared, failed to open", "url", event.Wallet.URL(), "err", err) | 
					
						
							| 
									
										
										
										
											2017-02-08 20:25:52 +02:00
										 |  |  | 				} else { | 
					
						
							| 
									
										
										
										
											2017-03-02 15:06:16 +02:00
										 |  |  | 					log.Info("New wallet appeared", "url", event.Wallet.URL(), "status", event.Wallet.Status()) | 
					
						
							| 
									
										
										
										
											2017-02-11 17:02:00 +02:00
										 |  |  | 					event.Wallet.SelfDerive(accounts.DefaultBaseDerivationPath, stateReader) | 
					
						
							| 
									
										
										
										
											2017-02-08 20:25:52 +02:00
										 |  |  | 				} | 
					
						
							|  |  |  | 			} else { | 
					
						
							| 
									
										
										
										
											2017-03-02 15:06:16 +02:00
										 |  |  | 				log.Info("Old wallet dropped", "url", event.Wallet.URL()) | 
					
						
							| 
									
										
										
										
											2017-02-09 14:39:26 +02:00
										 |  |  | 				event.Wallet.Close() | 
					
						
							| 
									
										
										
										
											2017-02-08 20:25:52 +02:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}() | 
					
						
							| 
									
										
										
										
											2016-02-02 19:06:43 +02:00
										 |  |  | 	// Start auxiliary services if enabled | 
					
						
							| 
									
										
										
										
											2015-03-06 03:00:41 +01:00
										 |  |  | 	if ctx.GlobalBool(utils.MiningEnabledFlag.Name) { | 
					
						
							| 
									
										
										
										
											2016-06-30 13:03:26 +03:00
										 |  |  | 		var ethereum *eth.Ethereum | 
					
						
							| 
									
										
										
										
											2015-12-16 04:26:23 +01:00
										 |  |  | 		if err := stack.Service(ðereum); err != nil { | 
					
						
							| 
									
										
										
										
											2017-02-22 17:22:50 +02:00
										 |  |  | 			utils.Fatalf("ethereum service not running: %v", err) | 
					
						
							| 
									
										
										
										
											2015-12-16 04:26:23 +01:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2017-04-05 01:16:29 +03:00
										 |  |  | 		if threads := ctx.GlobalInt(utils.MinerThreadsFlag.Name); threads > 0 { | 
					
						
							|  |  |  | 			type threaded interface { | 
					
						
							|  |  |  | 				SetThreads(threads int) | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			if th, ok := ethereum.Engine().(threaded); ok { | 
					
						
							|  |  |  | 				th.SetThreads(threads) | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2017-04-10 11:43:01 +03:00
										 |  |  | 		if err := ethereum.StartMining(true); err != nil { | 
					
						
							| 
									
										
										
										
											2017-02-22 17:22:50 +02:00
										 |  |  | 			utils.Fatalf("Failed to start mining: %v", err) | 
					
						
							| 
									
										
										
										
											2015-04-22 01:36:28 +01:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-03-06 03:00:41 +01:00
										 |  |  | 	} | 
					
						
							|  |  |  | } |