arnaucube
arnaucube/slowlorisdbPublic Self-hosted repository
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}