aboutsummaryrefslogtreecommitdiffstats
path: root/cmd
diff options
context:
space:
mode:
Diffstat (limited to 'cmd')
-rw-r--r--cmd/bootnode/main.go46
-rw-r--r--cmd/geth/js.go16
-rw-r--r--cmd/geth/main.go82
-rw-r--r--cmd/geth/usage.go7
-rw-r--r--cmd/utils/flags.go22
5 files changed, 104 insertions, 69 deletions
diff --git a/cmd/bootnode/main.go b/cmd/bootnode/main.go
index 7f74e9c70..7d3f9fdb3 100644
--- a/cmd/bootnode/main.go
+++ b/cmd/bootnode/main.go
@@ -19,15 +19,12 @@ package main
import (
"crypto/ecdsa"
- "encoding/hex"
"flag"
- "fmt"
- "io/ioutil"
- "log"
"os"
+ "github.com/ethereum/go-ethereum/cmd/utils"
"github.com/ethereum/go-ethereum/crypto"
- "github.com/ethereum/go-ethereum/logger"
+ "github.com/ethereum/go-ethereum/logger/glog"
"github.com/ethereum/go-ethereum/p2p/discover"
"github.com/ethereum/go-ethereum/p2p/nat"
)
@@ -43,50 +40,43 @@ func main() {
nodeKey *ecdsa.PrivateKey
err error
)
+ flag.Var(glog.GetVerbosity(), "verbosity", "log verbosity (0-9)")
+ flag.Var(glog.GetVModule(), "vmodule", "log verbosity pattern")
+ glog.SetToStderr(true)
flag.Parse()
- logger.AddLogSystem(logger.NewStdLogSystem(os.Stdout, log.LstdFlags, logger.DebugLevel))
if *genKey != "" {
- writeKey(*genKey)
+ key, err := crypto.GenerateKey()
+ if err != nil {
+ utils.Fatalf("could not generate key: %v", err)
+ }
+ if err := crypto.SaveECDSA(*genKey, key); err != nil {
+ utils.Fatalf("%v", err)
+ }
os.Exit(0)
}
natm, err := nat.Parse(*natdesc)
if err != nil {
- log.Fatalf("-nat: %v", err)
+ utils.Fatalf("-nat: %v", err)
}
switch {
case *nodeKeyFile == "" && *nodeKeyHex == "":
- log.Fatal("Use -nodekey or -nodekeyhex to specify a private key")
+ utils.Fatalf("Use -nodekey or -nodekeyhex to specify a private key")
case *nodeKeyFile != "" && *nodeKeyHex != "":
- log.Fatal("Options -nodekey and -nodekeyhex are mutually exclusive")
+ utils.Fatalf("Options -nodekey and -nodekeyhex are mutually exclusive")
case *nodeKeyFile != "":
if nodeKey, err = crypto.LoadECDSA(*nodeKeyFile); err != nil {
- log.Fatalf("-nodekey: %v", err)
+ utils.Fatalf("-nodekey: %v", err)
}
case *nodeKeyHex != "":
if nodeKey, err = crypto.HexToECDSA(*nodeKeyHex); err != nil {
- log.Fatalf("-nodekeyhex: %v", err)
+ utils.Fatalf("-nodekeyhex: %v", err)
}
}
if _, err := discover.ListenUDP(nodeKey, *listenAddr, natm, ""); err != nil {
- log.Fatal(err)
+ utils.Fatalf("%v", err)
}
select {}
}
-
-func writeKey(target string) {
- key, err := crypto.GenerateKey()
- if err != nil {
- log.Fatalf("could not generate key: %v", err)
- }
- b := crypto.FromECDSA(key)
- if target == "-" {
- fmt.Println(hex.EncodeToString(b))
- } else {
- if err := ioutil.WriteFile(target, b, 0600); err != nil {
- log.Fatal("write error: ", err)
- }
- }
-}
diff --git a/cmd/geth/js.go b/cmd/geth/js.go
index 767b513c1..2b64303b2 100644
--- a/cmd/geth/js.go
+++ b/cmd/geth/js.go
@@ -123,7 +123,7 @@ func (self *jsre) batch(statement string) {
err := self.re.EvalAndPrettyPrint(statement)
if err != nil {
- fmt.Printf("error: %v", err)
+ fmt.Printf("%v", jsErrorString(err))
}
if self.atexit != nil {
@@ -301,21 +301,19 @@ func (self *jsre) preloadJSFiles(ctx *cli.Context) error {
for _, file := range jsFiles {
filename := common.AbsolutePath(assetPath, strings.TrimSpace(file))
if err := self.re.Exec(filename); err != nil {
- return fmt.Errorf("%s: %v", file, err)
+ return fmt.Errorf("%s: %v", file, jsErrorString(err))
}
}
}
return nil
}
-// exec executes the JS file with the given filename and stops the JSRE
-func (self *jsre) exec(filename string) error {
- if err := self.re.Exec(filename); err != nil {
- self.re.Stop(false)
- return fmt.Errorf("Javascript Error: %v", err)
+// jsErrorString adds a backtrace to errors generated by otto.
+func jsErrorString(err error) string {
+ if ottoErr, ok := err.(*otto.Error); ok {
+ return ottoErr.String()
}
- self.re.Stop(true)
- return nil
+ return err.Error()
}
func (self *jsre) interactive() {
diff --git a/cmd/geth/main.go b/cmd/geth/main.go
index 8fe193b14..47b5f6817 100644
--- a/cmd/geth/main.go
+++ b/cmd/geth/main.go
@@ -18,9 +18,11 @@
package main
import (
+ "encoding/hex"
"fmt"
"io/ioutil"
"os"
+ "os/signal"
"path/filepath"
"runtime"
"strconv"
@@ -40,31 +42,48 @@ import (
"github.com/ethereum/go-ethereum/metrics"
"github.com/ethereum/go-ethereum/node"
"github.com/ethereum/go-ethereum/params"
+ "github.com/ethereum/go-ethereum/release"
"github.com/ethereum/go-ethereum/rlp"
)
const (
- ClientIdentifier = "Geth"
- Version = "1.4.0-rc"
- VersionMajor = 1
- VersionMinor = 4
- VersionPatch = 0
+ clientIdentifier = "Geth" // Client identifier to advertise over the network
+ versionMajor = 1 // Major version component of the current release
+ versionMinor = 4 // Minor version component of the current release
+ versionPatch = 1 // Patch version component of the current release
+ versionMeta = "rc" // Version metadata to append to the version string
+
+ versionOracle = "0xfa7b9770ca4cb04296cac84f37736d4041251cdf" // Ethereum address of the Geth release oracle
)
var (
- gitCommit string // set via linker flagg
- nodeNameVersion string
- app *cli.App
+ gitCommit string // Git SHA1 commit hash of the release (set via linker flags)
+ verString string // Combined textual representation of all the version components
+ relConfig release.Config // Structured version information and release oracle config
+ app *cli.App
)
func init() {
- if gitCommit == "" {
- nodeNameVersion = Version
- } else {
- nodeNameVersion = Version + "-" + gitCommit[:8]
+ // Construct the textual version string from the individual components
+ verString = fmt.Sprintf("%d.%d.%d", versionMajor, versionMinor, versionPatch)
+ if versionMeta != "" {
+ verString += "-" + versionMeta
+ }
+ if gitCommit != "" {
+ verString += "-" + gitCommit[:8]
}
+ // Construct the version release oracle configuration
+ relConfig.Oracle = common.HexToAddress(versionOracle)
- app = utils.NewApp(Version, "the go-ethereum command line interface")
+ relConfig.Major = uint32(versionMajor)
+ relConfig.Minor = uint32(versionMinor)
+ relConfig.Patch = uint32(versionPatch)
+
+ commit, _ := hex.DecodeString(gitCommit)
+ copy(relConfig.Commit[:], commit)
+
+ // Initialize the CLI app and start Geth
+ app = utils.NewApp(verString, "the go-ethereum command line interface")
app.Action = geth
app.HideVersion = true // we have a command to print the version
app.Commands = []cli.Command{
@@ -205,6 +224,7 @@ JavaScript API. See https://github.com/ethereum/go-ethereum/wiki/Javascipt-Conso
utils.NetworkIdFlag,
utils.RPCCORSDomainFlag,
utils.MetricsEnabledFlag,
+ utils.FakePoWFlag,
utils.SolcPathFlag,
utils.GpoMinGasPriceFlag,
utils.GpoMaxGasPriceFlag,
@@ -255,7 +275,7 @@ func makeDefaultExtra() []byte {
Name string
GoVersion string
Os string
- }{uint(VersionMajor<<16 | VersionMinor<<8 | VersionPatch), ClientIdentifier, runtime.Version(), runtime.GOOS}
+ }{uint(versionMajor<<16 | versionMinor<<8 | versionPatch), clientIdentifier, runtime.Version(), runtime.GOOS}
extra, err := rlp.EncodeToBytes(clientInfo)
if err != nil {
glog.V(logger.Warn).Infoln("error setting canonical miner information:", err)
@@ -273,7 +293,7 @@ func makeDefaultExtra() []byte {
// It creates a default node based on the command line arguments and runs it in
// blocking mode, waiting for it to be shut down.
func geth(ctx *cli.Context) {
- node := utils.MakeSystemNode(ClientIdentifier, nodeNameVersion, makeDefaultExtra(), ctx)
+ node := utils.MakeSystemNode(clientIdentifier, verString, relConfig, makeDefaultExtra(), ctx)
startNode(ctx, node)
node.Wait()
}
@@ -337,7 +357,7 @@ func initGenesis(ctx *cli.Context) {
// same time.
func console(ctx *cli.Context) {
// Create and start the node based on the CLI flags
- node := utils.MakeSystemNode(ClientIdentifier, nodeNameVersion, makeDefaultExtra(), ctx)
+ node := utils.MakeSystemNode(clientIdentifier, verString, relConfig, makeDefaultExtra(), ctx)
startNode(ctx, node)
// Attach to the newly started node, and either execute script or become interactive
@@ -353,7 +373,7 @@ func console(ctx *cli.Context) {
// preload user defined JS files into the console
err = repl.preloadJSFiles(ctx)
if err != nil {
- utils.Fatalf("unable to preload JS file %v", err)
+ utils.Fatalf("%v", err)
}
// in case the exec flag holds a JS statement execute it and return
@@ -370,8 +390,9 @@ func console(ctx *cli.Context) {
// of the JavaScript files specified as command arguments.
func execScripts(ctx *cli.Context) {
// Create and start the node based on the CLI flags
- node := utils.MakeSystemNode(ClientIdentifier, nodeNameVersion, makeDefaultExtra(), ctx)
+ node := utils.MakeSystemNode(clientIdentifier, verString, relConfig, makeDefaultExtra(), ctx)
startNode(ctx, node)
+ defer node.Stop()
// Attach to the newly started node and execute the given scripts
client, err := node.Attach()
@@ -383,10 +404,24 @@ func execScripts(ctx *cli.Context) {
ctx.GlobalString(utils.RPCCORSDomainFlag.Name),
client, false)
+ // Run all given files.
for _, file := range ctx.Args() {
- repl.exec(file)
+ if err = repl.re.Exec(file); err != nil {
+ break
+ }
}
- node.Stop()
+ if err != nil {
+ utils.Fatalf("JavaScript Error: %v", jsErrorString(err))
+ }
+ // JS files loaded successfully.
+ // Wait for pending callbacks, but stop for Ctrl-C.
+ abort := make(chan os.Signal, 1)
+ signal.Notify(abort, os.Interrupt)
+ go func() {
+ <-abort
+ repl.re.Stop(false)
+ }()
+ repl.re.Stop(true)
}
// startNode boots up the system node and all registered protocols, after which
@@ -471,11 +506,8 @@ func gpubench(ctx *cli.Context) {
}
func version(c *cli.Context) {
- fmt.Println(ClientIdentifier)
- fmt.Println("Version:", Version)
- if gitCommit != "" {
- fmt.Println("Git Commit:", gitCommit)
- }
+ fmt.Println(clientIdentifier)
+ fmt.Println("Version:", version)
fmt.Println("Protocol Versions:", eth.ProtocolVersions)
fmt.Println("Network Id:", c.GlobalInt(utils.NetworkIdFlag.Name))
fmt.Println("Go Version:", runtime.Version())
diff --git a/cmd/geth/usage.go b/cmd/geth/usage.go
index 278a55980..90019d7b9 100644
--- a/cmd/geth/usage.go
+++ b/cmd/geth/usage.go
@@ -150,8 +150,11 @@ var AppHelpFlagGroups = []flagGroup{
},
},
{
- Name: "LOGGING AND DEBUGGING",
- Flags: append([]cli.Flag{utils.MetricsEnabledFlag}, debug.Flags...),
+ Name: "LOGGING AND DEBUGGING",
+ Flags: append([]cli.Flag{
+ utils.MetricsEnabledFlag,
+ utils.FakePoWFlag,
+ }, debug.Flags...),
},
{
Name: "EXPERIMENTAL",
diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go
index 52060c795..43dbc37f7 100644
--- a/cmd/utils/flags.go
+++ b/cmd/utils/flags.go
@@ -47,6 +47,8 @@ import (
"github.com/ethereum/go-ethereum/p2p/discover"
"github.com/ethereum/go-ethereum/p2p/nat"
"github.com/ethereum/go-ethereum/params"
+ "github.com/ethereum/go-ethereum/pow"
+ "github.com/ethereum/go-ethereum/release"
"github.com/ethereum/go-ethereum/rpc"
"github.com/ethereum/go-ethereum/whisper"
)
@@ -228,6 +230,10 @@ var (
Name: metrics.MetricsEnabledFlag,
Usage: "Enable metrics collection and reporting",
}
+ FakePoWFlag = cli.BoolFlag{
+ Name: "fakepow",
+ Usage: "Disables proof-of-work verification",
+ }
// RPC settings
RPCEnabledFlag = cli.BoolFlag{
@@ -636,7 +642,7 @@ func MakePasswordList(ctx *cli.Context) []string {
// MakeSystemNode sets up a local node, configures the services to launch and
// assembles the P2P protocol stack.
-func MakeSystemNode(name, version string, extra []byte, ctx *cli.Context) *node.Node {
+func MakeSystemNode(name, version string, relconf release.Config, extra []byte, ctx *cli.Context) *node.Node {
// Avoid conflicting network flags
networks, netFlags := 0, []cli.BoolFlag{DevModeFlag, TestNetFlag, OlympicFlag}
for _, flag := range netFlags {
@@ -767,7 +773,11 @@ func MakeSystemNode(name, version string, extra []byte, ctx *cli.Context) *node.
Fatalf("Failed to register the Whisper service: %v", err)
}
}
-
+ if err := stack.Register(func(ctx *node.ServiceContext) (node.Service, error) {
+ return release.NewReleaseService(ctx, relconf)
+ }); err != nil {
+ Fatalf("Failed to register the Geth release oracle service: %v", err)
+ }
return stack
}
@@ -842,11 +852,13 @@ func MakeChain(ctx *cli.Context) (chain *core.BlockChain, chainDb ethdb.Database
glog.Fatalln(err)
}
}
-
chainConfig := MustMakeChainConfigFromDb(ctx, chainDb)
- var eventMux event.TypeMux
- chain, err = core.NewBlockChain(chainDb, chainConfig, ethash.New(), &eventMux)
+ pow := pow.PoW(core.FakePow{})
+ if !ctx.GlobalBool(FakePoWFlag.Name) {
+ pow = ethash.New()
+ }
+ chain, err = core.NewBlockChain(chainDb, chainConfig, pow, new(event.TypeMux))
if err != nil {
Fatalf("Could not start chainmanager: %v", err)
}