OSDN Git Service

2f65a106fe7e58cb04fbee057f813c3a3bc08cb5
[bytom/bytom-spv.git] / cmd / miner / main.go
1 package main
2
3 import (
4         "encoding/json"
5         "fmt"
6         "os"
7
8         "github.com/bytom/api"
9         "github.com/bytom/consensus/difficulty"
10         "github.com/bytom/protocol/bc"
11         "github.com/bytom/protocol/bc/types"
12         "github.com/bytom/util"
13 )
14
15 const (
16         maxNonce = ^uint64(0) // 2^32 - 1
17 )
18
19 // do proof of work
20 func doWork(bh *types.BlockHeader, seed *bc.Hash) bool {
21         for i := uint64(0); i <= maxNonce; i++ {
22                 bh.Nonce = i
23                 headerHash := bh.Hash()
24                 if difficulty.CheckProofOfWork(&headerHash, seed, bh.Bits) {
25                         fmt.Printf("Mining: successful-----proof hash:%v\n", headerHash.String())
26                         return true
27                 }
28         }
29         return false
30 }
31
32 func getBlockHeaderByHeight(height uint64) {
33         type Req struct {
34                 BlockHeight uint64 `json:"block_height"`
35         }
36
37         type Resp struct {
38                 BlockHeader *types.BlockHeader `json:"block_header"`
39                 Reward      uint64             `json:"reward"`
40         }
41
42         data, _ := util.ClientCall("/get-block-header-by-height", Req{BlockHeight: height})
43         rawData, err := json.Marshal(data)
44         if err != nil {
45                 fmt.Println(err)
46                 os.Exit(1)
47         }
48
49         resp := &Resp{}
50         if err = json.Unmarshal(rawData, resp); err != nil {
51                 fmt.Println(err)
52                 os.Exit(1)
53         }
54         fmt.Println(resp.Reward)
55 }
56
57 func main() {
58         data, _ := util.ClientCall("/getwork", nil)
59         rawData, err := json.Marshal(data)
60         if err != nil {
61                 fmt.Println(err)
62                 os.Exit(1)
63         }
64         resp := &api.GetWorkResp{}
65         if err = json.Unmarshal(rawData, resp); err != nil {
66                 fmt.Println(err)
67                 os.Exit(1)
68         }
69
70         if doWork(resp.BlockHeader, resp.Seed) {
71                 util.ClientCall("/submitwork", resp.BlockHeader)
72         }
73
74         getBlockHeaderByHeight(resp.BlockHeader.Height)
75 }