This commit is contained in:
zelig 2014-06-26 18:41:36 +01:00
parent 648c418fcd
commit ae5ace1619
8 changed files with 219 additions and 219 deletions

@ -1,13 +1,13 @@
package main package main
import ( import (
"fmt"
"os"
"os/user"
"path"
"github.com/ethereum/eth-go/ethlog"
"flag"
"bitbucket.org/kardianos/osext" "bitbucket.org/kardianos/osext"
"flag"
"fmt"
"github.com/ethereum/eth-go/ethlog"
"os"
"os/user"
"path"
"path/filepath" "path/filepath"
"runtime" "runtime"
) )
@ -60,8 +60,8 @@ func defaultAssetPath() string {
} }
func defaultDataDir() string { func defaultDataDir() string {
usr, _ := user.Current() usr, _ := user.Current()
return path.Join(usr.HomeDir, ".ethereal") return path.Join(usr.HomeDir, ".ethereal")
} }
var defaultConfigFile = path.Join(defaultDataDir(), "conf.ini") var defaultConfigFile = path.Join(defaultDataDir(), "conf.ini")

@ -1,12 +1,12 @@
package main package main
import ( import (
"github.com/ethereum/eth-go/ethlog"
"github.com/ethereum/go-ethereum/ethereal/ui" "github.com/ethereum/go-ethereum/ethereal/ui"
"github.com/ethereum/go-ethereum/utils" "github.com/ethereum/go-ethereum/utils"
"github.com/ethereum/eth-go/ethlog"
"github.com/go-qml/qml" "github.com/go-qml/qml"
"runtime"
"os" "os"
"runtime"
) )
func main() { func main() {
@ -32,11 +32,11 @@ func main() {
ethereum := utils.NewEthereum(UseUPnP, OutboundPort, MaxPeer) ethereum := utils.NewEthereum(UseUPnP, OutboundPort, MaxPeer)
// create, import, export keys // create, import, export keys
utils.KeyTasks(GenAddr, ImportKey, ExportKey, NonInteractive) utils.KeyTasks(GenAddr, ImportKey, ExportKey, NonInteractive)
if ShowGenesis { if ShowGenesis {
utils.ShowGenesis(ethereum) utils.ShowGenesis(ethereum)
} }
if StartRpc { if StartRpc {
utils.StartRpc(ethereum, RpcPort) utils.StartRpc(ethereum, RpcPort)
@ -45,17 +45,17 @@ func main() {
gui := ethui.New(ethereum, LogLevel) gui := ethui.New(ethereum, LogLevel)
utils.RegisterInterrupt(func(os.Signal) { utils.RegisterInterrupt(func(os.Signal) {
gui.Stop() gui.Stop()
}) })
utils.StartEthereum(ethereum, UseSeed) utils.StartEthereum(ethereum, UseSeed)
// gui blocks the main thread // gui blocks the main thread
gui.Start(AssetPath) gui.Start(AssetPath)
// we need to run the interrupt callbacks in case gui is closed // we need to run the interrupt callbacks in case gui is closed
// this skips if we got here by actual interrupt stopping the GUI // this skips if we got here by actual interrupt stopping the GUI
if !interrupted { if !interrupted {
utils.RunInterruptCallbacks(os.Interrupt) utils.RunInterruptCallbacks(os.Interrupt)
} }
// this blocks the thread // this blocks the thread
ethereum.WaitForShutdown() ethereum.WaitForShutdown()
ethlog.Flush() ethlog.Flush()
} }

@ -6,9 +6,9 @@ import (
"github.com/ethereum/eth-go" "github.com/ethereum/eth-go"
"github.com/ethereum/eth-go/ethchain" "github.com/ethereum/eth-go/ethchain"
"github.com/ethereum/eth-go/ethdb" "github.com/ethereum/eth-go/ethdb"
"github.com/ethereum/eth-go/ethlog"
"github.com/ethereum/eth-go/ethpub" "github.com/ethereum/eth-go/ethpub"
"github.com/ethereum/eth-go/ethutil" "github.com/ethereum/eth-go/ethutil"
"github.com/ethereum/eth-go/ethlog"
"github.com/ethereum/go-ethereum/utils" "github.com/ethereum/go-ethereum/utils"
"github.com/go-qml/qml" "github.com/go-qml/qml"
"math/big" "math/big"
@ -35,9 +35,9 @@ type Gui struct {
addr []byte addr []byte
pub *ethpub.PEthereum pub *ethpub.PEthereum
logLevel ethlog.LogLevel logLevel ethlog.LogLevel
open bool open bool
} }
// Create GUI, but doesn't start it // Create GUI, but doesn't start it

@ -1,32 +1,32 @@
package main package main
import ( import (
"github.com/ethereum/eth-go" "github.com/ethereum/eth-go"
"github.com/ethereum/go-ethereum/utils" "github.com/ethereum/go-ethereum/utils"
"os" "io/ioutil"
"io/ioutil" "os"
) )
func InitJsConsole(ethereum *eth.Ethereum) { func InitJsConsole(ethereum *eth.Ethereum) {
repl := NewJSRepl(ethereum) repl := NewJSRepl(ethereum)
go repl.Start() go repl.Start()
utils.RegisterInterrupt(func(os.Signal) { utils.RegisterInterrupt(func(os.Signal) {
repl.Stop() repl.Stop()
}) })
} }
func ExecJsFile (ethereum *eth.Ethereum, InputFile string) { func ExecJsFile(ethereum *eth.Ethereum, InputFile string) {
file, err := os.Open(InputFile) file, err := os.Open(InputFile)
if err != nil { if err != nil {
logger.Fatalln(err) logger.Fatalln(err)
} }
content, err := ioutil.ReadAll(file) content, err := ioutil.ReadAll(file)
if err != nil { if err != nil {
logger.Fatalln(err) logger.Fatalln(err)
} }
re := NewJSRE(ethereum) re := NewJSRE(ethereum)
utils.RegisterInterrupt(func(os.Signal) { utils.RegisterInterrupt(func(os.Signal) {
re.Stop() re.Stop()
}) })
re.Run(string(content)) re.Run(string(content))
} }

@ -3,10 +3,10 @@ package main
import ( import (
"flag" "flag"
"fmt" "fmt"
"github.com/ethereum/eth-go/ethlog"
"os" "os"
"os/user" "os/user"
"path" "path"
"github.com/ethereum/eth-go/ethlog"
) )
var Identifier string var Identifier string
@ -34,8 +34,8 @@ var StartJsConsole bool
var InputFile string var InputFile string
func defaultDataDir() string { func defaultDataDir() string {
usr, _ := user.Current() usr, _ := user.Current()
return path.Join(usr.HomeDir, ".ethereum") return path.Join(usr.HomeDir, ".ethereum")
} }
var defaultConfigFile = path.Join(defaultDataDir(), "conf.ini") var defaultConfigFile = path.Join(defaultDataDir(), "conf.ini")

@ -1,12 +1,12 @@
package main package main
import ( import (
"fmt" "fmt"
"github.com/ethereum/eth-go" "github.com/ethereum/eth-go"
"github.com/ethereum/eth-go/ethchain" "github.com/ethereum/eth-go/ethchain"
"github.com/ethereum/eth-go/ethlog"
"github.com/ethereum/eth-go/ethpub" "github.com/ethereum/eth-go/ethpub"
"github.com/ethereum/eth-go/ethutil" "github.com/ethereum/eth-go/ethutil"
"github.com/ethereum/eth-go/ethlog"
"github.com/ethereum/go-ethereum/utils" "github.com/ethereum/go-ethereum/utils"
"github.com/obscuren/otto" "github.com/obscuren/otto"
"io/ioutil" "io/ioutil"

@ -1,8 +1,8 @@
package main package main
import ( import (
"github.com/ethereum/go-ethereum/utils"
"github.com/ethereum/eth-go/ethlog" "github.com/ethereum/eth-go/ethlog"
"github.com/ethereum/go-ethereum/utils"
"runtime" "runtime"
) )
@ -24,11 +24,11 @@ func main() {
ethereum := utils.NewEthereum(UseUPnP, OutboundPort, MaxPeer) ethereum := utils.NewEthereum(UseUPnP, OutboundPort, MaxPeer)
// create, import, export keys // create, import, export keys
utils.KeyTasks(GenAddr, ImportKey, ExportKey, NonInteractive) utils.KeyTasks(GenAddr, ImportKey, ExportKey, NonInteractive)
if ShowGenesis { if ShowGenesis {
utils.ShowGenesis(ethereum) utils.ShowGenesis(ethereum)
} }
if StartMining { if StartMining {
utils.StartMining(ethereum) utils.StartMining(ethereum)
@ -48,6 +48,6 @@ func main() {
utils.StartEthereum(ethereum, UseSeed) utils.StartEthereum(ethereum, UseSeed)
// this blocks the thread // this blocks the thread
ethereum.WaitForShutdown() ethereum.WaitForShutdown()
ethlog.Flush() ethlog.Flush()
} }

@ -1,20 +1,20 @@
package utils package utils
import ( import (
"github.com/ethereum/eth-go" "fmt"
"github.com/ethereum/eth-go/ethminer" "github.com/ethereum/eth-go"
"github.com/ethereum/eth-go/ethpub" "github.com/ethereum/eth-go/ethlog"
"github.com/ethereum/eth-go/ethrpc" "github.com/ethereum/eth-go/ethminer"
"github.com/ethereum/eth-go/ethutil" "github.com/ethereum/eth-go/ethpub"
"github.com/ethereum/eth-go/ethlog" "github.com/ethereum/eth-go/ethrpc"
"log" "github.com/ethereum/eth-go/ethutil"
"io" "io"
"path" "log"
"os" "os"
"os/signal" "os/signal"
"fmt" "path"
"time" "strings"
"strings" "time"
) )
var logger = ethlog.NewLogger("CLI") var logger = ethlog.NewLogger("CLI")
@ -22,142 +22,142 @@ var interruptCallbacks = []func(os.Signal){}
// Register interrupt handlers callbacks // Register interrupt handlers callbacks
func RegisterInterrupt(cb func(os.Signal)) { func RegisterInterrupt(cb func(os.Signal)) {
interruptCallbacks = append(interruptCallbacks, cb) interruptCallbacks = append(interruptCallbacks, cb)
} }
// go routine that call interrupt handlers in order of registering // go routine that call interrupt handlers in order of registering
func HandleInterrupt() { func HandleInterrupt() {
c := make(chan os.Signal, 1) c := make(chan os.Signal, 1)
go func() { go func() {
signal.Notify(c, os.Interrupt) signal.Notify(c, os.Interrupt)
for sig := range c { for sig := range c {
logger.Errorf("Shutting down (%v) ... \n", sig) logger.Errorf("Shutting down (%v) ... \n", sig)
RunInterruptCallbacks(sig) RunInterruptCallbacks(sig)
} }
}() }()
} }
func RunInterruptCallbacks(sig os.Signal) { func RunInterruptCallbacks(sig os.Signal) {
for _, cb := range interruptCallbacks { for _, cb := range interruptCallbacks {
cb(sig) cb(sig)
} }
} }
func AbsolutePath(Datadir string, filename string) string { func AbsolutePath(Datadir string, filename string) string {
if path.IsAbs(filename) { if path.IsAbs(filename) {
return filename return filename
} }
return path.Join(Datadir, filename) return path.Join(Datadir, filename)
} }
func openLogFile (Datadir string, filename string) *os.File { func openLogFile(Datadir string, filename string) *os.File {
path := AbsolutePath(Datadir, filename) path := AbsolutePath(Datadir, filename)
file, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666) file, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
if err != nil { if err != nil {
panic(fmt.Sprintf("error opening log file '%s': %v", filename, err)) panic(fmt.Sprintf("error opening log file '%s': %v", filename, err))
} }
return file return file
} }
func confirm (message string) bool { func confirm(message string) bool {
fmt.Println(message, "Are you sure? (y/n)") fmt.Println(message, "Are you sure? (y/n)")
var r string var r string
fmt.Scanln(&r) fmt.Scanln(&r)
for ; ; fmt.Scanln(&r) { for ; ; fmt.Scanln(&r) {
if r == "n" || r == "y" { if r == "n" || r == "y" {
break break
} else { } else {
fmt.Printf("Yes or no?", r) fmt.Printf("Yes or no?", r)
} }
} }
return r == "y" return r == "y"
} }
func InitDataDir(Datadir string) { func InitDataDir(Datadir string) {
_, err := os.Stat(Datadir) _, err := os.Stat(Datadir)
if err != nil { if err != nil {
if os.IsNotExist(err) { if os.IsNotExist(err) {
fmt.Printf("Debug logging directory '%s' doesn't exist, creating it\n", Datadir) fmt.Printf("Debug logging directory '%s' doesn't exist, creating it\n", Datadir)
os.Mkdir(Datadir, 0777) os.Mkdir(Datadir, 0777)
} }
} }
} }
func InitLogging (Datadir string, LogFile string, LogLevel int, DebugFile string) { func InitLogging(Datadir string, LogFile string, LogLevel int, DebugFile string) {
var writer io.Writer var writer io.Writer
if LogFile == "" { if LogFile == "" {
writer = os.Stdout writer = os.Stdout
} else { } else {
writer = openLogFile(Datadir, LogFile) writer = openLogFile(Datadir, LogFile)
} }
ethlog.AddLogSystem(ethlog.NewStdLogSystem(writer, log.LstdFlags, ethlog.LogLevel(LogLevel))) ethlog.AddLogSystem(ethlog.NewStdLogSystem(writer, log.LstdFlags, ethlog.LogLevel(LogLevel)))
if DebugFile != "" { if DebugFile != "" {
writer = openLogFile(Datadir, DebugFile) writer = openLogFile(Datadir, DebugFile)
ethlog.AddLogSystem(ethlog.NewStdLogSystem(writer, log.LstdFlags, ethlog.DebugLevel)) ethlog.AddLogSystem(ethlog.NewStdLogSystem(writer, log.LstdFlags, ethlog.DebugLevel))
} }
} }
func InitConfig(ConfigFile string, Datadir string, Identifier string, EnvPrefix string) { func InitConfig(ConfigFile string, Datadir string, Identifier string, EnvPrefix string) {
InitDataDir(Datadir) InitDataDir(Datadir)
ethutil.ReadConfig(ConfigFile, Datadir, Identifier, EnvPrefix) ethutil.ReadConfig(ConfigFile, Datadir, Identifier, EnvPrefix)
ethutil.Config.Set("rpcport", "700") ethutil.Config.Set("rpcport", "700")
} }
func exit(status int) { func exit(status int) {
ethlog.Flush() ethlog.Flush()
os.Exit(status) os.Exit(status)
} }
func NewEthereum(UseUPnP bool, OutboundPort string, MaxPeer int) *eth.Ethereum { func NewEthereum(UseUPnP bool, OutboundPort string, MaxPeer int) *eth.Ethereum {
ethereum, err := eth.New(eth.CapDefault, UseUPnP) ethereum, err := eth.New(eth.CapDefault, UseUPnP)
if err != nil { if err != nil {
logger.Fatalln("eth start err:", err) logger.Fatalln("eth start err:", err)
} }
ethereum.Port = OutboundPort ethereum.Port = OutboundPort
ethereum.MaxPeers = MaxPeer ethereum.MaxPeers = MaxPeer
return ethereum return ethereum
} }
func StartEthereum(ethereum *eth.Ethereum, UseSeed bool) { func StartEthereum(ethereum *eth.Ethereum, UseSeed bool) {
logger.Infof("Starting Ethereum v%s", ethutil.Config.Ver) logger.Infof("Starting Ethereum v%s", ethutil.Config.Ver)
ethereum.Start(UseSeed) ethereum.Start(UseSeed)
RegisterInterrupt(func(sig os.Signal) { RegisterInterrupt(func(sig os.Signal) {
ethereum.Stop() ethereum.Stop()
ethlog.Flush() ethlog.Flush()
}) })
} }
func ShowGenesis(ethereum *eth.Ethereum) { func ShowGenesis(ethereum *eth.Ethereum) {
logger.Infoln(ethereum.BlockChain().Genesis()) logger.Infoln(ethereum.BlockChain().Genesis())
exit(0) exit(0)
} }
func KeyTasks(GenAddr bool, ImportKey string, ExportKey bool, NonInteractive bool) { func KeyTasks(GenAddr bool, ImportKey string, ExportKey bool, NonInteractive bool) {
switch { switch {
case GenAddr: case GenAddr:
if NonInteractive || confirm("This action overwrites your old private key.") { if NonInteractive || confirm("This action overwrites your old private key.") {
CreateKeyPair(true) CreateKeyPair(true)
} }
exit(0) exit(0)
case len(ImportKey) > 0: case len(ImportKey) > 0:
if NonInteractive || confirm("This action overwrites your old private key.") { if NonInteractive || confirm("This action overwrites your old private key.") {
// import should be from file // import should be from file
mnemonic := strings.Split(ImportKey, " ") mnemonic := strings.Split(ImportKey, " ")
if len(mnemonic) == 24 { if len(mnemonic) == 24 {
logger.Infoln("Got mnemonic key, importing.") logger.Infoln("Got mnemonic key, importing.")
key := ethutil.MnemonicDecode(mnemonic) key := ethutil.MnemonicDecode(mnemonic)
ImportPrivateKey(key) ImportPrivateKey(key)
} else if len(mnemonic) == 1 { } else if len(mnemonic) == 1 {
logger.Infoln("Got hex key, importing.") logger.Infoln("Got hex key, importing.")
ImportPrivateKey(ImportKey) ImportPrivateKey(ImportKey)
} else { } else {
logger.Errorln("Did not recognise format, exiting.") logger.Errorln("Did not recognise format, exiting.")
} }
} }
exit(0) exit(0)
case ExportKey: // this should be exporting to a filename case ExportKey: // this should be exporting to a filename
keyPair := ethutil.GetKeyRing().Get(0) keyPair := ethutil.GetKeyRing().Get(0)
fmt.Printf(` fmt.Printf(`
Generating new address and keypair. Generating new address and keypair.
Please keep your keys somewhere save. Please keep your keys somewhere save.
@ -169,61 +169,61 @@ pubk: %x
save these words so you can restore your account later: %s save these words so you can restore your account later: %s
`, keyPair.Address(), keyPair.PrivateKey, keyPair.PublicKey) `, keyPair.Address(), keyPair.PrivateKey, keyPair.PublicKey)
exit(0) exit(0)
default: default:
// Creates a keypair if none exists // Creates a keypair if none exists
CreateKeyPair(false) CreateKeyPair(false)
} }
} }
func StartRpc(ethereum *eth.Ethereum, RpcPort int) { func StartRpc(ethereum *eth.Ethereum, RpcPort int) {
var err error var err error
ethereum.RpcServer, err = ethrpc.NewJsonRpcServer(ethpub.NewPEthereum(ethereum), RpcPort) ethereum.RpcServer, err = ethrpc.NewJsonRpcServer(ethpub.NewPEthereum(ethereum), RpcPort)
if err != nil { if err != nil {
logger.Errorf("Could not start RPC interface (port %v): %v", RpcPort, err) logger.Errorf("Could not start RPC interface (port %v): %v", RpcPort, err)
} else { } else {
go ethereum.RpcServer.Start() go ethereum.RpcServer.Start()
} }
} }
var miner ethminer.Miner var miner ethminer.Miner
func StartMining(ethereum *eth.Ethereum) bool { func StartMining(ethereum *eth.Ethereum) bool {
if !ethereum.Mining { if !ethereum.Mining {
ethereum.Mining = true ethereum.Mining = true
if ethutil.GetKeyRing().Len() == 0 { if ethutil.GetKeyRing().Len() == 0 {
logger.Errorln("No address found, can't start mining") logger.Errorln("No address found, can't start mining")
ethereum.Mining = false ethereum.Mining = false
return true //???? return true //????
} }
keyPair := ethutil.GetKeyRing().Get(0) keyPair := ethutil.GetKeyRing().Get(0)
addr := keyPair.Address() addr := keyPair.Address()
go func() { go func() {
miner = ethminer.NewDefaultMiner(addr, ethereum) miner = ethminer.NewDefaultMiner(addr, ethereum)
// Give it some time to connect with peers // Give it some time to connect with peers
time.Sleep(3 * time.Second) time.Sleep(3 * time.Second)
logger.Infoln("Miner started") logger.Infoln("Miner started")
miner := ethminer.NewDefaultMiner(addr, ethereum) miner := ethminer.NewDefaultMiner(addr, ethereum)
miner.Start() miner.Start()
}() }()
RegisterInterrupt(func(os.Signal) { RegisterInterrupt(func(os.Signal) {
StopMining(ethereum) StopMining(ethereum)
}) })
return true return true
} }
return false return false
} }
func StopMining(ethereum *eth.Ethereum) bool { func StopMining(ethereum *eth.Ethereum) bool {
if ethereum.Mining { if ethereum.Mining {
miner.Stop() miner.Stop()
logger.Infoln("Miner stopped") logger.Infoln("Miner stopped")
ethereum.Mining = false ethereum.Mining = false
return true return true
} }
return false return false
} }
// Replay block // Replay block