区块链项目数据存储系统分析

 

前言

一、区块链简介:

二、数据存储:

1 比特币(Bitcoin)

2 以太坊

3 Hyperledger Fabric

4 EOS(Enterprise Operation System)

4.1 IPFS

4.2 EOS存储的设计

5 The Libra Blockchain存储模块 Storage

5.1 账本历史

5.2账本状态

5.3 事务(Transactions)

5.4 经验证的数据结构和存储

5.5 性能

6 FISCO BCOS 2.0

总结:


转载:前言引自 http://mini.eastday.com/bdmip/180412111636715.html#

           各区块链底层数据存储分析(1和2) https://blog.51cto.com/13501774/2050073

           区块链:比特币数据存储 https://www.oxysun.cn/blockchain/bitcoin-data-storage.html

EOS是什么?与比特币、以太坊有何区别? https://www.jinse.com/news/bitcoin/418762.html

深度带你走进EOS的存储系统  http://www.qukuaiwang.com.cn/news/134882.html

EOS存储系统介绍 https://www.jianshu.com/p/307c99d9ae47

The Libra Blockchain机翻及整理 http://www.manongjc.com/detail/7-kjssjoccmowymny.html

FISCO BCOS 技术文档 https://fisco-bcos-documentation.readthedocs.io/zh_CN/release-2.0/index.html

FISCO BCOS 2.0原理解析篇2: 分布式存储架构设计 https://mp.weixin.qq.com/s/vDbA5VfdtHoF4-RuJhyfgg?utm_source=wechat_session&utm_medium=social&utm_oi=617005212758577152


前言

目前,区块链项目众多,酋长根据区块链产业链,将主要项目归为五大类,即数字资产、全球支付、金融、平台应用和底层技术。本文的主要目的就是分析当前主要流行的区块链的存储技术以及他们之间的不同。

区块链项目数据存储系统分析_第1张图片

 

一、区块链简介:

区块链(英语:blockchain 或 block chain)是用分布式数据库识别、传播和记载信息的智能化对等网络, 也称为价值互联网。中本聪于2008年在《比特币白皮书》中提出“区块链”概念,并在2009年创立了比特币社会网络,开发出第一个区块,即“创世区块”。区块链包含一张被称为区块的列表,有着持续增长并且排列整齐的记录。每个区块都包含一个时间戳和一个与前一区块的链接,这样设计区块链使得数据不可篡改,一旦记录下来,在一个区块中的数据将不可逆。其数据结构大致如下:

 

二、数据存储:

 

1 比特币(Bitcoin)

比特币(英语:Bitcoin)是一种去中心化、全球通用、不需第三方机构或个人,基于区块链作为支付技术的电子加密货币。它由中本聪于2009年1月3日,基于无国界的对等网络,用共识主动性开源软件发明创立,是加密货币及区块链的始祖,也是目前知名度与市场总值最高的加密货币。

比特币存储系统由普通文件和 kv 数据库(levelDB)组成。普通文件用于存储区块链数据,kv 数据库用于存储区块链元数据。

用于存储区块链数据普通文件以 blk00000.dat , blk00001.dat 文件名格式组成,使用网络格式,直接存储在磁盘上。他们仅仅被用于:一个钱包重新扫描丢失的交易,重新组织去区块链的一部分,给另外的节点进行同步提供区块数据。如下图所示,其中 index 目录存储用于存储区块元数据,这是一个LevelDB数据库,包含了所有知道的区块的元数据,和在磁盘的哪里可以找到它们。

为了快速检索区块数据每个文件的大小是128 M Bytes。每个区块的数据(区块头和区块里的所有交易)都会序列成字节码的形式写入 dat 文件中。在序列化的过程中,如果检测到当前写入文件尺寸加上区块尺寸大于 128 M Bytes,则会重新生成一个 dat 文件。具体的序列化过程如下所述:

  • 获取当前 dat 文件大小 npos,并将区块大小追加写入至 dat 文件中
  • 序列化区块数据和区块中的交易数据,并将序列化的数据追加至 dat 文件中。
  • 在写入数据的过程中,会生成区块和交易相关的元数据。

区块的元数据格式如 格式, 其中 xxxxx 为 dat 文件序号,npos 为区块写入 dat 文件的起始位置。

交易的元数据格式如 格式, 其中 xxxxx、npos 和上面的描述一致,nTxOffset 为写入 dat 文件的起始位置(基于npos 位置)。上述所有元数据都将写入 kv 数据库中,其中blockhash/txHash将作为后续查询具体数据在 dat 文件中的索引使用。

综上所述,在获取链数据的时候只需传入区哈希或是交易哈希,就能很容易的定位到区块数据或是交易数据

补充:chainstate/* :这是一个levelDB数据库,以压缩的形式存储所有当前未花费的交易输出(UTXO)以及关于这些交易来源的一些元数据。这里的数据对于验证新传入的块和交易是必要的。这些数据理论上可以从区块数据中重建(参看-reindex 命令选项),但是这需要花费很长时间。没有这些数据,理论上你也可以进行验证,但是它意味着一个全面地对区块 (2013年5月已经达到7GB ) 的扫描,来检查每一笔输出是否被花费。

blocks/rev*.dat :包含着“undo”数据。你可以把区块数据看成是区块链状态(它们消费一些未花费的输出,然后产生新的一些)的补丁,可以把这些undo数据看做是反向的补丁。它们对于回滚区块状态非常重要,而回滚对于重新组织构建这种情况又是非常重要的。

 

2 以太坊

以太坊是一个开源的有智能合约功能的公共区块链平台。通过其专用加密货币以太币(Ether,又称为「以太币」)提供去中心化的虚拟机(称为「以太虚拟机」Ethereum Virtual Machine)来处理点对点合约。

以太坊的区块主要由区块头和交易组成区块在存储的过程中分别将区块头和交易体经过 RLP 编码后存入至 KV 数据当中。以太坊在数据存储的过程中,每个 value 对应的key 都有相对应的前缀,不同类型的 value 对应不同的前缀

区块交易体的存储过程如下:

  1. 将区块中的交易数据和叔块头信息进行 RLP 编码从而生成存储值value;
  2. 将数据类型前缀,编码后的区块高度和区块哈希拼接生成 key;
  3. 存储至db数据库中。

区块的信息可以通过区块哈希和区块高度进行检索,其存储过程如下:

  1. 将区块头信息进行 RLP 编码从而生成存储值 value
  2. 将区块高度进行编码(转发成大端格式数据)生成encNum
  3. 将数据类型前缀 (headerPrefix) 和 encNum 生成以区块高度为检索信息的 key
  4. 将存储至db数据库中,从而生成以区块高度为检索的信息
  5. 将数据类型前缀(blockHashPrefix)和区块哈希生成以区块哈希为检索信息的key
  6. 将存储至db数据库中,从生成区块哈希为检索的信息

在数据查询的时候,应用层只需要提供交易 hash、区块高度和区块哈希就能得到交易 key,从而查询到相关的交易信息。

 

3 Hyperledger Fabric

Hyperledger fabric (HLF)是由Linux基金会主导推广的区块链开源项目。在Hyperledger Fabric的基础上又衍生出了其他一些相关的项目。HyperLedger项目汇集了金融、银行、物联网、供应链、制造等各界开发人员的心血。目的是为了打造一个跨领域的区块链用。

HLF 的存储系统和比特币一样,也是由普通的文件和 kv 的数据库(levelDB/couchDB)组成。在 HLF 中,每个 channel 对应一个账本目录,在账本目录中由 blockfile_000000、blockfile_000001 命名格式的文件名组成。为了快速检索区块数据每个文件的大小是64 M(比特币:128M) Bytes。每个区块的数据(区块头和区块里的所有交易)都会序列成字节码的形式写入 blockfile 文件中。

HLF存储区块数据的文件名格式如图所示:

HLF检索信息文件如图所示:

在序列化的过程中,程序以 append 方式打开 blockfile 文件,然后将区块大小和和区块数据写入至 blockfile 文件中。以下是区块数据写入的具体描述:

  1. 写入区块头数据,依次写入的数据为区块高度、交易哈希和前一个区块哈希;
  2. 写入交易数据,依次写入的数据为区块包含交易总量和每笔交易详细数据;
  3. 写入区块的Metadata 数据,依次写入的数据为 Metadata 数据总量和每个 Metadata 项的数据详细信息。

在写入数据的过程中会以 kv 的形式保存区块和交易在 blockfile 文件中的索引信息,以方便 HLF 的快速查询。

HLF 区块索引信息格式在 kv 数据库中存储的最终的 LevelKey 值有前缀标志和区块 hash 组成,而 LevelValue 的值由区块高度,区块 hash,本地文件信息(文件名,文件偏移等信息),每个交易在文件中的偏移列表和区块的 MetaData 组成HLF 按照特定的编码方式将上述的信息拼接成 db 数据库中的 value

HLF交易索引信息格式在kv数据库中存储最终的LevelKey值由channel_name,chaincode_name和chaincode中的key值组合而成:
LevelKey = channel_name + []byte + chaincode_name + []byte + key LevelValue 的值由BlockNum 区块号,TxNum 交易在区块中的编号组成, HLF 通过将区块号和交易编号按照特定的方式编码,然后与 chaincode 中的 value 相互拼接最终生成 db 数据库中的 value

 

4 EOS(Enterprise Operation System)

EOS 是由 Block.one 公司开发的一个新的区块链软件系统,它的目标是将一切去中心化(decentralize everything)。从 2017 年年中开始,经过一年的代币众筹后,它于 2018 年 6 月 15 通过由数十个区块生产者(block producer,BP,又称超级节点)组成的社区上线了主网,EOS 主网这条主要的区块链开始正式运转。

区块链项目数据存储系统分析_第2张图片 图片来自 金色财经 

 

EOS存储使用基于EOS发行的token TOK激励区块生产者保证存储的可访问性和带宽。4.1

4.1 IPFS

IPFS是一种去中心化的文件系统,它将文件名和文件内容强关联起来(文件名是文件内容的hash)。

  • 相同文件内容的文件其名称也一定相同。
  • 当你下载一个文件的时候可以通过文件名来校验文件的完整性。
  • IPFS提供了一个p2p的网络传输层用于终端之间基于文件名称发现和分享文件。

但是IPFS并不提供和保证文件的存储、托管和带宽。也就是说即使能有文件名,但是有可能找不到对应的文件内容,例如,文件被删除或者远程节点拒绝访问等等。所以,需要有一套完善的激励机制鼓励服务器节点提供稳定高效的存储服务。IPFS团队为了解决这个问题,发布了FileCoin区块链,使用区块链的支付系统来激励拥有剩余存储空间的人帮助提供稳定可靠文件的存储、托管和带宽,用户需要为每次上传和下载文件支付一定的费用给服务器节点。

4.2 EOS存储的设计

首先设计了一套文件系统智能合约,发行了一种 token 叫TOK。它允许每个用户定义一个目录结构,这个目录结构下面的所有文件都链接了一个IPFS文件,链接内容主要包括本地home目录路径、文件名(文件内容的hash值)、文件大小。也就是说TOK只存储IPFS的文件链接和一个人类可读的文件名。生产者节点负责保存文件实际的数据,而客户端节点本地只保存文件的地址,所有客户端节点可以通过地址远程访问文件内容。这样可以为客户端节点节约大量的存储开销。

                 区块链项目数据存储系统分析_第3张图片       区块链项目数据存储系统分析_第4张图片

用户通过签名一个交易创建一个指向IPFS文件的链接,并将该交易广播的区块链。这个交易包含了用户的home目录和相应的IPFS文件名以及文件大小。同时用户也可以指定文件被存储在哪个TOK 区块生产者上。然后用户将通过标准的restfull api(API由EOS.io定义)上传文件到指定的区块生产者。一旦区块生产者验证文件和文件名匹配,则其会广播交易到整个区块链系统,其他的区块生产会通过IPFS网络复制那个文件。这样用户就成功的上传了一个文件,同时在的home目录下保存了该文件的链接。

区块链项目数据存储系统分析_第5张图片

 文件上传成功后,当客户端需要下载文件时,只需要将文件名发给生产者服务器,然后,服务器通过IPFS检索到对应的文件发送给客户端即可。一般来说,IPFS文件系统中的文件都是只读的,因为文件内容的细微修改就会导致客户端校验失败。

EOS存储的核心是IPFS,它提供了一个任何人都可以托管文件的去中心化网络,这些文件可以通过地址远程访问。区块生产者实际代表了21个超级节点,每个超级节点需要拥有支持高吞吐EOS交易量的数据中心,可以在全球范围提供文件托管服务,而且只要有至少一个超级节点在线,用户的文件就是可以访问的。

 

5 The Libra Blockchain存储模块 Storage

存储模块为Libra区块链上的所有数据集以及Libra Core内部使用的必要数据提供可靠和高效的持久存储。

存储模块旨在实现下面两个主要目的:

  1. 保留区块链数据,特别是验证方通过共识协议达成一致的交易及其输出。
  2. 为任何查询提供一个带有Merkle证明的响应,该查询要求部分区块链数据。如果客户端获得了正确的root hash,则可以轻松地验证响应的完整性。

Libra 区块链可以被视为Merkle树,包含组件有:账本历史、账本状态、事件

5.1 账本历史

账本历史记录存储已提交和已执行事务的序列,以及它们发出的关联事件。账本历史的目的,是为了记录最近的账本状态是如何被计算的。账本历史中不存在一组事务的概念。共识协议将事务批处理至区块,作为优化并驱动这一共识协议。然而,在逻辑数据模型中,事务按顺序发生,而不会区分哪个区块包含每个事务。

响应客户端查询:验证者可使用账本历史来回答客户端关于以前账本状态、事务和输出的查询。例如,客户端可能会询问有关特定版本的账本状态(例如,在第30个版本的地址x的帐户余额是多少?),或者特定类型事件的历史(例如,Y地址的账户在最后20分钟收到了哪些付款?)。 

审核事务执行:客户端可通过重新执行历史记录中的每个事务Ti,并将计算的账本状态与版本数据库中相应的账本状态Si和事务输出Oi进行比较,来检查账本状态是否正确。此机制允许客户端审计验证者,以确保正确执行事务。

5.2 账本状态

账本状态代表了有关Libra生态系统的基本事实,包括每个用户在给定版本中持有的Libra币的数量。每个验证者必须知道最新版本的账本状态,以便执行新的事务。

Libra协议使用基于帐户的数据模型]对账本状态进行编码。状态被构造为一个键值存储,它将帐户地址键映射到帐户值。账本状态下的账户值是已发布Move资源和模块的集合。这个 Move资源存储数据值,而模块则存储代码。初始帐户集及其状态在创始账本状态中指定。

帐户地址:帐户地址是一个256位的值。要创建新帐户,用户首先为签名方案生成一个新的验证/签名密钥对 (vk, sk),并使用公共验证密钥vk的加密哈希作为帐户地址a = H(vk)。当从现有账户发送的事务调用这个create_account(a) Move指令时,则这个新账户就会在账本状态中创建。这通常发生在一笔事务尝试将Libra发送到尚未创建的地址a的帐户时。

在地址a中创建新帐户后,用户可使用私人签名密钥sk,签署要从该帐户发送的事务。该用户还可以在不更改其地址的情况下,更改用于签署交易的密钥(例如,主动更改密钥或响应密钥可能被盗的情况)。

Libra协议不会将帐户链接到用户的真实身份(即没有KYC)。用户可通过生成多个密钥对来自由创建多个帐户。由同一用户控制的帐户没有固有的相互联系。该方案参照了比特币和以太坊,为用户提供了假名性 (又称半匿名)[19]。

资源值:所谓资源值或资源,是将命名字段绑定到简单值(例如整数或复杂值)的记录。

模块值:所谓模块值或模块,包含声明资源类型和程序的Move字节码(更多细节见第3.4节)。与资源类型一样,模块由声明模块的帐户地址识别。例如,图2中Currency模块的标识符是0x56.Currency。

  • 模块必须在一个帐户中唯一命名
  • 一旦在帐户地址下声明模块,就不能修改或删除它,除非通过硬分叉的方式。

 

区块链项目数据存储系统分析_第6张图片

5.3 事务(Transactions)

Libra区块链的客户端是通过提交事务来更新账本状态的。从高维度来讲,事务由事务脚本(以Move字节码编写)和事务脚本的参数(例如,接收方帐户地址或要发送的Libra币数量)组成。验证者通过运行脚本及其参数和当前账本状态作为输入来执行事务,以生成完全确定的事务输出。

5.4 经验证的数据结构和存储

存储模块使用 RocksDB 作为其物理存储引擎,RocksDB中的键值对是字节数组,其上有一个包装器来处理键和值的序列化, 此包装器强制执行数据库内外的所有数据都是根据预定义的模式构建的。

实现主要功能的核心模块称为 LibraDB. 使用单个RocksDB实例来存储整个数据集,相关数据被分组到逻辑存储中 — 例如,账本存储,状态存储和交易存储等。

对于表示账本状态的稀疏Merkle树,我们通过使用具有16个子节点的分支节点来优化磁盘布局,这些子节点表示4级子树,而扩展节点表示没有分支的路径。 但是,在计算root hash和证明时,我们仍然会模拟二叉树。 此修改结果证明,比以太坊的Merkle Patricia树生成的证明更短。(我看不出来)

区块链项目数据存储系统分析_第7张图片

1账本历史结构的根哈希是系统完整状态的验证器,即2由法定人数验证者签署。当事务添加到数据库时,提交到账本历史的验证器将增长(用虚线箭头表示)。账本历史的每个子叶都提交至一个3 TransactionInfo结构。此结构承诺4签署的事务(Ti),5该事务(Ei)期间产生的事件列表,以及6该事务 (Si)执行后的状态。该状态是一颗稀疏Merkle二叉树,其中每个子叶上都有一个7帐户斑点。

5.5 性能

Libra协议还处于原型阶段,预计Libra协议在最初发布时可支持每秒1000笔支付事务,事务提交到确认的最终时间为10秒,许多支付事务将发生在链下进行。

宽带:验证者需要40 Mbps的网络连接来支持每秒1000笔事务

磁盘:如果帐户大小约为4 KB(包括所有形式的开销),从大型服务器供应商那里获得16TB SSD存储的服务器,这将使得验证者可存储40亿个帐户。

6 FISCO BCOS 2.0

FISCO BCOS是一个区块链底层平台,由金融区块链合作联盟(深圳)(以下简称:金链盟)开源工作组以金融业务实践为参考样本,在BCOS开源平台基础上进行模块升级与功能重塑。特点:深度定制的安全可控、适用于金融行业且完全开源。金链盟开源工作组的首批成员包括:微众银行、深证通、腾讯、华为、神州数码、四方精创、博彦科技、越秀金科、亦笔科技等9家单位。

 

 

总结:

综上所述,本文介绍的主要区块链除了 Ripple 使用的关系型数据库存储、检索区块数据外,其他三种类型的区块链都使用 kv 数据库存储区块链的检索信息。在存储、检索数据上,比特币和 Hyperledger Fabric 高度一致,即使用普通文件存储区块数据,使用 kv 数据库存储检索信息;以太坊的区块数据和检索信息都存储至 kv 数据库中,而 Ripple 的区块数据也会存储至 kv 数据库中。

你可能感兴趣的:(区块链项目数据存储系统分析)