主页 > imtoken钱包官方版下载教程 > 我的区块链技术学习笔记(五):存储一个区块链

我的区块链技术学习笔记(五):存储一个区块链

本文约2700字,阅读(观看)需20分钟

到目前为止,我们已经构建了一个工作量证明区块链。 有了工作证明,挖矿将得到解决。 虽然我们越来越接近功能齐全的区块链,但它仍然缺乏一些重要的功能。 在今天的内容中,我们将把区块链持久化到一个数据库中比特币怎么保存在硬盘,然后提供一个简单的命令行界面来完成一些与区块链的交互操作。 本质上,区块链是一个分布式数据库。 但是,我们暂时忽略“分布式”部分,只关注“存储”这一点。

选择数据库

目前,我们的区块链实现不使用数据库,只是在每次程序运行时将区块链存储在内存中。 然后一旦程序退出,所有内容都没有了。 我们没有办法再次使用这条链,也没有办法分享给其他人,所以我们需要将它存入磁盘。

那么,我们应该使用哪个数据库呢? 实际上,任何数据库都可以。 在最初的比特币论文中,并没有提到具体使用哪个数据库,完全取决于开发者如何选择。 Bitcoin Core 最初由中本聪发布,现在是比特币的参考实现,它使用 LevelDB。 而我们要使用的是...

螺栓数据库

比特币怎么保存在硬盘_比特币 硬盘涨价_比特币是储存在硬盘上吗

因为它:

非常简洁

在 Go 中实现

无需运行服务器

可以让我们构建所需的数据结构

比特币是储存在硬盘上吗_比特币 硬盘涨价_比特币怎么保存在硬盘

BoltDB GitHub 上的 README 是这样说的:

Bolt 是一个纯键值存储 Go 数据库,灵感来自 Howard Chu 的 LMDB。 它旨在为不需要像 Postgres 和 MySQL 这样的完整数据库服务器的项目提供一个简单、快速和可靠的数据库。

由于 Bolt 旨在提供一些低级功能,因此简单性是关键。 它的 API 并不广泛,只专注于获取和设置值。 就这样。

听起来非常适合我们的需求! 让我们快速回顾一下:

Bolt 使用键值存储,这意味着它没有像 SQL RDBMS(MySQL、PostgreSQL 等)那样的表​​,没有行和列。 相反,数据存储为键值对(如 Golang 映射)。 键值对存储在桶中以将相似的键值对分组(类似于 RDBMS 中的表)。 因此,为了得到一个值,你需要知道一个桶和一个键。

比特币 硬盘涨价_比特币怎么保存在硬盘_比特币是储存在硬盘上吗

需要注意的一件事是,Bolt 数据库没有数据类型:键和值是字节数组。 鉴于其中需要存储Go结构体(准确的说是存储Blocks),我们需要对其进行序列化,即实现一种从Go struct到byte数组的转换机制,同时从byte转换数组返回到 Go 结构。 虽然我们将为此目的使用 encoding/gob,但 JSON、XML、Protocol Buffers 等也是可选的。 我选择使用 encoding/gob 因为它很简单并且是 Go 标准库的一部分。

虽然 BoldDB 的作者因为个人原因不再维护它(见 README),但没关系,足够稳定,还有一个活跃的 fork:coreos/bblot。

数据库结构

在开始实现持久化逻辑之前,我们首先需要决定如何将其存储在数据库中。 对此,我们可以参考Bitcoin Core的做法:

简单来说,Bitcoin Core 使用两个“桶”来存储数据:

比特币怎么保存在硬盘_比特币是储存在硬盘上吗_比特币 硬盘涨价

其中一个桶是块,它存储描述链中所有块的元数据

另一个bucket是chainstate,它存储了一条链的状态,即当前所有未花费的交易输出,以及一些元数据

此外,出于性能原因,Bitcoin Core 将每个块存储为磁盘上的不同文件。 这样,就不需要为了读取单个块而将所有(或部分)块加载到内存中。 但是,为了简单起见,我们不会实现它。

在块中,key -> value 是:

b + 32字节block hashblock index recordf + 4字节文件号文件信息recordl + 4字节文件号最后使用的块文件号R + 1字节boolean是否reindexF + 1字节flag name length + flag name string1 byte boolean: various flags that can be on or off + 32 bytes of transaction hashtransaction index record

比特币怎么保存在硬盘_比特币 硬盘涨价_比特币是储存在硬盘上吗

在 chainstate 中,key -> value 是:

c + 32 bytes of transaction hashunspent transaction output record for that transactionB32 bytes of block hash: 数据库代表未花费交易输出的块散列

详情可以在这里找到:_Data_Storage)。

由于还没有交易,我们只需要块桶。 另外,如上所述,我们会将整个数据库存储为单个文件比特币怎么保存在硬盘,而不是将块存储在单独的文件中。 因此,我们也不需要任何与文件编号相关的信息。 最后,我们将使用的键值对是:

32 字节块哈希 -> 块结构

l -> 链中最后一个块的哈希值

这就是关于实现持久性机制的全部知识。 (未完待续)