diff --git a/accounts/account_manager.go b/accounts/account_manager.go index 34a2c48910..e9eb8f8165 100644 --- a/accounts/account_manager.go +++ b/accounts/account_manager.go @@ -81,13 +81,7 @@ func (am *Manager) HasAccount(addr []byte) bool { return false } -// Coinbase returns the account address that mining rewards are sent to. -func (am *Manager) Coinbase() (addr []byte, err error) { - // TODO: persist coinbase address on disk - return am.firstAddr() -} - -func (am *Manager) firstAddr() ([]byte, error) { +func (am *Manager) Primary() (addr []byte, err error) { addrs, err := am.keyStore.GetKeyAddresses() if os.IsNotExist(err) { return nil, ErrNoKeys diff --git a/cmd/geth/main.go b/cmd/geth/main.go index da505218bc..05e2e4ae65 100644 --- a/cmd/geth/main.go +++ b/cmd/geth/main.go @@ -221,6 +221,7 @@ JavaScript API. See https://github.com/ethereum/go-ethereum/wiki/Javascipt-Conso utils.LogJSONFlag, utils.LogLevelFlag, utils.MaxPeersFlag, + utils.EtherbaseFlag, utils.MinerThreadsFlag, utils.MiningEnabledFlag, utils.NATFlag, @@ -322,10 +323,10 @@ func startEth(ctx *cli.Context, eth *eth.Ethereum) { account := ctx.GlobalString(utils.UnlockedAccountFlag.Name) if len(account) > 0 { - if account == "coinbase" { - accbytes, err := am.Coinbase() + if account == "primary" { + accbytes, err := am.Primary() if err != nil { - utils.Fatalf("no coinbase account: %v", err) + utils.Fatalf("no primary account: %v", err) } account = common.ToHex(accbytes) } @@ -468,7 +469,6 @@ func dump(ctx *cli.Context) { } else { statedb := state.New(block.Root(), stateDb) fmt.Printf("%s\n", statedb.Dump()) - // fmt.Println(block) } } } diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go index f948cdb06b..1b5559081b 100644 --- a/cmd/utils/flags.go +++ b/cmd/utils/flags.go @@ -96,10 +96,15 @@ var ( Name: "mine", Usage: "Enable mining", } + EtherbaseFlag = cli.StringFlag{ + Name: "Etherbase", + Usage: "public address for block mining rewards. By default the address of your primary account is used", + Value: "primary", + } UnlockedAccountFlag = cli.StringFlag{ Name: "unlock", - Usage: "unlock the account given until this program exits (prompts for password). '--unlock coinbase' unlocks the primary (coinbase) account", + Usage: "unlock the account given until this program exits (prompts for password). '--unlock primary' unlocks the primary account", Value: "", } PasswordFileFlag = cli.StringFlag{ @@ -215,6 +220,7 @@ func MakeEthConfig(clientID, version string, ctx *cli.Context) *eth.Config { LogFile: ctx.GlobalString(LogFileFlag.Name), LogLevel: ctx.GlobalInt(LogLevelFlag.Name), LogJSON: ctx.GlobalString(LogJSONFlag.Name), + Etherbase: ctx.GlobalString(EtherbaseFlag.Name), MinerThreads: ctx.GlobalInt(MinerThreadsFlag.Name), AccountManager: GetAccountManager(ctx), VmDebug: ctx.GlobalBool(VMDebugFlag.Name), diff --git a/eth/backend.go b/eth/backend.go index c73e767921..fed0da0169 100644 --- a/eth/backend.go +++ b/eth/backend.go @@ -63,6 +63,7 @@ type Config struct { Shh bool Dial bool + Etherbase string MinerThreads int AccountManager *accounts.Manager @@ -140,6 +141,7 @@ type Ethereum struct { Mining bool DataDir string + etherbase common.Address clientVersion string ethVersionId int netVersionId int @@ -185,6 +187,7 @@ func New(config *Config) (*Ethereum, error) { eventMux: &event.TypeMux{}, accountManager: config.AccountManager, DataDir: config.DataDir, + etherbase: common.HexToAddress(config.Etherbase), clientVersion: config.Name, // TODO should separate from Name ethVersionId: config.ProtocolVersion, netVersionId: config.NetworkId, @@ -297,15 +300,31 @@ func (s *Ethereum) ResetWithGenesisBlock(gb *types.Block) { } func (s *Ethereum) StartMining() error { - cb, err := s.accountManager.Coinbase() + eb, err := s.Etherbase() if err != nil { - servlogger.Errorf("Cannot start mining without coinbase: %v\n", err) - return fmt.Errorf("no coinbase: %v", err) + err = fmt.Errorf("Cannot start mining without etherbase address: %v", err) + servlogger.Errorln(err) + return err + } - s.miner.Start(common.BytesToAddress(cb)) + + s.miner.Start(eb) return nil } +func (s *Ethereum) Etherbase() (eb common.Address, err error) { + eb = s.etherbase + if (eb == common.Address{}) { + var ebbytes []byte + ebbytes, err = s.accountManager.Primary() + eb = common.BytesToAddress(ebbytes) + if (eb == common.Address{}) { + err = fmt.Errorf("no accounts found") + } + } + return +} + func (s *Ethereum) StopMining() { s.miner.Stop() } func (s *Ethereum) IsMining() bool { return s.miner.Mining() } func (s *Ethereum) Miner() *miner.Miner { return s.miner } diff --git a/xeth/xeth.go b/xeth/xeth.go index bf30fc2fcc..3a9855bf34 100644 --- a/xeth/xeth.go +++ b/xeth/xeth.go @@ -250,8 +250,8 @@ func (self *XEth) IsListening() bool { } func (self *XEth) Coinbase() string { - cb, _ := self.backend.AccountManager().Coinbase() - return common.ToHex(cb) + eb, _ := self.backend.Etherbase() + return eb.Hex() } func (self *XEth) NumberToHuman(balance string) string {