各区块链底层数据存储分析(二)

目前市场上主流的区块链系统有比特币,Ripple,以太坊和 Hyperledger Fabric 。昨天小编已经为大家介绍了比特币和瑞波币(Ripple),今天小编将继续为大家分析当前主要流行的区块链的存储技术——以太坊和Hyperledger Fabric。

区块链简介

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

数据存储(二)

1

以太坊

以太坊是一个开源的有智能合约功能的公共区块链平台。通过其专用加密货币以太币(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,从而查询到相关的交易信息。

2

Hyperledger Fabric

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

HLF 的存储系统和比特币一样,也是由普通的文件和 kv 的数据库(levelDB/couchDB)组成。在 HLF 中,每个 channel 对应一个账本目录,在账本目录中由 blockfile_000000、blockfile_000001 命名格式的文件名组成。为了快速检索区块数据每个文件的大小是64 M 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 。

总结

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

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20171213A0AVSH00?refer=cp_1026

扫码关注云+社区