6 chainjson "github.com/bytom/encoding/json"
7 "github.com/bytom/errors"
8 "github.com/bytom/protocol/bc"
9 "github.com/bytom/protocol/bc/types"
12 // BlockHeaderJSON struct provides support for get work in json format, when it also follows
13 // BlockHeader structure
14 type BlockHeaderJSON struct {
15 Version uint64 `json:"version"` // The version of the block.
16 Height uint64 `json:"height"` // The height of the block.
17 PreviousBlockHash bc.Hash `json:"previous_block_hash"` // The hash of the previous block.
18 Timestamp uint64 `json:"timestamp"` // The time of the block in seconds.
19 Nonce uint64 `json:"nonce"` // Nonce used to generate the block.
20 Bits uint64 `json:"bits"` // Difficulty target for the block.
21 BlockCommitment *types.BlockCommitment `json:"block_commitment"` //Block commitment
24 type CoinbaseArbitrary struct {
25 Arbitrary chainjson.HexBytes `json:"arbitrary"`
28 func (a *API) getCoinbaseArbitrary() Response {
29 arbitrary := a.wallet.AccountMgr.GetCoinbaseArbitrary()
30 resp := &CoinbaseArbitrary{
33 return NewSuccessResponse(resp)
36 func (a *API) setCoinbaseArbitrary(ctx context.Context, req CoinbaseArbitrary) Response {
37 a.wallet.AccountMgr.SetCoinbaseArbitrary(req.Arbitrary)
38 return a.getCoinbaseArbitrary()
41 // getWork gets work in compressed protobuf format
42 func (a *API) getWork() Response {
43 work, err := a.GetWork()
45 return NewErrorResponse(err)
47 return NewSuccessResponse(work)
50 // getWorkJSON gets work in json format
51 func (a *API) getWorkJSON() Response {
52 work, err := a.GetWorkJSON()
54 return NewErrorResponse(err)
56 return NewSuccessResponse(work)
59 // SubmitWorkJSONReq is req struct for submit-work API
60 type SubmitWorkReq struct {
61 BlockHeader *types.BlockHeader `json:"block_header"`
64 // submitWork submits work in compressed protobuf format
65 func (a *API) submitWork(ctx context.Context, req *SubmitWorkReq) Response {
66 if err := a.SubmitWork(req.BlockHeader); err != nil {
67 return NewErrorResponse(err)
69 return NewSuccessResponse(true)
72 // SubmitWorkJSONReq is req struct for submit-work-json API
73 type SubmitWorkJSONReq struct {
74 BlockHeader *BlockHeaderJSON `json:"block_header"`
77 // submitWorkJSON submits work in json format
78 func (a *API) submitWorkJSON(ctx context.Context, req *SubmitWorkJSONReq) Response {
79 bh := &types.BlockHeader{
80 Version: req.BlockHeader.Version,
81 Height: req.BlockHeader.Height,
82 PreviousBlockHash: req.BlockHeader.PreviousBlockHash,
83 Timestamp: req.BlockHeader.Timestamp,
84 Nonce: req.BlockHeader.Nonce,
85 Bits: req.BlockHeader.Bits,
86 BlockCommitment: *req.BlockHeader.BlockCommitment,
89 if err := a.SubmitWork(bh); err != nil {
90 return NewErrorResponse(err)
92 return NewSuccessResponse(true)
95 // GetWorkResp is resp struct for get-work API
96 type GetWorkResp struct {
97 BlockHeader *types.BlockHeader `json:"block_header"`
98 Seed *bc.Hash `json:"seed"`
101 // GetWork gets work in compressed protobuf format
102 func (a *API) GetWork() (*GetWorkResp, error) {
103 bh, err := a.miningPool.GetWork()
108 seed, err := a.chain.CalcNextSeed(&bh.PreviousBlockHash)
119 // GetWorkJSONResp is resp struct for get-work-json API
120 type GetWorkJSONResp struct {
121 BlockHeader *BlockHeaderJSON `json:"block_header"`
122 Seed *bc.Hash `json:"seed"`
125 // GetWorkJSON gets work in json format
126 func (a *API) GetWorkJSON() (*GetWorkJSONResp, error) {
127 bh, err := a.miningPool.GetWork()
132 seed, err := a.chain.CalcNextSeed(&bh.PreviousBlockHash)
137 return &GetWorkJSONResp{
138 BlockHeader: &BlockHeaderJSON{
141 PreviousBlockHash: bh.PreviousBlockHash,
142 Timestamp: bh.Timestamp,
145 BlockCommitment: &bh.BlockCommitment,
151 // SubmitWork tries to submit work to the chain
152 func (a *API) SubmitWork(bh *types.BlockHeader) error {
153 return a.miningPool.SubmitWork(bh)
156 func (a *API) setMining(in struct {
157 IsMining bool `json:"is_mining"`
160 if _, err := a.wallet.AccountMgr.GetMiningAddress(); err != nil {
161 return NewErrorResponse(errors.New("Mining address does not exist"))
163 return a.startMining()
165 return a.stopMining()
168 func (a *API) startMining() Response {
171 return NewErrorResponse(errors.New("Failed to start mining"))
173 return NewSuccessResponse("")
176 func (a *API) stopMining() Response {
179 return NewErrorResponse(errors.New("Failed to stop mining"))
181 return NewSuccessResponse("")