OSDN Git Service

Optimized mining api (#585)
[bytom/bytom.git] / api / miner.go
1 package api
2
3 import (
4         "context"
5
6         "github.com/bytom/errors"
7         "github.com/bytom/protocol/bc"
8         "github.com/bytom/protocol/bc/types"
9 )
10
11 func (a *API) getWork() Response {
12         work, err := a.GetWork()
13         if err != nil {
14                 return NewErrorResponse(err)
15         }
16         return NewSuccessResponse(work)
17 }
18
19 type SubmitWorkReq struct {
20         BlockHeader *types.BlockHeader `json:"block_header"`
21 }
22
23 func (a *API) submitWork(ctx context.Context, req *SubmitWorkReq) Response {
24         if err := a.SubmitWork(req.BlockHeader); err != nil {
25                 return NewErrorResponse(err)
26         }
27         return NewSuccessResponse(true)
28 }
29
30 func (a *API) getBlockHeaderByHeight(ctx context.Context, req struct {
31         Height uint64 `json:"block_height"`
32 }) Response {
33         block, err := a.chain.GetBlockByHeight(req.Height)
34         if err != nil {
35                 return NewErrorResponse(err)
36         }
37
38         resp := &BlockHeaderByHeight{
39                 BlockHeader: &block.BlockHeader,
40                 Reward:      block.Transactions[0].Outputs[0].Amount,
41         }
42         return NewSuccessResponse(resp)
43 }
44
45 // GetWorkResp is resp struct for API
46 type GetWorkResp struct {
47         BlockHeader *types.BlockHeader `json:"block_header"`
48         Seed        *bc.Hash           `json:"seed"`
49 }
50
51 func (a *API) GetWork() (*GetWorkResp, error) {
52         bh, err := a.miningPool.GetWork()
53         if err != nil {
54                 return nil, err
55         }
56
57         seed, err := a.chain.CalcNextSeed(&bh.PreviousBlockHash)
58         if err != nil {
59                 return nil, err
60         }
61
62         return &GetWorkResp{
63                 BlockHeader: bh,
64                 Seed:        seed,
65         }, nil
66 }
67
68 func (a *API) SubmitWork(bh *types.BlockHeader) error {
69         return a.miningPool.SubmitWork(bh)
70 }
71
72 func (a *API) setMining(in struct {
73         IsMining bool `json:"is_mining"`
74 }) Response {
75         if in.IsMining {
76                 return a.startMining()
77         }
78         return a.stopMining()
79 }
80
81 func (a *API) startMining() Response {
82         a.cpuMiner.Start()
83         if !a.IsMining() {
84                 return NewErrorResponse(errors.New("Failed to start mining"))
85         }
86         return NewSuccessResponse("")
87 }
88
89 func (a *API) stopMining() Response {
90         a.cpuMiner.Stop()
91         if a.IsMining() {
92                 return NewErrorResponse(errors.New("Failed to stop mining"))
93         }
94         return NewSuccessResponse("")
95 }