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 中,每个叶子节点包含相应的数据,而非叶子节点保存其子树的键值.非叶子一
   283   284   285   286   287   288   289   290   291   292   293