slowlorisdb/core/block.go
core/block.goRaw
1package core
2
3import (
4 "crypto/ecdsa"
5 "encoding/json"
6 "fmt"
7 "time"
8)
9
10// Block holds the data structure for the block
11type Block struct {
12 Height uint64
13 PrevHash Hash
14 Txs []Tx
15 Miner Address
16 MinerPubK *ecdsa.PublicKey // tmp meanwhile no ecrecover function
17 Timestamp time.Time
18 Nonce uint64
19 Hash Hash
20 Signature []byte
21}
22
23// for testing
24func (block Block) Print() {
25 fmt.Println("height", block.Height)
26 fmt.Println("hash", block.Hash.String())
27 fmt.Println("PrevHash", block.PrevHash.String())
28 fmt.Println("timestamp", block.Timestamp.String())
29 fmt.Println("signature", block.Signature)
30}
31
32func (block Block) Copy() *Block {
33 return &Block{
34 Height: block.Height,
35 PrevHash: block.PrevHash,
36 Txs: block.Txs,
37 Miner: block.Miner,
38 MinerPubK: block.MinerPubK,
39 Timestamp: block.Timestamp,
40 Nonce: block.Nonce,
41 Hash: block.Hash,
42 Signature: block.Signature,
43 }
44}
45
46// Bytes outputs a byte array containing the data of the Block
47func (blk Block) Bytes() []byte {
48 // TODO add parser, to use minimum amount of bytes
49 b, _ := json.Marshal(blk)
50 return b
51}
52
53func (block *Block) CalculateHash() {
54 blockCopy := block.Copy()
55 blockCopy.Hash = Hash{}
56 blockCopy.Signature = []byte{}
57 hash := HashBytes(blockCopy.Bytes())
58 block.Hash = hash
59}
60
61func (blk *Block) GetNonce() uint64 {
62 return blk.Nonce
63}
64
65func (blk *Block) IncrementNonce() {
66 blk.Nonce++
67}
68func (block *Block) CalculatePoW(difficulty uint64) error {
69 blockCopy := block.Copy()
70 blockCopy.Hash = Hash{}
71
72 hash := HashBytes(blockCopy.Bytes())
73 for !CheckPoW(hash, difficulty) {
74 blockCopy.IncrementNonce()
75 hash = HashBytes(blockCopy.Bytes())
76 }
77 block.Hash = hash
78 block.Nonce = blockCopy.Nonce
79 return nil
80}
81
82func CheckBlockPoW(block *Block, difficulty uint64) bool {
83 blockCopy := block.Copy()
84 blockCopy.Hash = Hash{}
85 blockCopy.Signature = []byte{}
86 return CheckPoW(HashBytes(blockCopy.Bytes()), difficulty)
87}
88
89func BlockFromBytes(b []byte) (*Block, error) {
90 var block *Block
91 err := json.Unmarshal(b, &block)
92 return block, err
93}