Kaynağa Gözat

"centralised" mining to backend. Closes #323

obscuren 10 yıl önce
ebeveyn
işleme
8135752a32
11 değiştirilmiş dosya ile 47 ekleme ve 96 silme
  1. 1 1
      cmd/mist/ext_app.go
  2. 1 4
      cmd/mist/gui.go
  3. 5 9
      cmd/mist/ui_lib.go
  4. 2 2
      core/filter.go
  5. 1 2
      core/manager.go
  6. 19 63
      eth/backend.go
  7. 4 4
      miner/miner.go
  8. 3 4
      miner/worker.go
  9. 1 1
      ui/filter.go
  10. 1 1
      ui/qt/filter.go
  11. 9 5
      xeth/xeth.go

+ 1 - 1
cmd/mist/ext_app.go

@@ -43,7 +43,7 @@ type AppContainer interface {
 
 type ExtApplication struct {
 	*xeth.XEth
-	eth core.EthManager
+	eth core.Backend
 
 	events          event.Subscription
 	watcherQuitChan chan bool

+ 1 - 4
cmd/mist/gui.go

@@ -41,7 +41,6 @@ import (
 	"github.com/ethereum/go-ethereum/ethdb"
 	"github.com/ethereum/go-ethereum/ethutil"
 	"github.com/ethereum/go-ethereum/logger"
-	"github.com/ethereum/go-ethereum/miner"
 	"github.com/ethereum/go-ethereum/ui/qt/qwhisper"
 	"github.com/ethereum/go-ethereum/xeth"
 	"github.com/obscuren/qml"
@@ -81,8 +80,6 @@ type Gui struct {
 	config  *ethutil.ConfigManager
 
 	plugins map[string]plugin
-
-	miner *miner.Miner
 }
 
 // Create GUI, but doesn't start it
@@ -454,7 +451,7 @@ func (gui *Gui) update() {
 		case <-generalUpdateTicker.C:
 			statusText := "#" + gui.eth.ChainManager().CurrentBlock().Number().String()
 			lastBlockLabel.Set("text", statusText)
-			miningLabel.Set("text", "Mining @ "+strconv.FormatInt(gui.uiLib.miner.HashRate(), 10)+"/Khash")
+			miningLabel.Set("text", "Mining @ "+strconv.FormatInt(gui.uiLib.Miner().HashRate(), 10)+"/Khash")
 
 			/*
 				blockLength := gui.eth.BlockPool().BlocksProcessed

+ 5 - 9
cmd/mist/ui_lib.go

@@ -30,7 +30,6 @@ import (
 	"github.com/ethereum/go-ethereum/ethutil"
 	"github.com/ethereum/go-ethereum/event/filter"
 	"github.com/ethereum/go-ethereum/javascript"
-	"github.com/ethereum/go-ethereum/miner"
 	"github.com/ethereum/go-ethereum/xeth"
 	"github.com/obscuren/qml"
 )
@@ -56,13 +55,10 @@ type UiLib struct {
 
 	filterCallbacks map[int][]int
 	filterManager   *filter.FilterManager
-
-	miner *miner.Miner
 }
 
 func NewUiLib(engine *qml.Engine, eth *eth.Ethereum, assetPath string) *UiLib {
 	lib := &UiLib{XEth: xeth.New(eth), engine: engine, eth: eth, assetPath: assetPath, jsEngine: javascript.NewJSRE(eth), filterCallbacks: make(map[int][]int)} //, filters: make(map[int]*xeth.JSFilter)}
-	lib.miner = miner.New(eth.KeyManager().Address(), eth)
 	lib.filterManager = filter.NewFilterManager(eth.EventMux())
 	go lib.filterManager.Start()
 
@@ -221,20 +217,20 @@ func (self *UiLib) RemoveLocalTransaction(id int) {
 }
 
 func (self *UiLib) SetGasPrice(price string) {
-	self.miner.MinAcceptedGasPrice = ethutil.Big(price)
+	self.Miner().MinAcceptedGasPrice = ethutil.Big(price)
 }
 
 func (self *UiLib) SetExtra(extra string) {
-	self.miner.Extra = extra
+	self.Miner().Extra = extra
 }
 
 func (self *UiLib) ToggleMining() bool {
-	if !self.miner.Mining() {
-		self.miner.Start()
+	if !self.Miner().Mining() {
+		self.Miner().Start()
 
 		return true
 	} else {
-		self.miner.Stop()
+		self.Miner().Stop()
 
 		return false
 	}

+ 2 - 2
core/filter.go

@@ -25,7 +25,7 @@ type FilterOptions struct {
 
 // Filtering interface
 type Filter struct {
-	eth      EthManager
+	eth      Backend
 	earliest int64
 	latest   int64
 	skip     int
@@ -40,7 +40,7 @@ type Filter struct {
 
 // Create a new filter which uses a bloom filter on blocks to figure out whether a particular block
 // is interesting or not.
-func NewFilter(eth EthManager) *Filter {
+func NewFilter(eth Backend) *Filter {
 	return &Filter{eth: eth}
 }
 

+ 1 - 2
core/manager.go

@@ -7,12 +7,11 @@ import (
 	"github.com/ethereum/go-ethereum/p2p"
 )
 
-type EthManager interface {
+type Backend interface {
 	BlockProcessor() *BlockProcessor
 	ChainManager() *ChainManager
 	TxPool() *TxPool
 	PeerCount() int
-	IsMining() bool
 	IsListening() bool
 	Peers() []*p2p.Peer
 	KeyManager() *crypto.KeyManager

+ 19 - 63
eth/backend.go

@@ -11,6 +11,7 @@ import (
 	"github.com/ethereum/go-ethereum/ethutil"
 	"github.com/ethereum/go-ethereum/event"
 	ethlogger "github.com/ethereum/go-ethereum/logger"
+	"github.com/ethereum/go-ethereum/miner"
 	"github.com/ethereum/go-ethereum/p2p"
 	"github.com/ethereum/go-ethereum/p2p/discover"
 	"github.com/ethereum/go-ethereum/p2p/nat"
@@ -95,6 +96,7 @@ type Ethereum struct {
 	eventMux *event.TypeMux
 	txSub    event.Subscription
 	blockSub event.Subscription
+	miner    *miner.Miner
 
 	RpcServer  rpc.RpcServer
 	WsServer   rpc.RpcServer
@@ -151,6 +153,7 @@ func New(config *Config) (*Ethereum, error) {
 	eth.blockProcessor = core.NewBlockProcessor(db, eth.txPool, eth.chainManager, eth.EventMux())
 	eth.chainManager.SetProcessor(eth.blockProcessor)
 	eth.whisper = whisper.New()
+	eth.miner = miner.New(keyManager.Address(), eth)
 
 	hasBlock := eth.chainManager.HasBlock
 	insertChain := eth.chainManager.InsertChain
@@ -181,69 +184,22 @@ func New(config *Config) (*Ethereum, error) {
 	return eth, nil
 }
 
-func (s *Ethereum) KeyManager() *crypto.KeyManager {
-	return s.keyManager
-}
-
-func (s *Ethereum) Logger() ethlogger.LogSystem {
-	return s.logger
-}
-
-func (s *Ethereum) Name() string {
-	return s.net.Name
-}
-
-func (s *Ethereum) ChainManager() *core.ChainManager {
-	return s.chainManager
-}
-
-func (s *Ethereum) BlockProcessor() *core.BlockProcessor {
-	return s.blockProcessor
-}
-
-func (s *Ethereum) TxPool() *core.TxPool {
-	return s.txPool
-}
-
-func (s *Ethereum) BlockPool() *BlockPool {
-	return s.blockPool
-}
-
-func (s *Ethereum) Whisper() *whisper.Whisper {
-	return s.whisper
-}
-
-func (s *Ethereum) EventMux() *event.TypeMux {
-	return s.eventMux
-}
-func (self *Ethereum) Db() ethutil.Database {
-	return self.db
-}
-
-func (s *Ethereum) IsMining() bool {
-	return s.Mining
-}
-
-func (s *Ethereum) IsListening() bool {
-	// XXX TODO
-	return false
-}
-
-func (s *Ethereum) PeerCount() int {
-	return s.net.PeerCount()
-}
-
-func (s *Ethereum) Peers() []*p2p.Peer {
-	return s.net.Peers()
-}
-
-func (s *Ethereum) MaxPeers() int {
-	return s.net.MaxPeers
-}
-
-func (s *Ethereum) Coinbase() []byte {
-	return nil // TODO
-}
+func (s *Ethereum) KeyManager() *crypto.KeyManager       { return s.keyManager }
+func (s *Ethereum) Logger() ethlogger.LogSystem          { return s.logger }
+func (s *Ethereum) Name() string                         { return s.net.Name }
+func (s *Ethereum) ChainManager() *core.ChainManager     { return s.chainManager }
+func (s *Ethereum) BlockProcessor() *core.BlockProcessor { return s.blockProcessor }
+func (s *Ethereum) TxPool() *core.TxPool                 { return s.txPool }
+func (s *Ethereum) BlockPool() *BlockPool                { return s.blockPool }
+func (s *Ethereum) Whisper() *whisper.Whisper            { return s.whisper }
+func (s *Ethereum) EventMux() *event.TypeMux             { return s.eventMux }
+func (s *Ethereum) Db() ethutil.Database                 { return s.db }
+func (s *Ethereum) Miner() *miner.Miner                  { return s.miner }
+func (s *Ethereum) IsListening() bool                    { return true } // Always listening
+func (s *Ethereum) PeerCount() int                       { return s.net.PeerCount() }
+func (s *Ethereum) Peers() []*p2p.Peer                   { return s.net.Peers() }
+func (s *Ethereum) MaxPeers() int                        { return s.net.MaxPeers }
+func (s *Ethereum) Coinbase() []byte                     { return nil } // TODO
 
 // Start the ethereum
 func (s *Ethereum) Start() error {

+ 4 - 4
miner/miner.go

@@ -3,7 +3,7 @@ package miner
 import (
 	"math/big"
 
-	"github.com/ethereum/go-ethereum/eth"
+	"github.com/ethereum/go-ethereum/core"
 	"github.com/ethereum/go-ethereum/logger"
 	"github.com/ethereum/go-ethereum/pow/ezp"
 )
@@ -16,13 +16,13 @@ type Miner struct {
 	MinAcceptedGasPrice *big.Int
 	Extra               string
 
-	coinbase []byte
+	Coinbase []byte
 	mining   bool
 }
 
-func New(coinbase []byte, eth *eth.Ethereum) *Miner {
+func New(coinbase []byte, eth core.Backend) *Miner {
 	miner := &Miner{
-		coinbase: coinbase,
+		Coinbase: coinbase,
 		worker:   newWorker(coinbase, eth),
 	}
 

+ 3 - 4
miner/worker.go

@@ -8,7 +8,6 @@ import (
 
 	"github.com/ethereum/go-ethereum/core"
 	"github.com/ethereum/go-ethereum/core/types"
-	"github.com/ethereum/go-ethereum/eth"
 	"github.com/ethereum/go-ethereum/ethutil"
 	"github.com/ethereum/go-ethereum/event"
 	"github.com/ethereum/go-ethereum/pow"
@@ -25,7 +24,7 @@ type environment struct {
 	uncles       *set.Set
 }
 
-func env(block *types.Block, eth *eth.Ethereum) *environment {
+func env(block *types.Block, eth core.Backend) *environment {
 	state := state.New(block.Root(), eth.Db())
 	env := &environment{
 		totalUsedGas: new(big.Int),
@@ -63,7 +62,7 @@ type worker struct {
 	quit   chan struct{}
 	pow    pow.PoW
 
-	eth      *eth.Ethereum
+	eth      core.Backend
 	chain    *core.ChainManager
 	proc     *core.BlockProcessor
 	coinbase []byte
@@ -73,7 +72,7 @@ type worker struct {
 	mining bool
 }
 
-func newWorker(coinbase []byte, eth *eth.Ethereum) *worker {
+func newWorker(coinbase []byte, eth core.Backend) *worker {
 	return &worker{
 		eth:      eth,
 		mux:      eth.EventMux(),

+ 1 - 1
ui/filter.go

@@ -15,7 +15,7 @@ func fromHex(s string) []byte {
 	return nil
 }
 
-func NewFilterFromMap(object map[string]interface{}, eth core.EthManager) *core.Filter {
+func NewFilterFromMap(object map[string]interface{}, eth core.Backend) *core.Filter {
 	filter := core.NewFilter(eth)
 
 	if object["earliest"] != nil {

+ 1 - 1
ui/qt/filter.go

@@ -6,7 +6,7 @@ import (
 	"github.com/obscuren/qml"
 )
 
-func NewFilterFromMap(object map[string]interface{}, eth core.EthManager) *core.Filter {
+func NewFilterFromMap(object map[string]interface{}, eth core.Backend) *core.Filter {
 	filter := ui.NewFilterFromMap(object, eth)
 
 	if object["topics"] != nil {

+ 9 - 5
xeth/xeth.go

@@ -14,6 +14,7 @@ import (
 	"github.com/ethereum/go-ethereum/ethutil"
 	"github.com/ethereum/go-ethereum/event"
 	"github.com/ethereum/go-ethereum/logger"
+	"github.com/ethereum/go-ethereum/miner"
 	"github.com/ethereum/go-ethereum/p2p"
 	"github.com/ethereum/go-ethereum/state"
 	"github.com/ethereum/go-ethereum/whisper"
@@ -27,13 +28,13 @@ type Backend interface {
 	ChainManager() *core.ChainManager
 	TxPool() *core.TxPool
 	PeerCount() int
-	IsMining() bool
 	IsListening() bool
 	Peers() []*p2p.Peer
 	KeyManager() *crypto.KeyManager
 	Db() ethutil.Database
 	EventMux() *event.TypeMux
 	Whisper() *whisper.Whisper
+	Miner() *miner.Miner
 }
 
 type XEth struct {
@@ -42,6 +43,7 @@ type XEth struct {
 	chainManager   *core.ChainManager
 	state          *State
 	whisper        *Whisper
+	miner          *miner.Miner
 }
 
 func New(eth Backend) *XEth {
@@ -50,15 +52,17 @@ func New(eth Backend) *XEth {
 		blockProcessor: eth.BlockProcessor(),
 		chainManager:   eth.ChainManager(),
 		whisper:        NewWhisper(eth.Whisper()),
+		miner:          eth.Miner(),
 	}
 	xeth.state = NewState(xeth)
 
 	return xeth
 }
 
-func (self *XEth) Backend() Backend  { return self.eth }
-func (self *XEth) State() *State     { return self.state }
-func (self *XEth) Whisper() *Whisper { return self.whisper }
+func (self *XEth) Backend() Backend    { return self.eth }
+func (self *XEth) State() *State       { return self.state }
+func (self *XEth) Whisper() *Whisper   { return self.whisper }
+func (self *XEth) Miner() *miner.Miner { return self.miner }
 
 func (self *XEth) BlockByHash(strHash string) *Block {
 	hash := fromHex(strHash)
@@ -96,7 +100,7 @@ func (self *XEth) PeerCount() int {
 }
 
 func (self *XEth) IsMining() bool {
-	return self.eth.IsMining()
+	return self.miner.Mining()
 }
 
 func (self *XEth) IsListening() bool {