发布日期:2024-10-08 13:21 点击次数:71
最近几年, 由于加密货币以及去中心化应用的兴起, 区块链时期在工业界与学术界得到了极大的热心, 并产生了高大的影响.加密货币中的比特币[1]、以太坊[2]等已被允许在新加坡、加拿大等国度进行支付.从数据处理的角度, 区块链是一种由网罗中一组节点贵重、只能添加的链式数据结构.在区块链系统中, 数据与事务以区块为最小单元进行存储.区块与区块之间以链表的阵势进行结合, 且新的区块只能在链表末尾添加.因此, 区块链中每个节点均按照区块被添加的规章来存储区块内的数据内容.在这种情况下, 扫数的区块酿成了一个存在全局规章的链表.区块链因此也常被称作账本.与此同期, 区块链系统可在不着实的网罗中因循数据的一致性以及不可批改等特色.为了在不着实的网罗中保证数据不可批改, 区块链将每个区块及前一区块的哈希值存储在区块中, 因此网罗中的节点可通过哈希值ed2k白石茉莉奈, 考证自身数据以及前一区块的数据是否与相应的哈希值一致.同期, 推敲到不着实网罗中坏心节点的坏心报复举止, 区块链系统要求不错因循拜占庭容错, 即:当网罗中存在小数坏心节点时, 依然不错确保网罗中数据的一致性.由于以上性情, 通盘区块链网罗组成了一个去中心化且不可批改的一致数据存储系统.
区块链系统的去中心化特色使其与传统的散播式数据库在时期, 应用等方面有很大不同.传统的散播式数据库往往假设存在中心节点, 且节点不存在坏心举止, 因此大部分散播式数据库只需要推敲崩溃性故障.而区块链中节点之间是不着实的, 即节点可能坏心地发送音尘或推论操办, 因而区块链需推敲拜占庭容错.诸多企业, 举例IBM[3]、Oracle[4]、SAP[5]、华为[6]等, 均建造了自身的区块链系统.跟着区块链时期的彭胀以及对智能合约的因循, 区块链时期也被进一步应用于多个鸿沟, 包括物联网[7, 8]、医疗健康[9, 10]、专利保护[11]、政府监管[12]、金钱不停[13]等.与此同期, 越来越多的责任对区块链各个方面进行了优化, 包括系统模子[14, 15]、共鸣算法[16, 17]、数据安全[18-21]、数据存储[22]以及性能评价基准[23]等.
从数据不停的角度, 区块链是一个在散播式环境下存储大都存在全序相关的数据纪录系统.数据以及对数据的操作均存储在区块内并以区块的粒度进行不停.一个典型的区块结构如图 1所示, 包括前一区块哈希值(PreBkHash)、共鸣考证字段(ConsProof)以及区块内事务的哈希值(MerkleRoot).其中, 节点可期骗共鸣考证字段考证其存储的区块是否餍足共鸣要求, 并确保网罗中小数节点的坏心举止不会影响区块链的一致性, 从而使其因循拜占庭容错.
Fig. 1 Structure of the blockchain 图 1 区块链中的数据结构在散播式数据库系统中, 由于其假设节点不存在坏心报复举止, 因此散播式数据库中节点共鸣只需推敲节点崩溃的情况.典型的共鸣算法有Paxos[24], Raft[25]等.这类共鸣算法也曾被应用于行家化的散播式数据库中, 并也曾取得了很好的性能.而在区块链中, 为了因循拜占庭容错, 区块链中典型的共鸣机制包括责任量证明PoW[26]、实用拜占庭容错PBFT[27]等.对于区块结构以及共鸣算法, 将在“区块链的中枢组成”部分先容.
天然与散播式数据库比较, 区块链不错因循在不信任网罗环境中的去中心化数据不停, 然则区块链系统在数据不停方面仍然濒临着诸多问题, 其中枢问题包括数据存储、事务处感性能、查询处理优化等方面.举例, 现阶段区块链的每秒可推论事务数(TPS)远小于传统的散播式数据库, 也很难餍足内容公司级别的走动量需求.最通俗使用的电子货币比特币因循平均每秒7笔走动, 而visa等信用卡公司每秒需推论4 000笔傍边的走动[28, 29].具体而言, 区块链系统中的数据不停与现存散播式数据库有如下方面的不同.
● 数据存储方面
在区块链系统中, 数据以区块算作基本存储单元.为了通俗数据的存取, 以太坊[3]等期骗LevelDB这一基于Key-Value结构的数据库存取数据, 而部分区块链则聘请期骗文献系统或相关型数据库进行存储.与传统的散播式数据库或其他散播式存储系统比较, 由于区块链网罗中的节点均存储数据的备份, 导致数据的存储在区块链框架下产生新的挑战.率先, 径直将所稀有据存储于区块链上将导致区块链上的数据范围极大.在一般情况下, 系统中的节点均需要存储扫数历史和新添加的数据, 因而导致通盘系统的存储开销极大.这将使得部分节点可能由于存储空间的限定, 不成加入到区块链的网罗中.其次, 由于区块链中存储了大都的历史数据, 在这种情况下, 一个数据在区块链中不错存在多个历史版块.现存的诸多操作需要基于数据的不同版块进行, 因此, 数据存储需因循多版块的存储、查询等操作, 且不错在各个版块上进行零丁的数据添加鼎新等操作.
● 事务推论方面
在区块链中, 智能合约的一次推论独特于数据库中的一个事务.在传统的数据库中, 事务处理需餍足ACID性情, 包括原子性(atomicity)、一致性(consistency)、隔断性(isolation)与捏久性(durability).在区块链系统中, 其事务的处理雷同需餍足以上性情.为了提高系统的抽象量, 部分区块链的事务处理雷同会罗致并发机制.然则, 区块链系统的并发箝制与散播式数据库的并发箝制比较有诸多不同[30, 31].率先, 区块链系统中的事务的提交(commit)是以区块为单元, 而不是以每个事务为单元.一个区块内将包含多个事务, 这将导致针对事务的并发箝制需要推敲区块的提交规章.当一个事务与其他事务并发推论却莫得在肃清区块中提交, 将不会彰着提高系统的推论后果.其次, 部分区块链中的事务处理历程与数据库中的事务不同.举例Hyperledger Fabric中, 事务的处理包含模拟、考证等过程.当其共鸣左券达成之后, 每个节点才会推论区块内的事务.第三, 散播式数据库往往基于master- slave[32, 33]或者master-master模式[34, 35], 其中, master节点是着实任节点.由于区块链运行在不着实环境, 事务的处理过程需要推敲区块链系统所罗致的共鸣左券影响.以上不同使得散播式数据库的并发箝制无法径直应用于区块链系统.
● 查询处理方面
由于区块链应用于不着实的环境, 其查询处理的过程可归类为一般查询处理和着实查询处理.一般查询主要针对的是溯源查询等.针对着实查筹商题, 传统的针对查询闭幕的考证时期需要数据领有者产生一个期骗私钥生成的签名, 后续会期骗该签名进行考证.而在区块链系统中, 不存在完全的数据领有者.网罗中的多个节点(举例责任量证明共鸣左券下的挖矿者)均有契机添加区块到区块链中.这些有契机添加区块到区块链的节点不一定是数据自身的领有者, 进而不可能领有相应的私钥以及签名.其次, 传统的数据库签名方法针对不同的查询产生不同签名, 况兼均存储在数据库中.而在区块链系统中, 由于区块链系统不可批改的特色, 签名一朝写入区块中就不不错鼎新.因而, 当搪塞不同的查询时, 写入的签名需要餍足不同查询的考证要求.终末, 基于传统数据库生成的签名往往基于的是静态数据库.区块链是一个动态, 且对数据样貌、大小无尽定的系统, 因而可考证的签名需餍足可考证动态添加的数据的要求.
● 可扩展性方面
为了提高散播式系统的可扩展性, 传统的数据库可罗致分片机制以提高性能.分移时期会将网罗中的节点分割为多个零丁的片, 每个片内包含多个节点.片与片的数据一般存在一定的共稀有据, 从而不错保证当部分节点失效时, 依然不错复原一皆数据.而在区块链系统中, 由于节点的不着实, 需要期骗共鸣机制确保节点推论的事务等的一致性, 并能叛逆坏心节点的坏心报复.因此, 区块链的分移时期要确保某一分片内的坏心节点不成箝制该分片, 使其坏心报复举止收效.其次, 为了将分片机制应用到区块链系统中, 要确保分片环境下的共鸣机制的开销远小于分片所带来的性能的升迁.终末, 一般的散播式数据库存在master节点, 来分拨及协管事务的处理.而在区块链系统中, 径直期骗master节点来分拨事务需要推敲到master节点可能是坏心节点的情况.
本文将从以上几个不同的数据不停方面问题, 分析区块链与现存时期的异同.咱们将基于现存的数据不停时期, 尤其是散播式数据库不停时期, 来梳理并分析现存的区块链环境下数据不停问题.针对现存区块链的责任, 从安全与着实性[36, 37]、系统架构[38]、智能合约时期[39, 40]、探问箝制[41]等方面进行了综述.同期, 文献[42]主要从区块链与数据库外联结合的角度, 综述了在区块链中基于数据库的存储与查询的联系责任.与之前责任不同, 本文将从数据不停的角度, 聚焦区块链中的数据存储、事务处理、查询处理以及系统性能的方面的联系责任.
1 区块链的中枢组成在一个区块链网罗中, 包含相互不信任的多个节点, 节点间无法阐明某个节点是否为坏心节点.区块链网罗假设某些节点可能产生坏心报复, 然则网罗中大多数节点是康健节点.通盘区块链系统的节点一般可分为全节点、矿工节点和轻节点.全节点同步区块链上的所稀有据, 包括各个区块的头部哈希值、事务列表等.轻节点一般是用户的客户端.轻节点不存储区块链上的一皆数据, 而往往只存储区块头部的哈希值.轻节点有时会提交针对区块链上数据的查询等, 并期骗复返的闭幕以及自身存储的哈希值对闭幕进行考证.矿工节点是一种特殊的全节点, 该节点不但存储区块链的一皆数据, 同期参与区块链的共鸣过程.在一些区块链系统中, 矿工节点与全节点是相通的节点.本节咱们将先容区块链的中枢组成, 包括区块结构与事务、共鸣机制、UTXO与Account模子、智能合约以及区块链的类型.
1.1 区块结构与事务区块链网罗节点存储通盘区块链系统的数据以及事务的日记, 数据以区块的阵势进行存储并贯穿.节点中一个区块的数据如图 1所示, 后一个区块均包含前一个区块的哈希值(PreBkHash暗示).除此以外, 区块内还包含共鸣考证字段(ConsProof)、默克尔哈希树根的哈希值(MerkleRoot)以及事务日记所组成的默克尔哈希树.默克尔哈希树是一种二叉树[43], 其叶子节点存储事务, 而非叶子节点则存储其子节点内容的哈希值.默克尔哈希树的一个特色是:对于数据的任何变动, 会影响从叶子节点到根节点旅途上扫数节点的哈希值.因此, 扫数针对数据的修改都会从叶子节点朝上传递到根节点.因此, 期骗该性质可考证数据是否被批改.由于区块链以链式阵势存储数据并推论事务, 且区块链只允许在现存区块链的尾部添加新的区块, 该性质使得区块链不错纪录扫数对数据进行鼎新的操作, 因而其也被称为散播式日记或散播式账本.区块链中的一个事务对应于一次智能合约的齐全推论.区块链的事务也雷同要求餍够数据库中事务的原子性、一致性、隔断性以及捏久性.区块中的共鸣考证字段不错在部分共鸣机制中, 考证节点播送的音尘是否合适系统设定的要求, 其具体细节将在“共鸣机制”部分先容.同期, 区块链要求区块只能添加在区块链的尾部且不成删除.天然有部单干作计议修改区块链数据的方法[44], 然则该类责任并不修改区块链存储的数据.其方法通过设计视图荫藏需要修改的数据, 因而并不转换区块链对数据的存储和不停.
1.2 共鸣机制由于区块链网罗中节点不着实况兼其要求扫数节点均存储数据的相通状况, 当对其中一个节点的数据准备进行更新时, 扫数节点需要对更新操作达成共鸣.共鸣左券往往基于两种念念路, 分别为基于操办的共鸣左券和基于通信的左券.现存的共鸣机制大部分罗致以上两种之一或者二者之间作念一定的均衡[45].
基于操办的共鸣左券代表是比特币所使用的责任量证明(proof-of-work, 简称PoW)[26], 其旨趣为:网罗中的节点通过责任量证明, 细当前一个有职权将生成的区块添加到链中的节点.参与责任量证明的节点称为挖矿节点.举例:当一个区块的结构如图 1所示, 包括前一区块的哈希值、共鸣的考证字段以及区块内事务的哈希值时, 挖矿节点期骗这些哈希值操办出该区块的共鸣的考证字段, 使得考证字段餍足以下要求:
$ hash(PrevBKhash|ConsProof|MerkleRoot) \le Z $ (1)其中, Z这一参数箝制责任量的大小.首先操办出相应考证字段的挖矿节点将其闭幕全网播送, 其他的挖矿节点考证其收到的考证字段是否餍足方程(1)的要求:若闭幕餍足, 则将区块添加到已有区块链的尾部, 而首先操办出闭幕的节点则赢得相应的奖励.责任量证明的共鸣左券不错很好地应用于公有链网罗中, 况兼不错叛逆女巫报复[46].当坏心的算力达到全网算力的10%时, 在6个区块后阐明的走动不错保证进取99.9%的着实性[47].同期, 在责任量证明方程的闭幕播送的过程中, PoW共鸣可期骗中继节点, 通过多轮传递阵势来减少责任量证明共鸣机制的冗余网罗开销[48].
另一类型的共鸣左券则是基于通信的共鸣左券, 基于通信的左券将投票权分拨给网罗中的节点, 并期骗多轮通信达成共鸣.该左券的代表为实用拜占庭容错左券(PBFT)[27].PBFT共鸣左券需经过3个过程:pre-prepare阶段、prepare阶段以及commit阶段.当用户提交苦求时, 一个主节点会在pre-prepare阶段播送其苦求.在prepare阶段, 扫数的节点收到苦求后判断是否推论该操作:如甘心推论, 则将我方的签名添加在音尘中, 并播送给其他节点; 若不甘心推论, 则不发送音尘.当节点招揽到其他节点发送的推论操作的音尘达到一定数目时, 则说明推论操作达成了共鸣.在commit阶段, 节点推论相应的苦求, 并将推论闭幕文告给主节点.由于扫数的节点都将全网发送并招揽来自扫数其他节点的音尘, 因而在网罗中有N个节点的情况下, 其网罗开销复杂度为O(N2).
以上两种共鸣分别基于操办和通信.同期, 有其他共鸣左券改造PoW共鸣左券中的要求方程, 或在两种共鸣左券中作念一定的弃取.举例, Elastico[49], RapidChain[50], Byzcoin[51], Tendermint[52]等均期骗采样的阵势中式指导者节点, 并在指导者节点中期骗PBFT、责任量证明或其他基于投票的算法达成共鸣, 从而减少其共鸣阶段的开销.需要选藏的是, 基于操办的责任量证明共鸣并不成细目保证网罗中的事务均正当.当坏心节点箝制全网33%的算力时, 则坏心节点已有可能箝制通盘网罗[53, 54].与之不同, PBFT共鸣则是细目性的.然则由于其网罗开销为O(N2), 当增多网罗节点个数时, 网罗产生的异常开销会进取增多算力所从简的时候, 使得系统的性能跟着算力增多而缩短.因此, 径直使用PBFT共鸣将会缩短通盘网罗的可扩展性[55], 并成为部分区块链系统的性能瓶颈[22].对于其他共鸣机制的综述可见文献[56, 57].
1.3 UTXO与Account模子在区块链系统中, 典型的数据模式是比特币所基于的Unspent Transactions Outputs(UTXO)结构.以比特币为例, 在UTXO模子中, 不存在一个账户纪录一个用户所捏有的扫数比特币.每个走动均是通过已有的UTXO生成新的UTXO.换言之, 走动只是代表UTXO连合的变更, 而一个用户所领有的一皆比特币是其所领有的UTXO总额.举例, 假设用户A分别在事务1和事务2中转账2个比特币到B用户.此时, B用户有两个UTXO:UTXO1与UTXO2, 且分别包含2个比特币.当用户B缠绵生成事务3, 并在事务3中转账3个比特币到用户C的账户时, 事务3的输入需要包含的是B用户的UTXO.本例中, 事务3的输入不错为UTXO1以及UTXO2.之后, 在事务推论过程中, 事务将输入的UTXO标记为已奢靡的状况, 并生成一个新的包含3个比特币的UTXO, 并将其转念到C用户.同期, 事务生成一个UTXO包含剩下的一个1个比特币, 并将其转念到B用户.通过UTXO这一模子, 扫数走动均在已有的UTXO之上进行, 大多数走动只需要判定是否存在双花(一个UTXO被屡次走动)即可.因而, 走动是否被推论不错很快地考证, 况兼具有很高的阴私性.然则由于其不存在账户的想法且走动需要基于UTXO, 其编程复杂度较高.
另一种数据模子是Ethereum所罗致的Account模子, 该模子下一个账户包含用户扫数可用的电子货币.当一个走动被提交时, 相应的事务率先判断账户内的电子货币是否足以完成该走动:如若不错, 则该走动被推论; 不然, 走动被取消.与UTXO比较, Account模子更容易领略, 并从简了大都的存储空间.而UTXO则不错更好地保护用户阴私.
1.4 智能合约智能合约最早于1994年由Szabo建议[58], 其设计为:在一个操办机系统中, 当一些事务被推论时, 不错引发相应的代码自动推论, 并产生相应的输出合约.然则由于很难确保智能合约的代码等不被批改, 因而其在内容的应用受到了很大的限定.跟着区块链时期的发展, 期骗区块链所因循的数据不可批改的特色, 区块链上的智能合约得到了越来越多的醉心.智能合约不错看作是一段区块链扫数节点都招供的代码.部署在区块链上的智能合约需罗致该区块链系统可推论的代码, 并雷同存储于区块中.当智能合约的要求被餍足时, 合约自动被激活并推论相应的代码.举例, 一个推论转账功能的智能合约聚率先判断其激活要求是否被餍足:若被餍足, 则进一步考证相应的事务是否可推论, 包括事务是否被批改、开销账户的金额是否弥散等.在考证正当之后, 合约将自动推论相应的事务.
1.5 区块链类型笔据节点加入或退出区块链系统的阵势, 区块链系统可分为公有链、定约链、独有链这3类.
● 公有链系统也称为非许可链, 允许任何节点参与区块链数据贵重和读取, 同期, 节点也不错随时加入或离开该网罗.因此, 公有链系统是一个完全的去中心化的系统.典型的公有链系统包含比特币[1]、以太坊[60]等.在公有链中, 其共鸣机制一般是基于操办的责任量证明共鸣.表面上, 坏心节点需占有网罗中51%的算力, 才不错箝制该区块链;
● 定约链也赞许可链, 是一种新加入的节点需要赢得许可的区块链.定约链限定可参与的成员节点, 且节点的读写权限以及所发达的操办由定约链的设计执法来细目.典型的定约链包括Hyperledger Fabric[59]等.通盘定约链由扫数节点共同贵重, 然则与公有链不同, 定约链不错假设网罗中部分节点是着实的.节点的加入以及共鸣过程一般通过着实的节点箝制.定约链一般不罗致责任量证明的共鸣机制, 而是多罗致PBFT等基于通信的共鸣算法;
● 独有链则仅限信任的个体使用, 且不完万大致措置信任问题.网罗节点相互之间需要透明, 但分歧外公开.
2 区块链的数据存储在区块链的多样应用中, 数据的存储是底层设计中相配迫切的档次.由于数据库的通俗应用终点丰富的数据不停用具, 好多责任联系期骗数据库的存储来结束区块链的数据存储不停.针对区块链数据的存储模式主要集结在两个标的.
● 一个标的为基于键值对的存储模式, 该模式下存储的任一数据纪录包含一个不错细目该纪录的主键, 并将其余部分视为该主键所对应的数值进行存储.该模式数据结构约略, 不错在处理大范围数据时赢得很好的性能;
● 另一个标的是罗致相关型数据的存储模式, 该模式将数据以相关模子的阵势建模并存储.在该模式下, 不错保证数据餍足诸多适度要求, 举例数据库的一致性、原子性等.因此, 部分公司也曾推出了基于数据库的区块链系统, 包括Amazon QLDB(https://aws.amazon.com/cn/qldb/)以及ORACLE blockchain table(https://blogs.oracle.com/blockchain/)等.该类区块链在数据库的基础上, 通过设计共鸣机制, 确保各个节点数据的一致性.
由于区块链上数据存储的本钱远高于一般数据库, 部单干作罗致再行编码、链上-链下结合等阵势来减少区块链数据存储的开销.因此, 咱们也将从键值对模子和相关数据模子两个标的对其进行综述, 并先容针对区块链数据存储的优化时期.表 1分别从性能、可拓展性以实时期复杂度方面, 比较现存对于数据存储的责任.
Table 1 Comparision of the approaches for data storage in blockchains 表 1 区块链存储时期的比较 2.1 基于键值对的数据存储模式在区块链的应用中, 许多系统率受基于键值对的文献系统存储其数据状况.由于基于键值对的数据库往往具有比较高效的查询处感性能, Hyperledger Fabric[60], Ethereum[59]均罗致键值对数据库存储其数据.比较常见的区块链键值对存储系统包括LevelDB[61], RocksDB[62]等.
在典型的区块链系统中, 各个节点均要存储区块链内数据的备份.在这种情况下, 数据在链上的存储代价极高.同期, 推敲到部分共鸣左券需要大都的网罗开销, 在数据范围极大的情况下, 径直将所稀有据存储于区块链中将产生高大的存储开销和网罗通信代价.因此, 部单干作旨在以较小的代价提高数据存储范围, 包括散播式存储、链下存储等时期.
文献[63]联系通过散播式编码的阵势提高区块链存储范围.具体而言, 区块链的节点分为多个区域, 况兼保证每个区域内的扫数节点数据不错通过整合, 生成通盘区块链数据.因而在这种情况下ed2k白石茉莉奈, 一个区域的单一节点不需要存储通盘区块链内数据副本, 而只需要存储部分数据即可达到数据一致性的要求.在编码过程中, 率先假设要将数据分割为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中, 每个叶子节点包含相应的数据, 而非叶子节点保存其子树的键值.非叶子一般存在多个不同的分支.与此同期, POS-Tree期骗默克尔树的性情, 对每个节点操办其相应的哈希签名.里面节点的签名由其子节点的签名决定.因此, 当一个分支的根节点哈希值莫得变化时, 则不错细目该节点的扫数子节点所包含的内容均莫得更新版块.相应的, 当两个Pos-Tree中节点的数据不同期, 势必导致其祖宗节点的签名不同.因而在查找不同的数据时, 只需从签名不同的根节点开头, 搜索其子树中带有不同签名的节点即可.在文献[22]中, Forkbase被应用于Hyperledger Fabric, 以取代Hyperledger Fabric的存储层.
2.2 基于相关型数据的存储模式在相关型数据中, 数据往往以表的样貌进行存储.存储于肃清表的数据具有相通的模式, 而不同表之间的数据笔据主外键等产生关联相关.相关型数据一直以来都被通俗应用于企业的不停等诸多方面.文献[68, 69]建议了BlockchainDB这一将数据库的相关模子想法与区块链结合的系统.由于企业间的走动往往但愿将部分相关型数据在二者之间公开并赢得共鸣, BlockchainDB主要针对分享表类型数据, 并在多个用户均需要对分享表进行操作的情况下, 因循对表进行数据考证.该系统率受定约链的设计阵势并假设节点不着实.区块链算作数据的存储层, 保证数据在不着实环境下的一致性.在一个BlockchainDB系统里面, 节点间存在多个分块.每一块零丁时贵重一个区块链并存储分享表的部分数据.每一块零丁的区块链保证了分块内数据的一致性.
在每一块的区块链存储层之上, BlockchainDB构建数据库层.数据库层发达的任务包括:(1)数据库层纪录表的任一笔纪录存储在哪一些分块中; (2)提供用户可径直调用的API; (3)保证用户提交的事务处理一致性.当需要进行读写操作时, 用户需提交数据场所分片的ID.之后, BlockchainDB会在相应的分片中推论读写操作.由于罗致分块的阵势不停数据, 当用户赢得数据时, 需考证所得到的数据是否被坏心批改终点齐全性.作家在文中建议了Online和Offline两种考证方法.
● 在Online考证方法中, 用户在提交读苦求并赢得相应的数据之后, 播送其所读数据并要求扫数存储该数据的节点进行考证.如若大部分节点复返的音尘暗示所需要考证的苦求以及数据合适土产货的数据, 则复返招供读取到的数据的音尘.当大多数的节点均招供所读数据时, 则以为数据已被考证; 不然, 则判定读取的数据被坏心批改;
● 在Offline考证方法中, 罗致延长考证阵势, 即:当用户提交考证苦求且考证苦求达到系统设定的参数e时, BlockchainDB开头进行考证.
3 区块链事务处理与数据库中对事务处理的要求类似, 区块链中的事务雷同要求保证其原子性(atomicity)、一致性(consistency)、隔断性(isolation)与捏久性(durability).原子性要求事务的扫数操作或者一皆完成, 或者一皆不完成, 而不会存在中间状况.在区块链中, 当一个智能合约对多个区块链进行操作时, 雷同要求其扫数操作一皆完成或一皆不完成.隔断性则是针对数据资源的并发探问, 规定了各个事务之间相互影响的进度.在区块链中, 为了提高抽象量, 区块链中的并发箝制也得到极大的热心[71].在本部分, 咱们将从原子性、隔断性、一致性这3个角度, 综述现存责任中区块链的事务处理时期.表 2讲究了部单干作针对事务的3个性情所罗致的主要时期阵势终点针对的事务处理的阶段与对象.
Table 2 Comparison of the approaches for transaction execution 表 2 针对事务处理的时期比较 3.1 确保原子性的处理时期文献[72]联系多链之间事务的处理过程, 以保证其原子性.当一个事务需要在不同的链上进行读写操作时, 一个保证原子性的径直作念法是:将多个链合并成一个链, 进而使得扫数的事务处理只需在一个链上进行.这种阵势在不需要推敲数据阴私的情况下是可行的, 然则内容中, 用户或组织之间进行走动时, 不但愿自身里面的走动也被公开.换言之, 当事务波及多个链时, 需要推敲每个链上单独的数据阴私问题, 同期也要确保跨链操作的着实性.因而, 文献[72]建议事务应存储在扫数与其有关的链上.同期, 跨链的事务应该保证原子性, 即只能在扫数有关的链上均推论操作, 或者均不推论(即abort).
为了保证事务的原子性, 文献[72]建议了两类方法.
● 第1类方法需要区块链网罗中存在异常的发达排序的节点.率先, 扫数的事务均播送其签名, 从而确保发送音尘的着实性; 之后, 扫数的区块链针对其自身所需要处理的事务, 酿成自身的事务处理规章; 在酿陈规章之后, 区块链的节点将需要参与跨链操作的事务以及该事务在土产货区块链事务规章中的前一个事务的哈希值, 合并为一个音尘进行播送; 对于发达排序的节点, 其赢得的音尘包括跨链事务以及跨链事务在各个区块链中前一个推论事务的哈希; 排序节点笔据赢得的音尘, 细目跨链事务是否推论以及推论规章;
● 第2类方法莫得相应的排序节点, 然则各个区块链有部分节点参与跨链事务的排序.具体而言, 与第1种方法类似, 率先, 各个区块链生成独自的事务推论规章; 在酿陈规章之后, 区块链的节点雷同将需要参与跨链操作的事务以及该事务在土产货区块链事务规章中的前一个事务的哈希值, 合并为一个音尘进行播送.与第1种方法不同, 该播送发送到扫数区块链的各个参与排序的节点中.参与排序的节点期骗PBFT或Paxo等基于投票的共鸣左券, 细目跨链事务产生的规章, 并将其播送到扫数链的节点.各个区块链依据产生的规章推论事务.
文献[72]期骗异常的节点或已有区块链网罗中的部分节点, 发达事务中扫数操作的推论规章问题, 以保证事务的原子性.与之不同, 文献[73]推敲期骗锁机制结束跨链事务的原子性.当需要跨链事务时, 率先, 区块链A的用户期骗智能合约对其金钱进行加锁操作, 使其不成被其他事务使用.同期, 期骗哈希函数h=H(s)产生签名并将签名与金钱写入到智能合约中.该智能合约中需添加要求为:如若另一方不错提供s’, 使得h=H(s’), 则向另一方转账A中被锁定的金钱.另一方可通过梭巡智能合约, 阐明合约的要求以及相应的h值.之后, 在自身的区块链部署智能合约.合约的框架为:如若A提供S, 使得h=H(S), 则向A转账.文献[73]期骗以上的基于哈希函数锁机制, 结束了跨链走动的原子性.
文献[73]的方法不错保证跨链事务的原子性, 然则其要求扫数的参与者需先选举一个指导者, 并由指导者串行地部署相应的智能合约, 而串行的阵势导致部署智能合约的开销很大.文献[74]针对文献[73]的问题, 联系如安在多条区块链并发地部署智能合约, 同期保证跨链事务的原子性.其中枢念念想在于:通过智能合约, 确保当事务的原子性莫得被餍足时, 相应的事务被隔断况兼回滚扫数也曾推论的操作.举例A捏有比特币与B捏有的以太币进行兑换, 惟有当A, B均赢得对方的货币时候, 通盘事务才不错收尾.当A转账给B, 然则B莫得转回相应的金额时, 则该事务在被隔断的同期, 需确保A拿回我方的那一部分金额.在文献[74]中, 作家假设每一组交换类型的事务中有一个发起者, 况兼有一组节点发达各个区块链间的共鸣.该组节点被称为不雅察网罗.事务的发起者发达部署智能合约到该组节点中.率先, 多组交换的事务不错建模为一个图.图中的节点暗示一个账户, 边暗示账户间的走动.一个正当的交换事务需要餍足的要求为:该事务所对应的图, 在删掉暗示发起者的节点之后, 余下的图不不错存在环.发起者将事务所对应的图结构签名并播送.其余参与走动的账户考证该图结构, 并部署相应的智能合约在自身的区块链中.同期, 发起者部署一个智能合约到不雅察网罗中.该智能合约的触发要求为:当扫数相应的账户均推论对应的智能合约后, 阐明走动; 不然, 则将扫数智能合约锁住的金钱回退到相应的账户中.在文献[74]中, 不雅察者网罗既不错是着实的节点, 也不错追悼着实的环境.
3.2 确保隔断性的处理时期为了提高区块链系统的事务处理后果, 散播式系统中的部分并发箝制时期也曾被应用到区块链系统中.本末节主要综述针对事务隔断性的时期.
在数据库中, 针对事务的并发处理, 典型的阵势罗致先排序后推论的政策.在区块链系统中, 好多系统依然沿用这种政策[1, 59].率先, 在排序过程中, 扫数的节点需要达成一个针对扫数事务规章的全局共鸣; 之后, 在推论阶段, 扫数节点在土产货按照也曾达成共鸣的规章推论相应的事务.与数据库中的先排序后推论的政策不同, 在Hyperledger Fabric[60]区块链系统中, 其责任历程则是罗致先模拟后排序的念念路, 如图 2所示.通盘历程包含了模拟阶段、排序阶段、考证阶段、推论阶段这4个部分.
Fig. 2 Transaction processing in Hyperledger Fabric 图 2 Hyperledger Fabric中的事务处理历程● 在模拟阶段, 客户端将一系列的事务处理苦求提交给部分节点.收到苦求的节点将在土产货的数据中模拟事务的推论.节点会产生一个签名并将签名以及事务所需进行的读写数据连合进行播送;
● 在排序阶段, 排序就业节点招揽扫数提交的事务并细目事务推论规章.默许情况下, 事务会按照提交时候的规章进行排序.在排序收尾之后, 这些事务被组织成一个区块并分发给网罗中的节点;
● 在考证阶段, 节点按照规章细目事务是否可推论.在该阶段需考证两部天职容:
➢ 率先, 节点考证事务的签名是否餍足共鸣要求.如若不餍足, 证明存在节点批改了客户提交的事务.此时, 该事务被标记为不可行;
➢ 其次, 节点考证提交的事务规章是否存在读写打破.如若某一事务与排序在其前边的事务存在读写打破, 则该事务被标记为不可行.
● 在推论阶段, 扫数可行与不可行的事物均被写入区块中.同期, 可行的事务被推论.
常用的先排序后推论的政策在排序之后, 区块链中的各个节点只能规章地推论相应的事务.而Hyperledger Fabric则不错期骗模拟阶段的闭幕, 并发地推论事务并保证数据的一致性, 从而提高系统性能.针对Hyperledger Fabric的各个阶段, 如表 2所示, 许多责任针对不同阶段建议相应的优化时期, 以提高系统的并发度.
在事务的并发箝制过程中, 如若事务间存在读写打破, 那么惟有部分事务不错收效推论.其他的事务将被中止.在文献[75]中, 通过试验发现:即使Hyperledger Fabric不错提高事务的并发度, 径直期骗读写打破处理区块链的事务依然导致大都的事务被隔断.文献[75]联系通过转换事务的推论规章, 减少事务中止的个数, 从而提高并发度.在Hyperledger Fabric的“模拟-排序-考证-推论”过程中, 不错从两个方面提高事务的并发度.
● 率先, 一个区块中的事务默许按照提交时候的规章进行处理.关联词, 不错通过转换区块内事务的规章, 使得蓝本被隔断的事务在新的规章下莫得打破, 从而不错顺利推论;
● 其次, 事务的处理过程需要4个阶段, 而现存责任只能在考证阶段判断事务是否被推论或隔断.如若不错在该阶段之前判断事务不可推论, 则不错提前将事务标记为隔断状况, 从而从简后续阶段的开销.
基于以上两点, 针对区块内事务的规章问题, 文献[75]建议了期骗打破图的方法产生推论规章的算法.具体而言, 在打破图中, 图中的一个节点暗示一个事务.当两个事务Ti, Tj存在读写打破时, 相应的事务的点之间存在一条有向边Ti←Tj, 暗示Ti应在Tj之前推论.而一个区块中, 代表扫数可推论事务的点以及之间的边所组成的图一定是打破图中的一个无环子图, 因而作家建议了启发式的算法, 在打破图中, 通过查找其中最大的无环图, 进而产生相应的事务推论规章的算法.
同期, 针对区块间的事务读写打破, 作家建议分别在模拟阶段与排序阶段判断事务是否可行的机制.如若不可行, 则事务不需参加到下一个阶段.在模拟阶段, 系统的节点需对数据进行读操作.节点的数据都添加了相应的版块号.当一个事务的多个读数据的版块号不一致时, 则证明部分读入的数据也曾被其他事务修改, 则该事务被标记为不可行.在排序阶段, 当两个事务都需读入相通数据且后一事务读入的版块号与前一事务不相通期, 则后一事务被标记为不可行.其原因在于:Fabric的事务推论不是以单一事务为单元, 而是以区块内扫数事务为单元, 因而区块内事务读入的数据应具有相通的版块号.
ParBlockchain[76]以及文献[77]联系了在Hyperledger Fabric中事务的并行问题, 并针对推论阶段进行优化.在ParBlockchain的推论阶段, 与文献[75]类似, 部分节点笔据事务的读写打破建造相关依赖图.图中的节点暗示事务, 并用有向边暗示事务的打破.该图在建造后, 被传送到发达排序阶段的节点中.排序节点笔据相关依赖图阐明事务的推论规章.在推论层面, 当多个事务属于不同的应用, 或者不共事务之间不存在读写打破时, 则这些事务不错并行推论.ParBlockchain将推论事务的节点按照不同的应用进行分类, 一个节点只发达处理一部分应用的事务.当需并行推论不同应用的事务时, 处理不同应用的节点可并行地推论对应应用的事务.在推论完成之后, 各个节点播送其推论闭幕, 即可保证扫数节点数据的一致性.
以上责任东要针对的是排序与推论过程.针对考证阶段, 文献[78, 79]联系针对智能合约考证过程的并发箝制.智能合约在公有链上的推论一般分为两个阶段:在第1个阶段, 挖矿节点发达串行的推论智能合约代码并将更生成的事务、智能合约的新状况、前一个区块的哈希等均存储在一个新的区块中, 之后, 该区块融会过挖矿节点间的共鸣, 加入到区块链中; 在第2个阶段, 扫数网罗中的节点会考证该区块内的事务与闭幕是否与土产货的数据一致, 惟有当对应的数据均一致时, 该区块才会被节点所招揽.因此在第2个阶段, 智能合约所产生的事务会串行的被节点再行推论.文献[78, 79]通过不同的机制结束该阶段智能合约的并发考证.在文献[78]中, 作家期骗加锁的阵势结束并发箝制.对于挖矿节点, 其在推论智能合约代码的同期生成happens-before图.该图中, 每个节点代表一个智能合约, 节点与节点的边纪录智能合约的推论需衔命的先后规章, 该规章可笔据智能合约间的读写打破细目.挖矿节点在生成happens-before图之后, 将其写在区块内.区块链网罗的节点需要考证区块内容时, 可笔据happens-before图, 阐明不错并发推论的智能合约.与文献[78]中加锁机制不同, 文献[79]则期骗软件事务内存(STM)机制来处缄默能合约的并发推论.文献[79]将一个智能合约视作一个原子事务, 原子事务中包含的操作只能能一皆推论或者一皆取消.在考证过程中, 扫数智能合约均会按照时候戳的规章并发地推论.同期, 节点会检测智能合约之间是否存在读写打破.当智能合约间存在打破时, 则隔断其中一个合约, 并在之后再行提交该智能合约的事务.文献[80]则联系事务处理的规章怎么餍足拜占庭容错.
3.3 确保一致性的处理时期针对事务的一致性, 文献[81]建议期骗数据库的一致性来处理区块链中并发事务的一致性问题.现存数据库不错因循推论多种事务与查询, 因而在数据库上建造区块链的一个中枢问题是:怎么确保所稀有据库节点推论事务的规章完全一致, 从而不错保证节点数据的一致性.在文献[81]中, 为了保证区块链的安全性, 作家假设在定约链的环境中, 每一个节点均需要对其提交的每一个事务进行签名.其余节点可笔据签名考证事务的着实性.为提高抽象量, 在细目事务处理规章时, 作家优化了快照隔断的并发箝制方法[82, 83], 使其从针对事务的并发拓展到针对区块的并发, 并建议两种针对一般事务的并发箝制政策.
(1) 传统的先排序后推论并发箝制.在该阵势框架下, 系统中的部分节点发达对提交的事务进行考证比肩序.由于在区块链中, 一个区块内的事务需一皆推论之后方能完成, 当存在写操作时, 若罗致传统数据库中的快照隔断方法, 在多个事务均对一个数据进行写操作时, 一个事务需恭候之前扫数的事务写操作均完成之后方可开头推论, 这将导致系统性能大幅下跌.因而作家建议:在事务推论阶段不推敲事务所处的区块, 而是径直对事务进行排序.与此同期, 对数据的写操作会产生多个副本.当事务完成时, 按照事务在区块链中的规章阐明所产生的多个副本中的一个为正当的副本.
(2) 先推论后排序的并发箝制阵势.在该种阵势下, 雷同期骗快照隔断来进行事务的并发处理.然则该阵势需要处理3个问题:率先, 先推论再排序要幸免幻读的可能, 即读入还未写入的数据; 其次, 要幸免脏读的可能, 即读入已被更新的数据; 终末, 网罗中不同的节点由于延长等原因, 数据可能未达成一致, 进而可能使得事务所需探问的数据不存在.为了处理这些问题, 作家建议了基于区块高度的快照隔断.具体而言, 每一个数据库节点都按照区块链的内容来存储数据.每一个节点纪录相应的已写入的区块链的个数.区块链的个数可区分现存区块链的快照.当一个节点A的区块的个数多于另一节点B时, 则A节点的数据已更新, 而B的数据还未更新.作家设计了基于区块链高度的并发快照隔断方法, 确保扫数的节点均可在事务完成后, 保证数据的一致性.
文献[68, 69]建议了BlockchainDB, 一个将数据库与区块链相结合的系统, 并设计了多种一致性水平, 以提高事务写的后果.在这种情况下, 当用户提交查询时, 数据库层的TransactionManager发达分发提交的查询并确保不同的一致性.具体而言, BlockchainDB有两种一致性水平可供聘请.第1种为串行一致性.在串行一致性中, 扫数的写操作按照提交的规章插入队伍中.当多个写操作同期对一个数据进行写操作时, 惟有队伍中的第1个写操作不错被推论.其他的写操作均处于恭候状况, 直到写操作完成.第2种为最终一致性.在最终一致性中, 写操作依然按照规章插入到队伍中, 然则扫数的读操作不错就地推论.在这种情况下, 脏读的情况可能会发生, 即数据在被读入之后, 被其他的写操作隐敝, 因而之前所读的数据与存储的数据不一致.当用户提交查询时, 由分片不停器阐明查询所需的数据处于区块链中的位置.之后, 该位置的数据会被并行地读写.由于BlockchainDB因循不同的一致性, 查询的后果在不同的一致性下将会不同.举例, 在串行一致性下, BlockchainDB的查询可能需要恭候队伍中写操作的完成之后才可进行.
4 区块链查询处理在区块链中, 所稀有据均以链表的样貌存储.与一般数据库的查询不同, 区块链存储的数据包含在扫数事务当中.区块链查询分为一般查询与着实查询.表 3从对相关型查询语句的因循、着实性查询以及链上链下数据查询等多方面比较了最新的联系责任.
Table 3 Comparison of the query processing in blockchains 表 3 区块链查询处理比较 4.1 一般查询处理LineageChain[84]联系区块链环境下数据溯源查询的后果问题, 并因循需要数据溯源的智能合约.
LineageChain针对每个数据, 赋予其驱动版块号.当一个事务对数据进行读写操作时, 事务的输出可能是新的数据或者更新现存数据的版块.这注意况下, 如若一个区块内还有不共事务时, 则不错视作一个区块的事务对前一区块数据库状况进行的修改.因此, 数据版块号与区块同步递加.LineageChain将这种递加相关建模成为一个无环图.当需要溯源查询时, 期骗无环图中点的拓扑序进行搜索.
与文献[84]需异常构建图结构不同, 文献[85]联系期骗智能合约细目数据的相关, 并对数据进行溯源查询.当一个数据的创建者创建一个文档时, 创建者可在区块链中部署一个智能合约.该合约的功能包括鼎新数据领有者、添加可探问用户、进行溯源查询等.同期, 该合约要求扫数对指定文献的鼎新需经过投票过程.参与投票的用户由数据领有者细目.对数据的任性一次鼎新需至少半数以上的用户投票甘心才可进行.在这种环境下, 坏心的用户若对数据进击罪意批改, 需箝制半数以上参与投票的用户.同期, 由于扫数的修改均期骗部署的智能合约, 因而对数据的溯源查询飘摇为对智能合约调用的查询.
部单干作联系区块链查询处理语, 使其与数据库的SQL查询语句类似[86-88], 文献[88]建议了SEBDB, 并设计了与数据库SQL语句类似的查询语句, 使之不错完成在区块链中对相关型表的建表、插入、聘请等操作.在SEBDB中, 数据分别罗致链上链下存储阵势.链下存储的数据由一个土产货相关型数据库进行不停.针对链上与链下的数据, SEBDB设计了包括结合操作等语句.当只需要链下数据进行结合操作时, SEBDB不错径直期骗土产货数据库的Join语句来进行.当需要链上链下数据同期进行结合时, SEBDB率先扫描链上数据, 并期骗hash-join的方法将其与链下数据进行结合.为了提高查询后果, SEBDB设计了区块层级的B+-Tree.SEBDB期骗区块ID、事务ID以实时候戳算作每一个B+-Tree里面数据的排序键值.当给定区块ID、事务ID或者时候戳时, 可期骗区块级的B+Tree, 快速找到存储相应数据的区块.同期, SEBDB建造表与区块的索引, 即每个表的索引指向扫数包含对该表进行操作的事务的区块.期骗以上索引, 使得对链上数据的探问不需扫描扫数区块.文献[89]在SEBDB基础上, 通过建造数据的视图, 进一步提高其查询后果.
4.2 着实查询处理推敲到区块链应用在不着实的环境下, 当用户提交查询并赢得查询闭幕时, 往往需考证其查询闭幕的着实性[90-93].文献[94]建议了一个区块链系统vChain, 结束了高效的可考证查询处理算法.该系统假设用户节点并不一定存储通盘区块链的一皆数据, 而是只存储扫数区块中的哈希值.由于一个区块的哈希值所占的存储空间远远小于区块内存储事务所奢靡的空间, 因而该假设即使在轻量级的硬件环境下也可结束.为了考证查询闭幕, 在每个区块中添加一个异常的定名为AttDigest的字段.具体而言, AttDigest由多连合加密累加器(cryptographic multiset accumulator)所生成.所生成的AttDigest具有如下性质:给定肃清公钥, 当需考证两个连合的杂乱是否为空时, 不错通过各自的AttDigest径直考证.期骗该性质, 当查询要求不错抒发为连合杂乱的样貌时, 可期骗复返闭幕的AttDigest与查询要求中连合的AttDigest进行比较, 来细目复返的闭幕与查询的要求是否存在杂乱.如若发现二者不存在杂乱的相关, 则考证查询闭幕和查询要求不匹配.
文献[94]进一步将该方法彭胀到范围查询.范围查询中, 用户会对值域为数字的属性给定一个区间.查询闭幕复返在该区间中餍足要求的数据.当考证范围查询的查询闭幕时, 无法径直将AttDigest应用到范围查询中.其原因在于, AttDigest只适用于判定连合的相关.因此, 作家将范围查询飘摇为连合查询.具体而言, 率先, vChain将所稀有字以二进制样貌进行璀璨, 并将其视作字符串.期骗二进制暗示, vChain构建了前缀树来暗示所稀有字.每个叶子节点是一个具体的数字, 而非叶子节点对应一个数字的范围.当一个查询中包含范围要求时, 该范围对应前缀树的一部分一语气的叶子节点.因此, 可将其飘摇为基于前缀的连合暗示样貌.举例, 当查询范围为[0, 6], 且该属性数据的范围为[0, 7]时, 其对应的抒发样貌可为0*∩10*∩110.标记*暗示二进制的0或1.基于此连合暗示, 则不错将AttDigest的签名雷同应用于范围查询.
同期, 为了提高考证后果, vChain建议了区块内以及区块间的索引.区块内的索引为一种类似于默克尔树的结构.树中的每一个节点包含3个域, 分别为左子树哈希值、右子树的哈希值和连合属性所包含的元素.期骗该树结构, 查询处理不错看作对树的搜索.当搜索到树中节点时, 如若该节点的连合的AttDigest不餍足查询要求, 则不需要络续搜索该节点的子节点.雷同的念念想也被用来建造区块间的索引.vChain将区块按照指数递加的阵势来分段.举例, 每段区块域包含的区块的个数分别为2, 4, 8等.每一个区块域均操办相应的AttDigest.当一个区块域所包含的扫数连合元素所产生的Attigest均不餍足查询要求时, 则通盘区块域不错不被搜索.期骗区块内以及区块间的索引, vChain提高了查询考证的后果.
雷同针对范围查询, 文献[95]联系在以太坊框架下, 查询闭幕考证的开销问题.开销是指在以太坊框架下, 推论操作所产生的gas开销.在以太坊的框架下, 当用户需要存储以及推论智能合约时, 需要支付相应的gas.gas可由以太币兑换.在智能合约中, 不同的操作需要支付不同数目的gas.举例, 从区块中读数据需要200gas, 更新操作需要5 000gas, 而写操作需要20 000gas.在这种情况下, 当用户推论查询考证时, 一个考量是怎么用尽量少的gas来达到考证的目的.基于此, 作家建议了GEM2-Tree这一数据结构, 来达到减少gas开销的目的.一般考证查询闭幕需要区块链以及用户端均产生相应的考证签名, 并在查询复返闭幕之后, 通过签名进行查询闭幕考证.针对区块链这一读写操作开销诀别极大的情况, 作家建议期骗代价低的读操作代替代价高的写操作的念念想, 并建议了SMB树.SMB树是一种压缩的默克尔树, 它并不剖析地存储默克尔树的非根节点, 而是只在区块中存储其根节点的哈希值.通盘智能合约的索引包含一个齐全的默克尔树以及多个SMB树.新加入的数据老是先加入到SMB树中.由于SMB树一般范围较小, 是以针对插入操作, 其gas开销较小.由于区块链中包含一个默克尔树和多个SMB树, 当推论范围查询时, 就业器需要搜索通盘默克尔树, 并在相应数据上推论查询处理过程.在得到闭幕的同期, 就业器也需要将包含闭幕的默克尔树或者SMB树的考证信息一皆复返.客户端赢得扫数考证信息后, 需要期骗相应的考证重构默克尔树或SMB树并进行查询考证.
Veritas[96]针对数据库分享表的情况, 设计因循考证的区块链.Veritas将数据存储在数据库中, 况兼允许分享表可被网罗中的节点探问.在数据库以外, 数据签名以及共鸣投票则存储在区块链中.为了保证分享表在各个数据库的一致性, Veritas期骗着实的节点来对事务进行排序.与一般的区块链系统不同, Veritas的各个节点只在自身的数据库中推论针对分享表的事务.扫数节点在一段时候内播送其扫数更生成的日记以及推论事务所进行的读写数据.扫数节点对于播送的日记以及数据, 期骗投票的阵势来确保一致性.
5 区块链可扩展性散播式系统的可扩展性主要推敲两个方面的身分:每秒处理事务数(TPS)和网罗节点数.而区块链在这两方面均受到一定的制约[23].其原因在于:为了餍足拜占庭容错, 节点间需要餍足共鸣左券要求.不管是基于操办的共鸣左券如故基于通信的共鸣左券, 都会产生极大的操办开销和网罗开销.另一方面, 传统的中心化系统可期骗均衡不同节点的责任量等阵势提高系统的抽象量.然则在区块链中, 节点均存储区块链中的数据且均需推论相应的事务.
文献[97]计议了提高区块链抽象量的诸多挑战.部单干作, 举例BigchainDB[87]等, 针对比特币所因循的UTXO这类走动数据模式进行优化, 以提高可拓展性.而大部分提高区块链抽象量的责任针对的是Account模子下的数据模式.由于区块链系统中, 共鸣的达成是基于区块的粒度, 是以一种约略的提高抽象量的方法是通过调理系统的各个参数, 举例区块的大小, 使得系统的TPS得到升迁.该种方法在公有链环境下对性能有一定的升迁.然则StreamChain[98]指出, 转换区块的大小不错提高基于责任量证明共鸣左券下的区块链系统抽象量.而在定约链中, 多罗致的是基于通信的共鸣.在这种情况下, 增多区块的容量反而会使系统性能缩短.部单干作建议了将区块链的链式结构拓展到无环图[99, 100]或期骗侧链[101-130]的阵势, 以提高区块链的共鸣后果.然则由于无环图雷同不错产生一个全局的区块规章, 况兼不错笔据该序列飘摇为链式结构, 因而本节主要针对链式结构下提高区块链可扩展的时期, 尤其是分片以及链下事务处理时期.
5.1 基于分片的区块链系统为了提高抽象量, 将数据库中的分移时期引入到区块链系统中是联系的一个热门问题[104].表 4讲究了部分区块链可扩展性的特色.
Table 4 Comparision of the scalability of blockchains 表 4 区块链可扩展性比较Elastico[49], RapidChain[50], Omniledger[105]等系统期骗分移时期大幅度升迁了系统的抽象量.在一般情况下, 系统中扫数节点差异为多个片且每个片包含多个节点.这么, 每个片都具有一定的算力不错因循区块链的共鸣左券.由于罗致了分移时期, 且区块链系统运行在非着实环境中, 片的差异需要保证存在坏心节点前提下, 依然不错安全进行事务处理.因此, 现存的基于分片的区块链责任大多需要在每个事务处理过程中, 进行片的巧合再构建等操作[23, 49, 105], 以保证坏心节点无法箝制一个片.同期, 为了缩短共鸣阶段的开销, 大多数系统会中式一部分节点组成委员会, 且惟有委员会节点参与共鸣阶段.为了保证安全性, 部分区块链会在一段时候后, 对委员会节点进行再行聘请或替换.
Elastico[49]最早建议在公有链系统中罗致分片模子.在Elastico中, 通盘网罗被分为多个片.Elastico率先会要求扫数节点操办基于责任量证明的考证字段(公式(1)).首先得到该函数哈希值的C个节点称为字典节点.字典节点发达纪录通盘网罗扫数节点所对应的片.网罗中的节点由其PoW提交的结断然定该节点将被分拨到哪个片, 因而节点的分拨具有巧合性, 况兼坏心节点无法细目其是否分拨到肃清个片.同期, 为选藏女巫报复, 每个新加入Elastico公有链的新节点都必须先推论PoW, 网罗中的现存节点考证新节点的PoW并授权其加入彀罗.
当一笔走动提交到网罗时, Elastico会笔据事务发送者的地址, 巧合分拨到不同的片中推论.各个委员会内对事务期骗PBFT等机制达成共鸣, 并最终将达成共鸣的事务提交到最终委员会.其中, 最终委员会的节点亦然笔据委员会节点ID进行巧合聘请.最终委员会在节点中运行PBFT共鸣左券, 从而确保通盘网罗的一致性.由于分片具有巧合性, 当每个分片的节点数目不低于600个时, 其中三分之一的节点是坏心的概率为百万分之一, 因而系统的安全性不错得到保证.每推论一定数目的事务, Elastico中扫数的节点再行操办PoW, 以便再行分拨节点所属的片.为减少片间的通信, Elastico的音尘通过C个字典节点进行传递, 使得其最优的通信复杂度为O(Cn).
Elastico在处理跨片事务的过程中, 如若事务所需探问的数据在一个片被加锁, 但在另一个片被拒却, 将会导致被加锁的数据恒久处于锁的状况.为了措置该问题, Omniledger[105]在进行跨片事务考证时, 采纳两步考证来幸免出现由于部分犯警输入而导致的事务中断.率先, 在第1阶段, Omniledger锁定扫数输入分片以及输出分片.扫数输入分片搜检自身场所的片内输入是否正当:如若正当, 则生成一个包含本走动的区块签名的招揽证明; 类似的, 如若犯警, 则生成拒却证明.当扫数的输入都生成相应的证明, 则可判定该事务可推论或取消.在第2阶段, 如若扫数的输入都复返招揽证明, 那么事务被推论.同期, 末端创建并分发一个解锁苦求.每个参与该事务的节点考证并更新账本状况.如若存在一个输入场所的片复返拒却证明, 则事务取消.同期, 末端生成并分发一个解锁取消苦求, 输入场所的片招揽该苦求并将已加锁的数据解锁.
RapidChain[50]雷同在Pow共鸣左券下期骗分片提高区块链可扩展性.与Elastico不同, RapidChain不需要扫数节点都存储区块链的一皆数据.在这种情况下, 对于一个事务, 举例输入输出分别为In, Out的事务tx(In, Out), 有两种情况产生.第1种情况是事务的输入与输出均在肃清派内.由于数据都存储于肃清派中, 这种情况下, 径直期骗片中的节点间的共鸣机制即可处理该事务(RapidChain期骗近似的PBFT共鸣左券处理片中的事务).第2种情况为输入In与输出Out的数据处于不同片中.在这种情况下, 不失一般性, 假设输入包含p组数据In={l1, l2, …, lp}, 输出包含一组数据Out.RapidChain在处理该事务时, Out场所的片将生成p个新的事务txi(li, Oi).每个事务输入为li, 输出为Oi, 况兼餍足|li|=|Oi|.同期生成一个事务txp+1(O, Out).其中, 输入O包含O1, O2, …, Op, Out为原事务的输出.在进行事务考证时, 输出场所的片率先要求li场所的片考证事务txi(li, Oi)是否可推论:如可推论, li场所的片将事务txi写入其账本, 并发送Oi至Out场所的片.最终, txp+1(O, Out)可期骗片内的共鸣机制进行考证.通盘过程通过将事务分割, 结束了片间的共鸣.
Chainspace[106]则旨在措置分片情况下数据的一致性问题.当数据在多个片均存在相通的备份, 且不同片通过不同的智能合约, 均对该数据进行了修改, 则可能导致不同片中数据不一致的情况出现.为了措置这个问题, 作家建议了事务印迹的想法.事务印迹包含这个事务所需要探问的所稀有据, 以及产生这些数据所调用的智能合约.基于事务印迹, 作家建议了S-BAC共鸣算法.具体而言, 当客户端提交事务时, Chainspace笔据事务印迹, 在扫数可能产生数据不一致的分片均分别推论共鸣算法, 况兼判断在一个分片内, 该事务是否和其他事务产生打破:如若莫得打破, 则该事务在该分片内可推论; 不然, 复返取消号召.一个事务惟有在它的印迹在扫数分片均可推论时, 方可推论.当有任性分片复返取消号召时, 则该事务会被隔断.期骗S-BAC共鸣, Chainspace措置了不同片之间的数据一致性问题, 然则代价是一个事务需推论多轮共鸣.
文献[107]建议了Monoxide区块链系统, 该系统率受分片架构来对公有链系统进行优化.Monoxide不错有用地措置分片结构中算力分散的问题.由于系统中存在多个片, 且每个片零丁时进行共鸣操办, 当报复者不错集结算力报复特定片霎, 极有可能报复者具有该片进取51%的算力, 从而使得共鸣左券失效.为了处理这种报复, 作家建议了“连弩挖矿”这一左券.在该种左券下, Monoxide允许一次收效地措置哈希问题不错阐明多个片中的块.连弩挖矿允许矿工同期参与多个编号一语气的片.一般的责任证明方程如方程(1)所示, 其中, 默克尔哈希树根包含区块内事务的哈希值.而在连弩挖矿中, 方程(1)的默克尔哈希树根替换为由多个区块块头部分的哈希值组成的新哈希值.这么, 在阐明块时, 哈希函数将隐敝多个块的块头, 同期, 这些块头将共用一个考证字段.这个结构允许连弩挖矿包含算力难度不同的共鸣组.一朝一个节点操办出考证字段, 则该节点将扫数其涵盖的区块索引以及相应的默克尔树的根节点的哈希值均纪录到区块链中.其他节点也可笔据此纪录, 考证其数据的着实性.终末, 当区块链出现分叉时, 为了保证正确性, 扫数区块链分支上的事务的后续原子操作均不会被推论, 直到一个分叉被铁心.
在文献[108]中, 作家联系在PBFT共鸣左券下, 通过分片的阵势提高区块链系统的抽象量.为了提高系统的可扩展性同期保证安全性, 该文献将着实推论环境(trusted execution environment)融入到区块链节点中.在着实推论环境中, 数据的可认证性以及齐全性均受保护, 不被坏心样貌所批改.在共鸣左券达成阶段, 可期骗着实推论环境的节点操办闭幕, 减少共鸣达成所需要的开销.在事务处理方面, 作家将散播式数据库中二阶段阐明与二阶段锁引入到区块链中.具体而言, 当节点需要处理跨片的多个事务时, 率先向事务输入场所的片发送阐明苦求, 阐明事务处理输入是否正当.在收到扫数阐明之后, 节点进行事务的推论并将推论的闭幕(commit或者abort)回传给场所的片.在事务推论阶段, 期骗二阶段锁机制, 将多个事务并发处理, 进而提高通盘系统的抽象量.
针对共鸣算法, Algorand[109]建议了基于委员会节点的共鸣算法, 以提高区块链网罗的抽象量.在Algorand中, 共鸣算法融会过可考证巧合函数, 巧合地聘请一组节点算作委员会.委员会节点会笔据其所捏有的区块链网罗中的货币份额来分拨权重, 并期骗权重证明来结束共鸣.由于委员会的聘请罗致巧合函数生成, 因而报复者并不成细目哪一部分节点将会属于委员会.同期, Algorand会如期替换属于委员会的节点, 从而保证网罗的安全性.
5.2 区块链的链下事务处理为了提高系统的抽象量, 部分事务可从链上处理迁徙到链下, 即部分走动不在区块链所纪录且不需要节点间达成共鸣.然则, 由于存在不需要达成共鸣的事务存在, 链下事务处理往往措置节点之间的着实问题[104, 110].现存的责任多应用在链下的转账走动等(举例比特币).通过建造链下的信任网罗[111-113], 区块链允许在链下推论特定用户之间的事务, 并最终合并成一个事务存储在链上.通过这么的阵势, 大都的信任节点之间的走动不需要通过区块链的共鸣考证, 从而提高通盘网罗的抽象量.
文献[113, 114]分别基于比特币和以太坊, 建议了因循比特币的Lighting网罗和因循以太币的Raiden链下支付网罗, 来算作比特币和以太坊走动的补充.在链下支付网罗中, 当用户与用户阐明相互着实时, 不错在他们之间建造支付通说念.支付通说念内的走动所产生的事务不错不需要经过链上的共鸣阐明, 而不错径直阐明.在链下的支付网罗中, 参与的用户需提前存入一定量的比特币或以太币.当一个支付产生时, 付款方需将存入的一部分金额转入收款方.因而, 链下支付需保证支付的金额小于用户在网罗中所剩的金额.与此同期, 链下走动网罗餍足传递性.当用户A与B、B与C之间分别存在支付通说念, 即使A与C之间莫得建造支付通说念, A依然不错通过旅途A, B, C, 将一定金额通过链下走动网罗转入C的账户中.因此, 在链下支付网罗中, 部单干作旨在减少支付事务的时候开销.文献[115]通过设计多个查找支付道路的算法, 缩短查找支付道路的平均时候开销.
而与Lightning, Raiden等网罗径直对账户内的金额进行走动不同, 文献[116]建议了Sprites, 这一期骗智能合约确保事务推论的网罗.通过智能合约, 当多个事务存在线性相关时, Sprites不错部分地并行推论多个事务, 从而提高链下走动的推论后果.
链下网罗的另一个问题是再均衡问题.在链下支付网罗中, 用户需先存于一定的金额于支付通说念中, 况兼该金额只能用于该支付通说念中的两个用户之间的支付.假设用户A, B, C这3个用户两两之间均有支付通说念.在某一时刻, 假设三者的金额状况为AB通说念之间A有200元, AC通说念之间C有200元.则当A想转账50元于C时, 由于AC之间的支付通说念中A的所剩金额为0, 因而, A不成通过AC之间的支付通说念转账于C.一个可行的通路是A通过AB以及BC之间的通说念转账于C.然则内容上, 用户A的账户金额含有AB之间的200元.金额上A弥散支付AC间的转账金额.因此, 支付网罗中支付通说念的不屈衡导致支付需要探问更多的节点, 才能完成支付.
为了措置再均衡的问题, 文献[117]建议了Revive系统.该文献作家构建了支付网罗图.该图中的一个节点为一个用户, 节点与节点的边为建造的支付通说念.期骗该图结构, 一个支付网罗的支付技艺为图中扫数支付通说念可支付的金额总额.在这种情况下, 最大化支付网罗的支付技艺不错建模为线性缠绵问题.然则, 径直求解线性缠绵问题是NP难的问题.因此在Revive中, 一个支付网罗的再均衡过程不错率先找到图中一个环形的结构, 并在环形结构中的扫数节点转念相通的金额.由于是环形结构, 该过程不会减少任何用户的账户金额.基于此, 作家设计了基于环形结构的再均衡算法, 并建议了相应的启发式优化算法.
6 区块链数据不停的往常联系趋势区块链算作近几年被通俗计议的时期, 在数据不停方面尚有许多值得真切探索的问题.在本文的终末, 咱们建议一些值得进一步挖掘的针对数据不停的联系问题, 但愿对才略域其他联系者有所启发.
● 区块链内数据的阴私保护时期
在一个典型的区块链中, 扫数的数据以及事务需要赢得扫数节点的共鸣, 因此扫数的数据均可被网罗中的节点探问.在这种情况下, 需要联统统据阴私保护问题.文献[88]初步尝试了将部分数据存储于链上, 而将明锐数据存储于链下的阵势.在这种情况下, 需要东说念主为地将数据分割为明锐数据与非明锐数据.对需要保护的明锐数据, 无法在区块链的环境下对其进行不停.因此, 措置该类阴私保护问题, 从数据不停的角度, 其难点在于怎么对区块链中的数据进行探问箝制.已有的针对数据库的探问箝制阵势对数据或者表设定探问权限.径直将其应用于区块链中会导致每个区块的哈希值无法与所赢得的数据对应, 因而用户无法考证该链中的数据是否被批改.
● 链间事务处理优化时期
现存的多数责任推敲单一区块链, 并对单一区块链下的事务处理等问题建议了高效的算法.然则当一个事务需要探问多个区块链时, 会产生诸多问题, 包括怎么保证数据的一致性、高效的并发箝制算法等.文献[72]推敲了多链情况下的视图以及考证问题.现存的责任多推敲怎么保证跨链事务一致性的问题.与单链比较, 较少责任推敲跨链事务处理的后果.在跨链事务的推论过程中, 可能会对一条链的数据进行加锁等操作, 这种操作将会影响与该链有关的事务推论.因此, 只是推敲单链的事务或者仅推敲跨链的事务都可能缩短通盘系统的抽象量.对链间事务处理后果问题的联系将着眼于:怎么设计针对多链环境下的事务处理优化, 以达到在保证一致性的同期, 提高抽象量的主见.
● 面向智能合约的事务处理优化时期
区块链所部署的智能合约不错对数据进行添加、修改等操作.现存的责任往往将智能合约视为一个事务处理.然则由于智能合约推论的复杂度并不一致, 且一个智能合约不错调用其他智能合约, 仅将一个智能合约视为一个事务并不成完全臆想系统的性能优劣.因此, 需要一个更适用于区块链的臆想法式, 以比较不同区块链系统的性能.该法式的难点在于, 怎么设计基本的语义以及怎么将智能合约与智能合约的嵌套相关同期推敲在性能臆想的主见中.
7 讲究咱们从区块链数据存储、区块链事务处理、区块链查询处理、区块链可扩展性等几个方面, 对区块链环境下的数据不停有关联系责任进行了较为系统的综述ed2k白石茉莉奈, 分析了多样区块链数据不停方法的优点与不及, 终末先容了区块链的往常联系趋势.从数据不停的角度, 区块链的现存系统与方法仍然有相配多的责任需要进行.况兼在一个不着实场景下构造一个着实操办环境, 仍然具有相配高大的应用出息, 因此, 通过本文的综述与先容, 也但愿有更多的联系者, 尤其是数据库联系者, 更多地开展区块链数据不停联系责任.