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	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 BlockFromBytes(b []byte) (*Block, error) {
71	var block *Block
72	err := json.Unmarshal(b, &block)
73	return block, err
74}