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}