主页 > imtoken官方下载 > 图解比特币第 4 部分:如何存储 BlockHeaders?
图解比特币第 4 部分:如何存储 BlockHeaders?
备注:为简洁起见,本文仅涉及一些关键代码和结构。 推荐下载源码查看详细实现。
1.1 简介
第1部分完成“握手”,第2部分“心跳”信息,第3部分加载mate文件。
接下来我们存储 BlockHeaders,以后可以用它来验证交易。
1.2 代码地址
图解比特币第 4 部分:如何存储 BlockHeaders?
1.3 BoltDB数据库
Bolt 是一个纯键值存储 Go 数据库比特币spv,灵感来自 Howard Chu 的 LMDB。 它旨在为不需要像 Postgres 和 MySQL 这样的完整数据库服务器的项目提供一个简单、快速和可靠的数据库。
BoltDB 非常简单,并且是用 go 语言实现的。 它使用key-value存储数据,可以理解为一个map存储在一个文件中。
1.4 数据库结构表头表
键|值
—|:–:
BlockHash|StoredHeader
Headers表存储了所有的Header数据,key是区块的hash,value是StoredHeader。
StoredHeader 包含区块头、当前高度和难度值之和。
链尖表
键|值
—|:–:
"KEYChainTip"|StoredHeader
ChainTip 表存储最新的区块头。
1.5 四种网络模式
MainNet:主网。 真实的网络,真实的金钱。 详细参数见chaincfg.MainNetParams
TestNet:测试网络。 它是互联网上的另一个“比特币区块链”。 通过指定命令行参数-testnet(或在bitcoin.conf配置文件中添加testnet=1)启动,块大小为10-20GB。 它使开发人员和测试人员能够在不使用真钱的情况下获得比特币网络近乎真实的体验。 详细参数见chaincfg.TestNet3Params
SimNet:模拟测试网络。 通过指定命令行参数-simnet启动(在配置文件中加入simnet=1),该节点将不会与其他节点通信。 如果节点运行在 SimNet 上,程序将创建一个新的区块链,无需区块数据同步。 它主要用于应用程序开发和测试的目的。 . 详细参数见chaincfg.SimNetParams
RegTest:回归测试网络。 通过指定命令行参数-regtest(在配置文件中添加regtest=1)在本地启动一个私有节点比特币spv,主要用于应用开发和测试目的。 详细参数见chaincfg.RegressionNetParams
今天我们将使用RegTest测试本地Header的存储和查询,使用TestNet测试计算工作的难度(PoW目标)。
1.6 测试
# cd ./blockchain
# go test .
ok
以TestBlockchain_CommitHeader方法为例,验证CommitHeader方法。
NewBlockchainSPV 创建一个新的数据库来存储标题
CommitHeader存储区块头,区块信息写入链中
GetBestHeader 从数据库中提取区块头
比较chain和best中的数据,相等则成功
1.7 总结
本章使用 BoltDB 数据库和单元测试来存储标头。 接下来我们可以获得真正的标题。
参考:
spv钱包
BTCD
本作品采用《CC协议》,转载需注明作者及本文链接