| 
									
										
										
										
											2015-01-06 12:13:57 +01:00
										 |  |  | /* | 
					
						
							|  |  |  | 	This file is part of go-ethereum | 
					
						
							| 
									
										
										
										
											2014-10-23 15:48:53 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-06 12:13:57 +01:00
										 |  |  | 	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/>. | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * @authors | 
					
						
							|  |  |  |  * 	Jeffrey Wilcke <i@jev.io> | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2014-06-23 12:20:59 +01:00
										 |  |  | package main | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							| 
									
										
										
										
											2015-03-07 12:39:52 +01:00
										 |  |  | 	"bufio" | 
					
						
							| 
									
										
										
										
											2014-08-06 09:53:12 +02:00
										 |  |  | 	"fmt" | 
					
						
							|  |  |  | 	"os" | 
					
						
							| 
									
										
										
										
											2014-07-30 01:05:40 +02:00
										 |  |  | 	"runtime" | 
					
						
							| 
									
										
										
										
											2015-03-06 03:00:41 +01:00
										 |  |  | 	"strconv" | 
					
						
							| 
									
										
										
										
											2015-03-11 01:08:42 +01:00
										 |  |  | 	"strings" | 
					
						
							| 
									
										
										
										
											2014-12-23 18:35:36 +01:00
										 |  |  | 	"time" | 
					
						
							| 
									
										
										
										
											2014-07-30 01:05:40 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-06 03:00:41 +01:00
										 |  |  | 	"github.com/codegangsta/cli" | 
					
						
							| 
									
										
										
										
											2014-10-31 14:20:11 +01:00
										 |  |  | 	"github.com/ethereum/go-ethereum/cmd/utils" | 
					
						
							| 
									
										
										
										
											2014-12-04 10:53:49 +01:00
										 |  |  | 	"github.com/ethereum/go-ethereum/core/types" | 
					
						
							| 
									
										
										
										
											2015-01-04 14:20:16 +01:00
										 |  |  | 	"github.com/ethereum/go-ethereum/eth" | 
					
						
							| 
									
										
										
										
											2015-03-16 11:27:38 +01:00
										 |  |  | 	"github.com/ethereum/go-ethereum/common" | 
					
						
							| 
									
										
										
										
											2014-10-31 12:56:05 +01:00
										 |  |  | 	"github.com/ethereum/go-ethereum/logger" | 
					
						
							| 
									
										
										
										
											2015-01-07 13:17:48 +01:00
										 |  |  | 	"github.com/ethereum/go-ethereum/state" | 
					
						
							| 
									
										
										
										
											2015-03-07 12:39:52 +01:00
										 |  |  | 	"github.com/peterh/liner" | 
					
						
							| 
									
										
										
										
											2014-06-23 12:20:59 +01:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-03 17:36:24 +01:00
										 |  |  | const ( | 
					
						
							|  |  |  | 	ClientIdentifier = "Ethereum(G)" | 
					
						
							| 
									
										
										
										
											2015-03-08 00:59:26 +01:00
										 |  |  | 	Version          = "0.9.0" | 
					
						
							| 
									
										
										
										
											2014-07-03 17:36:24 +01:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-06 03:00:41 +01:00
										 |  |  | var ( | 
					
						
							|  |  |  | 	clilogger = logger.NewLogger("CLI") | 
					
						
							| 
									
										
										
										
											2015-03-09 22:51:50 +01:00
										 |  |  | 	app       = utils.NewApp(Version, "the go-ethereum command line interface") | 
					
						
							| 
									
										
										
										
											2015-03-06 03:00:41 +01:00
										 |  |  | ) | 
					
						
							| 
									
										
										
										
											2014-06-23 12:20:59 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-06 03:00:41 +01:00
										 |  |  | func init() { | 
					
						
							|  |  |  | 	app.Action = run | 
					
						
							|  |  |  | 	app.HideVersion = true // we have a command to print the version | 
					
						
							|  |  |  | 	app.Commands = []cli.Command{ | 
					
						
							| 
									
										
										
										
											2015-03-13 18:37:13 +01:00
										 |  |  | 		blocktestCmd, | 
					
						
							| 
									
										
										
										
											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. | 
					
						
							|  |  |  | `, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2015-03-07 12:39:52 +01:00
										 |  |  | 		{ | 
					
						
							|  |  |  | 			Action: accountList, | 
					
						
							|  |  |  | 			Name:   "account", | 
					
						
							|  |  |  | 			Usage:  "manage accounts", | 
					
						
							|  |  |  | 			Subcommands: []cli.Command{ | 
					
						
							|  |  |  | 				{ | 
					
						
							|  |  |  | 					Action: accountList, | 
					
						
							|  |  |  | 					Name:   "list", | 
					
						
							|  |  |  | 					Usage:  "print account addresses", | 
					
						
							|  |  |  | 				}, | 
					
						
							|  |  |  | 				{ | 
					
						
							|  |  |  | 					Action: accountCreate, | 
					
						
							|  |  |  | 					Name:   "new", | 
					
						
							|  |  |  | 					Usage:  "create a new account", | 
					
						
							|  |  |  | 				}, | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2015-03-06 03:00:41 +01:00
										 |  |  | 		{ | 
					
						
							|  |  |  | 			Action: dump, | 
					
						
							|  |  |  | 			Name:   "dump", | 
					
						
							|  |  |  | 			Usage:  `dump a specific block from storage`, | 
					
						
							|  |  |  | 			Description: ` | 
					
						
							|  |  |  | The arguments are interpreted as block numbers or hashes. | 
					
						
							|  |  |  | Use "ethereum dump 0" to dump the genesis block. | 
					
						
							|  |  |  | `, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			Action: runjs, | 
					
						
							|  |  |  | 			Name:   "js", | 
					
						
							|  |  |  | 			Usage:  `interactive JavaScript console`, | 
					
						
							|  |  |  | 			Description: ` | 
					
						
							|  |  |  | In the console, you can use the eth object to interact | 
					
						
							|  |  |  | with the running ethereum stack. The API does not match | 
					
						
							|  |  |  | ethereum.js. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | A JavaScript file can be provided as the argument. The | 
					
						
							|  |  |  | runtime will execute the file and exit. | 
					
						
							|  |  |  | `, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			Action: importchain, | 
					
						
							|  |  |  | 			Name:   "import", | 
					
						
							|  |  |  | 			Usage:  `import a blockchain file`, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2015-03-08 22:44:48 +07:00
										 |  |  | 		{ | 
					
						
							|  |  |  | 			Action: exportchain, | 
					
						
							|  |  |  | 			Name:   "export", | 
					
						
							|  |  |  | 			Usage:  `export blockchain into file`, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2015-03-06 03:00:41 +01:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	app.Flags = []cli.Flag{ | 
					
						
							| 
									
										
										
										
											2015-03-11 01:08:42 +01:00
										 |  |  | 		utils.UnlockedAccountFlag, | 
					
						
							| 
									
										
										
										
											2015-03-06 03:00:41 +01:00
										 |  |  | 		utils.BootnodesFlag, | 
					
						
							|  |  |  | 		utils.DataDirFlag, | 
					
						
							|  |  |  | 		utils.ListenPortFlag, | 
					
						
							|  |  |  | 		utils.LogFileFlag, | 
					
						
							|  |  |  | 		utils.LogFormatFlag, | 
					
						
							|  |  |  | 		utils.LogLevelFlag, | 
					
						
							|  |  |  | 		utils.MaxPeersFlag, | 
					
						
							|  |  |  | 		utils.MinerThreadsFlag, | 
					
						
							|  |  |  | 		utils.MiningEnabledFlag, | 
					
						
							|  |  |  | 		utils.NATFlag, | 
					
						
							|  |  |  | 		utils.NodeKeyFileFlag, | 
					
						
							|  |  |  | 		utils.NodeKeyHexFlag, | 
					
						
							|  |  |  | 		utils.RPCEnabledFlag, | 
					
						
							|  |  |  | 		utils.RPCListenAddrFlag, | 
					
						
							|  |  |  | 		utils.RPCPortFlag, | 
					
						
							| 
									
										
										
										
											2015-03-11 13:56:02 +01:00
										 |  |  | 		utils.UnencryptedKeysFlag, | 
					
						
							| 
									
										
										
										
											2015-03-06 16:58:52 +01:00
										 |  |  | 		utils.VMDebugFlag, | 
					
						
							|  |  |  | 		//utils.VMTypeFlag, | 
					
						
							| 
									
										
										
										
											2015-03-06 03:00:41 +01:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// missing: | 
					
						
							|  |  |  | 	// flag.StringVar(&ConfigFile, "conf", defaultConfigFile, "config file") | 
					
						
							|  |  |  | 	// flag.BoolVar(&DiffTool, "difftool", false, "creates output for diff'ing. Sets LogLevel=0") | 
					
						
							|  |  |  | 	// flag.StringVar(&DiffType, "diff", "all", "sets the level of diff output [vm, all]. Has no effect if difftool=false") | 
					
						
							| 
									
										
										
										
											2014-06-23 12:20:59 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-06 03:00:41 +01:00
										 |  |  | 	// potential subcommands: | 
					
						
							|  |  |  | 	// flag.StringVar(&SecretFile, "import", "", "imports the file given (hex or mnemonic formats)") | 
					
						
							|  |  |  | 	// flag.StringVar(&ExportDir, "export", "", "exports the session keyring to files in the directory given") | 
					
						
							|  |  |  | 	// flag.BoolVar(&GenAddr, "genaddr", false, "create a new priv/pub key") | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2014-12-23 14:33:15 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-06 03:00:41 +01:00
										 |  |  | func main() { | 
					
						
							|  |  |  | 	runtime.GOMAXPROCS(runtime.NumCPU()) | 
					
						
							|  |  |  | 	defer logger.Flush() | 
					
						
							|  |  |  | 	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-03-06 03:00:41 +01:00
										 |  |  | func run(ctx *cli.Context) { | 
					
						
							|  |  |  | 	fmt.Printf("Welcome to the FRONTIER\n") | 
					
						
							| 
									
										
										
										
											2015-03-06 12:18:44 +01:00
										 |  |  | 	utils.HandleInterrupt() | 
					
						
							| 
									
										
										
										
											2015-03-13 18:30:45 +01:00
										 |  |  | 	cfg := utils.MakeEthConfig(ClientIdentifier, Version, ctx) | 
					
						
							|  |  |  | 	ethereum, err := eth.New(cfg) | 
					
						
							| 
									
										
										
										
											2015-03-11 23:41:51 +01:00
										 |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2015-03-10 15:44:05 +01:00
										 |  |  | 		utils.Fatalf("%v", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-13 18:30:45 +01:00
										 |  |  | 	startEth(ctx, ethereum) | 
					
						
							| 
									
										
										
										
											2015-03-06 03:00:41 +01:00
										 |  |  | 	// this blocks the thread | 
					
						
							| 
									
										
										
										
											2015-03-13 18:30:45 +01:00
										 |  |  | 	ethereum.WaitForShutdown() | 
					
						
							| 
									
										
										
										
											2015-03-06 03:00:41 +01:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2014-07-11 16:04:27 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-06 03:00:41 +01:00
										 |  |  | func runjs(ctx *cli.Context) { | 
					
						
							| 
									
										
										
										
											2015-03-13 18:30:45 +01:00
										 |  |  | 	cfg := utils.MakeEthConfig(ClientIdentifier, Version, ctx) | 
					
						
							|  |  |  | 	ethereum, err := eth.New(cfg) | 
					
						
							| 
									
										
										
										
											2015-03-11 23:41:51 +01:00
										 |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2015-03-10 15:44:05 +01:00
										 |  |  | 		utils.Fatalf("%v", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-13 18:30:45 +01:00
										 |  |  | 	startEth(ctx, ethereum) | 
					
						
							|  |  |  | 	repl := newJSRE(ethereum) | 
					
						
							| 
									
										
										
										
											2015-03-06 03:00:41 +01:00
										 |  |  | 	if len(ctx.Args()) == 0 { | 
					
						
							| 
									
										
										
										
											2015-03-10 02:00:57 +01:00
										 |  |  | 		repl.interactive() | 
					
						
							| 
									
										
										
										
											2015-03-06 03:00:41 +01:00
										 |  |  | 	} else { | 
					
						
							| 
									
										
										
										
											2015-03-10 00:24:11 +01:00
										 |  |  | 		for _, file := range ctx.Args() { | 
					
						
							| 
									
										
										
										
											2015-03-10 02:00:57 +01:00
										 |  |  | 			repl.exec(file) | 
					
						
							| 
									
										
										
										
											2015-03-10 00:24:11 +01:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-01-07 01:21:55 +01:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-03-13 18:30:45 +01:00
										 |  |  | 	ethereum.Stop() | 
					
						
							|  |  |  | 	ethereum.WaitForShutdown() | 
					
						
							| 
									
										
										
										
											2015-03-06 03:00:41 +01:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2015-01-07 01:21:55 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-06 03:00:41 +01:00
										 |  |  | func startEth(ctx *cli.Context, eth *eth.Ethereum) { | 
					
						
							|  |  |  | 	utils.StartEthereum(eth) | 
					
						
							| 
									
										
										
										
											2015-03-11 01:08:42 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// Load startup keys. XXX we are going to need a different format | 
					
						
							|  |  |  | 	account := ctx.GlobalString(utils.UnlockedAccountFlag.Name) | 
					
						
							|  |  |  | 	if len(account) > 0 { | 
					
						
							|  |  |  | 		split := strings.Split(account, ":") | 
					
						
							|  |  |  | 		if len(split) != 2 { | 
					
						
							|  |  |  | 			utils.Fatalf("Illegal 'unlock' format (address:password)") | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-03-11 16:33:04 +01:00
										 |  |  | 		am := eth.AccountManager() | 
					
						
							| 
									
										
										
										
											2015-03-11 01:08:42 +01:00
										 |  |  | 		// Attempt to unlock the account | 
					
						
							| 
									
										
										
										
											2015-03-16 11:27:38 +01:00
										 |  |  | 		err := am.Unlock(common.FromHex(split[0]), split[1]) | 
					
						
							| 
									
										
										
										
											2015-03-11 01:08:42 +01:00
										 |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			utils.Fatalf("Unlock account failed '%v'", err) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-03-10 16:44:22 +01:00
										 |  |  | 	// Start auxiliary services if enabled. | 
					
						
							| 
									
										
										
										
											2015-03-06 03:00:41 +01:00
										 |  |  | 	if ctx.GlobalBool(utils.RPCEnabledFlag.Name) { | 
					
						
							| 
									
										
										
										
											2015-03-09 23:00:27 +01:00
										 |  |  | 		utils.StartRPC(eth, ctx) | 
					
						
							| 
									
										
										
										
											2015-03-06 03:00:41 +01:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	if ctx.GlobalBool(utils.MiningEnabledFlag.Name) { | 
					
						
							| 
									
										
										
										
											2015-03-11 23:35:34 +01:00
										 |  |  | 		eth.StartMining() | 
					
						
							| 
									
										
										
										
											2015-03-06 03:00:41 +01:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2015-01-05 17:10:42 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-07 12:39:52 +01:00
										 |  |  | func accountList(ctx *cli.Context) { | 
					
						
							|  |  |  | 	am := utils.GetAccountManager(ctx) | 
					
						
							|  |  |  | 	accts, err := am.Accounts() | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		utils.Fatalf("Could not list accounts: %v", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	for _, acct := range accts { | 
					
						
							|  |  |  | 		fmt.Printf("Address: %#x\n", acct) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func accountCreate(ctx *cli.Context) { | 
					
						
							|  |  |  | 	am := utils.GetAccountManager(ctx) | 
					
						
							| 
									
										
										
										
											2015-03-11 13:56:02 +01:00
										 |  |  | 	passphrase := "" | 
					
						
							|  |  |  | 	if !ctx.GlobalBool(utils.UnencryptedKeysFlag.Name) { | 
					
						
							|  |  |  | 		fmt.Println("The new account will be encrypted with a passphrase.") | 
					
						
							|  |  |  | 		fmt.Println("Please enter a passphrase now.") | 
					
						
							|  |  |  | 		auth, err := readPassword("Passphrase: ", true) | 
					
						
							|  |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			utils.Fatalf("%v", err) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		confirm, err := readPassword("Repeat Passphrase: ", false) | 
					
						
							|  |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			utils.Fatalf("%v", err) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if auth != confirm { | 
					
						
							|  |  |  | 			utils.Fatalf("Passphrases did not match.") | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		passphrase = auth | 
					
						
							| 
									
										
										
										
											2015-03-07 12:39:52 +01:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-03-11 13:56:02 +01:00
										 |  |  | 	acct, err := am.NewAccount(passphrase) | 
					
						
							| 
									
										
										
										
											2015-03-07 12:39:52 +01:00
										 |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		utils.Fatalf("Could not create the account: %v", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	fmt.Printf("Address: %#x\n", acct.Address) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-06 03:00:41 +01:00
										 |  |  | func importchain(ctx *cli.Context) { | 
					
						
							|  |  |  | 	if len(ctx.Args()) != 1 { | 
					
						
							|  |  |  | 		utils.Fatalf("This command requires an argument.") | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-03-08 22:44:48 +07:00
										 |  |  | 	chainmgr, _, _ := utils.GetChain(ctx) | 
					
						
							| 
									
										
										
										
											2015-03-06 03:00:41 +01:00
										 |  |  | 	start := time.Now() | 
					
						
							| 
									
										
										
										
											2015-03-08 22:44:48 +07:00
										 |  |  | 	err := utils.ImportChain(chainmgr, ctx.Args().First()) | 
					
						
							| 
									
										
										
										
											2014-08-22 12:14:37 +02:00
										 |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2015-03-06 03:00:41 +01:00
										 |  |  | 		utils.Fatalf("Import error: %v\n", err) | 
					
						
							| 
									
										
										
										
											2014-08-22 12:14:37 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-03-08 22:44:48 +07:00
										 |  |  | 	fmt.Printf("Import done in %v", time.Since(start)) | 
					
						
							|  |  |  | 	return | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func exportchain(ctx *cli.Context) { | 
					
						
							|  |  |  | 	if len(ctx.Args()) != 1 { | 
					
						
							|  |  |  | 		utils.Fatalf("This command requires an argument.") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	chainmgr, _, _ := utils.GetChain(ctx) | 
					
						
							|  |  |  | 	start := time.Now() | 
					
						
							|  |  |  | 	err := utils.ExportChain(chainmgr, ctx.Args().First()) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		utils.Fatalf("Export error: %v\n", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	fmt.Printf("Export done in %v", time.Since(start)) | 
					
						
							| 
									
										
										
										
											2015-03-06 03:00:41 +01:00
										 |  |  | 	return | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2015-01-05 17:10:42 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-06 03:00:41 +01:00
										 |  |  | func dump(ctx *cli.Context) { | 
					
						
							| 
									
										
										
										
											2015-03-08 22:44:48 +07:00
										 |  |  | 	chainmgr, _, stateDb := utils.GetChain(ctx) | 
					
						
							| 
									
										
										
										
											2015-03-06 03:00:41 +01:00
										 |  |  | 	for _, arg := range ctx.Args() { | 
					
						
							| 
									
										
										
										
											2014-11-18 19:52:45 +01:00
										 |  |  | 		var block *types.Block | 
					
						
							| 
									
										
										
										
											2015-03-06 03:00:41 +01:00
										 |  |  | 		if hashish(arg) { | 
					
						
							| 
									
										
										
										
											2015-03-16 11:27:38 +01:00
										 |  |  | 			block = chainmgr.GetBlock(common.Hex2Bytes(arg)) | 
					
						
							| 
									
										
										
										
											2014-08-06 09:53:12 +02:00
										 |  |  | 		} else { | 
					
						
							| 
									
										
										
										
											2015-03-06 03:00:41 +01:00
										 |  |  | 			num, _ := strconv.Atoi(arg) | 
					
						
							| 
									
										
										
										
											2015-03-08 22:44:48 +07:00
										 |  |  | 			block = chainmgr.GetBlockByNumber(uint64(num)) | 
					
						
							| 
									
										
										
										
											2014-08-06 09:53:12 +02:00
										 |  |  | 		} | 
					
						
							|  |  |  | 		if block == nil { | 
					
						
							|  |  |  | 			fmt.Println("{}") | 
					
						
							| 
									
										
										
										
											2015-03-06 03:00:41 +01:00
										 |  |  | 			utils.Fatalf("block not found") | 
					
						
							|  |  |  | 		} else { | 
					
						
							| 
									
										
										
										
											2015-03-06 18:26:16 +01:00
										 |  |  | 			statedb := state.New(block.Root(), stateDb) | 
					
						
							| 
									
										
										
										
											2015-03-06 03:00:41 +01:00
										 |  |  | 			fmt.Printf("%s\n", statedb.Dump()) | 
					
						
							|  |  |  | 			// fmt.Println(block) | 
					
						
							| 
									
										
										
										
											2014-12-23 14:33:15 +01:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-02-28 23:01:41 +01:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-03-06 03:00:41 +01:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2015-02-28 23:01:41 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-06 03:00:41 +01:00
										 |  |  | func version(c *cli.Context) { | 
					
						
							| 
									
										
										
										
											2015-03-08 22:50:27 +07:00
										 |  |  | 	fmt.Printf(`%v | 
					
						
							|  |  |  | Version: %v | 
					
						
							|  |  |  | Protocol Version: %d | 
					
						
							|  |  |  | Network Id: %d | 
					
						
							|  |  |  | GO: %s | 
					
						
							|  |  |  | OS: %s | 
					
						
							| 
									
										
										
										
											2015-01-07 01:21:55 +01:00
										 |  |  | GOPATH=%s | 
					
						
							|  |  |  | GOROOT=%s | 
					
						
							| 
									
										
										
										
											2015-03-08 22:50:27 +07:00
										 |  |  | `, ClientIdentifier, Version, eth.ProtocolVersion, eth.NetworkId, runtime.Version(), runtime.GOOS, os.Getenv("GOPATH"), runtime.GOROOT()) | 
					
						
							| 
									
										
										
										
											2015-01-07 01:21:55 +01:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2015-03-07 12:39:52 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | // hashish returns true for strings that look like hashes. | 
					
						
							|  |  |  | func hashish(x string) bool { | 
					
						
							|  |  |  | 	_, err := strconv.Atoi(x) | 
					
						
							|  |  |  | 	return err != nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func readPassword(prompt string, warnTerm bool) (string, error) { | 
					
						
							|  |  |  | 	if liner.TerminalSupported() { | 
					
						
							|  |  |  | 		lr := liner.NewLiner() | 
					
						
							|  |  |  | 		defer lr.Close() | 
					
						
							|  |  |  | 		return lr.PasswordPrompt(prompt) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if warnTerm { | 
					
						
							|  |  |  | 		fmt.Println("!! Unsupported terminal, password will be echoed.") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	fmt.Print(prompt) | 
					
						
							|  |  |  | 	input, err := bufio.NewReader(os.Stdin).ReadString('\n') | 
					
						
							|  |  |  | 	fmt.Println() | 
					
						
							|  |  |  | 	return input, err | 
					
						
							|  |  |  | } |