|
|
@@ -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 }
|