当前位置:首页 > 知识 >

的完整结构区块链初学者必读:存储一个完整结构的区块链技术学习笔记

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

到目前为止,我们已经构建了一个有工作量证明机制的区块链。有了工作量证明,挖矿也就有了着落。虽然目前距离一个有着完整功能的区块链越来越近了,但是它仍然缺少了一些重要的特性。在今天的内容中,我们会将区块链持久化到一个数据库中,然后会提供一个简单的命令行接口,用来完成一些与区块链的交互操作。本质上,区块链是一个分布式数据库,不过,我们暂时先忽略“分布式”这个部分,仅专注于“存储”这一点。

选择数据库

目前,我们的区块链实现里面并没有用到数据库,而是在每次运行程序时,简单地将区块链存储在内存中。那么一旦程序退出,所有的内容就都消失了。我们没有办法再次使用这条链,也没有办法与其他人共享,所以我们需要把它存储到磁盘上。

那么,我们要用哪个数据库呢?实际上,任何一个数据库都可以。在比特币原始论文中,并没有提到要使用哪一个具体的数据库,它完全取决于开发者如何选择。BitcoinCore,最初由中本聪发布,现在是比特币的一个参考实现,它使用的是LevelDB。而我们将要使用的是BoltDB,因为它非常简洁,用Go实现,不需要运行一个服务器,能够允许我们构造想要的数据结构。

数据库结构

Bolt使用键值存储,这意味着它没有像SQL RDBMS(MySQL,PostgreSQL等等)的表,没有行和列。相反,数据被存储为键值对(key-value pair,就像Golang的map)。键值对被存储在bucket中,这是为了将相似的键值对进行分组(类似RDBMS中的表格)。因此,为了获取一个值,你需要知道一个bucket和一个键(key)。

需要注意的一个事情是,Bolt数据库没有数据类型:键和值都是字节数组(byte array)。鉴于需要在里面存储Go的结构(准确来说,也就是存储Block(块)),我们需要对它们进行序列化,也就说,实现一个从Go struct转换到一个byte array的机制,同时还可以从一个byte array再转换回Go struct。虽然我们将会使用encoding/gob来完成这一目标,但实际上也可以选择使用JSON, XML, Protocol Buffers等等。之所以选择使用encoding/gob,是因为它很简单,而且是Go标准库的一部分。

因为目前还没有交易,所以我们只需要blocks bucket。另外,正如上面提到的,我们会将整个数据库存储为单个文件,而不是将区块存储在不同的文件中。所以,我们也不会需要文件编号(filenumber)相关的东西。最终,我们会用到的键值对有:

- 32字节的block-hash -> block结构 - l -> 链中最后一个块的hash

这就是实现持久化机制所有需要了解的内容了。(未完待续)

猜你喜欢

关注我们

微信二维码

微信