miner.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. package api
  2. import (
  3. "github.com/ethereum/ethash"
  4. "github.com/ethereum/go-ethereum/common"
  5. "github.com/ethereum/go-ethereum/eth"
  6. "github.com/ethereum/go-ethereum/rpc/codec"
  7. "github.com/ethereum/go-ethereum/rpc/shared"
  8. )
  9. const (
  10. MinerApiVersion = "1.0"
  11. )
  12. var (
  13. // mapping between methods and handlers
  14. MinerMapping = map[string]minerhandler{
  15. "miner_hashrate": (*minerApi).Hashrate,
  16. "miner_makeDAG": (*minerApi).MakeDAG,
  17. "miner_setExtra": (*minerApi).SetExtra,
  18. "miner_setGasPrice": (*minerApi).SetGasPrice,
  19. "miner_setEtherbase": (*minerApi).SetEtherbase,
  20. "miner_startAutoDAG": (*minerApi).StartAutoDAG,
  21. "miner_start": (*minerApi).StartMiner,
  22. "miner_stopAutoDAG": (*minerApi).StopAutoDAG,
  23. "miner_stop": (*minerApi).StopMiner,
  24. }
  25. )
  26. // miner callback handler
  27. type minerhandler func(*minerApi, *shared.Request) (interface{}, error)
  28. // miner api provider
  29. type minerApi struct {
  30. ethereum *eth.Ethereum
  31. methods map[string]minerhandler
  32. codec codec.ApiCoder
  33. }
  34. // create a new miner api instance
  35. func NewMinerApi(ethereum *eth.Ethereum, coder codec.Codec) *minerApi {
  36. return &minerApi{
  37. ethereum: ethereum,
  38. methods: MinerMapping,
  39. codec: coder.New(nil),
  40. }
  41. }
  42. // Execute given request
  43. func (self *minerApi) Execute(req *shared.Request) (interface{}, error) {
  44. if callback, ok := self.methods[req.Method]; ok {
  45. return callback(self, req)
  46. }
  47. return nil, &shared.NotImplementedError{req.Method}
  48. }
  49. // collection with supported methods
  50. func (self *minerApi) Methods() []string {
  51. methods := make([]string, len(self.methods))
  52. i := 0
  53. for k := range self.methods {
  54. methods[i] = k
  55. i++
  56. }
  57. return methods
  58. }
  59. func (self *minerApi) Name() string {
  60. return shared.MinerApiName
  61. }
  62. func (self *minerApi) ApiVersion() string {
  63. return MinerApiVersion
  64. }
  65. func (self *minerApi) StartMiner(req *shared.Request) (interface{}, error) {
  66. args := new(StartMinerArgs)
  67. if err := self.codec.Decode(req.Params, &args); err != nil {
  68. return nil, err
  69. }
  70. if args.Threads == -1 { // (not specified by user, use default)
  71. args.Threads = self.ethereum.MinerThreads
  72. }
  73. self.ethereum.StartAutoDAG()
  74. err := self.ethereum.StartMining(args.Threads)
  75. if err == nil {
  76. return true, nil
  77. }
  78. return false, err
  79. }
  80. func (self *minerApi) StopMiner(req *shared.Request) (interface{}, error) {
  81. self.ethereum.StopMining()
  82. return true, nil
  83. }
  84. func (self *minerApi) Hashrate(req *shared.Request) (interface{}, error) {
  85. return self.ethereum.Miner().HashRate(), nil
  86. }
  87. func (self *minerApi) SetExtra(req *shared.Request) (interface{}, error) {
  88. args := new(SetExtraArgs)
  89. if err := self.codec.Decode(req.Params, &args); err != nil {
  90. return nil, err
  91. }
  92. self.ethereum.Miner().SetExtra([]byte(args.Data))
  93. return true, nil
  94. }
  95. func (self *minerApi) SetGasPrice(req *shared.Request) (interface{}, error) {
  96. args := new(GasPriceArgs)
  97. if err := self.codec.Decode(req.Params, &args); err != nil {
  98. return false, err
  99. }
  100. self.ethereum.Miner().SetGasPrice(common.String2Big(args.Price))
  101. return true, nil
  102. }
  103. func (self *minerApi) SetEtherbase(req *shared.Request) (interface{}, error) {
  104. args := new(SetEtherbaseArgs)
  105. if err := self.codec.Decode(req.Params, &args); err != nil {
  106. return false, err
  107. }
  108. self.ethereum.SetEtherbase(args.Etherbase)
  109. return nil, nil
  110. }
  111. func (self *minerApi) StartAutoDAG(req *shared.Request) (interface{}, error) {
  112. self.ethereum.StartAutoDAG()
  113. return true, nil
  114. }
  115. func (self *minerApi) StopAutoDAG(req *shared.Request) (interface{}, error) {
  116. self.ethereum.StopAutoDAG()
  117. return true, nil
  118. }
  119. func (self *minerApi) MakeDAG(req *shared.Request) (interface{}, error) {
  120. args := new(MakeDAGArgs)
  121. if err := self.codec.Decode(req.Params, &args); err != nil {
  122. return nil, err
  123. }
  124. if args.BlockNumber < 0 {
  125. return false, shared.NewValidationError("BlockNumber", "BlockNumber must be positive")
  126. }
  127. err := ethash.MakeDAG(uint64(args.BlockNumber), "")
  128. if err == nil {
  129. return true, nil
  130. }
  131. return false, err
  132. }