區塊鏈V3版本實現之四

2022-06-29 14:45:09 字數 3131 閱讀 7394

部分**(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()/*

將區塊序列化,轉成位元組流*/)

14 b.put(byte("

lasthashkey

"),block.hash)

1516 bc.tail =block.hash

1718

return

nil19

})20 }

部分**(blockchain.go檔案中將資料修改為全域性變數):

1

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 }

顯示效果:(刪除之前的bucket後,執行2次hash)

區塊鏈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.編碼...