|
|
@@ -413,16 +413,6 @@ func MustMakeDataDir(ctx *cli.Context) string {
|
|
|
return ""
|
|
|
}
|
|
|
|
|
|
-// MakeKeyStoreDir resolves the folder to use for storing the account keys from the
|
|
|
-// set command line flags, returning the explicitly requested path, or one inside
|
|
|
-// the data directory otherwise.
|
|
|
-func MakeKeyStoreDir(datadir string, ctx *cli.Context) string {
|
|
|
- if path := ctx.GlobalString(KeyStoreDirFlag.Name); path != "" {
|
|
|
- return path
|
|
|
- }
|
|
|
- return filepath.Join(datadir, "keystore")
|
|
|
-}
|
|
|
-
|
|
|
// MakeIPCPath creates an IPC path configuration from the set command line flags,
|
|
|
// returning an empty string if IPC was explicitly disabled, or the set path.
|
|
|
func MakeIPCPath(ctx *cli.Context) string {
|
|
|
@@ -555,20 +545,6 @@ func MakeDatabaseHandles() int {
|
|
|
return limit / 2 // Leave half for networking and other stuff
|
|
|
}
|
|
|
|
|
|
-// MakeAccountManager creates an account manager from set command line flags.
|
|
|
-func MakeAccountManager(ctx *cli.Context) *accounts.Manager {
|
|
|
- // Create the keystore crypto primitive, light if requested
|
|
|
- scryptN := accounts.StandardScryptN
|
|
|
- scryptP := accounts.StandardScryptP
|
|
|
- if ctx.GlobalBool(LightKDFFlag.Name) {
|
|
|
- scryptN = accounts.LightScryptN
|
|
|
- scryptP = accounts.LightScryptP
|
|
|
- }
|
|
|
- datadir := MustMakeDataDir(ctx)
|
|
|
- keydir := MakeKeyStoreDir(datadir, ctx)
|
|
|
- return accounts.NewManager(keydir, scryptN, scryptP)
|
|
|
-}
|
|
|
-
|
|
|
// MakeAddress converts an account specified directly as a hex encoded string or
|
|
|
// a key index in the key store to an internal account representation.
|
|
|
func MakeAddress(accman *accounts.Manager, account string) (accounts.Account, error) {
|
|
|
@@ -631,9 +607,48 @@ func MakePasswordList(ctx *cli.Context) []string {
|
|
|
return lines
|
|
|
}
|
|
|
|
|
|
-// MakeSystemNode sets up a local node, configures the services to launch and
|
|
|
-// assembles the P2P protocol stack.
|
|
|
-func MakeSystemNode(name, version string, relconf release.Config, extra []byte, ctx *cli.Context) *node.Node {
|
|
|
+// MakeNode configures a node with no services from command line flags.
|
|
|
+func MakeNode(ctx *cli.Context, name, version string) *node.Node {
|
|
|
+ config := &node.Config{
|
|
|
+ DataDir: MustMakeDataDir(ctx),
|
|
|
+ KeyStoreDir: ctx.GlobalString(KeyStoreDirFlag.Name),
|
|
|
+ UseLightweightKDF: ctx.GlobalBool(LightKDFFlag.Name),
|
|
|
+ PrivateKey: MakeNodeKey(ctx),
|
|
|
+ Name: MakeNodeName(name, version, ctx),
|
|
|
+ NoDiscovery: ctx.GlobalBool(NoDiscoverFlag.Name),
|
|
|
+ BootstrapNodes: MakeBootstrapNodes(ctx),
|
|
|
+ ListenAddr: MakeListenAddress(ctx),
|
|
|
+ NAT: MakeNAT(ctx),
|
|
|
+ MaxPeers: ctx.GlobalInt(MaxPeersFlag.Name),
|
|
|
+ MaxPendingPeers: ctx.GlobalInt(MaxPendingPeersFlag.Name),
|
|
|
+ IPCPath: MakeIPCPath(ctx),
|
|
|
+ HTTPHost: MakeHTTPRpcHost(ctx),
|
|
|
+ HTTPPort: ctx.GlobalInt(RPCPortFlag.Name),
|
|
|
+ HTTPCors: ctx.GlobalString(RPCCORSDomainFlag.Name),
|
|
|
+ HTTPModules: MakeRPCModules(ctx.GlobalString(RPCApiFlag.Name)),
|
|
|
+ WSHost: MakeWSRpcHost(ctx),
|
|
|
+ WSPort: ctx.GlobalInt(WSPortFlag.Name),
|
|
|
+ WSOrigins: ctx.GlobalString(WSAllowedOriginsFlag.Name),
|
|
|
+ WSModules: MakeRPCModules(ctx.GlobalString(WSApiFlag.Name)),
|
|
|
+ }
|
|
|
+ if ctx.GlobalBool(DevModeFlag.Name) {
|
|
|
+ if !ctx.GlobalIsSet(DataDirFlag.Name) {
|
|
|
+ config.DataDir = filepath.Join(os.TempDir(), "/ethereum_dev_mode")
|
|
|
+ }
|
|
|
+ // --dev mode does not need p2p networking.
|
|
|
+ config.MaxPeers = 0
|
|
|
+ config.ListenAddr = ":0"
|
|
|
+ }
|
|
|
+ stack, err := node.New(config)
|
|
|
+ if err != nil {
|
|
|
+ Fatalf("Failed to create the protocol stack: %v", err)
|
|
|
+ }
|
|
|
+ return stack
|
|
|
+}
|
|
|
+
|
|
|
+// RegisterEthService configures eth.Ethereum from command line flags and adds it to the
|
|
|
+// given node.
|
|
|
+func RegisterEthService(ctx *cli.Context, stack *node.Node, relconf release.Config, extra []byte) {
|
|
|
// Avoid conflicting network flags
|
|
|
networks, netFlags := 0, []cli.BoolFlag{DevModeFlag, TestNetFlag, OlympicFlag}
|
|
|
for _, flag := range netFlags {
|
|
|
@@ -644,29 +659,6 @@ func MakeSystemNode(name, version string, relconf release.Config, extra []byte,
|
|
|
if networks > 1 {
|
|
|
Fatalf("The %v flags are mutually exclusive", netFlags)
|
|
|
}
|
|
|
- // Configure the node's service container
|
|
|
- stackConf := &node.Config{
|
|
|
- DataDir: MustMakeDataDir(ctx),
|
|
|
- PrivateKey: MakeNodeKey(ctx),
|
|
|
- Name: MakeNodeName(name, version, ctx),
|
|
|
- NoDiscovery: ctx.GlobalBool(NoDiscoverFlag.Name),
|
|
|
- BootstrapNodes: MakeBootstrapNodes(ctx),
|
|
|
- ListenAddr: MakeListenAddress(ctx),
|
|
|
- NAT: MakeNAT(ctx),
|
|
|
- MaxPeers: ctx.GlobalInt(MaxPeersFlag.Name),
|
|
|
- MaxPendingPeers: ctx.GlobalInt(MaxPendingPeersFlag.Name),
|
|
|
- IPCPath: MakeIPCPath(ctx),
|
|
|
- HTTPHost: MakeHTTPRpcHost(ctx),
|
|
|
- HTTPPort: ctx.GlobalInt(RPCPortFlag.Name),
|
|
|
- HTTPCors: ctx.GlobalString(RPCCORSDomainFlag.Name),
|
|
|
- HTTPModules: MakeRPCModules(ctx.GlobalString(RPCApiFlag.Name)),
|
|
|
- WSHost: MakeWSRpcHost(ctx),
|
|
|
- WSPort: ctx.GlobalInt(WSPortFlag.Name),
|
|
|
- WSOrigins: ctx.GlobalString(WSAllowedOriginsFlag.Name),
|
|
|
- WSModules: MakeRPCModules(ctx.GlobalString(WSApiFlag.Name)),
|
|
|
- }
|
|
|
- // Configure the Ethereum service
|
|
|
- accman := MakeAccountManager(ctx)
|
|
|
|
|
|
// initialise new random number generator
|
|
|
rand := rand.New(rand.NewSource(time.Now().UnixNano()))
|
|
|
@@ -679,14 +671,13 @@ func MakeSystemNode(name, version string, relconf release.Config, extra []byte,
|
|
|
}
|
|
|
|
|
|
ethConf := ð.Config{
|
|
|
+ Etherbase: MakeEtherbase(stack.AccountManager(), ctx),
|
|
|
ChainConfig: MustMakeChainConfig(ctx),
|
|
|
FastSync: ctx.GlobalBool(FastSyncFlag.Name),
|
|
|
BlockChainVersion: ctx.GlobalInt(BlockchainVersionFlag.Name),
|
|
|
DatabaseCache: ctx.GlobalInt(CacheFlag.Name),
|
|
|
DatabaseHandles: MakeDatabaseHandles(),
|
|
|
NetworkId: ctx.GlobalInt(NetworkIdFlag.Name),
|
|
|
- AccountManager: accman,
|
|
|
- Etherbase: MakeEtherbase(accman, ctx),
|
|
|
MinerThreads: ctx.GlobalInt(MinerThreadsFlag.Name),
|
|
|
ExtraData: MakeMinerExtra(extra, ctx),
|
|
|
NatSpec: ctx.GlobalBool(NatspecEnabledFlag.Name),
|
|
|
@@ -703,8 +694,6 @@ func MakeSystemNode(name, version string, relconf release.Config, extra []byte,
|
|
|
SolcPath: ctx.GlobalString(SolcPathFlag.Name),
|
|
|
AutoDAG: ctx.GlobalBool(AutoDAGFlag.Name) || ctx.GlobalBool(MiningEnabledFlag.Name),
|
|
|
}
|
|
|
- // Configure the Whisper service
|
|
|
- shhEnable := ctx.GlobalBool(WhisperEnabledFlag.Name)
|
|
|
|
|
|
// Override any default configs in dev mode or the test net
|
|
|
switch {
|
|
|
@@ -722,54 +711,30 @@ func MakeSystemNode(name, version string, relconf release.Config, extra []byte,
|
|
|
state.StartingNonce = 1048576 // (2**20)
|
|
|
|
|
|
case ctx.GlobalBool(DevModeFlag.Name):
|
|
|
- // Override the base network stack configs
|
|
|
- if !ctx.GlobalIsSet(DataDirFlag.Name) {
|
|
|
- stackConf.DataDir = filepath.Join(os.TempDir(), "/ethereum_dev_mode")
|
|
|
- }
|
|
|
- if !ctx.GlobalIsSet(MaxPeersFlag.Name) {
|
|
|
- stackConf.MaxPeers = 0
|
|
|
- }
|
|
|
- if !ctx.GlobalIsSet(ListenPortFlag.Name) {
|
|
|
- stackConf.ListenAddr = ":0"
|
|
|
- }
|
|
|
- // Override the Ethereum protocol configs
|
|
|
ethConf.Genesis = core.OlympicGenesisBlock()
|
|
|
if !ctx.GlobalIsSet(GasPriceFlag.Name) {
|
|
|
ethConf.GasPrice = new(big.Int)
|
|
|
}
|
|
|
- if !ctx.GlobalIsSet(WhisperEnabledFlag.Name) {
|
|
|
- shhEnable = true
|
|
|
- }
|
|
|
ethConf.PowTest = true
|
|
|
}
|
|
|
- // Assemble and return the protocol stack
|
|
|
- stack, err := node.New(stackConf)
|
|
|
- if err != nil {
|
|
|
- Fatalf("Failed to create the protocol stack: %v", err)
|
|
|
- }
|
|
|
-
|
|
|
- if err := stack.Register(func(ctx *node.ServiceContext) (node.Service, error) {
|
|
|
- return accman, nil
|
|
|
- }); err != nil {
|
|
|
- Fatalf("Failed to register the account manager service: %v", err)
|
|
|
- }
|
|
|
|
|
|
if err := stack.Register(func(ctx *node.ServiceContext) (node.Service, error) {
|
|
|
return eth.New(ctx, ethConf)
|
|
|
}); err != nil {
|
|
|
Fatalf("Failed to register the Ethereum service: %v", err)
|
|
|
}
|
|
|
- if shhEnable {
|
|
|
- if err := stack.Register(func(*node.ServiceContext) (node.Service, error) { return whisper.New(), nil }); err != nil {
|
|
|
- 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
|
|
|
+}
|
|
|
+
|
|
|
+// RegisterShhService configures whisper and adds it to the given node.
|
|
|
+func RegisterShhService(stack *node.Node) {
|
|
|
+ if err := stack.Register(func(*node.ServiceContext) (node.Service, error) { return whisper.New(), nil }); err != nil {
|
|
|
+ Fatalf("Failed to register the Whisper service: %v", err)
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
// SetupNetwork configures the system for either the main net or some test network.
|