| 
									
										
										
										
											2015-01-06 12:13:57 +01:00
										 |  |  | /* | 
					
						
							|  |  |  | 	This file is part of go-ethereum | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	go-ethereum is free software: you can redistribute it and/or modify | 
					
						
							|  |  |  | 	it under the terms of the GNU General Public License as published by | 
					
						
							|  |  |  | 	the Free Software Foundation, either version 3 of the License, or | 
					
						
							|  |  |  | 	(at your option) any later version. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	go-ethereum is distributed in the hope that it will be useful, | 
					
						
							|  |  |  | 	but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  | 	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
					
						
							|  |  |  | 	GNU General Public License for more details. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	You should have received a copy of the GNU General Public License | 
					
						
							|  |  |  | 	along with go-ethereum.  If not, see <http://www.gnu.org/licenses/>. | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * @authors | 
					
						
							|  |  |  |  * 	Jeffrey Wilcke <i@jev.io> | 
					
						
							|  |  |  |  * 	Viktor Tron <viktor@ethdev.com> | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2014-05-14 12:41:30 +02:00
										 |  |  | package utils | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							| 
									
										
										
										
											2014-06-26 18:41:36 +01:00
										 |  |  | 	"fmt" | 
					
						
							| 
									
										
										
										
											2014-08-15 01:07:40 +02:00
										 |  |  | 	"os" | 
					
						
							|  |  |  | 	"os/signal" | 
					
						
							|  |  |  | 	"path" | 
					
						
							|  |  |  | 	"path/filepath" | 
					
						
							| 
									
										
										
										
											2014-08-15 13:16:07 +02:00
										 |  |  | 	"regexp" | 
					
						
							| 
									
										
										
										
											2014-08-15 01:07:40 +02:00
										 |  |  | 	"runtime" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	"bitbucket.org/kardianos/osext" | 
					
						
							| 
									
										
										
										
											2014-12-23 15:37:03 +01:00
										 |  |  | 	"github.com/ethereum/go-ethereum/core/types" | 
					
						
							| 
									
										
										
										
											2014-10-31 12:37:43 +01:00
										 |  |  | 	"github.com/ethereum/go-ethereum/crypto" | 
					
						
							| 
									
										
										
										
											2014-12-14 18:26:13 +00:00
										 |  |  | 	"github.com/ethereum/go-ethereum/eth" | 
					
						
							| 
									
										
										
										
											2014-10-23 15:01:27 +02:00
										 |  |  | 	"github.com/ethereum/go-ethereum/ethutil" | 
					
						
							| 
									
										
										
										
											2014-10-31 12:56:05 +01:00
										 |  |  | 	"github.com/ethereum/go-ethereum/logger" | 
					
						
							| 
									
										
										
										
											2014-10-31 14:56:42 +01:00
										 |  |  | 	"github.com/ethereum/go-ethereum/miner" | 
					
						
							| 
									
										
										
										
											2014-12-23 15:37:03 +01:00
										 |  |  | 	"github.com/ethereum/go-ethereum/rlp" | 
					
						
							| 
									
										
										
										
											2015-01-25 14:50:43 -06:00
										 |  |  | 	rpchttp "github.com/ethereum/go-ethereum/rpc/http" | 
					
						
							| 
									
										
										
										
											2015-01-27 14:16:34 -06:00
										 |  |  | 	rpcws "github.com/ethereum/go-ethereum/rpc/ws" | 
					
						
							| 
									
										
										
										
											2015-01-07 13:17:48 +01:00
										 |  |  | 	"github.com/ethereum/go-ethereum/state" | 
					
						
							| 
									
										
										
										
											2014-10-31 14:30:08 +01:00
										 |  |  | 	"github.com/ethereum/go-ethereum/xeth" | 
					
						
							| 
									
										
										
										
											2014-05-14 12:41:30 +02:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-31 12:56:05 +01:00
										 |  |  | var clilogger = logger.NewLogger("CLI") | 
					
						
							| 
									
										
										
										
											2014-06-26 10:47:45 +01:00
										 |  |  | var interruptCallbacks = []func(os.Signal){} | 
					
						
							| 
									
										
										
										
											2014-06-23 12:20:59 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-26 10:47:45 +01:00
										 |  |  | // Register interrupt handlers callbacks | 
					
						
							| 
									
										
										
										
											2014-06-23 12:20:59 +01:00
										 |  |  | func RegisterInterrupt(cb func(os.Signal)) { | 
					
						
							| 
									
										
										
										
											2014-06-26 18:41:36 +01:00
										 |  |  | 	interruptCallbacks = append(interruptCallbacks, cb) | 
					
						
							| 
									
										
										
										
											2014-06-26 10:47:45 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // go routine that call interrupt handlers in order of registering | 
					
						
							|  |  |  | func HandleInterrupt() { | 
					
						
							| 
									
										
										
										
											2014-06-26 18:41:36 +01:00
										 |  |  | 	c := make(chan os.Signal, 1) | 
					
						
							|  |  |  | 	go func() { | 
					
						
							|  |  |  | 		signal.Notify(c, os.Interrupt) | 
					
						
							|  |  |  | 		for sig := range c { | 
					
						
							| 
									
										
										
										
											2014-10-31 12:56:05 +01:00
										 |  |  | 			clilogger.Errorf("Shutting down (%v) ... \n", sig) | 
					
						
							| 
									
										
										
										
											2014-06-26 18:41:36 +01:00
										 |  |  | 			RunInterruptCallbacks(sig) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}() | 
					
						
							| 
									
										
										
										
											2014-05-14 13:32:49 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-26 16:26:14 +01:00
										 |  |  | func RunInterruptCallbacks(sig os.Signal) { | 
					
						
							| 
									
										
										
										
											2014-06-26 18:41:36 +01:00
										 |  |  | 	for _, cb := range interruptCallbacks { | 
					
						
							|  |  |  | 		cb(sig) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-06-26 16:26:14 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-26 18:41:36 +01:00
										 |  |  | func openLogFile(Datadir string, filename string) *os.File { | 
					
						
							| 
									
										
										
										
											2015-01-04 14:20:16 +01:00
										 |  |  | 	path := ethutil.AbsolutePath(Datadir, filename) | 
					
						
							| 
									
										
										
										
											2014-06-26 18:41:36 +01:00
										 |  |  | 	file, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		panic(fmt.Sprintf("error opening log file '%s': %v", filename, err)) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return file | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func confirm(message string) bool { | 
					
						
							|  |  |  | 	fmt.Println(message, "Are you sure? (y/n)") | 
					
						
							|  |  |  | 	var r string | 
					
						
							|  |  |  | 	fmt.Scanln(&r) | 
					
						
							|  |  |  | 	for ; ; fmt.Scanln(&r) { | 
					
						
							|  |  |  | 		if r == "n" || r == "y" { | 
					
						
							|  |  |  | 			break | 
					
						
							|  |  |  | 		} else { | 
					
						
							| 
									
										
										
										
											2015-01-04 14:20:16 +01:00
										 |  |  | 			fmt.Printf("Yes or no? (%s)", r) | 
					
						
							| 
									
										
										
										
											2014-06-26 18:41:36 +01:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return r == "y" | 
					
						
							| 
									
										
										
										
											2014-06-23 12:20:59 +01:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2014-05-22 00:25:48 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-04 14:20:16 +01:00
										 |  |  | func initDataDir(Datadir string) { | 
					
						
							| 
									
										
										
										
											2014-06-26 18:41:36 +01:00
										 |  |  | 	_, err := os.Stat(Datadir) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		if os.IsNotExist(err) { | 
					
						
							| 
									
										
										
										
											2014-06-29 13:43:27 +01:00
										 |  |  | 			fmt.Printf("Data directory '%s' doesn't exist, creating it\n", Datadir) | 
					
						
							| 
									
										
										
										
											2014-06-26 18:41:36 +01:00
										 |  |  | 			os.Mkdir(Datadir, 0777) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-14 11:49:15 +02:00
										 |  |  | func InitConfig(vmType int, ConfigFile string, Datadir string, EnvPrefix string) *ethutil.ConfigManager { | 
					
						
							| 
									
										
										
										
											2015-01-04 14:20:16 +01:00
										 |  |  | 	initDataDir(Datadir) | 
					
						
							| 
									
										
										
										
											2014-10-14 11:49:15 +02:00
										 |  |  | 	cfg := ethutil.ReadConfig(ConfigFile, Datadir, EnvPrefix) | 
					
						
							|  |  |  | 	cfg.VmType = vmType | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return cfg | 
					
						
							| 
									
										
										
										
											2014-06-23 12:20:59 +01:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2014-05-14 13:26:15 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-29 18:39:13 +01:00
										 |  |  | func exit(err error) { | 
					
						
							|  |  |  | 	status := 0 | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2014-10-31 12:56:05 +01:00
										 |  |  | 		clilogger.Errorln("Fatal: ", err) | 
					
						
							| 
									
										
										
										
											2014-06-29 18:39:13 +01:00
										 |  |  | 		status = 1 | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-10-31 12:56:05 +01:00
										 |  |  | 	logger.Flush() | 
					
						
							| 
									
										
										
										
											2014-06-26 18:41:36 +01:00
										 |  |  | 	os.Exit(status) | 
					
						
							| 
									
										
										
										
											2014-05-14 12:41:30 +02:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2014-05-22 00:25:48 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-07 00:38:36 +01:00
										 |  |  | func StartEthereum(ethereum *eth.Ethereum) { | 
					
						
							| 
									
										
										
										
											2015-02-05 03:16:16 +01:00
										 |  |  | 	clilogger.Infoln("Starting ", ethereum.Name()) | 
					
						
							| 
									
										
										
										
											2015-02-07 00:38:36 +01:00
										 |  |  | 	if err := ethereum.Start(); err != nil { | 
					
						
							| 
									
										
										
										
											2015-01-05 17:12:52 +01:00
										 |  |  | 		exit(err) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-06-26 18:41:36 +01:00
										 |  |  | 	RegisterInterrupt(func(sig os.Signal) { | 
					
						
							|  |  |  | 		ethereum.Stop() | 
					
						
							| 
									
										
										
										
											2014-10-31 12:56:05 +01:00
										 |  |  | 		logger.Flush() | 
					
						
							| 
									
										
										
										
											2014-06-26 18:41:36 +01:00
										 |  |  | 	}) | 
					
						
							| 
									
										
										
										
											2014-06-23 12:20:59 +01:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2014-05-22 00:25:48 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-15 12:52:30 +02:00
										 |  |  | func DefaultAssetPath() string { | 
					
						
							|  |  |  | 	var assetPath string | 
					
						
							|  |  |  | 	// If the current working directory is the go-ethereum dir | 
					
						
							|  |  |  | 	// assume a debug build and use the source directory as | 
					
						
							|  |  |  | 	// asset directory. | 
					
						
							|  |  |  | 	pwd, _ := os.Getwd() | 
					
						
							| 
									
										
										
										
											2014-10-27 11:50:38 +01:00
										 |  |  | 	if pwd == path.Join(os.Getenv("GOPATH"), "src", "github.com", "ethereum", "go-ethereum", "cmd", "mist") { | 
					
						
							| 
									
										
										
										
											2014-07-15 12:52:30 +02:00
										 |  |  | 		assetPath = path.Join(pwd, "assets") | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		switch runtime.GOOS { | 
					
						
							|  |  |  | 		case "darwin": | 
					
						
							|  |  |  | 			// Get Binary Directory | 
					
						
							|  |  |  | 			exedir, _ := osext.ExecutableFolder() | 
					
						
							|  |  |  | 			assetPath = filepath.Join(exedir, "../Resources") | 
					
						
							|  |  |  | 		case "linux": | 
					
						
							| 
									
										
										
										
											2014-09-17 15:58:44 +02:00
										 |  |  | 			assetPath = "/usr/share/mist" | 
					
						
							| 
									
										
										
										
											2014-07-15 12:52:30 +02:00
										 |  |  | 		case "windows": | 
					
						
							|  |  |  | 			assetPath = "./assets" | 
					
						
							|  |  |  | 		default: | 
					
						
							|  |  |  | 			assetPath = "." | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return assetPath | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2014-07-15 16:21:16 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-31 12:37:43 +01:00
										 |  |  | func KeyTasks(keyManager *crypto.KeyManager, KeyRing string, GenAddr bool, SecretFile string, ExportDir string, NonInteractive bool) { | 
					
						
							| 
									
										
										
										
											2014-07-15 12:52:30 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-29 18:39:13 +01:00
										 |  |  | 	var err error | 
					
						
							| 
									
										
										
										
											2014-06-26 18:41:36 +01:00
										 |  |  | 	switch { | 
					
						
							|  |  |  | 	case GenAddr: | 
					
						
							|  |  |  | 		if NonInteractive || confirm("This action overwrites your old private key.") { | 
					
						
							| 
									
										
										
										
											2014-06-29 18:39:13 +01:00
										 |  |  | 			err = keyManager.Init(KeyRing, 0, true) | 
					
						
							| 
									
										
										
										
											2014-06-26 18:41:36 +01:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2014-06-29 18:39:13 +01:00
										 |  |  | 		exit(err) | 
					
						
							|  |  |  | 	case len(SecretFile) > 0: | 
					
						
							| 
									
										
										
										
											2014-07-01 20:10:38 +02:00
										 |  |  | 		SecretFile = ethutil.ExpandHomePath(SecretFile) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-26 18:41:36 +01:00
										 |  |  | 		if NonInteractive || confirm("This action overwrites your old private key.") { | 
					
						
							| 
									
										
										
										
											2014-06-29 18:39:13 +01:00
										 |  |  | 			err = keyManager.InitFromSecretsFile(KeyRing, 0, SecretFile) | 
					
						
							| 
									
										
										
										
											2014-06-26 18:41:36 +01:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2014-06-29 18:39:13 +01:00
										 |  |  | 		exit(err) | 
					
						
							|  |  |  | 	case len(ExportDir) > 0: | 
					
						
							|  |  |  | 		err = keyManager.Init(KeyRing, 0, false) | 
					
						
							|  |  |  | 		if err == nil { | 
					
						
							|  |  |  | 			err = keyManager.Export(ExportDir) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		exit(err) | 
					
						
							| 
									
										
										
										
											2014-06-26 18:41:36 +01:00
										 |  |  | 	default: | 
					
						
							|  |  |  | 		// Creates a keypair if none exists | 
					
						
							| 
									
										
										
										
											2014-06-29 18:39:13 +01:00
										 |  |  | 		err = keyManager.Init(KeyRing, 0, false) | 
					
						
							|  |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			exit(err) | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2014-06-26 18:41:36 +01:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-12-04 17:09:47 +01:00
										 |  |  | 	clilogger.Infof("Main address %x\n", keyManager.Address()) | 
					
						
							| 
									
										
										
										
											2014-06-23 12:20:59 +01:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2014-05-22 00:25:48 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-23 12:20:59 +01:00
										 |  |  | func StartRpc(ethereum *eth.Ethereum, RpcPort int) { | 
					
						
							| 
									
										
										
										
											2014-06-26 18:41:36 +01:00
										 |  |  | 	var err error | 
					
						
							| 
									
										
										
										
											2015-01-28 18:35:49 +01:00
										 |  |  | 	ethereum.RpcServer, err = rpchttp.NewRpcHttpServer(xeth.New(ethereum), RpcPort) | 
					
						
							| 
									
										
										
										
											2014-06-26 18:41:36 +01:00
										 |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2014-10-31 12:56:05 +01:00
										 |  |  | 		clilogger.Errorf("Could not start RPC interface (port %v): %v", RpcPort, err) | 
					
						
							| 
									
										
										
										
											2014-06-26 18:41:36 +01:00
										 |  |  | 	} else { | 
					
						
							|  |  |  | 		go ethereum.RpcServer.Start() | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-05-22 00:25:48 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-27 12:28:58 -06:00
										 |  |  | func StartWebSockets(eth *eth.Ethereum, wsPort int) { | 
					
						
							| 
									
										
										
										
											2015-01-20 13:40:24 -06:00
										 |  |  | 	clilogger.Infoln("Starting WebSockets") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-27 12:28:58 -06:00
										 |  |  | 	var err error | 
					
						
							| 
									
										
										
										
											2015-02-02 07:37:44 -06:00
										 |  |  | 	eth.WsServer, err = rpcws.NewWebSocketServer(xeth.New(eth), wsPort) | 
					
						
							| 
									
										
										
										
											2015-01-27 12:28:58 -06:00
										 |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		clilogger.Errorf("Could not start RPC interface (port %v): %v", wsPort, err) | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		go eth.WsServer.Start() | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-01-20 13:40:24 -06:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-31 14:56:42 +01:00
										 |  |  | var gminer *miner.Miner | 
					
						
							| 
									
										
										
										
											2014-05-22 00:25:48 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-31 14:56:42 +01:00
										 |  |  | func GetMiner() *miner.Miner { | 
					
						
							|  |  |  | 	return gminer | 
					
						
							| 
									
										
										
										
											2014-07-18 12:01:26 +02:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2014-05-22 00:25:48 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-23 12:20:59 +01:00
										 |  |  | func StartMining(ethereum *eth.Ethereum) bool { | 
					
						
							| 
									
										
										
										
											2014-06-26 18:41:36 +01:00
										 |  |  | 	if !ethereum.Mining { | 
					
						
							|  |  |  | 		ethereum.Mining = true | 
					
						
							| 
									
										
										
										
											2014-06-29 18:39:13 +01:00
										 |  |  | 		addr := ethereum.KeyManager().Address() | 
					
						
							| 
									
										
										
										
											2014-06-26 18:41:36 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		go func() { | 
					
						
							| 
									
										
										
										
											2014-10-31 12:56:05 +01:00
										 |  |  | 			clilogger.Infoln("Start mining") | 
					
						
							| 
									
										
										
										
											2014-10-31 14:56:42 +01:00
										 |  |  | 			if gminer == nil { | 
					
						
							| 
									
										
										
										
											2014-11-07 12:18:48 +01:00
										 |  |  | 				gminer = miner.New(addr, ethereum) | 
					
						
							| 
									
										
										
										
											2014-06-29 10:43:56 +02:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2014-10-31 14:56:42 +01:00
										 |  |  | 			gminer.Start() | 
					
						
							| 
									
										
										
										
											2014-06-26 18:41:36 +01:00
										 |  |  | 		}() | 
					
						
							|  |  |  | 		RegisterInterrupt(func(os.Signal) { | 
					
						
							|  |  |  | 			StopMining(ethereum) | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 		return true | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return false | 
					
						
							| 
									
										
										
										
											2014-06-23 12:20:59 +01:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2014-05-22 00:25:48 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-08-15 13:16:07 +02:00
										 |  |  | func FormatTransactionData(data string) []byte { | 
					
						
							|  |  |  | 	d := ethutil.StringToByteFunc(data, func(s string) (ret []byte) { | 
					
						
							|  |  |  | 		slice := regexp.MustCompile("\\n|\\s").Split(s, 1000000000) | 
					
						
							|  |  |  | 		for _, dataItem := range slice { | 
					
						
							|  |  |  | 			d := ethutil.FormatData(dataItem) | 
					
						
							|  |  |  | 			ret = append(ret, d...) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		return | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return d | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-23 12:20:59 +01:00
										 |  |  | func StopMining(ethereum *eth.Ethereum) bool { | 
					
						
							| 
									
										
										
										
											2014-10-31 14:56:42 +01:00
										 |  |  | 	if ethereum.Mining && gminer != nil { | 
					
						
							|  |  |  | 		gminer.Stop() | 
					
						
							| 
									
										
										
										
											2014-10-31 12:56:05 +01:00
										 |  |  | 		clilogger.Infoln("Stopped mining") | 
					
						
							| 
									
										
										
										
											2014-06-26 18:41:36 +01:00
										 |  |  | 		ethereum.Mining = false | 
					
						
							| 
									
										
										
										
											2014-07-18 13:49:52 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-26 18:41:36 +01:00
										 |  |  | 		return true | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-07-18 13:49:52 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-26 18:41:36 +01:00
										 |  |  | 	return false | 
					
						
							| 
									
										
										
										
											2014-05-22 00:25:48 +02:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2014-06-25 09:47:11 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | // Replay block | 
					
						
							|  |  |  | func BlockDo(ethereum *eth.Ethereum, hash []byte) error { | 
					
						
							| 
									
										
										
										
											2014-10-20 12:03:31 +02:00
										 |  |  | 	block := ethereum.ChainManager().GetBlock(hash) | 
					
						
							| 
									
										
										
										
											2014-06-25 09:47:11 +02:00
										 |  |  | 	if block == nil { | 
					
						
							|  |  |  | 		return fmt.Errorf("unknown block %x", hash) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-23 13:48:44 +01:00
										 |  |  | 	parent := ethereum.ChainManager().GetBlock(block.ParentHash()) | 
					
						
							| 
									
										
										
										
											2014-06-25 09:47:11 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-07 13:17:48 +01:00
										 |  |  | 	statedb := state.New(parent.Root(), ethereum.Db()) | 
					
						
							|  |  |  | 	_, err := ethereum.BlockProcessor().TransitionState(statedb, parent, block) | 
					
						
							| 
									
										
										
										
											2014-06-25 09:47:11 +02:00
										 |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return nil | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2014-12-23 15:37:03 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | func ImportChain(ethereum *eth.Ethereum, fn string) error { | 
					
						
							| 
									
										
										
										
											2014-12-23 18:35:36 +01:00
										 |  |  | 	clilogger.Infof("importing chain '%s'\n", fn) | 
					
						
							| 
									
										
										
										
											2014-12-23 15:37:03 +01:00
										 |  |  | 	fh, err := os.OpenFile(fn, os.O_RDONLY, os.ModePerm) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	defer fh.Close() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	var chain types.Blocks | 
					
						
							|  |  |  | 	if err := rlp.Decode(fh, &chain); err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	ethereum.ChainManager().Reset() | 
					
						
							|  |  |  | 	if err := ethereum.ChainManager().InsertChain(chain); err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	clilogger.Infof("imported %d blocks\n", len(chain)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return nil | 
					
						
							|  |  |  | } |