部分**(blockchain.go檔案中改寫addblock函式):
1部分**(blockchain.go檔案中將資料修改為全域性變數)://v3版本
2 func (bc *blockchain) addblock(data string
) 12 block :=newblock(data, bc.tail)
13 b.put(block.hash,block.serialize()/*
將區塊序列化,轉成位元組流*/)
14 b.put(byte("
lasthashkey
"),block.hash)
1516 bc.tail =block.hash
1718
return
nil19
})20 }
1顯示效果:(刪除之前的bucket後,執行2次hash)package main23
import (4"
beijing_go_term2/bolt"5
"fmt"6
"log"7
"os"8
)910//
v1,v2版本
11///
/建立區塊鏈,使用block陣列模擬
12//
type blockchain struct
1516
//v3版本
17//
使用bolt進行改寫,需要2個字段
18//
1.bolt資料庫的控制代碼
19//
2.最後乙個區塊的雜湊值
20 type blockchain struct
2627
const blockchainname = "
blockchain.db"28
const blockbucketname = "
blockbucket"29
const lasthashkey = "
lasthashkey"30
31//
實現建立區塊鏈的方法
32 func newblockchain() *blockchain )
36//
37//
bc := blockchain}
38//
return &bc
3940
//v3版本使用
41//
功能分析
42//
1.獲得資料庫的控制代碼,開啟資料庫,讀寫資料
43//
判讀是否有buket,如果沒有,建立bucket
44//
寫入創世塊
45//
寫入1asthashkey這條資料
46//
更新tai1為最後乙個區塊的雜湊
47//
返回bc例項
48//
2.獲取最後乙個區塊的雜湊值
49//
填充給tail
50//
返回bc例項
5152 db, err := bolt.open(blockchainname, 0600
, nil)
53//
向資料庫中寫入資料
54//
從資料庫中讀取資料
5556
if err !=nil
5960
var tail byte
6162 db.update(func(tx *bolt.tx) error
7576
//新增創世塊
77 genesisblock := newblock(genesisinfo, byte
{})78 b.put(genesisblock.hash,genesisblock.serialize()/*
將區塊序列化,轉成位元組流*/)
79 b.put(byte
(lasthashkey),genesisblock.hash)
8081
////區塊資料讀取,測試寫入是否成功,成功就稍後注釋
82//
blockinfo := b.get(genesisblock.hash)
83//
block := deserialize(blockinfo)
84//
fmt.printf("解碼後的block資料:%v\n",block)
8586 tail =genesisblock.hash
87 }else
9091
return
nil92
})93
94return &blockchain95}
9697
//v2版本
98///
/新增區塊
99//
func (bc *blockchain) addblock(data string)
112113
//v3版本
114 func (bc *blockchain) addblock(data string
) 124 block :=newblock(data, bc.tail)
125 b.put(block.hash,block.serialize()/*
將區塊序列化,轉成位元組流*/)
126 b.put(byte
(lasthashkey),block.hash)
127128 bc.tail =block.hash
129130
return
nil131
})132 }
區塊鏈V3版本實現之六
命令列demo 1 package main23 import 4 fmt 5 os 6 78func main 16 顯示效果 使用命令列分析 所有的支配動作交給命令列來做 主函式只需要呼叫命令列結構即可 根據輸入的不同命令,命令列做相應動作 a addblock b printchain cli...
區塊鏈V3版本實現思路
當前版本問題 區塊在記憶體中,每次執行完程式就釋放,無法重用 建立區塊不靈活,在main中寫死,無法隨意新增區塊 v3版本思路 bolt資料庫介紹 輕量級 開源 go語言實現 key value進行讀取 map byte byte blockchain結構重寫 newblockchain函式重寫 由...
區塊鏈V3版本實現之二
部分 gob.go檔案中建立乙個gob的demo實現序列化與反序列化的功能 1 package main23 import 4 encoding gob 5 bytes 6 log 7 fmt 8 910 1.gob是go語言內建的編碼包 11 2.它可以對任意資料型別進行編碼和解碼 12 3.編碼...