我的区块链技术学习笔记(六):区块链的持久化 [复制链接]

677
 
8btm.com-新币圈 8btm.com-新币圈 8btm.com-新币圈attachments-2018-01-YvYklzN35a6571e6ab752.jpg 8btm.com-新币圈 8btm.com-新币圈 8btm.com-新币圈著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
8btm.com-新币圈 8btm.com-新币圈作者: Ivan Kuznetsov  吴寿鹤等
8btm.com-新币圈 8btm.com-新币圈到目前为止,我们已经构建了一个有工作量证明机制的区块链。有了工作量证明,挖矿也就有了着落。虽然目前距离一个有着完整功能的区块链越来越近了,但是它仍然缺少了一些重要的特性。在今天的内容中,我们会将区块链持久化到一个数据库中,然后会提供一个简单的命令行接口,用来完成一些与区块链的交互操作。本质上,区块链是一个分布式数据库,不过,我们暂时先忽略 “分布式” 这个部分,仅专注于 “存储” 这一点。
8btm.com-新币圈 8btm.com-新币圈选择数据库
8btm.com-新币圈 8btm.com-新币圈

8btm.com-新币圈 8btm.com-新币圈目前,我们的区块链实现里面并没有用到数据库,而是在每次运行程序时,简单地将区块链存储在内存中。那么一旦程序退出,所有的内容就都消失了。我们没有办法再次使用这条链,也没有办法与其他人共享,所以我们需要把它存储到磁盘上。
8btm.com-新币圈 8btm.com-新币圈那么,我们要用哪个数据库呢?实际上,任何一个数据库都可以。在 比特币原始论文 中,并没有提到要使用哪一个具体的数据库,它完全取决于开发者如何选择。 Bitcoin Core ,最初由中本聪发布,现在是比特币的一个参考实现,它使用的是 LevelDB。而我们将要使用的是...
8btm.com-新币圈 8btm.com-新币圈BoltDB
8btm.com-新币圈 8btm.com-新币圈因为它:
8btm.com-新币圈 8btm.com-新币圈

    8btm.com-新币圈 8btm.com-新币圈
  • 非常简洁
    8btm.com-新币圈 8btm.com-新币圈
  • 用 Go 实现
    8btm.com-新币圈 8btm.com-新币圈
  • 不需要运行一个服务器
    8btm.com-新币圈 8btm.com-新币圈
  • 能够允许我们构造想要的数据结构
    8btm.com-新币圈 8btm.com-新币圈
BoltDB GitHub 上的 README 是这么说的:
8btm.com-新币圈 8btm.com-新币圈 8btm.com-新币圈 8btm.com-新币圈 8btm.com-新币圈attachments-2018-01-BuQfhRpQ5a656f3f7436e. 8btm.com-新币圈 8btm.com-新币圈 8btm.com-新币圈数据库结构
8btm.com-新币圈 8btm.com-新币圈在开始实现持久化的逻辑之前,我们首先需要决定到底要如何在数据库中进行存储。为此,我们可以参考 Bitcoin Core 的做法:
8btm.com-新币圈 8btm.com-新币圈简单来说,Bitcoin Core 使用两个 “bucket” 来存储数据:
8btm.com-新币圈 8btm.com-新币圈

    8btm.com-新币圈 8btm.com-新币圈
  • 其中一个 bucket 是 blocks,它存储了描述一条链中所有块的元数据
    8btm.com-新币圈 8btm.com-新币圈
  • 另一个 bucket 是 chainstate,存储了一条链的状态,也就是当前所有的未花费的交易输出,和一些元数据
    8btm.com-新币圈 8btm.com-新币圈
此外,出于性能的考虑,Bitcoin Core 将每个区块(block)存储为磁盘上的不同文件。如此一来,就不需要仅仅为了读取一个单一的块而将所有(或者部分)的块都加载到内存中。但是,为了简单起见,我们并不会实现这一点。
8btm.com-新币圈 8btm.com-新币圈在 blocks 中,key -> value 为:
8btm.com-新币圈 8btm.com-新币圈

8btm.com-新币圈 8btm.com-新币圈
b + 32 字节的 block hashblock index record
f + 4 字节的 file numberfile information record
l + 4 字节的 file numberthe last block file number used
R + 1 字节的 boolean是否正在 reindex
F + 1 字节的 flag name length + flag name string1 byte boolean: various flags that can be on or off
t + 32 字节的 transaction hashtransaction index record
在 chainstatekey -> value 为:
8btm.com-新币圈 8btm.com-新币圈
c + 32 字节的 transaction hashunspent transaction output record for that transaction
B32 字节的 block hash: the block hash up to which the database represents the unspent transaction outputs

8btm.com-新币圈 8btm.com-新币圈
详情可见 这里:_Data_Storage)
8btm.com-新币圈 8btm.com-新币圈因为目前还没有交易,所以我们只需要 blocks bucket。另外,正如上面提到的,我们会将整个数据库存储为单个文件,而不是将区块存储在不同的文件中。所以,我们也不会需要文件编号(file number)相关的东西。最终,我们会用到的键值对有:
8btm.com-新币圈 8btm.com-新币圈

    8btm.com-新币圈 8btm.com-新币圈
  • 32 字节的 block-hash -> block 结构
    8btm.com-新币圈 8btm.com-新币圈
  • l -> 链中最后一个块的 hash
    8btm.com-新币圈 8btm.com-新币圈
这就是实现持久化机制所有需要了解的内容了。
8btm.com-新币圈 8btm.com-新币圈
8btm.com-新币圈 8btm.com-新币圈下一篇:我的区块链技术学习笔记(七):区块链的序列化
8btm.com-新币圈 8btm.com-新币圈
8btm.com-新币圈 8btm.com-新币圈上一篇:我的区块链技术学习笔记(五):愉快的挖矿
8btm.com-新币圈 8btm.com-新币圈 8btm.com-新币圈 8btm.com-新币圈 8btm.com-新币圈attachments-2018-01-KR3OuPgA5a62135b82784.jpg 8btm.com-新币圈 8btm.com-新币圈 8btm.com-新币圈

本版积分规则

发表主题 回复
mailtopia,把去中心化做到极致!

(c) 2015-2021 8BTM Inc. M链、₥币 All Rights Reserved 智能硬件IoT产品:福州智垒电子科技有限公司

网站备案证书号: 闽ICP备18010811号  Ƀ猫商城 IoT&BlockChain:微物联(福州)网络科技有限公司 SiteMap