From a93e1e96c9e2419e298ece656578db140e1eb4ff Mon Sep 17 00:00:00 2001 From: Ivan Kuznetsov Date: Mon, 28 Aug 2017 16:28:23 +0700 Subject: [PATCH] Store a DB connection in Blockchain --- blockchain.db | Bin 32768 -> 32768 bytes blockchain.go | 40 ++++++++++++++++++++-------------------- main.go | 5 +++-- 3 files changed, 23 insertions(+), 22 deletions(-) diff --git a/blockchain.db b/blockchain.db index 090c32ce8f4764e27c0298725bbf74d4e9e09ced..a4e79c3c7e308999f553d34e061ae120c9849391 100644 GIT binary patch delta 542 zcmZo@U}|V!nqV;5KtO<>jR695md}d1m=Um9(O@J0Bmsqq3IdZ9I3!@QtWZ_!Zhux1 zyZOl#sB8m2Pywd^0~1(^d9$Fwd;UoV0+R&-I5tZdum~_do-FHN8nO+llZ}yqK>^5~ z0Oc=(^7labML=_aLSQuv3<(+tOm1`x znB3sR&U8d-@;pWHG=|;`$qQUxRi|8CUu2)tJCSGlWufe1qj_Ae;^+PaykJxyWFX@| zlY2nB@f!oOHNpOW6XT!F?nfjTdEHa0YA`U`1<4MytN!x@tiUmPM za1dQ8D2ga{6f@`|mJT8)I5;?nE+UmwbZCW!#COTPQcLBQA~k*wF8AK`-Q{AY8vYHu=AqH=MdTvwgO`W5H5}2q1s}0tg_000IagfB*sr zAh1FNOn&bZ)i(jor&IcO^7|P*IX#$;4`luntWTKyUx*!gk<$A$ckvr{o_FUr^xd4h zD`)PXm^^!KcCHxSG=6ui|MJiLleV#`JwMhKkF?&twJ*|LzTlTK*yVh=ERPBql&gCZ zNjsCZl0z~eWMIFQwd5Kh>yM4txyrhjmFaWN1k50KG@XjudbJQ8!Wtc z&LlFba*a=UMIuYv4hd0rKNNl4ez7}o;LGs3t-U8(?!9}ttL@eGjUS(f*AIVK?r`n- zaGQ?XsWWP)>gtK8Y+4=6St;oqv+@d9mbRqCpw}wrAH{|M0tg_000IagfB*srAW$0u zCVy`f)i(jA55V;K*Tz%w6bK-I00IagfB*srAbjmyCf{GG{{Kn867Z`3o9l(> z)R0Q=&-CtWb-LKE^wIPKJaXrzA7Dt|U7xC~5%NXz+Xv&H?7`BK42O$mg>y-TdfWr zKQR3}WJ3S}1Q0*~0R#|0009JQTfo%$P5r;x1)#Im+J0=F4gmxZKmY**5I_I{1Q0*~ w0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~fqzQi7iwCc(f|Me diff --git a/blockchain.go b/blockchain.go index 0aecb89..5c6b119 100644 --- a/blockchain.go +++ b/blockchain.go @@ -12,33 +12,33 @@ const blocksBucket = "blocks" // Blockchain keeps a sequence of Blocks type Blockchain struct { tip []byte + db *bolt.DB } // BlockchainIterator is used to iterate over blockchain blocks type BlockchainIterator struct { currentHash []byte + db *bolt.DB } // AddBlock saves provided data as a block in the blockchain func (bc *Blockchain) AddBlock(data string) { var lastHash []byte - db, err := bolt.Open(dbFile, 0600, nil) - if err != nil { - log.Panic(err) - } - defer db.Close() - - err = db.View(func(tx *bolt.Tx) error { + err := bc.db.View(func(tx *bolt.Tx) error { b := tx.Bucket([]byte(blocksBucket)) lastHash = b.Get([]byte("l")) return nil }) + if err != nil { + log.Panic(err) + } + newBlock := NewBlock(data, lastHash) - err = db.Update(func(tx *bolt.Tx) error { + err = bc.db.Update(func(tx *bolt.Tx) error { b := tx.Bucket([]byte(blocksBucket)) err := b.Put(newBlock.Hash, newBlock.Serialize()) if err != nil { @@ -58,7 +58,7 @@ func (bc *Blockchain) AddBlock(data string) { // Iterator ... func (bc *Blockchain) Iterator() *BlockchainIterator { - bci := &BlockchainIterator{bc.tip} + bci := &BlockchainIterator{bc.tip, bc.db} return bci } @@ -66,13 +66,8 @@ func (bc *Blockchain) Iterator() *BlockchainIterator { // Next returns next block starting from the tip func (i *BlockchainIterator) Next() *Block { var block *Block - db, err := bolt.Open(dbFile, 0600, nil) - if err != nil { - log.Panic(err) - } - defer db.Close() - err = db.View(func(tx *bolt.Tx) error { + err := i.db.View(func(tx *bolt.Tx) error { b := tx.Bucket([]byte(blocksBucket)) encodedBlock := b.Get(i.currentHash) block = DeserializeBlock(encodedBlock) @@ -80,6 +75,10 @@ func (i *BlockchainIterator) Next() *Block { return nil }) + if err != nil { + log.Panic(err) + } + i.currentHash = block.PrevBlockHash return block @@ -87,12 +86,11 @@ func (i *BlockchainIterator) Next() *Block { // NewBlockchain creates a new Blockchain with genesis Block func NewBlockchain() *Blockchain { - bc := Blockchain{} + var tip []byte db, err := bolt.Open(dbFile, 0600, nil) if err != nil { log.Panic(err) } - defer db.Close() err = db.Update(func(tx *bolt.Tx) error { b := tx.Bucket([]byte(blocksBucket)) @@ -114,17 +112,19 @@ func NewBlockchain() *Blockchain { if err != nil { log.Panic(err) } - bc.tip = genesis.Hash + tip = genesis.Hash } else { - tip := b.Get([]byte("l")) - bc.tip = tip + tip = b.Get([]byte("l")) } return nil }) + if err != nil { log.Panic(err) } + bc := Blockchain{tip, db} + return &bc } diff --git a/main.go b/main.go index 58fcacd..57cc9bc 100644 --- a/main.go +++ b/main.go @@ -7,9 +7,10 @@ import ( func main() { bc := NewBlockchain() + defer bc.db.Close() - bc.AddBlock("Send 1 BTC to Ivan") - bc.AddBlock("Send 2 more BTC to Ivan") + // bc.AddBlock("Send 1 BTC to Ivan") + // bc.AddBlock("Send 2 more BTC to Ivan") bci := bc.Iterator()