mirror of https://github.com/ethereum/go-ethereum
parent
cb7f2d43b6
commit
4b9b633dfe
@ -0,0 +1,143 @@ |
|||||||
|
package api |
||||||
|
|
||||||
|
import ( |
||||||
|
"github.com/ethereum/ethash" |
||||||
|
"github.com/ethereum/go-ethereum/common" |
||||||
|
"github.com/ethereum/go-ethereum/eth" |
||||||
|
"github.com/ethereum/go-ethereum/rpc/codec" |
||||||
|
"github.com/ethereum/go-ethereum/rpc/shared" |
||||||
|
) |
||||||
|
|
||||||
|
const ( |
||||||
|
MinerVersion = "1.0.0" |
||||||
|
) |
||||||
|
|
||||||
|
var ( |
||||||
|
// mapping between methods and handlers
|
||||||
|
MinerMapping = map[string]minerhandler{ |
||||||
|
"miner_hashrate": (*miner).Hashrate, |
||||||
|
"miner_makeDAG": (*miner).MakeDAG, |
||||||
|
"miner_setExtra": (*miner).SetExtra, |
||||||
|
"miner_setGasPrice": (*miner).SetGasPrice, |
||||||
|
"miner_startAutoDAG": (*miner).StartAutoDAG, |
||||||
|
"miner_start": (*miner).StartMiner, |
||||||
|
"miner_stopAutoDAG": (*miner).StopAutoDAG, |
||||||
|
"miner_stop": (*miner).StopMiner, |
||||||
|
} |
||||||
|
) |
||||||
|
|
||||||
|
// miner callback handler
|
||||||
|
type minerhandler func(*miner, *shared.Request) (interface{}, error) |
||||||
|
|
||||||
|
// miner api provider
|
||||||
|
type miner struct { |
||||||
|
ethereum *eth.Ethereum |
||||||
|
methods map[string]minerhandler |
||||||
|
codec codec.ApiCoder |
||||||
|
} |
||||||
|
|
||||||
|
// create a new miner api instance
|
||||||
|
func NewMinerApi(ethereum *eth.Ethereum, coder codec.Codec) *miner { |
||||||
|
return &miner{ |
||||||
|
ethereum: ethereum, |
||||||
|
methods: MinerMapping, |
||||||
|
codec: coder.New(nil), |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// Execute given request
|
||||||
|
func (self *miner) Execute(req *shared.Request) (interface{}, error) { |
||||||
|
if callback, ok := self.methods[req.Method]; ok { |
||||||
|
return callback(self, req) |
||||||
|
} |
||||||
|
|
||||||
|
return nil, &shared.NotImplementedError{req.Method} |
||||||
|
} |
||||||
|
|
||||||
|
// collection with supported methods
|
||||||
|
func (self *miner) Methods() []string { |
||||||
|
methods := make([]string, len(self.methods)) |
||||||
|
i := 0 |
||||||
|
for k := range self.methods { |
||||||
|
methods[i] = k |
||||||
|
i++ |
||||||
|
} |
||||||
|
return methods |
||||||
|
} |
||||||
|
|
||||||
|
func (self *miner) Name() string { |
||||||
|
return MinerApiName |
||||||
|
} |
||||||
|
|
||||||
|
func (self *miner) StartMiner(req *shared.Request) (interface{}, error) { |
||||||
|
args := new(StartMinerArgs) |
||||||
|
if err := self.codec.Decode(req.Params, &args); err != nil { |
||||||
|
return nil, err |
||||||
|
} |
||||||
|
if args.Threads == -1 { // (not specified by user, use default)
|
||||||
|
args.Threads = self.ethereum.MinerThreads |
||||||
|
} |
||||||
|
|
||||||
|
self.ethereum.StartAutoDAG() |
||||||
|
err := self.ethereum.StartMining(args.Threads) |
||||||
|
if err == nil { |
||||||
|
return true, nil |
||||||
|
} |
||||||
|
|
||||||
|
return false, err |
||||||
|
} |
||||||
|
|
||||||
|
func (self *miner) StopMiner(req *shared.Request) (interface{}, error) { |
||||||
|
self.ethereum.StopMining() |
||||||
|
return true, nil |
||||||
|
} |
||||||
|
|
||||||
|
func (self *miner) Hashrate(req *shared.Request) (interface{}, error) { |
||||||
|
return self.ethereum.Miner().HashRate(), nil |
||||||
|
} |
||||||
|
|
||||||
|
func (self *miner) SetExtra(req *shared.Request) (interface{}, error) { |
||||||
|
args := new(SetExtraArgs) |
||||||
|
if err := self.codec.Decode(req.Params, &args); err != nil { |
||||||
|
return nil, err |
||||||
|
} |
||||||
|
self.ethereum.Miner().SetExtra([]byte(args.Data)) |
||||||
|
return true, nil |
||||||
|
} |
||||||
|
|
||||||
|
func (self *miner) SetGasPrice(req *shared.Request) (interface{}, error) { |
||||||
|
args := new(GasPriceArgs) |
||||||
|
if err := self.codec.Decode(req.Params, &args); err != nil { |
||||||
|
return false, err |
||||||
|
} |
||||||
|
|
||||||
|
self.ethereum.Miner().SetGasPrice(common.String2Big(args.Price)) |
||||||
|
return true, nil |
||||||
|
} |
||||||
|
|
||||||
|
func (self *miner) StartAutoDAG(req *shared.Request) (interface{}, error) { |
||||||
|
self.ethereum.StartAutoDAG() |
||||||
|
return true, nil |
||||||
|
} |
||||||
|
|
||||||
|
func (self *miner) StopAutoDAG(req *shared.Request) (interface{}, error) { |
||||||
|
self.ethereum.StopAutoDAG() |
||||||
|
return true, nil |
||||||
|
} |
||||||
|
|
||||||
|
func (self *miner) MakeDAG(req *shared.Request) (interface{}, error) { |
||||||
|
args := new(MakeDAGArgs) |
||||||
|
if err := self.codec.Decode(req.Params, &args); err != nil { |
||||||
|
return nil, err |
||||||
|
} |
||||||
|
|
||||||
|
if args.BlockNumber < 0 { |
||||||
|
return false, shared.NewValidationError("BlockNumber", "BlockNumber must be positive") |
||||||
|
} |
||||||
|
|
||||||
|
err := ethash.MakeDAG(uint64(args.BlockNumber), "") |
||||||
|
if err == nil { |
||||||
|
return true, nil |
||||||
|
} |
||||||
|
return false, err |
||||||
|
} |
@ -0,0 +1,93 @@ |
|||||||
|
package api |
||||||
|
|
||||||
|
import ( |
||||||
|
"encoding/json" |
||||||
|
|
||||||
|
"math/big" |
||||||
|
|
||||||
|
"github.com/ethereum/go-ethereum/rpc/shared" |
||||||
|
) |
||||||
|
|
||||||
|
type StartMinerArgs struct { |
||||||
|
Threads int |
||||||
|
} |
||||||
|
|
||||||
|
func (args *StartMinerArgs) UnmarshalJSON(b []byte) (err error) { |
||||||
|
var obj []interface{} |
||||||
|
if err := json.Unmarshal(b, &obj); err != nil { |
||||||
|
return shared.NewDecodeParamError(err.Error()) |
||||||
|
} |
||||||
|
|
||||||
|
if len(obj) == 0 || obj[0] == nil { |
||||||
|
args.Threads = -1 |
||||||
|
return nil |
||||||
|
} |
||||||
|
|
||||||
|
var num *big.Int |
||||||
|
if num, err = numString(obj[0]); err != nil { |
||||||
|
return err |
||||||
|
} |
||||||
|
args.Threads = int(num.Int64()) |
||||||
|
return nil |
||||||
|
} |
||||||
|
|
||||||
|
type SetExtraArgs struct { |
||||||
|
Data string |
||||||
|
} |
||||||
|
|
||||||
|
func (args *SetExtraArgs) UnmarshalJSON(b []byte) (err error) { |
||||||
|
var obj []interface{} |
||||||
|
if err := json.Unmarshal(b, &obj); err != nil { |
||||||
|
return shared.NewDecodeParamError(err.Error()) |
||||||
|
} |
||||||
|
|
||||||
|
extrastr, ok := obj[0].(string) |
||||||
|
if !ok { |
||||||
|
return shared.NewInvalidTypeError("Price", "not a string") |
||||||
|
} |
||||||
|
args.Data = extrastr |
||||||
|
|
||||||
|
return nil |
||||||
|
} |
||||||
|
|
||||||
|
type GasPriceArgs struct { |
||||||
|
Price string |
||||||
|
} |
||||||
|
|
||||||
|
func (args *GasPriceArgs) UnmarshalJSON(b []byte) (err error) { |
||||||
|
var obj []interface{} |
||||||
|
if err := json.Unmarshal(b, &obj); err != nil { |
||||||
|
return shared.NewDecodeParamError(err.Error()) |
||||||
|
} |
||||||
|
|
||||||
|
pricestr, ok := obj[0].(string) |
||||||
|
if !ok { |
||||||
|
return shared.NewInvalidTypeError("Price", "not a string") |
||||||
|
} |
||||||
|
args.Price = pricestr |
||||||
|
|
||||||
|
return nil |
||||||
|
} |
||||||
|
|
||||||
|
type MakeDAGArgs struct { |
||||||
|
BlockNumber int64 |
||||||
|
} |
||||||
|
|
||||||
|
func (args *MakeDAGArgs) UnmarshalJSON(b []byte) (err error) { |
||||||
|
args.BlockNumber = -1 |
||||||
|
var obj []interface{} |
||||||
|
|
||||||
|
if err := json.Unmarshal(b, &obj); err != nil { |
||||||
|
return shared.NewDecodeParamError(err.Error()) |
||||||
|
} |
||||||
|
|
||||||
|
if len(obj) < 1 { |
||||||
|
return shared.NewInsufficientParamsError(len(obj), 1) |
||||||
|
} |
||||||
|
|
||||||
|
if err := blockHeight(obj[0], &args.BlockNumber); err != nil { |
||||||
|
return err |
||||||
|
} |
||||||
|
|
||||||
|
return nil |
||||||
|
} |
@ -0,0 +1,74 @@ |
|||||||
|
package api |
||||||
|
|
||||||
|
const Miner_JS = ` |
||||||
|
web3.extend({ |
||||||
|
property: 'miner', |
||||||
|
methods: |
||||||
|
[ |
||||||
|
new web3.extend.Method({ |
||||||
|
name: 'start', |
||||||
|
call: 'miner_start', |
||||||
|
params: 1, |
||||||
|
inputFormatter: [web3.extend.formatters.formatInputInt], |
||||||
|
outputFormatter: web3.extend.formatters.formatOutputBool |
||||||
|
}), |
||||||
|
new web3.extend.Method({ |
||||||
|
name: 'stop', |
||||||
|
call: 'miner_stop', |
||||||
|
params: 1, |
||||||
|
inputFormatter: [web3.extend.formatters.formatInputInt], |
||||||
|
outputFormatter: web3.extend.formatters.formatOutputBool |
||||||
|
}), |
||||||
|
new web3.extend.Method({ |
||||||
|
name: 'getHashrate', |
||||||
|
call: 'miner_hashrate', |
||||||
|
params: 0, |
||||||
|
inputFormatter: [], |
||||||
|
outputFormatter: web3.extend.utils.toDecimal |
||||||
|
}), |
||||||
|
new web3.extend.Method({ |
||||||
|
name: 'setExtra', |
||||||
|
call: 'miner_setExtra', |
||||||
|
params: 1, |
||||||
|
inputFormatter: [web3.extend.utils.formatInputString], |
||||||
|
outputFormatter: web3.extend.formatters.formatOutputBool |
||||||
|
}), |
||||||
|
new web3.extend.Method({ |
||||||
|
name: 'setGasPrice', |
||||||
|
call: 'miner_setGasPrice', |
||||||
|
params: 1, |
||||||
|
inputFormatter: [web3.extend.utils.formatInputString], |
||||||
|
outputFormatter: web3.extend.formatters.formatOutputBool |
||||||
|
}), |
||||||
|
new web3.extend.Method({ |
||||||
|
name: 'startAutoDAG', |
||||||
|
call: 'miner_startAutoDAG', |
||||||
|
params: 0, |
||||||
|
inputFormatter: [], |
||||||
|
outputFormatter: web3.extend.formatters.formatOutputBool |
||||||
|
}), |
||||||
|
new web3.extend.Method({ |
||||||
|
name: 'stopAutoDAG', |
||||||
|
call: 'miner_stopAutoDAG', |
||||||
|
params: 0, |
||||||
|
inputFormatter: [], |
||||||
|
outputFormatter: web3.extend.formatters.formatOutputBool |
||||||
|
}), |
||||||
|
new web3.extend.Method({ |
||||||
|
name: 'makeDAG', |
||||||
|
call: 'miner_makeDAG', |
||||||
|
params: 1, |
||||||
|
inputFormatter: [web3.extend.formatters.inputDefaultBlockNumberFormatter], |
||||||
|
outputFormatter: web3.extend.formatters.formatOutputBool |
||||||
|
}) |
||||||
|
], |
||||||
|
properties: |
||||||
|
[ |
||||||
|
new web3.extend.Property({ |
||||||
|
name: 'hashrate', |
||||||
|
getter: 'miner_hashrate', |
||||||
|
outputFormatter: web3.extend.utils.toDecimal |
||||||
|
}) |
||||||
|
] |
||||||
|
}); |
||||||
|
` |
Loading…
Reference in new issue