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