圖說比特幣 Part 4:如何儲存BlockHeaders?

Kezhou發表於2020-10-29

備註:為了簡潔起見,文章只涉及了部分關鍵程式碼和結構。推薦下載原始碼,檢視詳細實現。

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方法。

  1. NewBlockchainSPV 新建一個資料庫用於儲存headers

  2. CommitHeader 儲存區塊頭,區塊資訊寫死在chain

  3. GetBestHeader 從資料庫中提取區塊頭

  4. 比較chainbest中的資料,如果相等則表示成功

1.7 總結

本章應用了BoltDB資料庫和單元測試來儲存headers。接下來我們就可以獲取真正的headers。

參考:

spvwallet

BTCD

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章