Refactor NewBlockchain

This commit is contained in:
Ivan Kuznetsov 2017-08-28 16:16:45 +07:00
parent fdccadfb63
commit e6cf54a124
3 changed files with 19 additions and 32 deletions

Binary file not shown.

View File

@ -1,9 +1,7 @@
package main package main
import ( import (
"fmt"
"log" "log"
"os"
"github.com/boltdb/bolt" "github.com/boltdb/bolt"
) )
@ -13,8 +11,7 @@ const blocksBucket = "blocks"
// Blockchain keeps a sequence of Blocks // Blockchain keeps a sequence of Blocks
type Blockchain struct { type Blockchain struct {
blocks []*Block tip []byte
tip []byte
} }
// BlockchainIterator is used to iterate over blockchain blocks // BlockchainIterator is used to iterate over blockchain blocks
@ -91,18 +88,18 @@ func (i *BlockchainIterator) Next() *Block {
// NewBlockchain creates a new Blockchain with genesis Block // NewBlockchain creates a new Blockchain with genesis Block
func NewBlockchain() *Blockchain { func NewBlockchain() *Blockchain {
bc := Blockchain{} bc := Blockchain{}
db, err := bolt.Open(dbFile, 0600, nil)
if err != nil {
log.Panic(err)
}
defer db.Close()
if _, err := os.Stat(dbFile); os.IsNotExist(err) { err = db.Update(func(tx *bolt.Tx) error {
fmt.Println("Creating a new blockchain...") b := tx.Bucket([]byte(blocksBucket))
db, err := bolt.Open(dbFile, 0600, nil)
if err != nil {
log.Panic(err)
}
defer db.Close()
genesis := NewGenesisBlock() if b == nil {
genesis := NewGenesisBlock()
err = db.Update(func(tx *bolt.Tx) error {
b, err := tx.CreateBucket([]byte(blocksBucket)) b, err := tx.CreateBucket([]byte(blocksBucket))
if err != nil { if err != nil {
log.Panic(err) log.Panic(err)
@ -117,26 +114,16 @@ func NewBlockchain() *Blockchain {
if err != nil { if err != nil {
log.Panic(err) log.Panic(err)
} }
bc.tip = genesis.Hash
return nil } else {
})
bc.tip = genesis.Hash
} else {
// TODO: remove the duplication, check for the "l" key
db, err := bolt.Open(dbFile, 0600, nil)
if err != nil {
log.Panic(err)
}
defer db.Close()
err = db.View(func(tx *bolt.Tx) error {
b := tx.Bucket([]byte(blocksBucket))
tip := b.Get([]byte("l")) tip := b.Get([]byte("l"))
bc.tip = tip bc.tip = tip
}
return nil return nil
}) })
if err != nil {
log.Panic(err)
} }
return &bc return &bc

View File

@ -8,8 +8,8 @@ import (
func main() { func main() {
bc := NewBlockchain() bc := NewBlockchain()
// bc.AddBlock("Send 1 BTC to Ivan") bc.AddBlock("Send 1 BTC to Ivan")
// bc.AddBlock("Send 2 more BTC to Ivan") bc.AddBlock("Send 2 more BTC to Ivan")
bci := bc.Iterator() bci := bc.Iterator()