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 NextHash Hash
14 Txs []Tx
15 Miner Address
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 NextHash: block.NextHash,
27 Txs: block.Txs,
28 Miner: block.Miner,
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 b, _ := json.Marshal(blk)
39 return b
40}
41
42func (blk *Block) GetNonce() uint64 {
43 return blk.Nonce
44}
45
46func (blk *Block) IncrementNonce() {
47 blk.Nonce++
48}
49func (block *Block) CalculatePoW(difficulty uint64) error {
50 blockCopy := block.Copy()
51 blockCopy.Hash = Hash{}
52
53 hash := HashBytes(blockCopy.Bytes())
54 for !CheckPoW(hash, difficulty) {
55 blockCopy.IncrementNonce()
56 hash = HashBytes(blockCopy.Bytes())
57 }
58 block.Hash = hash
59 block.Nonce = blockCopy.Nonce
60 return nil
61}
62
63func CheckBlockPoW(block *Block, difficulty uint64) bool {
64 blockCopy := block.Copy()
65 blockCopy.Hash = Hash{}
66 blockCopy.Signature = []byte{}
67 return CheckPoW(HashBytes(blockCopy.Bytes()), difficulty)
68}
69
70func VerifyBlockSignature(pubK *ecdsa.PublicKey, block *Block) bool {
71 sig, err := SignatureFromBytes(block.Signature)
72 if err != nil {
73 return false
74 }
75
76 return VerifySignature(pubK, block.Hash[:], *sig)
77}
78
79func BlockFromBytes(b []byte) (*Block, error) {
80 var block *Block
81 err := json.Unmarshal(b, &block)
82 return block, err
83}