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