diff options
Diffstat (limited to 'cmd')
-rw-r--r-- | cmd/bootnode/main.go | 46 | ||||
-rw-r--r-- | cmd/geth/js.go | 16 | ||||
-rw-r--r-- | cmd/geth/main.go | 82 | ||||
-rw-r--r-- | cmd/geth/usage.go | 7 | ||||
-rw-r--r-- | cmd/utils/flags.go | 22 |
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) } |