備註:為了簡潔起見,文章只涉及了部分關鍵程式碼和結構。推薦下載原始碼,檢視詳細實現。
1.1引言
part 1 完成了”handshake”,part 2 “心跳”資訊,part 3 載入配合檔案。
接下來我們儲存BlockHeaders,以後可以用BlockHeaders驗證交易。
1.2程式碼地址
圖說比特幣 Part 4:如何儲存BlockHeaders?
1.3 BoltDB資料庫
Bolt 是一個純鍵值儲存的 Go 資料庫,啟發自 Howard Chu 的 LMDB. 它旨在為那些無須一個像 Postgres 和 MySQL 這樣有著完整資料庫伺服器的專案,提供一個簡單,快速和可靠的資料庫。
BoltDB足夠簡單,而且是go實現的。它使用鍵值儲存資料,可以理解成一個存在檔案中的map。
1.4 資料庫結構
Headers表
key|value
—|:–:
BlockHash|StoredHeader
Headers表儲存所有Header的資料,key是block的hash,value是StoredHeader
。
StoredHeader
包含了blockheader,當前高度和難度值的總和。
ChainTip表
key|value
—|:–:
“KEYChainTip”|StoredHeader
ChainTip表儲存最新的區塊頭。
1.5 四種網路模式
MainNet:主網。真實的網路,real money。詳細引數看chaincfg.MainNetParams
TestNet:測試網路。是網際網路上的另一個“比特幣區塊鏈”,通過指定命令列引數 –testnet(或者在bitcoin.conf配置檔案中新增testnet=1)啟動,區塊大小10-20GB,它使得開發、測試人員在不需要使用real money的情況下,近乎真實的體驗比特幣網路。詳細引數看chaincfg.TestNet3Params
SimNet:模擬測試網路。通過指定命令列引數 –simnet啟動(配置檔案中新增simnet=1),節點不會和其他節點通訊,如果節點執行在SimNet,程式建立全新的區塊鏈,不需要區塊資料同步,主要用於應用開發和測試的目的。。詳細引數看chaincfg.SimNetParams
RegTest:迴歸測試網路。通過指定命令列引數 –regtest(配置檔案中新增regtest=1) 在本機啟動一個私有節點,主要用於應用開發和測試的目的。詳細引數看chaincfg.RegressionNetParams
今天我們要使用RegTest來測試本地Header的儲存和查詢,TestNet來測試計算工作難度(PoW target)。
1.6 測試
# cd ./blockchain
# go test .
ok
選擇TestBlockchain_CommitHeader
方法作為例子,它驗證CommitHeader
方法。
NewBlockchainSPV
新建一個資料庫用於儲存headersCommitHeader
儲存區塊頭,區塊資訊寫死在chain
中GetBestHeader
從資料庫中提取區塊頭比較
chain
和best
中的資料,如果相等則表示成功
1.7 總結
本章應用了BoltDB資料庫和單元測試來儲存headers。接下來我們就可以獲取真正的headers。
參考:
本作品採用《CC 協議》,轉載必須註明作者和本文連結