@ -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 := & eth . 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.