| 
									
										
										
										
											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 ( | 
					
						
							| 
									
										
										
										
											2016-04-28 12:00:11 +03:00
										 |  |  | 	"encoding/hex" | 
					
						
							| 
									
										
										
										
											2014-08-06 09:53:12 +02:00
										 |  |  | 	"fmt" | 
					
						
							| 
									
										
										
										
											2015-03-24 16:19:11 +00:00
										 |  |  | 	"io/ioutil" | 
					
						
							| 
									
										
										
										
											2014-08-06 09:53:12 +02:00
										 |  |  | 	"os" | 
					
						
							| 
									
										
										
										
											2015-05-05 08:24:15 +02:00
										 |  |  | 	"path/filepath" | 
					
						
							| 
									
										
										
										
											2014-07-30 01:05:40 +02:00
										 |  |  | 	"runtime" | 
					
						
							| 
									
										
										
										
											2015-03-06 03:00:41 +01:00
										 |  |  | 	"strconv" | 
					
						
							| 
									
										
										
										
											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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-17 14:12:34 +01:00
										 |  |  | 	"github.com/ethereum/ethash" | 
					
						
							| 
									
										
										
										
											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" | 
					
						
							| 
									
										
										
										
											2016-03-01 23:32:43 +01:00
										 |  |  | 	"github.com/ethereum/go-ethereum/core" | 
					
						
							| 
									
										
										
										
											2015-01-04 14:20:16 +01:00
										 |  |  | 	"github.com/ethereum/go-ethereum/eth" | 
					
						
							| 
									
										
										
										
											2016-03-01 23:32:43 +01:00
										 |  |  | 	"github.com/ethereum/go-ethereum/ethdb" | 
					
						
							| 
									
										
										
										
											2016-01-26 14:39:21 +01:00
										 |  |  | 	"github.com/ethereum/go-ethereum/internal/debug" | 
					
						
							| 
									
										
										
										
											2014-10-31 12:56:05 +01:00
										 |  |  | 	"github.com/ethereum/go-ethereum/logger" | 
					
						
							| 
									
										
										
										
											2015-07-01 00:52:44 +02:00
										 |  |  | 	"github.com/ethereum/go-ethereum/logger/glog" | 
					
						
							| 
									
										
										
										
											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" | 
					
						
							| 
									
										
										
										
											2015-08-06 11:20:15 +02:00
										 |  |  | 	"github.com/ethereum/go-ethereum/params" | 
					
						
							| 
									
										
										
										
											2016-04-28 12:00:11 +03:00
										 |  |  | 	"github.com/ethereum/go-ethereum/release" | 
					
						
							| 
									
										
										
										
											2015-08-06 11:20:15 +02:00
										 |  |  | 	"github.com/ethereum/go-ethereum/rlp" | 
					
						
							| 
									
										
										
										
											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-05-09 22:06:27 +02:00
										 |  |  | 	clientIdentifier = "Geth"   // Client identifier to advertise over the network | 
					
						
							|  |  |  | 	versionMajor     = 1        // Major version component of the current release | 
					
						
							|  |  |  | 	versionMinor     = 4        // Minor version component of the current release | 
					
						
							| 
									
										
										
										
											2016-09-26 08:49:42 +03:00
										 |  |  | 	versionPatch     = 13       // Patch version component of the current release | 
					
						
							| 
									
										
										
										
											2016-05-09 22:06:27 +02:00
										 |  |  | 	versionMeta      = "stable" // Version metadata to append to the version string | 
					
						
							| 
									
										
										
										
											2016-04-28 12:00:11 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-02 15:29:55 +03:00
										 |  |  | 	versionOracle = "0xfa7b9770ca4cb04296cac84f37736d4041251cdf" // Ethereum address of the Geth release oracle | 
					
						
							| 
									
										
										
										
											2014-07-03 17:36:24 +01:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-28 13:14:53 +02:00
										 |  |  | var ( | 
					
						
							| 
									
										
										
										
											2016-04-28 12:00:11 +03:00
										 |  |  | 	gitCommit string         // Git SHA1 commit hash of the release (set via linker flags) | 
					
						
							|  |  |  | 	verString string         // Combined textual representation of all the version components | 
					
						
							|  |  |  | 	relConfig release.Config // Structured version information and release oracle config | 
					
						
							|  |  |  | 	app       *cli.App | 
					
						
							| 
									
										
										
										
											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
										 |  |  | 	// Construct the textual version string from the individual components | 
					
						
							|  |  |  | 	verString = fmt.Sprintf("%d.%d.%d", versionMajor, versionMinor, versionPatch) | 
					
						
							|  |  |  | 	if versionMeta != "" { | 
					
						
							|  |  |  | 		verString += "-" + versionMeta | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if gitCommit != "" { | 
					
						
							|  |  |  | 		verString += "-" + gitCommit[:8] | 
					
						
							| 
									
										
										
										
											2015-04-28 13:14:53 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-04-28 12:00:11 +03:00
										 |  |  | 	// Construct the version release oracle configuration | 
					
						
							|  |  |  | 	relConfig.Oracle = common.HexToAddress(versionOracle) | 
					
						
							| 
									
										
										
										
											2015-04-28 13:14:53 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-28 12:00:11 +03:00
										 |  |  | 	relConfig.Major = uint32(versionMajor) | 
					
						
							|  |  |  | 	relConfig.Minor = uint32(versionMinor) | 
					
						
							|  |  |  | 	relConfig.Patch = uint32(versionPatch) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	commit, _ := hex.DecodeString(gitCommit) | 
					
						
							|  |  |  | 	copy(relConfig.Commit[:], commit) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Initialize the CLI app and start Geth | 
					
						
							|  |  |  | 	app = utils.NewApp(verString, "the go-ethereum command line interface") | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							|  |  |  | 	app.Commands = []cli.Command{ | 
					
						
							| 
									
										
										
										
											2015-05-27 13:43:49 +02:00
										 |  |  | 		importCommand, | 
					
						
							|  |  |  | 		exportCommand, | 
					
						
							|  |  |  | 		upgradedbCommand, | 
					
						
							|  |  |  | 		removedbCommand, | 
					
						
							|  |  |  | 		dumpCommand, | 
					
						
							| 
									
										
										
										
											2015-06-25 10:36:47 +03:00
										 |  |  | 		monitorCommand, | 
					
						
							| 
									
										
										
										
											2016-03-17 13:09:18 +01:00
										 |  |  | 		accountCommand, | 
					
						
							|  |  |  | 		walletCommand, | 
					
						
							| 
									
										
										
										
											2016-05-06 12:40:23 +03:00
										 |  |  | 		consoleCommand, | 
					
						
							|  |  |  | 		attachCommand, | 
					
						
							|  |  |  | 		javascriptCommand, | 
					
						
							| 
									
										
										
										
											2015-03-17 14:12:34 +01:00
										 |  |  | 		{ | 
					
						
							|  |  |  | 			Action: makedag, | 
					
						
							|  |  |  | 			Name:   "makedag", | 
					
						
							|  |  |  | 			Usage:  "generate ethash dag (for testing)", | 
					
						
							|  |  |  | 			Description: ` | 
					
						
							|  |  |  | The makedag command generates an ethash DAG in /tmp/dag. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | This command exists to support the system testing project. | 
					
						
							|  |  |  | Regular users do not need to execute it. | 
					
						
							| 
									
										
										
										
											2015-06-12 07:45:23 +02:00
										 |  |  | `, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			Action: gpuinfo, | 
					
						
							|  |  |  | 			Name:   "gpuinfo", | 
					
						
							|  |  |  | 			Usage:  "gpuinfo", | 
					
						
							|  |  |  | 			Description: ` | 
					
						
							|  |  |  | Prints OpenCL device info for all found GPUs. | 
					
						
							|  |  |  | `, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			Action: gpubench, | 
					
						
							|  |  |  | 			Name:   "gpubench", | 
					
						
							|  |  |  | 			Usage:  "benchmark GPU", | 
					
						
							|  |  |  | 			Description: ` | 
					
						
							|  |  |  | Runs quick benchmark on first GPU found. | 
					
						
							| 
									
										
										
										
											2015-03-17 14:12:34 +01:00
										 |  |  | `, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2015-03-06 03:00:41 +01:00
										 |  |  | 		{ | 
					
						
							|  |  |  | 			Action: version, | 
					
						
							|  |  |  | 			Name:   "version", | 
					
						
							|  |  |  | 			Usage:  "print ethereum version numbers", | 
					
						
							|  |  |  | 			Description: ` | 
					
						
							|  |  |  | The output of this command is supposed to be machine-readable. | 
					
						
							|  |  |  | `, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2016-03-01 23:32:43 +01:00
										 |  |  | 		{ | 
					
						
							|  |  |  | 			Action: initGenesis, | 
					
						
							|  |  |  | 			Name:   "init", | 
					
						
							|  |  |  | 			Usage:  "bootstraps and initialises a new genesis block (JSON)", | 
					
						
							|  |  |  | 			Description: ` | 
					
						
							|  |  |  | The init command initialises a new genesis block and definition for the network. | 
					
						
							|  |  |  | This is a destructive action and changes the network in which you will be | 
					
						
							|  |  |  | participating. | 
					
						
							| 
									
										
										
										
											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, | 
					
						
							| 
									
										
										
										
											2015-04-13 10:13:52 +02:00
										 |  |  | 		utils.BlockchainVersionFlag, | 
					
						
							| 
									
										
										
										
											2015-08-03 17:48:24 +02:00
										 |  |  | 		utils.OlympicFlag, | 
					
						
							| 
									
										
										
										
											2015-10-09 18:36:31 +03:00
										 |  |  | 		utils.FastSyncFlag, | 
					
						
							| 
									
										
										
										
											2015-07-22 13:46:20 +03:00
										 |  |  | 		utils.CacheFlag, | 
					
						
							| 
									
										
										
										
											2015-11-10 15:47:19 +02:00
										 |  |  | 		utils.LightKDFFlag, | 
					
						
							| 
									
										
										
										
											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, | 
					
						
							| 
									
										
										
										
											2016-07-07 16:04:34 +03:00
										 |  |  | 		utils.SupportDAOFork, | 
					
						
							|  |  |  | 		utils.OpposeDAOFork, | 
					
						
							| 
									
										
										
										
											2015-03-06 03:00:41 +01:00
										 |  |  | 		utils.MinerThreadsFlag, | 
					
						
							|  |  |  | 		utils.MiningEnabledFlag, | 
					
						
							| 
									
										
										
										
											2015-06-12 07:45:23 +02:00
										 |  |  | 		utils.MiningGPUFlag, | 
					
						
							| 
									
										
										
										
											2015-05-20 16:56:17 +01:00
										 |  |  | 		utils.AutoDAGFlag, | 
					
						
							| 
									
										
										
										
											2016-04-04 12:04:04 +03:00
										 |  |  | 		utils.TargetGasLimitFlag, | 
					
						
							| 
									
										
										
										
											2015-03-06 03:00:41 +01:00
										 |  |  | 		utils.NATFlag, | 
					
						
							| 
									
										
										
										
											2015-04-08 13:22:31 +02:00
										 |  |  | 		utils.NatspecEnabledFlag, | 
					
						
							| 
									
										
										
										
											2015-05-26 19:07:24 +03:00
										 |  |  | 		utils.NoDiscoverFlag, | 
					
						
							| 
									
										
										
										
											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.IPCApiFlag, | 
					
						
							|  |  |  | 		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, | 
					
						
							| 
									
										
										
										
											2015-07-17 23:09:36 +02:00
										 |  |  | 		utils.VMForceJitFlag, | 
					
						
							|  |  |  | 		utils.VMJitCacheFlag, | 
					
						
							|  |  |  | 		utils.VMEnableJitFlag, | 
					
						
							| 
									
										
										
										
											2015-03-18 14:44:58 +07:00
										 |  |  | 		utils.NetworkIdFlag, | 
					
						
							| 
									
										
										
										
											2015-03-29 21:21:14 +02:00
										 |  |  | 		utils.RPCCORSDomainFlag, | 
					
						
							| 
									
										
										
										
											2015-06-29 16:11:01 +03:00
										 |  |  | 		utils.MetricsEnabledFlag, | 
					
						
							| 
									
										
										
										
											2016-04-21 12:14:57 +03:00
										 |  |  | 		utils.FakePoWFlag, | 
					
						
							| 
									
										
										
										
											2015-04-22 23:11:11 +01:00
										 |  |  | 		utils.SolcPathFlag, | 
					
						
							| 
									
										
										
										
											2015-05-26 14:17:43 +02:00
										 |  |  | 		utils.GpoMinGasPriceFlag, | 
					
						
							|  |  |  | 		utils.GpoMaxGasPriceFlag, | 
					
						
							|  |  |  | 		utils.GpoFullBlockRatioFlag, | 
					
						
							|  |  |  | 		utils.GpobaseStepDownFlag, | 
					
						
							|  |  |  | 		utils.GpobaseStepUpFlag, | 
					
						
							|  |  |  | 		utils.GpobaseCorrectionFactorFlag, | 
					
						
							| 
									
										
										
										
											2015-09-22 10:34:58 +02:00
										 |  |  | 		utils.ExtraDataFlag, | 
					
						
							| 
									
										
										
										
											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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-24 18:49:54 +02:00
										 |  |  | 		// This should be the only place where reporting is enabled | 
					
						
							|  |  |  | 		// because it is not intended to run while testing. | 
					
						
							|  |  |  | 		// In addition to this check, bad block reports are sent only | 
					
						
							|  |  |  | 		// for chains with the main network genesis block and network id 1. | 
					
						
							|  |  |  | 		eth.EnableBadBlockReporting = true | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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 { | 
					
						
							|  |  |  | 		logger.Flush() | 
					
						
							|  |  |  | 		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-08-06 11:20:15 +02:00
										 |  |  | func makeDefaultExtra() []byte { | 
					
						
							|  |  |  | 	var clientInfo = struct { | 
					
						
							|  |  |  | 		Version   uint | 
					
						
							|  |  |  | 		Name      string | 
					
						
							|  |  |  | 		GoVersion string | 
					
						
							|  |  |  | 		Os        string | 
					
						
							| 
									
										
										
										
											2016-04-28 12:00:11 +03:00
										 |  |  | 	}{uint(versionMajor<<16 | versionMinor<<8 | versionPatch), clientIdentifier, runtime.Version(), runtime.GOOS} | 
					
						
							| 
									
										
										
										
											2015-08-06 11:20:15 +02:00
										 |  |  | 	extra, err := rlp.EncodeToBytes(clientInfo) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		glog.V(logger.Warn).Infoln("error setting canonical miner information:", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if uint64(len(extra)) > params.MaximumExtraDataSize.Uint64() { | 
					
						
							|  |  |  | 		glog.V(logger.Warn).Infoln("error setting canonical miner information: extra exceeds", params.MaximumExtraDataSize) | 
					
						
							|  |  |  | 		glog.V(logger.Debug).Infof("extra: %x\n", extra) | 
					
						
							|  |  |  | 		return nil | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return extra | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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-04-28 12:00:11 +03:00
										 |  |  | 	node := utils.MakeSystemNode(clientIdentifier, verString, relConfig, makeDefaultExtra(), 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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-01 23:32:43 +01:00
										 |  |  | // initGenesis will initialise the given JSON format genesis file and writes it as | 
					
						
							|  |  |  | // the zero'd block (i.e. genesis) or will fail hard if it can't succeed. | 
					
						
							| 
									
										
										
										
											2016-06-10 11:23:00 +03:00
										 |  |  | func initGenesis(ctx *cli.Context) error { | 
					
						
							| 
									
										
										
										
											2016-03-01 23:32:43 +01:00
										 |  |  | 	genesisPath := ctx.Args().First() | 
					
						
							|  |  |  | 	if len(genesisPath) == 0 { | 
					
						
							|  |  |  | 		utils.Fatalf("must supply path to genesis JSON file") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	chainDb, err := ethdb.NewLDBDatabase(filepath.Join(utils.MustMakeDataDir(ctx), "chaindata"), 0, 0) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		utils.Fatalf("could not open database: %v", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	genesisFile, err := os.Open(genesisPath) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		utils.Fatalf("failed to read genesis file: %v", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	block, err := core.WriteGenesisBlock(chainDb, genesisFile) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		utils.Fatalf("failed to write genesis block: %v", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	glog.V(logger.Info).Infof("successfully wrote genesis block and/or chain rule set: %x", block.Hash()) | 
					
						
							| 
									
										
										
										
											2016-06-10 11:23:00 +03:00
										 |  |  | 	return nil | 
					
						
							| 
									
										
										
										
											2016-03-01 23:32:43 +01: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 | 
					
						
							|  |  |  | 	var ethereum *eth.Ethereum | 
					
						
							| 
									
										
										
										
											2015-11-26 18:35:44 +02:00
										 |  |  | 	if err := stack.Service(ðereum); err != nil { | 
					
						
							| 
									
										
										
										
											2015-11-17 18:33:25 +02:00
										 |  |  | 		utils.Fatalf("ethereum service not running: %v", err) | 
					
						
							| 
									
										
										
										
											2015-07-01 00:52:44 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-11-17 18:33:25 +02:00
										 |  |  | 	accman := ethereum.AccountManager() | 
					
						
							|  |  |  | 	passwords := utils.MakePasswordList(ctx) | 
					
						
							| 
									
										
										
										
											2015-03-23 13:00:06 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-17 18:33:25 +02:00
										 |  |  | 	accounts := strings.Split(ctx.GlobalString(utils.UnlockedAccountFlag.Name), ",") | 
					
						
							| 
									
										
										
										
											2015-06-18 16:20:00 +01:00
										 |  |  | 	for i, account := range accounts { | 
					
						
							| 
									
										
										
										
											2015-11-17 18:33:25 +02:00
										 |  |  | 		if trimmed := strings.TrimSpace(account); trimmed != "" { | 
					
						
							|  |  |  | 			unlockAccount(ctx, accman, trimmed, i, passwords) | 
					
						
							| 
									
										
										
										
											2015-03-24 12:37:00 +00:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-03-23 13:00:06 +00: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) { | 
					
						
							| 
									
										
										
										
											2015-11-17 18:33:25 +02:00
										 |  |  | 		if err := ethereum.StartMining(ctx.GlobalInt(utils.MinerThreadsFlag.Name), ctx.GlobalString(utils.MiningGPUFlag.Name)); err != nil { | 
					
						
							|  |  |  | 			utils.Fatalf("Failed to start mining: %v", err) | 
					
						
							| 
									
										
										
										
											2015-04-22 01:36:28 +01:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-03-06 03:00:41 +01:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2015-01-05 17:10:42 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-10 11:23:00 +03:00
										 |  |  | func makedag(ctx *cli.Context) error { | 
					
						
							| 
									
										
										
										
											2015-05-05 08:24:15 +02:00
										 |  |  | 	args := ctx.Args() | 
					
						
							|  |  |  | 	wrongArgs := func() { | 
					
						
							|  |  |  | 		utils.Fatalf(`Usage: geth makedag <block number> <outputdir>`) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	switch { | 
					
						
							|  |  |  | 	case len(args) == 2: | 
					
						
							|  |  |  | 		blockNum, err := strconv.ParseUint(args[0], 0, 64) | 
					
						
							|  |  |  | 		dir := args[1] | 
					
						
							|  |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			wrongArgs() | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			dir = filepath.Clean(dir) | 
					
						
							|  |  |  | 			// seems to require a trailing slash | 
					
						
							|  |  |  | 			if !strings.HasSuffix(dir, "/") { | 
					
						
							|  |  |  | 				dir = dir + "/" | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			_, err = ioutil.ReadDir(dir) | 
					
						
							|  |  |  | 			if err != nil { | 
					
						
							|  |  |  | 				utils.Fatalf("Can't find dir") | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			fmt.Println("making DAG, this could take awhile...") | 
					
						
							|  |  |  | 			ethash.MakeDAG(blockNum, dir) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	default: | 
					
						
							|  |  |  | 		wrongArgs() | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-06-10 11:23:00 +03:00
										 |  |  | 	return nil | 
					
						
							| 
									
										
										
										
											2015-03-17 14:12:34 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-10 11:23:00 +03:00
										 |  |  | func gpuinfo(ctx *cli.Context) error { | 
					
						
							| 
									
										
										
										
											2015-06-12 07:45:23 +02:00
										 |  |  | 	eth.PrintOpenCLDevices() | 
					
						
							| 
									
										
										
										
											2016-06-10 11:23:00 +03:00
										 |  |  | 	return nil | 
					
						
							| 
									
										
										
										
											2015-06-12 07:45:23 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-10 11:23:00 +03:00
										 |  |  | func gpubench(ctx *cli.Context) error { | 
					
						
							| 
									
										
										
										
											2015-06-12 07:45:23 +02:00
										 |  |  | 	args := ctx.Args() | 
					
						
							|  |  |  | 	wrongArgs := func() { | 
					
						
							|  |  |  | 		utils.Fatalf(`Usage: geth gpubench <gpu number>`) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	switch { | 
					
						
							|  |  |  | 	case len(args) == 1: | 
					
						
							|  |  |  | 		n, err := strconv.ParseUint(args[0], 0, 64) | 
					
						
							|  |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			wrongArgs() | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		eth.GPUBench(n) | 
					
						
							|  |  |  | 	case len(args) == 0: | 
					
						
							|  |  |  | 		eth.GPUBench(0) | 
					
						
							|  |  |  | 	default: | 
					
						
							|  |  |  | 		wrongArgs() | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-06-10 11:23:00 +03:00
										 |  |  | 	return nil | 
					
						
							| 
									
										
										
										
											2015-06-12 07:45:23 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-10 11:23:00 +03:00
										 |  |  | func version(c *cli.Context) error { | 
					
						
							| 
									
										
										
										
											2016-04-28 12:00:11 +03:00
										 |  |  | 	fmt.Println(clientIdentifier) | 
					
						
							| 
									
										
										
										
											2016-05-03 14:01:37 +02:00
										 |  |  | 	fmt.Println("Version:", verString) | 
					
						
							| 
									
										
										
										
											2015-06-26 16:54:27 +03:00
										 |  |  | 	fmt.Println("Protocol Versions:", eth.ProtocolVersions) | 
					
						
							| 
									
										
										
										
											2015-04-28 13:14:53 +02:00
										 |  |  | 	fmt.Println("Network Id:", c.GlobalInt(utils.NetworkIdFlag.Name)) | 
					
						
							|  |  |  | 	fmt.Println("Go Version:", runtime.Version()) | 
					
						
							|  |  |  | 	fmt.Println("OS:", runtime.GOOS) | 
					
						
							|  |  |  | 	fmt.Printf("GOPATH=%s\n", os.Getenv("GOPATH")) | 
					
						
							|  |  |  | 	fmt.Printf("GOROOT=%s\n", runtime.GOROOT()) | 
					
						
							| 
									
										
										
										
											2016-06-10 11:23:00 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return nil | 
					
						
							| 
									
										
										
										
											2015-01-07 01:21:55 +01:00
										 |  |  | } |