| 
									
										
										
										
											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
										 |  |  | 	"io" | 
					
						
							|  |  |  | 	"log" | 
					
						
							|  |  |  | 	"os" | 
					
						
							|  |  |  | 	"os/signal" | 
					
						
							|  |  |  | 	"path" | 
					
						
							|  |  |  | 	"path/filepath" | 
					
						
							| 
									
										
										
										
											2014-08-15 13:16:07 +02:00
										 |  |  | 	"regexp" | 
					
						
							| 
									
										
										
										
											2014-08-15 01:07:40 +02:00
										 |  |  | 	"runtime" | 
					
						
							|  |  |  | 	"time" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	"bitbucket.org/kardianos/osext" | 
					
						
							| 
									
										
										
										
											2014-10-23 15:01:27 +02:00
										 |  |  | 	"github.com/ethereum/go-ethereum" | 
					
						
							| 
									
										
										
										
											2014-10-31 12:37:43 +01:00
										 |  |  | 	"github.com/ethereum/go-ethereum/crypto" | 
					
						
							| 
									
										
										
										
											2014-10-23 15:01:27 +02:00
										 |  |  | 	"github.com/ethereum/go-ethereum/ethdb" | 
					
						
							|  |  |  | 	"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-10-23 15:01:27 +02:00
										 |  |  | 	"github.com/ethereum/go-ethereum/rpc" | 
					
						
							| 
									
										
										
										
											2014-10-31 14:53:42 +01:00
										 |  |  | 	"github.com/ethereum/go-ethereum/wire" | 
					
						
							| 
									
										
										
										
											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-23 12:20:59 +01:00
										 |  |  | func AbsolutePath(Datadir string, filename string) string { | 
					
						
							| 
									
										
										
										
											2014-06-26 18:41:36 +01:00
										 |  |  | 	if path.IsAbs(filename) { | 
					
						
							|  |  |  | 		return filename | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return path.Join(Datadir, filename) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func openLogFile(Datadir string, filename string) *os.File { | 
					
						
							|  |  |  | 	path := AbsolutePath(Datadir, filename) | 
					
						
							|  |  |  | 	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 { | 
					
						
							|  |  |  | 			fmt.Printf("Yes or no?", r) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return r == "y" | 
					
						
							| 
									
										
										
										
											2014-06-23 12:20:59 +01:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2014-05-22 00:25:48 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-08-22 12:12:41 +02:00
										 |  |  | func DBSanityCheck(db ethutil.Database) error { | 
					
						
							|  |  |  | 	d, _ := db.Get([]byte("ProtocolVersion")) | 
					
						
							|  |  |  | 	protov := ethutil.NewValue(d).Uint() | 
					
						
							|  |  |  | 	if protov != eth.ProtocolVersion && protov != 0 { | 
					
						
							|  |  |  | 		return fmt.Errorf("Database version mismatch. Protocol(%d / %d). `rm -rf %s`", protov, eth.ProtocolVersion, ethutil.Config.ExecPath+"/database") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-23 12:20:59 +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-31 12:56:05 +01:00
										 |  |  | func InitLogging(Datadir string, LogFile string, LogLevel int, DebugFile string) logger.LogSystem { | 
					
						
							| 
									
										
										
										
											2014-06-26 18:41:36 +01:00
										 |  |  | 	var writer io.Writer | 
					
						
							|  |  |  | 	if LogFile == "" { | 
					
						
							|  |  |  | 		writer = os.Stdout | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		writer = openLogFile(Datadir, LogFile) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-08-22 12:40:15 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-31 12:56:05 +01:00
										 |  |  | 	sys := logger.NewStdLogSystem(writer, log.LstdFlags, logger.LogLevel(LogLevel)) | 
					
						
							|  |  |  | 	logger.AddLogSystem(sys) | 
					
						
							| 
									
										
										
										
											2014-06-26 18:41:36 +01:00
										 |  |  | 	if DebugFile != "" { | 
					
						
							|  |  |  | 		writer = openLogFile(Datadir, DebugFile) | 
					
						
							| 
									
										
										
										
											2014-10-31 12:56:05 +01:00
										 |  |  | 		logger.AddLogSystem(logger.NewStdLogSystem(writer, log.LstdFlags, logger.DebugLevel)) | 
					
						
							| 
									
										
										
										
											2014-06-26 18:41:36 +01:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-08-22 12:40:15 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return sys | 
					
						
							| 
									
										
										
										
											2014-06-23 12:20:59 +01:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2014-05-21 11:45:19 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-14 11:49:15 +02:00
										 |  |  | func InitConfig(vmType int, ConfigFile string, Datadir string, EnvPrefix string) *ethutil.ConfigManager { | 
					
						
							| 
									
										
										
										
											2014-06-26 18:41:36 +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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-29 18:39:13 +01:00
										 |  |  | func NewDatabase() ethutil.Database { | 
					
						
							|  |  |  | 	db, err := ethdb.NewLDBDatabase("database") | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		exit(err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return db | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-31 14:53:42 +01:00
										 |  |  | func NewClientIdentity(clientIdentifier, version, customIdentifier string) *wire.SimpleClientIdentity { | 
					
						
							|  |  |  | 	return wire.NewSimpleClientIdentity(clientIdentifier, version, customIdentifier) | 
					
						
							| 
									
										
										
										
											2014-07-03 17:36:24 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-31 14:53:42 +01:00
										 |  |  | func NewEthereum(db ethutil.Database, clientIdentity wire.ClientIdentity, keyManager *crypto.KeyManager, usePnp bool, OutboundPort string, MaxPeer int) *eth.Ethereum { | 
					
						
							| 
									
										
										
										
											2014-07-03 17:36:24 +01:00
										 |  |  | 	ethereum, err := eth.New(db, clientIdentity, keyManager, eth.CapDefault, usePnp) | 
					
						
							| 
									
										
										
										
											2014-06-26 18:41:36 +01:00
										 |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2014-10-31 12:56:05 +01:00
										 |  |  | 		clilogger.Fatalln("eth start err:", err) | 
					
						
							| 
									
										
										
										
											2014-06-26 18:41:36 +01:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	ethereum.Port = OutboundPort | 
					
						
							|  |  |  | 	ethereum.MaxPeers = MaxPeer | 
					
						
							|  |  |  | 	return ethereum | 
					
						
							| 
									
										
										
										
											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 StartEthereum(ethereum *eth.Ethereum, UseSeed bool) { | 
					
						
							| 
									
										
										
										
											2014-10-31 12:56:05 +01:00
										 |  |  | 	clilogger.Infof("Starting %s", ethereum.ClientIdentity()) | 
					
						
							| 
									
										
										
										
											2014-06-26 18:41:36 +01:00
										 |  |  | 	ethereum.Start(UseSeed) | 
					
						
							|  |  |  | 	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-06-23 12:20:59 +01:00
										 |  |  | func ShowGenesis(ethereum *eth.Ethereum) { | 
					
						
							| 
									
										
										
										
											2014-10-31 12:56:05 +01:00
										 |  |  | 	clilogger.Infoln(ethereum.ChainManager().Genesis()) | 
					
						
							| 
									
										
										
										
											2014-06-29 18:39:13 +01:00
										 |  |  | 	exit(nil) | 
					
						
							| 
									
										
										
										
											2014-06-23 12:20:59 +01:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2014-05-22 00:25:48 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-31 12:37:43 +01:00
										 |  |  | func NewKeyManager(KeyStore string, Datadir string, db ethutil.Database) *crypto.KeyManager { | 
					
						
							|  |  |  | 	var keyManager *crypto.KeyManager | 
					
						
							| 
									
										
										
										
											2014-06-29 18:39:13 +01:00
										 |  |  | 	switch { | 
					
						
							|  |  |  | 	case KeyStore == "db": | 
					
						
							| 
									
										
										
										
											2014-10-31 12:37:43 +01:00
										 |  |  | 		keyManager = crypto.NewDBKeyManager(db) | 
					
						
							| 
									
										
										
										
											2014-06-29 18:39:13 +01:00
										 |  |  | 	case KeyStore == "file": | 
					
						
							| 
									
										
										
										
											2014-10-31 12:37:43 +01:00
										 |  |  | 		keyManager = crypto.NewFileKeyManager(Datadir) | 
					
						
							| 
									
										
										
										
											2014-06-29 18:39:13 +01:00
										 |  |  | 	default: | 
					
						
							|  |  |  | 		exit(fmt.Errorf("unknown keystore type: %s", KeyStore)) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return keyManager | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							| 
									
										
										
										
											2014-10-31 14:30:08 +01:00
										 |  |  | 	ethereum.RpcServer, err = rpc.NewJsonRpcServer(xeth.NewJSXEth(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
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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-07-18 13:49:52 +02:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2014-06-26 18:41:36 +01:00
										 |  |  | 			// Give it some time to connect with peers | 
					
						
							|  |  |  | 			time.Sleep(3 * time.Second) | 
					
						
							| 
									
										
										
										
											2014-07-01 04:25:42 -04:00
										 |  |  | 			for !ethereum.IsUpToDate() { | 
					
						
							| 
									
										
										
										
											2014-06-29 10:43:56 +02:00
										 |  |  | 				time.Sleep(5 * time.Second) | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											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-10-20 12:03:31 +02:00
										 |  |  | 	parent := ethereum.ChainManager().GetBlock(block.PrevHash) | 
					
						
							| 
									
										
										
										
											2014-06-25 09:47:11 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-02 22:37:45 +01:00
										 |  |  | 	_, err := ethereum.BlockManager().TransitionState(parent.State(), parent, block) | 
					
						
							| 
									
										
										
										
											2014-06-25 09:47:11 +02:00
										 |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return nil | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } |