发布时间:2020-01-22所属分类:科技论文浏览:1次
摘 要: 摘要:随着比特币、以太币等一系列加密货币的兴起,其底层的区块链技术受到越来越广泛的关注.区块链有防篡改、去中心化的特性.以太坊利用区块链技术来构建新一代去中心化的应用平台.BigchainDB将区块链技术与传统的分布式数据库相结合,利用基于联盟投票的共识
摘要:随着比特币、以太币等一系列加密货币的兴起,其底层的区块链技术受到越来越广泛的关注.区块链有防篡改、去中心化的特性.以太坊利用区块链技术来构建新一代去中心化的应用平台.BigchainDB将区块链技术与传统的分布式数据库相结合,利用基于联盟投票的共识机制改进传统Pow机制中的节点全复制问题,提高了系统的扩展性与吞吐率.但是现有的区块链系统存储的信息大都是固定格式的交易信息,虽然在每个交易里有数据字段,但是现有的区块链系统并不能经由链上对交易内的数据字段的具体细节进行直接查询.如果想要查询数据字段的具体细节,只能先根据交易的哈希值进行查询,得到该交易的完整信息,然后再检索该交易内的数据信息.数据可操作性低,不具备传统数据库的查询功能.首先提出一种区块链数据库系统框架,将区块链技术应用于分布式数据管理;其次提出一种基于哈希指针的不可篡改索引,根据该索引快速检索区块内数据,以此实现区块链的查询;最后,通过实验测试数据库的读写性能,实验结果表明,所提出的不可篡改索引在保证不可篡改的同时具有较好的读写性能.
关键词:区块链;数据库;可查询;哈希指针;不可篡改索引;可回溯
随着比特币、以太币等一系列加密货币的兴起,其底层的区块链技术也受到了越来越广泛的关注[1,2].比特币最核心的意图是为了实现去中心化,即:在没有第三方信任机构参与的情况下,实现两个对等实体的数字货币交易.然而,现实世界中不可避免地存在很多自然中心,比如提供贷款的银行、提供电信服务的电信运营商等.虽然我们可以把这些中心机构当作对等实体,将其与用户的交易记录到区块链上,比如用比特币去交话费,但是这种做法是不切实际的,因为这不利于机构管理用户数据(包括用户的信用等级等).实际上,现有的中心机构都是由自己管理其存储用户相关信息的数据库,但是这种模式存在很多缺陷:(1)不同的数据库可能存储着相同的用户基本身份信息,导致数据冗余度高;(2)不同的中心机构各自管理自己的数据,不利于机构之间的数据共享;(3)每个数据库大都由单一机构中心化管理,使得用户必须无条件信任该机构,存在中心化问题;(4)用户不能够独立验证数据的正确性,如果数据被恶意篡改,用户与机构都无法察觉.不仅如此,在供应链以及商品溯源等领域,也对数据可信性以及数据可回溯提出了新的要求.
而区块链技术具有去中心化、防篡改以及可回溯的特性,为解决上述这些问题提供了可能.为此,我们提出了区块链数据库的概念,核心思想是:通过限制中心机构对数据记录的操作,来达到防篡改和去中心化的目的.该数据库中有多条区块链,每一条区块链相当于传统数据库中的一张表,所有的中心机构充当数据的存储节点,所有的存储节点根据共识算法生成区块链,所有节点(包括用户)存储区块头信息,可以由区块头信息检索到记录并验证记录的正确性.我们希望有高效的共识算法来提高系统的吞吐率,并有高效的查询算法实现在区块链上检索数据.当前,在共识算法上已经有很多研究,例如POW[3,4],POS[5,6],PBFT[7].然而针对区块链查询的研究相对较少,而且现有的区块链系统并不能兼顾数据回溯与数据查询.在比特币中可以根据每一笔交易回溯前一笔交易,但是存在的问题是交易本身不易检索.在以太坊中是状态树+交易树,状态树存储的是用户账号信息,状态树支持检索,可以根据状态树查询用户当前余额,但是状态树本身不记录历史信息,不能对状态进行数据回溯,而且状态树不直接关联交易,同样无法有效对交易进行回溯.虽然已有一些研究利用同步技术将交易数据同步到传统数据库,根据各数据项建立索引,从而实现快速查询,但是这种做法并不能保证索引的不可篡改,所以损失了区块链不可篡改的特性.基于此,本文提出一种不可篡改的索引结构,兼顾数据查询以及数据回溯.
本文首先提出了区块链数据库系统框架,将区块链技术应用于数据管理;其次,提出了一种基于哈希指针的不可篡改索引,根据该索引快速检索区块内数据,以此实现区块链的查询;最后,通过实验测试数据库的读写性能,实验结果表明,本文提出的不可篡改索引在保证不可篡改的同时具有较好的读写性能.1相关工作文献[3]中,中本聪将数字签名技术、P2P技术、时间戳技术、Merkle树技术和工作量证明机制巧妙地结合起来,解决了双花与女巫攻击问题,实现了拥有去中心化、防篡改和数据可回溯等特性的数字货币系统——比特币系统.文献[8]中,Buterin等人对比特币系统进行扩展,构建了新一代智能合约和去中心化应用平台——以太坊.除了比特币的功能之外,以太坊还有图灵完备的合约语言,内置的持久化状态存储,具有可编程性,使开发者可以很快地在以太坊平台上创建自己的区块链应用.这两个应用都是自下而上设计区块链,有内置代币,比特币主要应用于货币,而以太坊的主要功能则是智能合约.
文献[9]中,超级账本则采用自上而下的设计方式,去除了内置代币,提出了商用区块链框架.它采用了松耦合的设计,将共识机制、身份验证等组件模块化,使之在应用过程中可以方便地根据应用场景来选择相应的模块,除此之外还采用了容器技术,将智能合约放在docker中运行,从而使得智能合约可以用几乎任意的高级语言来编写.
比特币、以太坊和超级账本三大应用平台的主要功能是针对数字货币与智能合约,但是数据管理性能较弱,一些机构发现了区块链不可篡改、去中心化与数据可回溯特性,力图将区块链技术与传统的数据库技术相结合,提升数据管理的性能,同时兼顾区块链去中心化、数据可回溯、防篡改的特性.
文献[10]中,Dinh等人受区块链链式结构以及Git版本控制的启发,为每个key创建设计了一个有向无环图,图中每一个节点对应key的某一历史版本,节点的前驱后继分别对应其版本的前驱后继,在保证高扩展性和高吞吐率的同时,实现了数据可共享与不可篡改的特性.文献[11]中,BigchainDB将区块链技术与RethinkDB相结合,在企业级分布式数据库的基础上添加区块链不可篡改和去中心化等特性,提出了一种基于管程的一致性策略,提高了数据的安全性,同时解决了区块链的数据存储容量问题.文献[12]提供了基于区块链的加密存储网络,通过将原始数据加密并签名后,保存到P2P文件系统中,用户可以对数据的完整性进行验证.文献[13]中,Tuan等人提出了一种区块链测试框架,包括针对区块链应用的一致性算法、数据模型、执行引擎和链上应用的测试方法,并且分析了以太坊、超级账本、Parity以及UStore的读写以及查询能力,对于区块链的设计以及瓶颈发现和解决带来了极大的帮助.文献[14]中,Tsai等人总结了基于区块链的应用开发方法,给出了开发区块链应用时需要注意的关键问题,设计并实现了”北航链”.文献[15]中,Li等人提出了一种高效的检索区块链的方法,包括范围查询和Top-k查询,有较好的灵活性.但是其解决方法是通过把区块链数据以及k-v数据库里面的数据同步到MongoDB数据库中,利用MongoDB进行查询操作,没有从根本上解决区块链的查询问题.为了将区块链技术应用于数据存储,ChainSQL[16]将数据库操作日志存储于区块链中,将数据存储于附属关系型数据库中,在底层支持SQLite3,MySQL,PostgreSQL等关系数据库,可以根据区块链里的日志记录将数据库表恢复到任意时刻点,但是其恢复粒度是以表为单位,不利于以交易为单位的数据溯源.
2区块链数据库系统框架
通过结合区块链和数据库技术,提出一种去中心化、防篡改同时支持查询的区块链数据库框架.如图1所示,分4层,具体如下.•存储层:在最底部,为k-v数据库,负责分布式存储数据,为每一个区块链备份多个副本;
•网络层:是该框架的核心,负责节点间的数据传输以及根据共识协议确定区块的先后顺序.其中,节点由存储节点以及用户组成,每一机构为一个存储节点,用于存储本机构的数据信息,可以是一个数据库,也可以是多个数据库.当添加或者修改用户相关的数据时,需要由用户和机构共同签名认可;签名后的数据由机构封装到区块中,当区块大小达到某一阈值时,将其打包发送给其他机构进行验证.机构间根据共识算法验证区块的正确性,并决定区块的先后顺序.将验证正确的区块发送给存储节点存储,将区块头广播给所有节点,包括用户.在进行查询操作时,用户向存储节点发送查询请求,存储节点会返回查询到的记录项以及查询路径,用户根据查询路径以及区块头信息,可以验证查询结果的正确性;
•区块链层:显示的是区块链的“世界状态”,上层应用可以据此对区块链数据进行查询操作;
•应用层:是最上层,可以对查询到的数据进行进一步的分析处理.针对这一框架,本文重新定义了数据库中的数据结构以及数据操作,并提出了MerkleRBTree索引,基于哈希指针构建不可篡改的索引,在保证不可篡改的前提下实现高效查询.系统中数据的操作定义如下.
•增加记录:数据在初次添加时,数据拥有者指定可以进行数据写操作的公钥,生成权限锁定脚本,然后用自己的私钥对该数据进行签名;
•修改记录:操作者用自己的私钥对其父记录进行签名,然后验证该签名是否能够解锁父记录的锁定脚本,当且只当在解锁锁定脚本的情况下,才可以添加一条相同key值的记录,以此实现对父记录的修改.其中,权限锁定脚本只有数据拥有者可以修改.需要说明的是,数据修改与数据防篡改并不冲突,本文中的防篡改指的是对应版本的数据不可改且数据的更改历史不可改,但是支持数据从较老版本更新到新的版本;
•查找记录:所有的参与者都可以进行查找操作,查找操作返回最新值为有效值,但是可以通过溯源操作查看该记录的完整修改历史;•删除记录:数据一旦添加便不可删除,当数据已经被修改多次,处于非常古老的版本时,为了节约磁盘空间,可以删除该数据的具体信息,但是该数据的哈希值则需要永久保存.
3区块链式数据模型
3.1已有的区块链系统模型
(1)数据结构
为了能够较好地理解区块链的结构,我们给出了哈希指针的定义.一个数据项的哈希指针是指将该数据项的内容做哈希操作后得到固定长度的哈希值,同时以该哈希值为key,该数据项的内容为value,将此k-v对存储于k-v数据库,则该key即为该数据项的哈希指针.
区块链就是一个个的区块根据哈希指针首尾相连,每一个区块一旦形成便不可改变.如图2所示,区块分为区块头和区块体两部分:区块头包括版本号、前一区块哈希指针(由前一区块头数据哈希得到)、区块形成时的时间戳、区块体中交易自下而上哈希得到的Merkle根以及用于工作量证明的随机数和目标哈希;区块体中保存着区块中的所有交易记录.
如图3所示,交易(transaction)包含版本号(nVersion)、交易输入(TxIn)、交易输出(Txout)以及交易时间(nLockTime).其中:交易输入包含其要花费的交易输出(preout)以及锁定脚本(ScriptSig),并且当且仅当SicriptSig是上一个输出中ScriptPubk对应的私钥签名时才被认为是有效的;交易输出指定该笔交易的输出金额(nValue),以及收款人的公钥(ScripPubk).数字签名技术[17]保证每笔交易被支付到一个公钥里,然后只有拥有私钥的人才能花费掉这笔交易.
(2)数据读写流程
对于数据的存储管理,在写入数据时,每个区块的数据操作流程如下.
1)收集交易.将未写入到区块内的交易数据进行正确性检查(包括格式检查以及双花检查),并将有效的交易数据收集在集合(MapTransaction)中,其中,MapTransaction只存放在内存中,其内存放了从交易哈希到交易的map映射;
2)创建区块.将MapTransaction中的数据添加到区块体中;之后运行PoW机制,搜索合适的随机数值,使得区块头的哈希值小于目标哈希,从而证明该区块有效,即挖矿成功并获得奖励;
3)存储区块.在网络上将该区块广播,在本地将该区块顺序存储在本地磁盘文件(blk000x.bat)中;
4)更新区块索引(CblockIndex).在k-v数据库中更新CblockIndex,CblockIndex记录着区块的磁盘存储位置以及该区块的前驱和后继区块,根据区块索引,能够得到区块链的世界状态;
5)更新交易索引(TxIndex).TxIndex存储在k-v数据库中,包含每一笔交易的磁盘存储位置以及交易的后继交易(以该交易作为输入的交易).后继交易初始为空,标识该交易是未花费的,当该交易被花费后更新其后继交易,也是根据该标识位判断交易是否被双花;
6)将写入到磁盘的交易数据从MapTransaction中移除.
在读取数据的时候,必须要提供要读取数据的hash值,根据hash值,先在内存中的MapTransaction中查找;如果没有查找到,则根据hash值到k-v数据库中查找对应索引信息TxIndex;最后,根据TxIndex在磁盘文件blk000x.bat中读取到数据.
(3)已有模型存在的不足
已有的模型利用数字签名技术以及MerkleRoot来保证数据不可篡改和数据安全,但是其交易数据结构固定,只能处理固定结构的交易数据,不能处理一般数据,不适合传统数据库中的数据处理,缺少一般性;在进行数据读写操作时,只能够根据数据的hash值进行处理,在不知道数据hash值的情况下,无法进行数据查询操作.
相关期刊推荐:《软件学报》创刊于1990年,由中国科学院软件研究所和中国计算机学会联合主办。是一本刊登计算机软件各领域原创性研究成果的期刊,所刊登的论文均经过严格的同行专家评议。刊登反映计算机科学和计算机软件新理论、新方法和新技术以及学科发展趋势的文章,主要涉及理论计算机科学、算法设计与分析、系统软件与软件工程、模式识别与人工智能、数据库技术、计算机网络、信息安全、计算机图形学与计算机辅助设计、多媒体技术及其他相关的内容。
SCISSCIAHCI