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