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}