Skip to content

Commit 6d241b6

Browse files
committed
refactor client storage
1 parent f1d85fc commit 6d241b6

File tree

7 files changed

+101
-81
lines changed

7 files changed

+101
-81
lines changed

cli/rest.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,11 @@ func GetRestCommand() cli.Command {
1111
Name: "rest",
1212
Usage: "start the REST service",
1313
Action: func(c *cli.Context) error {
14-
client.Sync()
14+
err := client.Sync()
15+
if err != nil {
16+
return err
17+
}
18+
1519
REST.Init()
1620
return nil
1721
},

client/state.go

Lines changed: 33 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -21,23 +21,36 @@ var (
2121
)
2222

2323
//Update allBlockHeaders to the latest header. Start listening to broadcasted headers after.
24-
func Sync() {
25-
loadBlockHeaders()
24+
func Sync() error {
25+
err := loadBlockHeaders()
26+
if err != nil {
27+
return err
28+
}
29+
2630
go incomingBlockHeaders()
31+
32+
return nil
2733
}
2834

29-
func loadBlockHeaders() {
30-
var last *protocol.Block
35+
func loadBlockHeaders() error {
3136

3237
//youngest = fetchBlockHeader(nil)
33-
if last = cstorage.ReadLastBlockHeader(); last != nil {
34-
var loaded []*protocol.Block
35-
loaded = loadDB(last, [32]byte{}, loaded)
36-
blockHeaders = append(blockHeaders, loaded...)
38+
last, err := cstorage.ReadLastBlockHeader()
39+
if err != nil || last == nil {
40+
return err
41+
}
42+
43+
loaded, err := loadDB(last, [32]byte{}, []*protocol.Block{})
44+
if err != nil {
45+
return err
3746
}
3847

48+
blockHeaders = append(blockHeaders, loaded...)
49+
3950
//The client is up to date with the network and can start listening for incoming headers.
4051
network.Uptodate = true
52+
53+
return nil
4154
}
4255

4356
func incomingBlockHeaders() {
@@ -114,15 +127,17 @@ func fetchBlockHeader(blockHash []byte) (blockHeader *protocol.Block) {
114127
return blockHeader
115128
}
116129

117-
func loadDB(last *protocol.Block, abort [32]byte, loaded []*protocol.Block) []*protocol.Block {
118-
var ancestor *protocol.Block
119-
130+
func loadDB(last *protocol.Block, abort [32]byte, loaded []*protocol.Block) ([]*protocol.Block, error) {
120131
if last.PrevHash != abort {
121-
if ancestor = cstorage.ReadBlockHeader(last.PrevHash); ancestor == nil {
122-
logger.Fatal()
132+
ancestor, err := cstorage.ReadBlockHeader(last.PrevHash)
133+
if err != nil {
134+
return nil, err
123135
}
124136

125-
loaded = loadDB(ancestor, abort, loaded)
137+
loaded, err = loadDB(ancestor, abort, loaded)
138+
if err != nil {
139+
return nil, err
140+
}
126141
}
127142

128143
logger.Printf("Header %x with height %v loaded from DB\n",
@@ -131,7 +146,7 @@ func loadDB(last *protocol.Block, abort [32]byte, loaded []*protocol.Block) []*p
131146

132147
loaded = append(loaded, last)
133148

134-
return loaded
149+
return loaded, nil
135150
}
136151

137152
func loadNetwork(last *protocol.Block, abort [32]byte, loaded []*protocol.Block) []*protocol.Block {
@@ -196,6 +211,7 @@ func getState(acc *Account, lastTenTx []*FundsTxJson) (err error) {
196211
return err
197212
}
198213

214+
// Check if account is sender of a transaction
199215
if fundsTx.From == acc.Address {
200216
//If Acc is no root, balance funds
201217
if !acc.IsRoot {
@@ -206,12 +222,14 @@ func getState(acc *Account, lastTenTx []*FundsTxJson) (err error) {
206222
acc.TxCnt += 1
207223
}
208224

225+
// Check if account is recipient of a transaction
209226
if fundsTx.To == acc.Address {
210227
acc.Balance += fundsTx.Amount
211228

212229
put(lastTenTx, ConvertFundsTx(fundsTx, "verified"))
213230
}
214231

232+
// Check if account is beneficiary of a block
215233
if block.Beneficiary == acc.Address {
216234
acc.Balance += fundsTx.Fee
217235
}

client/util.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,20 @@ var (
1212
logger *log.Logger
1313
)
1414

15-
func Init() {
15+
func Init() error {
1616
p2p.InitLogging()
1717
logger = util.InitLogger()
1818

1919
util.Config = util.LoadConfiguration()
2020

2121
network.Init()
22-
cstorage.Init("client.db")
22+
err := cstorage.Init("client.db")
23+
24+
if err != nil {
25+
return err
26+
}
27+
28+
return nil
2329
}
2430

2531
func put(slice []*FundsTxJson, tx *FundsTxJson) {

cstorage/delete.go

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,9 @@ package cstorage
22

33
import "github.com/boltdb/bolt"
44

5-
func DeleteBlockHeader(hash [32]byte) {
6-
db.Update(func(tx *bolt.Tx) error {
7-
b := tx.Bucket([]byte("blockheaders"))
8-
err := b.Delete(hash[:])
9-
10-
return err
5+
func DeleteBlockHeader(hash [32]byte) error {
6+
return db.Update(func(tx *bolt.Tx) error {
7+
b := tx.Bucket([]byte(BLOCKHEADERS_BUCKET))
8+
return b.Delete(hash[:])
119
})
1210
}

cstorage/read.go

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,47 @@
11
package cstorage
22

33
import (
4+
"errors"
5+
"fmt"
46
"github.com/bazo-blockchain/bazo-miner/protocol"
57
"github.com/boltdb/bolt"
68
)
79

8-
func ReadBlockHeader(hash [32]byte) (header *protocol.Block) {
9-
db.View(func(tx *bolt.Tx) error {
10-
b := tx.Bucket([]byte("blockheaders"))
10+
func ReadBlockHeader(hash [32]byte) (header *protocol.Block, err error) {
11+
err = db.View(func(tx *bolt.Tx) error {
12+
b := tx.Bucket([]byte(BLOCKHEADERS_BUCKET))
1113
encodedHeader := b.Get(hash[:])
1214
header = header.Decode(encodedHeader)
13-
1415
return nil
1516
})
1617

18+
if err != nil {
19+
return nil, err
20+
}
21+
1722
if header == nil {
18-
return nil
23+
return nil, errors.New(fmt.Sprintf("header not found for hash %x\n", hash))
1924
}
2025

21-
return header
26+
return header, nil
2227
}
2328

24-
func ReadLastBlockHeader() (header *protocol.Block) {
25-
db.View(func(tx *bolt.Tx) error {
26-
b := tx.Bucket([]byte("lastblockheader"))
29+
func ReadLastBlockHeader() (header *protocol.Block, err error) {
30+
err = db.View(func(tx *bolt.Tx) error {
31+
b := tx.Bucket([]byte(LASTBLOCKHEADER_BUCKET))
2732
cb := b.Cursor()
2833
_, encodedHeader := cb.First()
2934
header = header.Decode(encodedHeader)
30-
3135
return nil
3236
})
3337

38+
if err != nil {
39+
return nil, err
40+
}
41+
3442
if header == nil {
35-
return nil
43+
return nil, errors.New("last block header not found")
3644
}
3745

38-
return header
46+
return header, nil
3947
}

cstorage/storage.go

Lines changed: 18 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,45 @@
11
package cstorage
22

33
import (
4-
"fmt"
54
"github.com/bazo-blockchain/bazo-client/util"
5+
"github.com/bazo-blockchain/bazo-miner/storage"
66
"github.com/boltdb/bolt"
77
"log"
88
"time"
99
)
1010

1111
var (
12-
db *bolt.DB
13-
logger *log.Logger
12+
db *bolt.DB
13+
logger *log.Logger
14+
Buckets []string
1415
)
1516

1617
const (
1718
ERROR_MSG = "Initiate storage aborted: "
19+
BLOCKHEADERS_BUCKET = "blockheaders"
20+
LASTBLOCKHEADER_BUCKET = "lastblockheader"
1821
)
1922

2023
//Entry function for the storage package
21-
func Init(dbname string) {
24+
func Init(dbname string) (err error) {
2225
logger = util.InitLogger()
2326

24-
var err error
27+
Buckets = []string {
28+
BLOCKHEADERS_BUCKET,
29+
LASTBLOCKHEADER_BUCKET,
30+
}
31+
2532
db, err = bolt.Open(dbname, 0600, &bolt.Options{Timeout: 5 * time.Second})
2633
if err != nil {
2734
logger.Fatal(ERROR_MSG, err)
2835
}
2936

30-
db.Update(func(tx *bolt.Tx) error {
31-
_, err = tx.CreateBucket([]byte("blockheaders"))
32-
if err != nil {
33-
return fmt.Errorf(ERROR_MSG+"Create bucket: %s", err)
34-
}
35-
36-
return nil
37-
})
38-
39-
db.Update(func(tx *bolt.Tx) error {
40-
_, err = tx.CreateBucket([]byte("lastblockheader"))
37+
for _, bucket := range Buckets {
38+
err = storage.CreateBucket(bucket, db)
4139
if err != nil {
42-
return fmt.Errorf(ERROR_MSG+"Create bucket: %s", err)
40+
return err
4341
}
42+
}
4443

45-
return nil
46-
})
47-
}
48-
49-
func TearDown() {
50-
db.Close()
51-
}
44+
return nil
45+
}

cstorage/write.go

Lines changed: 13 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -6,35 +6,27 @@ import (
66
)
77

88
func WriteBlockHeader(header *protocol.Block) (err error) {
9-
err = db.Update(func(tx *bolt.Tx) error {
10-
b := tx.Bucket([]byte("blockheaders"))
11-
err := b.Put(header.Hash[:], header.EncodeHeader())
12-
13-
return err
9+
return db.Update(func(tx *bolt.Tx) error {
10+
b := tx.Bucket([]byte(BLOCKHEADERS_BUCKET))
11+
return b.Put(header.Hash[:], header.EncodeHeader())
1412
})
15-
16-
return err
1713
}
1814

1915
//Before saving the last block header, delete all existing entries.
2016
func WriteLastBlockHeader(header *protocol.Block) (err error) {
21-
db.Update(func(tx *bolt.Tx) error {
22-
b := tx.Bucket([]byte("lastblockheader"))
23-
b.ForEach(func(k, v []byte) error {
24-
b.Delete(k)
25-
26-
return nil
17+
err = db.Update(func(tx *bolt.Tx) error {
18+
b := tx.Bucket([]byte(LASTBLOCKHEADER_BUCKET))
19+
return b.ForEach(func(k, v []byte) error {
20+
return b.Delete(k)
2721
})
28-
29-
return nil
3022
})
3123

32-
err = db.Update(func(tx *bolt.Tx) error {
33-
b := tx.Bucket([]byte("lastblockheader"))
34-
err := b.Put(header.Hash[:], header.EncodeHeader())
35-
24+
if err != nil {
3625
return err
37-
})
26+
}
3827

39-
return err
28+
return db.Update(func(tx *bolt.Tx) error {
29+
b := tx.Bucket([]byte(LASTBLOCKHEADER_BUCKET))
30+
return b.Put(header.Hash[:], header.EncodeHeader())
31+
})
4032
}

0 commit comments

Comments
 (0)