From b375bbee5fa0b04867cdecdc28e66078a2e32280 Mon Sep 17 00:00:00 2001
From: zelig <viktor.tron@gmail.com>
Date: Thu, 26 Mar 2015 21:49:22 +0000
Subject: [PATCH] settable etherbase - etherbase flag for block reward
 destination - coinbase => etherbase - CLI- eth Config -> eth, xeth -> RPC /
 Miner - use primary instead of coinbase as the unlock magic wildcard -
 accounts: firstAddr/Coinbase -> Primary

---
 accounts/account_manager.go |  8 +-------
 cmd/geth/main.go            |  8 ++++----
 cmd/utils/flags.go          |  8 +++++++-
 eth/backend.go              | 27 +++++++++++++++++++++++----
 xeth/xeth.go                |  4 ++--
 5 files changed, 37 insertions(+), 18 deletions(-)

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 {
-- 
GitLab