go-ethereum/ethereum/ethereum.go

193 lines
4.0 KiB
Go
Raw Normal View History

2014-03-22 13:03:10 +02:00
package main
import (
"fmt"
"github.com/ethereum/eth-go"
"github.com/ethereum/eth-go/ethchain"
"github.com/ethereum/eth-go/ethutil"
"github.com/ethereum/go-ethereum/utils"
2014-05-19 18:01:40 +03:00
"io/ioutil"
2014-03-22 13:03:10 +02:00
"log"
"os"
"os/signal"
"runtime"
2014-04-09 17:29:52 +03:00
"strings"
2014-03-22 13:03:10 +02:00
)
const Debug = true
2014-05-19 17:32:45 +03:00
func RegisterInterrupt(cb func(os.Signal)) {
2014-03-22 13:03:10 +02:00
go func() {
2014-05-19 17:32:45 +03:00
// Buffered chan of one is enough
c := make(chan os.Signal, 1)
// Notify about interrupts for now
signal.Notify(c, os.Interrupt)
2014-03-22 13:03:10 +02:00
for sig := range c {
2014-05-19 17:32:45 +03:00
cb(sig)
2014-03-22 13:03:10 +02:00
}
}()
}
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-03-22 13:03:10 +02:00
func main() {
Init()
runtime.GOMAXPROCS(runtime.NumCPU())
// set logger
var logSys *log.Logger
flags := log.LstdFlags
2014-05-19 18:01:40 +03:00
if StartJsConsole || len(InputFile) > 0 {
2014-05-15 23:15:14 +03:00
ethutil.ReadConfig(DataDir, ethutil.LogFile)
} else {
ethutil.ReadConfig(DataDir, ethutil.LogFile|ethutil.LogStd)
}
logger := ethutil.Config.Log
if LogFile != "" {
logfile, err := os.OpenFile(LogFile, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
if err != nil {
panic(fmt.Sprintf("error opening log file '%s': %v", LogFile, err))
}
defer logfile.Close()
log.SetOutput(logfile)
logSys = log.New(logfile, "", flags)
logger.AddLogSystem(logSys)
} else {
logSys = log.New(os.Stdout, "", flags)
}
ethchain.InitFees()
2014-03-22 13:03:10 +02:00
// Instantiated a eth stack
ethereum, err := eth.New(eth.CapDefault, UseUPnP)
if err != nil {
log.Println("eth start err:", err)
return
}
ethereum.Port = OutboundPort
// bookkeeping tasks
switch {
case GenAddr:
if NonInteractive || confirm("This action overwrites your old private key.") {
2014-03-22 13:03:10 +02:00
utils.CreateKeyPair(true)
}
os.Exit(0)
case len(ImportKey) > 0:
if NonInteractive || confirm("This action overwrites your old private key.") {
mnemonic := strings.Split(ImportKey, " ")
if len(mnemonic) == 24 {
logSys.Println("Got mnemonic key, importing.")
key := ethutil.MnemonicDecode(mnemonic)
utils.ImportPrivateKey(key)
} else if len(mnemonic) == 1 {
logSys.Println("Got hex key, importing.")
utils.ImportPrivateKey(ImportKey)
} else {
logSys.Println("Did not recognise format, exiting.")
2014-03-22 13:03:10 +02:00
}
}
os.Exit(0)
case ExportKey:
2014-05-14 14:55:08 +03:00
keyPair := ethutil.GetKeyRing().Get(0)
fmt.Printf(`
Generating new address and keypair.
Please keep your keys somewhere save.
++++++++++++++++ KeyRing +++++++++++++++++++
addr: %x
prvk: %x
pubk: %x
++++++++++++++++++++++++++++++++++++++++++++
save these words so you can restore your account later: %s
`, keyPair.Address(), keyPair.PrivateKey, keyPair.PublicKey)
2014-03-22 13:03:10 +02:00
os.Exit(0)
case ShowGenesis:
logSys.Println(ethereum.BlockChain().Genesis())
2014-03-22 13:03:10 +02:00
os.Exit(0)
default:
// Creates a keypair if non exists
utils.CreateKeyPair(false)
2014-03-22 13:03:10 +02:00
}
// client
logger.Infoln(fmt.Sprintf("Starting Ethereum v%s", ethutil.Config.Ver))
2014-03-22 13:03:10 +02:00
// Set the max peers
ethereum.MaxPeers = MaxPeer
// Set Mining status
ethereum.Mining = StartMining
2014-03-22 13:03:10 +02:00
if StartMining {
utils.DoMining(ethereum)
2014-03-22 13:03:10 +02:00
}
if StartConsole {
err := os.Mkdir(ethutil.Config.ExecPath, os.ModePerm)
// Error is OK if the error is ErrExist
if err != nil && !os.IsExist(err) {
log.Panic("Unable to create EXECPATH:", err)
}
console := NewConsole(ethereum)
go console.Start()
2014-05-15 23:15:14 +03:00
} else if StartJsConsole {
2014-05-17 16:15:46 +03:00
repl := NewJSRepl(ethereum)
2014-05-15 21:45:19 +03:00
2014-05-17 16:15:46 +03:00
go repl.Start()
2014-05-19 17:32:45 +03:00
RegisterInterrupt(func(os.Signal) {
repl.Stop()
})
2014-05-19 18:01:40 +03:00
} else if len(InputFile) > 0 {
file, err := os.Open(InputFile)
if err != nil {
ethutil.Config.Log.Fatal(err)
}
content, err := ioutil.ReadAll(file)
if err != nil {
ethutil.Config.Log.Fatal(err)
}
re := NewJSRE(ethereum)
RegisterInterrupt(func(os.Signal) {
re.Stop()
})
re.Run(string(content))
2014-05-15 21:45:19 +03:00
}
if StartRpc {
utils.DoRpc(ethereum, RpcPort)
}
2014-05-19 17:32:45 +03:00
RegisterInterrupt(func(sig os.Signal) {
fmt.Printf("Shutting down (%v) ... \n", sig)
ethereum.Stop()
})
ethereum.Start(UseSeed)
2014-03-22 13:03:10 +02:00
// Wait for shutdown
ethereum.WaitForShutdown()
}