Page 288 - 《软件学报》2020年第9期
P. 288
张志威 等:区块链的数据管理技术综述 2909
Table 1 Comparision of the approaches for data storage in blockchains
表 1 区块链存储技术的比较
区块链名称 存储方式 存储模型 性能 可拓展性 优化技术复杂度
Hyperledger Fabric [60] 链上 键值对 高 强 低
BlockchainDB [68,69] 链上&链下 关系型 中等 弱 低
[2]
Ethereum 链上 键值对 低 弱 低
Ref.[63] 链上 键值对 中等 强 高
Ref.[64−67] 链上&链下 键值对 高 强 高
Ekiden [70] 链上&链下 − 中等 强 高
2.1 基于键值对的数据存储模式
在区块链的应用中,许多系统采用基于键值对的文件系统存储其数据状态.由于基于键值对的数据库往往
具有比较高效的查询处理性能,Hyperledger Fabric [60] ,Ethereum [59] 均采用键值对数据库存储其数据.比较常见的
区块链键值对存储系统包括 LevelDB [61] ,RocksDB [62] 等.
在典型的区块链系统中,各个节点均要存储区块链内数据的备份.在这种情况下,数据在链上的存储代价极
高.同时,考虑到部分共识协议需要大量的网络开销,在数据规模极大的情况下,直接将所有数据存储于区块链
中将产生巨大的存储开销和网络通讯代价.因此,部分工作旨在以较小的代价提高数据存储规模,包括分布式存
储、链下存储等技术.
文献[63]研究通过分布式编码的方式提高区块链存储规模.具体而言,区块链的节点分为多个区域,并且保
证每个区域内的所有节点数据可以通过整合,生成整个区块链数据.因而在这种情况下,一个区域的单一节点不
需要存储整个区块链内数据副本,而只需要存储部分数据即可达到数据一致性的要求.在编码过程中,首先假定
要将数据分割为 n 个不同的块,并将其分配到一个区域的 m 个节点中.利用分布式存储的编码技术,例如 MDS
编码,可以生成相应的数据分配方案,使得在 m 个节点中,获取任意 k 个节点的数据,即可获得所有原始数据.因
此,整个系统的数据可以在存在不超过 k 个恶意节点的情况下,依然保证一致性.与此同时,为了保护数据隐私,
数据利用 Shamir’s secret sharing 技术加密,并将密钥分配给一个区域内的各个节点.Shamir’s secret sharing 技术
可以保证各个节点独自的密钥均不相同,且不与原始密钥相同.当需要获得完整数据时,系统可通过各个节点的
密钥计算出原始密钥,再对数据进行解密.由于该方法减少了每一个节点的存储开销,因而其具有很好的拓展
性.但是由于需要对数据进行编码操作,因而在数据动态输入的过程时,需要额外的编码计算开销.
当利用区块链存储相应的数据时,如果数据规模极大,直接在链上存储所有的原始数据会导致存储开销极
大,且降低系统的性能.为了减少相应的数据存储开销,文献[64,65]研究基于区块链的链上链下混合存储的方式.
在链上链下混合存储的模型中,数据均以键值对〈key,value〉的格式进行存储.原始数据往往直接储存在相应的云
服务器中.云服务器中的数据不在区块链中,而是相当于在链下.在区块链中存储相应数据的哈希值,即〈key,
hash(value)〉.这样,链上的数据不包含原始数据,而只有 key 以及数据的哈希值.当用户通过云服务获得数据时,
可利用区块链上的哈希值对数据进行验证,从而可以保证数据的完整性与一致性.同时,由于在区块链上存储数
据以及部署智能合约均需要存储开销以及相应的货币开销,文献[66,67]提出了多种基于链下存储的优化技术.
其中,在计算方面,可以将状态检查等计算采用链下验证的方式,而不需要采用链上的智能合约,从而进一步降
低存储开销.Ekiden [62] 则提出:为了保证智能合约的隐私性,智能合约也可以在需要的情况下采用链下存储.为
了保证安全性,链下的执行环境需为可信的执行环境(例如采用 Intel SGX 处理器).同时,区块链存储相应的智能
合约状态的哈希值.在这样的结构下,网络同时存在计算节点与共识节点.计算节点负责智能合约的状态的改变
以及计算等,而共识节点只负责针对智能合约的状态哈希形成共识.
由于区块链存储全部的历史数据,部分区块链操作需获取不同历史版本的数据,Forkbase [22] 设计了支持数
据版本查询的数据存储系统.针对版本控制问题,Forkbase 将数据拆分为块,并在块的级别减少重复的数据冗余
存储.具体而言,Forkbase 利用 POS-Tree(pattern-oriented-split tree)这一索引来快速地确定重复数据.
类似于 B+Tree,在 POS-Tree 中,每个叶子节点包含相应的数据,而非叶子节点保存其子树的键值.非叶子一