miner.go 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. package miner
  2. import (
  3. "math/big"
  4. "github.com/ethereum/ethash"
  5. "github.com/ethereum/go-ethereum/common"
  6. "github.com/ethereum/go-ethereum/core"
  7. "github.com/ethereum/go-ethereum/core/state"
  8. "github.com/ethereum/go-ethereum/core/types"
  9. "github.com/ethereum/go-ethereum/pow"
  10. )
  11. type Miner struct {
  12. worker *worker
  13. MinAcceptedGasPrice *big.Int
  14. threads int
  15. mining bool
  16. eth core.Backend
  17. pow pow.PoW
  18. }
  19. func New(eth core.Backend, pow pow.PoW, minerThreads int) *Miner {
  20. // note: minerThreads is currently ignored because
  21. // ethash is not thread safe.
  22. miner := &Miner{eth: eth, pow: pow, worker: newWorker(common.Address{}, eth)}
  23. for i := 0; i < minerThreads; i++ {
  24. miner.worker.register(NewCpuMiner(i, pow))
  25. }
  26. miner.threads = minerThreads
  27. return miner
  28. }
  29. func (self *Miner) Mining() bool {
  30. return self.mining
  31. }
  32. func (self *Miner) Start(coinbase common.Address) {
  33. self.mining = true
  34. self.worker.coinbase = coinbase
  35. if self.threads > 0 {
  36. self.pow.(*ethash.Ethash).UpdateDAG()
  37. }
  38. self.worker.start()
  39. self.worker.commitNewWork()
  40. }
  41. func (self *Miner) Register(agent Agent) {
  42. if self.mining {
  43. agent.Start()
  44. }
  45. self.worker.register(agent)
  46. }
  47. func (self *Miner) Stop() {
  48. self.mining = false
  49. self.worker.stop()
  50. }
  51. func (self *Miner) HashRate() int64 {
  52. return self.worker.HashRate()
  53. }
  54. func (self *Miner) SetExtra(extra []byte) {
  55. self.worker.extra = extra
  56. }
  57. func (self *Miner) PendingState() *state.StateDB {
  58. return self.worker.pendingState()
  59. }
  60. func (self *Miner) PendingBlock() *types.Block {
  61. return self.worker.pendingBlock()
  62. }