比特币买来有什么用:我的区块链技术学习笔记(五):存储一个区块链

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

  选择数据库

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

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

  BoltDB

  因为它:

  1、非常简洁

  2、用 Go 实现

  3、不需要运行一个服务器

  4、能够允许我们构造想要的数据结构

  BoltDB GitHub 上的 README 是这么说的:

  Bolt 是一个纯键值存储的 Go 数据库,启发自 Howard Chu 的 LMDB. 它旨在为那些无须一个像 Postgres 和 MySQL 这样有着完整数据库服务器的项目,提供一个简单,快速和可靠的数据库。

  由于 Bolt 意在用于提供一些底层功能,简洁便成为其关键所在。它的 API 并不多,并且仅关注值的获取和设置。仅此而已。

  听起来跟我们的需求完美契合!来快速过一下:

  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 标准库的一部分。

  虽然 BoldDB 的作者出于个人原因已经不在对其维护(见README), 不过关系不大,它已经足够稳定了,况且也有活跃的 fork:coreos/bblot。

  数据库结构

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

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

  1、其中一个 bucket 是 blocks,它存储了描述一条链中所有块的元数据

  2、另一个 bucket 是 chainstate,存储了一条链的状态,也就是当前所有的未花费的交易输出,和一些元数据

  此外,出于性能的考虑,Bitcoin Core 将每个区块(block)存储为磁盘上的不同文件。如此一来,就不需要仅仅为了读取一个单一的块而将所有(或者部分)的块都加载到内存中。但是,为了简单起见,我们并不会实现这一点。

  在 blocks 中,key -> value 为:

  

  在 chainstate,key -> value 为:

  

  详情可见 这里:_Data_Storage)。

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

  1、32 字节的 block-hash -> block 结构

  2、l -> 链中最后一个块的 hash

  这就是实现持久化机制所有需要了解的内容了。

  声明:本文由入驻区块网专栏作者撰写,观点仅代表作者本人,绝不代表区块网赞同其观点或证实其描述。

文章内容系本站作者个人观点,不代表本站对其观点赞同或支持,文章的版权归该作者所有。如需转载,请注明文章来源。本文地址:http://www.cis.net.cn/kejikuaixun/43025.html
留言与评论(共有 条评论)
验证码:

最新文章

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

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

BCC:哈希算力与交易量同步上升

科技快讯
BCC(BitcoinCash)的创建将是一个有趣的社会实验。更具体地说,其有趣之处在于这个币甚至都还不存在,却似乎已经得到了很多人的支持。据说BCC代币将于8月1日创建,并为比特币用户提供“免费币”。目前,人们可以通过交易所用比特币换BCC。其交易量大幅上涨。此外,该项目的矿池支持也在增加。对于一个尚未创建的项目来说,BCC的支持率还是

区块链行业周报(10.01-10.15)

科技快讯
1、行业概览1.1市场行情:10.01-10.15期间,全球数字货币市场一度出现快速“跳水”现象,详细分析如下:1.2行业动态十月上旬,全球数字货币市场行业动态如下:中国央行公开招聘数字货币人才;比利时和荷兰的数字货币ATM数量增长,卢森堡相对落后;谷歌正撤销部分数字货币广告禁令等。1.3社群活跃度10月以来,关键词“BTC”、

谷歌公布防篡改审计系统和云操作平台两个独立的区块链项目

科技快讯
谷歌本周公布了两个独立的区块链项目:“防篡改”的审计系统和云操作平台。根据最初在2017年9月申请的一项专利,目前正在计划在区块链基础上创建一个所谓的“防篡改”分类账。与此同时,彭博3月21日援引匿名消息人士的话称,谷歌旗下的Alphabet集团正在寻求利用这项技术来创建一个透明的审计审查平台。本月,继Facebook之后,谷歌决定

区块链可信 人不可信

科技快讯
2013年10月的一个晚上,我到伦敦骑士桥一家意大利餐厅吃饭。餐厅很有名,服务很好,菜的味道也很好,直到我尝到一口发苦的菇。我一边咀嚼一边思考这种苦味是不是意味着菇坏了,一边将它咽下去。不幸的是,盘里剩下的菇都是正常味道。之后,经理用意大利人特有的丰富手势和充满热情的语气向我保证“这里不可能有坏菇”,因为他们坚持选择最好

社群链(OFBANK)出炉,区块链花落移动端,你备好盆了吗?

科技快讯
2017年,比特币携数字资产席卷全球,区块链迎来第一波爆发!那么更加险峻的2018又将是谁笑傲江湖呢?区块链终究要应用落地,服务大众才有价值,所以,得用户者得天下!区块链落地移动端,也许有人思虑已久,却鲜少有人能够真正落实,而即将发布的社群链OFBANK将成为全球首个落地移动端的区块链项目,而研发此项目的领主科技公司将成为整个区块链行业

区块链技术:分布式系统

科技快讯
我们在前面的文章中看到,链表为区块链提供了概念基础,其中“区块”是一个数据包,而区块通过某种类型的链接机制(如指针、引用、地址等)串联在一起。在第2部分中,我们将看到这个简单的概念如何产生强大的思想,为分布式系统奠定基础。当链表中的一个链接或分布式系统中的一台计算机(又名“节点”)响应

区块链初创公司Atlas Protocol完成300万美元种子轮融资

科技快讯
一支由谷歌前雇员创建的团队盯上了在线广告业务。这家名为AtlasProtocol的初创公司相信,如今在区块链上积累的数据可以用来更好地向互联网用户提供市场讯息,这一想法已经得到了一些亚洲商界巨头的认可。据CoinD

BMF研究院 | 数字货币市场稳定币深度解析与数据评测

科技快讯
随着比特币一次又一次的陷入低谷且反弹无力,整个数字货币市场支离破碎且绵柔无力的场景已经击碎了众多数字货币交易者的信心,在如此无情的寒冬里,到处都充斥着血色的筹码,秉冬肆虐的国际金融大环境更是助长着冬熊的威风。慢慢的熊途虽不知何日是个尽头,但一抹油绿却悄然的露出了尖尖的“角”这种势能相信一定会为冰冻的市场带来依