區塊鏈V3版本實現思路

2022-06-29 14:45:11 字數 2510 閱讀 6235

當前版本問題:

區塊在記憶體中,每次執行完程式就釋放,無法重用

建立區塊不靈活,在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.編碼...