當前版本問題:
區塊在記憶體中,每次執行完程式就釋放,無法重用
建立區塊不靈活,在main中寫死,無法隨意新增區塊
v3版本思路:
bolt資料庫介紹:輕量級、開源、go語言實現、key->value進行讀取(map)[ ]byteè[ ]byte
blockchain結構重寫
newblockchain函式重寫:由對陣列操作改為對資料庫操作,建立資料庫
addblock函式重寫:對資料庫的讀取和寫入
列印資料:對資料庫的遍歷(迭代器iterator)
命令列:命令列介紹及編寫;新增區塊命令;列印區塊命令;建立區塊鏈』
bolt資料庫:
資料儲存格式分析:
key唯一;
把所有的區塊都寫到乙個bucket中:key -> value: byte -> byte
在bucket儲存兩種資料:
1. 區塊,區塊的雜湊值作為key,區塊的位元組流作為value
block.hash -> block.tobytes()
2.最後乙個區塊的雜湊值
key使用固定的字串:byte("lasthashkey"),value就是最後乙個區塊的雜湊儲存區塊,使用的key必須唯一,所以使用區塊的hash值作為key,block的位元組流作為value.
具體儲存格式:
新增乙個新區塊要做兩件事情:
新增區塊
更新last這個key對應的值,這個值就是最後乙個區塊的雜湊值,用於新區塊的建立新增。
部分**(boltdemo.go檔案中建立乙個demo):
1顯示效果:package main23
import (4"
beijing_go_term2/bolt"//
5"fmt"6"
log"7)
89func main()
1718
defer db.close()
1920 db.update(func(tx *bolt.tx) error 33}
3435
//bucket已經建立完成,準備寫入資料
36//
寫資料使用put,讀資料使用get
37 err = b1.put(byte("
name1
"), byte("
lily1111"))
38if err !=nil
4142 err = b1.put(byte("
name2
"), byte("
jim1111"))
43if err !=nil
4647
//讀取資料
4849 name1 := b1.get(byte("
name1"))
50 name2 := b1.get(byte("
name2"))
51 name3 := b1.get(byte("
name3"))
5253 fmt.printf("
name1: %s\n
", name1)
54 fmt.printf("
name2: %s\n
", name2)
55 fmt.printf("
name3: %s\n
", name3)
5657
58return
nil59
})60
61 }
區塊鏈V3版本實現之六
命令列demo 1 package main23 import 4 fmt 5 os 6 78func main 16 顯示效果 使用命令列分析 所有的支配動作交給命令列來做 主函式只需要呼叫命令列結構即可 根據輸入的不同命令,命令列做相應動作 a addblock b printchain cli...
區塊鏈V3版本實現之四
部分 blockchain.go檔案中改寫addblock函式 1 v3版本 2 func bc blockchain addblock data string 12 block newblock data,bc.tail 13 b.put block.hash,block.serialize 將區...
區塊鏈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.編碼...