毛湘科 李 超,2 张桂刚,4 张 健 蔚 欣 邢春晓,2,3
(1.清华大学信息国家研究中心 北京 100084)(2.清华大学计算机系 北京 100084)(3.清华大学互联网产业研究院 北京 100084)(4.中国科学院自动化研究所 北京 100190)
2008 年,中本聪发表了关于加密数字货币的论文,标志着区块链技术的诞生[1]。区块链是一种通过共识协议、P2P 网络、加密算法和链式数据结构等来实现去中心化环境下数据一致性的技术。在十余年的发展过程中,区块链技术从最初的加密货币领域发展遍及到物联网[2]、供应链[3]、医疗健康[4]、金融科技[5]等众多领域。从任何用户都可以参与的公链发展出需要获得许可认证的联盟链。从存储地之间的转账交易发展成了存储文本、图片和表格等多种类型的数据;从完全的去中心化、脱离监管法,发展成了多中心化和强调监管的重要性。这些发展趋势都越来越凸显区块链所具备的防篡改、透明和可追溯等特性对交易数据的可信管理能力。
区块链具备与分布式数据库相类似的数据存储管理能力,已经有一些学者就区块链和分布式数据库在存储、共识算法和查询等方面进行了详细的对比[6]。相比传统的分布式数据库,区块链在数据管理方面最大的优势在于实现了去中心化环境下对交易的可信管理。区块链能够实现对数据的可信管理主要体现在三个方面:1)区块链的共识协议、链式结构和加密算法确保了去中心化环境下各节点间的数据的一致性,这是数据可信的前提。2)区块链提供的可验证查询方法,确保了不同类型节点在执行查询访问结果的完整性和可信性。3)区块链上存储的交易数据是透明的、全过程留痕的和可追溯的,任何参与者都可以对交易的真实性进行验证。
与已有的数字货币、共识协议、系统架构、交易分析等类型的区块链技术综述文章不同,本文的主要工作是从区块链对数据可信管理的角度出发,对近些年区块链在数据可信管理上相关的研究工作进行梳理。首先,我们从区块链的底层实现出发,对去中心化环境下提供区块链实现可信管理的共识协议算法和ADS进行了简单的梳理分析。接着,从区块链进行数据管理所需要的最基础的查询功能出发,对区块链上查询方法的改进进行了归纳总结,并且从医疗数据管理、物联网数据管理和数据溯源三个方面对查询的应用进行了讨论。
区块链作为一种去中心化的分布式账本,共识算法、可验证数据结构是实现区块链对交易可信管理的基础。
共识算法是维护区块链在互不信任的环境中各节点间数据一致性的基础,各节点间数据的一致性是交易可信管理的最低要求。在比特币中,中本聪设计了基于工作量证明的共识算法(Proof of Work,PoW),通过消耗计算资源解决难题的方式来达成一致共识,是目前区块链系统中最常用的共识算法。随着区块链技术的发展和在不同场景下的应用,一些新的共识算法也被相继提出,例如权益证明(Proof of Stake,PoS)[7]、委托权益证明(Delegated Proof of Stake,DPoS)[8]和实用拜占庭容错(Practical Byzantine Fault Tolerance,PBFT)[9]算法等。
为了实现对区块链中存储的交易数据进行快速的可信查询验证,区块链在设计的时候提供了ADS数据结构来对交易进行组织。
1)Merkle Hash Tree
Merkle Hash Tree(MHT)是由密码学家Merkle提出来的。MHT 通过树状结构把一系列的元素组织起来,通过树内路径就可以快速完成验证其中某个元素。
MHT 是一棵由哈希值构成的二叉树,通过对一组有序的数据集合进行哈希运算,并将哈希值作为叶子节点,通过二叉树的构建和哈希运算构建MHT。首先将数据块集合D中的所有元素进行哈希运算,得到有序的哈希集合。有序的哈希集合H作为叶子节点层,按照排序对每两个相邻的节点进行拼接,并进行哈希运算作为两个节点的父节点。自底向上如此返回对每层节点进行运算,最后得到一个MHT根的值。
2)Merkle Patricia Tree
在以太坊[10]和Hyperledger Fabric[11]等区块链系统中,除了包含有交易数据的Merkle 根外,还含有针对账户状态数据的状态Merkle根(State Root),以太坊块头还含有针对交易执行日志的收据Merkle 根(Receipts Root)。以太坊计算Merkle 根使用的是Merkle Patricia 树,虽然区块中的交易数据是不变的,但状态数据经常改变且数量众多,构建新区块时,MPT 仅需计算在新区块中变化了的账户状态,状态没有变化的分支可直接引用,而无需重新计算整棵树。在MPT 树中,包含了扩展节点、分支节点和叶子结点。扩展节点包含了共同的Key 前缀;分支节点通常在扩展结点之后,基于单个16 进制字符的key 前缀实现了树的分支;叶子结点包含一个以太坊账户状态。MPT 树实质上是融合了MHT 和前缀树,因此其具有查找能力。以一个以太坊账户地址为查找路径,能够快速地从MPT 根向下查找到叶子节点中账户的状态数据,这种查找能力是MHT树所不具备的。
3)Merkle Bucket Tree
在Hyperledger Fabric 中计算状态Merkle 根使用的是Merkle Bucket 树,Merkle Bucket 树是多叉树,每个叶子结点是一个桶,桶中存放的是Key-Value类型的状态数据集。为新区块计算状态根时,没有变化的桶可以被跳过,因而可快速计算状态根。Merkle Bucket 树可通过调整桶数和分支树控制树的深度和宽度,从而可在不同的性能和资源需求间权衡。
区块链具备与数据库相类似的存储功能,其也经常被用来与分布式数据库进行比较。对于区块链上交易数据的可信管理,离不开数据查询。在比特币、以太坊和超级账本三种典型的区块链系统中,均采用Key-Value 数据库对数据进行存储,有限的表达能力限制了这些系统定义更复杂的查询。同时,受限于可信数据结构(ADS)所支持的查询类型,这些系统只支持交易验证、账户状态查询等简单查询,无法支持更丰富的可验证查询。特别是,区块链通常为链式结构,当存储的交易数据量较大时,执行复杂查询的效率会十分低下,无法满足大规模的查询需求。为了提升区块链上查询的可信度、高效性和支持复杂查询,已经有许多的研究者进行了大量的研究工作。接下来,将从对区块链的查询改进和查询应用两方面分别进行叙述。
区块链作为仅追加的链式结构,其提供的简单的查询功能难以满足用户的需求。为了提升查询的效率,支持更复杂的查询类型,许多的研究工作对原有区块链的查询方案进行了改进。
受启发于传统数据库提供的丰富查询功能和区块链系统的防篡改性,已经有一些系统将区块链和数据库的优势进行了结合。结合的方式主要有两种,一种是在区块链系统的基础上融入数据库查询管理功能,提升区块链的查询的效率;另一种是在数据库的基础上融入区块链层,来提升数据库的防篡改性和可信性。
对于第一种结合的方式,其通常将区块链上的数据复制存储至数据库中。例如:在EtherQL[12]中,其通过以太坊提供的监听接口将区块数据导入到MongDB 数据库中,然后通过MongoDB 提供的查询功能进行数据查询。在ChainSQL[13]中,其通过在区块链实现拜占庭协议,将区块链和数据库相结合,并将所有事务传输到关系型数据库中丰富查询功能。在EtherQL和ChainSQL等类似系统中,数据存储在链下数据库中并缺少查询结果集完整性验证机制,难以确保数据不被篡改,因此对数据的可信管理支持不好。在BlockchainDB[14]中,其在区块链系统的基础上提供了一层key-value 的数据库层,其可以通过简单的put/get方法进行数据的获取和验证。在FalconDB[15]中,其在区块链的上层提供了一层数据库层,并在数据库内容的基础上建立一种ADS来为客户端提供可信查询验证,但是其每个区块内只能存储一笔交易会造成存储资源的浪费。Veritas[16]也在区块链之上添加了一层可验证的数据库系统层,并且提供了对SQL 语言的支持。虽然在BlockchainDB、FalconDB和Veritas等系统中提供了交易可信查询支持,但是存储数据至传统据库中仍然会有数据被篡改的风险。
对于第二种结合的方式,每个节点都管理自己的数据库实例并在其上面执行全局排序的事务。例如:在BigChainDB[17]中,其在MongDB 的基础上添加了一层区块链层,每个节点维护本地的Mong-DB数据库,并且所有的区块,交易和原数据都存储在MongDB 中,因此在查询时可以具备与MongDB相类似的查询能力。在Blockchain Relational Database[18]中,其将区块链层与关系数据库PostgreSQL进行了整合。ChainfyDB[19]提出了在任意与SQL-99兼容的数据库管理系统上添加区块链层的解决方案。
上述两种类型的解决方案,都过度地依赖于与其相关的数据库的能力。然而,这些数据库对于区块链查询中常见的区间范围查询,时间范围查询和可信查询等都不能提供良好的支持。
区块链是建立在不可信环境下的,当用户获得查询结果时,往往需要验证其查询结果的可信性和完整性。vChain[20]是一个实现了高效可验证查询处理算法的系统,其假定用户节点并不一定存储整个区块链的全部数据,而只存储所有区块中的Hash,并且其在每个区块中添加了一个额外的AttDigest 字段来对查询结果的真实性进行验证。SEBDB[21]在以太坊的基础上实现了一个支持关系型语义、可信查询和链上链下查询的区块链数据库。文献[22]针对使用一般验证查询方法验证区块链上的范围查询结果真实性时开销巨大的情况,提出了一种GEM2-Tree 数据结构,来达到减少gas开销的目的。文献[23]和[24]基于信任执行环境(TEE)的Intel SGX来执行面向轻节点可验证查询,以解决一般的基于ADS 的可信验证查询和验证对象(VO)所需要的网络、存储和计算开销。在文献[25]中,针对混合存储模型区块链系统中关键词可信查询,设计了Suppressed Merkle inverted index 和Chameleon inverted index 两种类型的索引结构来减少维护ADS的gas开销。
从上述所列举的文献,大部分的工作对区块链上的查询研究都是围绕单一类型的交易数据和单链系统进行的,对于包含多种类型交易数据和多条链系统的区块链研究工作较少,这是将来具有挑战的问题。
区块链具备的透明性、可追溯性和防篡改性使得区块链被使用在各种不同的应用场景中进行数据的可信管理,常见的有医疗健康数据管理、物联网数据管理和数据溯源等。
3.2.1 医疗健康数据管理
医疗健康领域信息化技术的普及,产生了大量的电子医疗数据,如病历、化验数据、处方等,这些数据对于患者的治疗,医学研究和新药研发都起着至关重要的作用。但是,受限于患者隐私,数据所有权不明确和数据格式不一等问题,难以使得医疗数据在患者、医疗机构和科研机构之间进行可信的管理,从而影响数据的共享。区块链的技术出现为医疗健康数据的可信管理提供了解决方案,因为它允许去中心化的数据管理。
已经有多个综述对区块链在医疗数据的可信管理进行了详细的归纳总结[26~29]。现有的基于区块链进行管理的医疗数据主要有两种类型,一种是医生录入的信息系统的患者病历、检查结果和处方等文件类型的数据。另一类是患者通过智能手环、血压计和血糖仪等联网健康检测设备自测的数据。从单个患者的角度出发,从区块链上获取与个人相关的当前健康数据、特定时间区间内的健康数据和汇总健康数据等都离不开区块链系统上的查询支持。典型的查询类型包括但不限于:1)获取患者在某段时间内的诊断记录。2)查询某个医生在某个特定时间内的接诊记录和开具的诊断书等。3)检索患者的最新诊断结果。4)根据某个关键词进行医疗记录的查询等。
现有的基于区块链的医疗数据可信管理方法中仍然存在着许多需要解决的问题。例如医疗数据的类型复杂,包括了文本、表格和图片等,现有的基于区块链的系统难以实现精确而高效的查询,且对于一些关联查询和语义查询支持较差。区块链是公开透明的,所有参与者都可以完全访问所有数据,这显然不利于对患者隐私的保护,因此在对参与者的访问权限进行管理和控制,或者采用零知识证明、同态加密算法等技术来解决查询中的隐私泄露问题。
3.2.2 物联网数据管理
随着物联网技术的广泛应用,物联网设备产生的数据爆炸式的增长。物联网数据异构程度高,隐私难以保障和数据分散的特点导致了数据难以管理的问题。为了更好地管理和利用物联网数据,基于区块链技术对的物联网数据管理受到了广泛的关注。
已经有多个综述文献对区块链在物联网数据管理上的应用进行了阐述[2,30~33]。基于这些研究,我们可以发现区块链对物联网数据的管理已经涉及到了智能交通、智慧城市、食品供应链和智能穿戴设备等领域,并且已经应用在了数据的采集、数据处理和数据共享等多个不同的阶段。考虑到物联网所涉及的数据规模大,完全将数据存储在区块链上需要大量的存储空间,同时对于区块链的吞吐量要求也较高,因此有些工作采用链上存储数据摘要,链下存储原始数据的方式来减轻区块链的负担。考虑到物联网所涉及的范围较广,下面以传感器网络为例例举几个常见的管理应用:1)验证链下存储的原始数据的摘要是否与链上存储的哈希值一致来判断数据是否可信。2)查询某个传感器所有的数据记录。3)查询某个区域内所有传感器在某个区域内的数据记录。
尽管已经有许多的工作采用区块链在物联网数据的管理上做了尝试,但是仍然有许多需要解决的问题。考虑到物联网数据的差异性巨大,现有的基于区块链的系统难以实现对多种不同来源的数据进行综合管理。在链上和链下相结合的混合型区块链系统中,解决复杂类型查询和提升大规模查询的效率都是需要解决的。
3.2.3 数据溯源
数据溯源可以视为一种特殊类型的查询。溯源查询可以形式化的描述为。P表示查询的条件,表示查询的区间,可以是时间戳或者是区块号。如果交易之间存在依赖关系,则Q返回区间中与交易TXi存在直接或间接依存关系的所有交易。如果交易为包含某些属性的交易数据,则Q 返回[f,t]内包含该属性的所有交易。
区块链上存储交易数据不可篡改、公开透明和全过程留痕的特性使得其能够完美地适用于数据溯源类型的应用场景。数据溯源作为一种验证数据来源是否可信的方式,对于交易数据的可信管理是至关重要的。已经有许多综述对农产品[34]、供应链[35]和奢侈品[39]等行业利用区块链进行溯源的研究进行了总结概括。区块链属于仅追加的链式结构,在进行数据溯源时,最简单的做法是从最新的区块向前面的区块依次进行查找,直到找出所有符合查询条件的交易数据为止。但是,随着区块链上的区块数目增多,存储的交易量变大时,依次查找的方法会变得十分缓慢。为了提升溯源的效率,使用数据库或者数据结构对交易进行重构成了一种常见的解决办法。在文献[36]中,其利用交易数据间的依赖关系,采用有向无环图(DAG)对交易进行重构,从而将溯源问题转换成DAG 上的搜索问题,大大提升效率。对于结构化的交易数据,可以采用关系型数据库来进行数据复制,在确保不被篡改的前提下,直接利用关系数据库的查询语言进行溯源查找。对半结构化和非结构化类型的交易数据,可以采用信息检索中构建索引的方式加快数据查询等。
区块链技术已经在可信交易管理上被广泛的使用。接下来,本文将结合区块链技术的发展趋势和在交易管理上现存的问题,对区块链技术在交易可信管理上可能面临的挑战进行展望。
设计面向包含多种类型交易数据的区块链系统的查询算法。区块链系统存储的交易数据日益趋于多样化,不再是地址之间的转账交易数据。在区块链上可能同时包含有文本、表格和图片等多种类型的交易数据,但是在现有的区块链查询算法中,针对同时包含文本、表格和图片等交易的区块链的查询算法尚未出现。因此,在区块链技术被各领域广泛使用的背景下,设计出面向包含多种类型交易数据的区块链系统的查询算法是亟待解决的问题。
针对多链上的数据查询解决方法设计。随着业务的不断发展,单链系统已经无法满足业务的需求。在未来的区块链系统中,必将越来越青睐于多链系统,最终会链链互联组成互链网。但是,目前的查询算法还未涉及到多链系统中,因此设计出多链系统中的查询算法也是十分关键的问题。
如何通过外置数据库或者数据结构提升复杂查询的效率。区块链属于链式结构,且只具备数据追加功能,在执行聚合、联合和溯源等类型的查询时,效率低下。在关系数据库中能较快的执行聚合、联合类查询,在图数据结构中能较快速的执行溯源查询。但是,外置的数据库或者数据结构不具备防篡改特性,难以确保返回查询结果的完整性和可信性。因此,在确保查询结果完整可信的前提下,如何利用外置的数据库或者数据结构提升查询的效率是本研究需要解决的重要问题。
如何提升复杂区块链系统中大规模查询的效率。随着参与组织以及链数量的增加,参与的用户也会增加,查询的请求数量也会增加。当复杂区块链系统中的查询请求数量特别大时,在保证返回查询结果完整性和可信性的前提下,如何确保查询的高效性,是需要研究的关键问题。
本文对近期区块链在可信交易管理上的开展研究工作进行了总结概括。首先,我们从共识算法、ADS两方面对区块链能够实现对交易可信管理的基础进行了叙述,接着对实现区块链上交易可信管理的查询方法从查询的改进和应用两个方面进行了归纳总结,然后对未来区块链在交易可信管理上的挑战进行了展望。在将来,我们将对第4 节中提出的挑战性问题进行解决。