slowlorisdb/core/block.go
core/block.goRaw
1package core
2
3import (
4 "crypto/ecdsa"
5 "encoding/json"
6 "time"
7)
8
9type Input struct {
10}
11type Output struct {
12}
13
14// Tx holds the data structure of a transaction
15type Tx struct {
16 From Address
17 To Address
18 InputCount uint64
19 Inputs []Input
20 Outputs []Output
21}
22
23func NewTx(from, to Address, in []Input, out []Output) *Tx {
24 tx := &Tx{
25 From: from,
26 To: to,
27 InputCount: uint64(len(in)),
28 Inputs: in,
29 Outputs: out,
30 }
31 return tx
32}
33
34// Block holds the data structure for the block
35type Block struct {
36 Height uint64
37 PrevHash Hash
38 NextHash Hash
39 Txs []Tx
40 Miner Address
41 Timestamp time.Time
42 Nonce uint64
43 Hash Hash
44 Signature []byte
45}
46
47func (block Block) Copy() *Block {
48 return &Block{
49 Height: block.Height,
50 PrevHash: block.PrevHash,
51 NextHash: block.NextHash,
52 Txs: block.Txs,
53 Miner: block.Miner,
54 Timestamp: block.Timestamp,
55 Nonce: block.Nonce,
56 Hash: block.Hash,
57 Signature: block.Signature,
58 }
59}
60
61// Bytes outputs a byte array containing the data of the Block
62func (blk Block) Bytes() []byte {
63 b, _ := json.Marshal(blk)
64 return b
65}
66
67func (blk *Block) GetNonce() uint64 {
68 return blk.Nonce
69}
70
71func (blk *Block) IncrementNonce() {
72 blk.Nonce++
73}
74func (block *Block) CalculatePoW(difficulty uint64) error {
75 blockCopy := block.Copy()
76 blockCopy.Hash = Hash{}
77
78 hash := HashBytes(blockCopy.Bytes())
79 for !CheckPoW(hash, difficulty) {
80 blockCopy.IncrementNonce()
81 hash = HashBytes(blockCopy.Bytes())
82 }
83 block.Hash = hash
84 block.Nonce = blockCopy.Nonce
85 return nil
86}
87
88func CheckBlockPoW(block *Block, difficulty uint64) bool {
89 blockCopy := block.Copy()
90 blockCopy.Hash = Hash{}
91 blockCopy.Signature = []byte{}
92 return CheckPoW(HashBytes(blockCopy.Bytes()), difficulty)
93}
94
95func VerifyBlockSignature(pubK *ecdsa.PublicKey, block *Block) bool {
96 sig, err := SignatureFromBytes(block.Signature)
97 if err != nil {
98 return false
99 }
100
101 return VerifySignature(pubK, block.Hash[:], *sig)
102}
103
104func BlockFromBytes(b []byte) (*Block, error) {
105 var block *Block
106 err := json.Unmarshal(b, &block)
107 return block, err
108}