// New creates a Ethereum client, pre-configured to one of the supported networks. func New(datadir string, network EthereumNetwork) (*Geth, error) { // Tag the data dir with the network name switch network { case MainNet: datadir = filepath.Join(datadir, "mainnet") case TestNet: datadir = filepath.Join(datadir, "testnet") default: return nil, fmt.Errorf("unsupported network: %v", network) } // Select the bootstrap nodes based on the network bootnodes := utils.FrontierBootNodes if network == TestNet { bootnodes = utils.TestNetBootNodes } // Configure the node's service container stackConf := &node.Config{ DataDir: datadir, Name: common.MakeName(NodeName, NodeVersion), BootstrapNodes: bootnodes, ListenAddr: fmt.Sprintf(":%d", NodePort), MaxPeers: NodeMaxPeers, } // Configure the bare-bone Ethereum service keystore := crypto.NewKeyStorePassphrase(filepath.Join(datadir, "keystore"), crypto.StandardScryptN, crypto.StandardScryptP) ethConf := ð.Config{ FastSync: true, DatabaseCache: 64, NetworkId: int(network), AccountManager: accounts.NewManager(keystore), // Blatantly initialize the gas oracle to the defaults from go-ethereum GpoMinGasPrice: new(big.Int).Mul(big.NewInt(50), common.Shannon), GpoMaxGasPrice: new(big.Int).Mul(big.NewInt(500), common.Shannon), GpoFullBlockRatio: 80, GpobaseStepDown: 10, GpobaseStepUp: 100, GpobaseCorrectionFactor: 110, } // Override any default configs in the test network if network == TestNet { ethConf.NetworkId = 2 ethConf.Genesis = core.TestNetGenesisBlock() state.StartingNonce = 1048576 // (2**20) } // Assemble and return the protocol stack stack, err := node.New(stackConf) if err != nil { return nil, fmt.Errorf("protocol stack: %v", err) } if err := stack.Register(func(ctx *node.ServiceContext) (node.Service, error) { return eth.New(ctx, ethConf) }); err != nil { return nil, fmt.Errorf("ethereum service: %v", err) } return &Geth{ stack: stack, keystore: keystore, }, nil }
// 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 := crypto.StandardScryptN scryptP := crypto.StandardScryptP if ctx.GlobalBool(LightKDFFlag.Name) { scryptN = crypto.LightScryptN scryptP = crypto.LightScryptP } // Assemble an account manager using the configured datadir var ( datadir = MustMakeDataDir(ctx) keystore = crypto.NewKeyStorePassphrase(filepath.Join(datadir, "keystore"), scryptN, scryptP) ) return accounts.NewManager(keystore) }