OSDN Git Service

Merge branch 'dev' into dev-gas
[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 // SubmitWorkReq used to submitWork req
20 type SubmitWorkReq struct {
21         BlockHeader *types.BlockHeader `json:"block_header"`
22 }
23
24 func (a *API) submitWork(ctx context.Context, req *SubmitWorkReq) Response {
25         if err := a.SubmitWork(req.BlockHeader); err != nil {
26                 return NewErrorResponse(err)
27         }
28         return NewSuccessResponse(true)
29 }
30
31 // GetWorkResp is resp struct for API
32 type GetWorkResp struct {
33         BlockHeader *types.BlockHeader `json:"block_header"`
34         Seed        *bc.Hash           `json:"seed"`
35 }
36
37 // GetWork get work
38 func (a *API) GetWork() (*GetWorkResp, error) {
39         bh, err := a.miningPool.GetWork()
40         if err != nil {
41                 return nil, err
42         }
43
44         seed, err := a.chain.CalcNextSeed(&bh.PreviousBlockHash)
45         if err != nil {
46                 return nil, err
47         }
48
49         return &GetWorkResp{
50                 BlockHeader: bh,
51                 Seed:        seed,
52         }, nil
53 }
54
55 // SubmitWork submit work
56 func (a *API) SubmitWork(bh *types.BlockHeader) error {
57         return a.miningPool.SubmitWork(bh)
58 }
59
60 func (a *API) setMining(in struct {
61         IsMining bool `json:"is_mining"`
62 }) Response {
63         if in.IsMining {
64                 return a.startMining()
65         }
66         return a.stopMining()
67 }
68
69 func (a *API) startMining() Response {
70         a.cpuMiner.Start()
71         if !a.IsMining() {
72                 return NewErrorResponse(errors.New("Failed to start mining"))
73         }
74         return NewSuccessResponse("")
75 }
76
77 func (a *API) stopMining() Response {
78         a.cpuMiner.Stop()
79         if a.IsMining() {
80                 return NewErrorResponse(errors.New("Failed to stop mining"))
81         }
82         return NewSuccessResponse("")
83 }