arnaucube
arnaucube/slowlorisdbPublic Self-hosted repository
slowlorisdb/core/blockchain.go
core/blockchain.goRaw
 1package core
 2
 3import (
 4	"errors"
 5	"time"
 6
 7	"github.com/arnaucube/slowlorisdb/db"
 8)
 9
10type Blockchain struct {
11	Id        []byte // Id allows to have multiple blockchains
12	Genesis   Hash
13	LastBlock *Block
14	db        *db.Db
15}
16
17func NewBlockchain(database *db.Db) *Blockchain {
18	blockchain := &Blockchain{
19		Id:        []byte{},
20		Genesis:   Hash{},
21		LastBlock: &Block{},
22		db:        database,
23	}
24	return blockchain
25}
26
27func (bc *Blockchain) NewBlock(txs []Tx) *Block {
28	block := &Block{
29		Height:    bc.GetHeight() + 1,
30		PrevHash:  bc.LastBlock.Hash,
31		Txs:       txs,
32		Miner:     Address{}, // TODO put the node address
33		Timestamp: time.Now(),
34		Nonce:     0,
35		Hash:      Hash{},
36		Signature: []byte{},
37	}
38	return block
39}
40
41func (bc *Blockchain) GetHeight() uint64 {
42	return bc.LastBlock.Height
43}
44
45func (bc *Blockchain) GetLastBlock() *Block {
46	return bc.LastBlock
47}
48
49func (bc *Blockchain) AddBlock(block *Block) error {
50	bc.LastBlock = block
51	err := bc.db.Put(block.Hash[:], block.Bytes())
52	return err
53}
54
55func (bc *Blockchain) GetBlock(hash Hash) (*Block, error) {
56	v, err := bc.db.Get(hash[:])
57	if err != nil {
58		return nil, err
59	}
60	block, err := BlockFromBytes(v)
61	if err != nil {
62		return nil, err
63	}
64	return block, nil
65}
66
67func (bc *Blockchain) GetPrevBlock(hash Hash) (*Block, error) {
68	currentBlock, err := bc.GetBlock(hash)
69	if err != nil {
70		return nil, err
71	}
72	if currentBlock.PrevHash.IsZero() {
73		return nil, errors.New("This was the oldest block")
74	}
75	prevBlock, err := bc.GetBlock(currentBlock.PrevHash)
76	if err != nil {
77		return nil, err
78	}
79
80	return prevBlock, nil
81}