基于区块链的数据存储方法、电子积分处理方法及***
技术领域
本发明涉及区块链技术领域,尤其是涉及基于区块链的数据存储方法、电子积分处理方法及***。
背景技术
随着区块链技术的崛起,越来越多的商家和政务部分选择了区块链智能合约作为去中心化的电子积分***的平台,用于向用户展示更公平、更透明、更公开同时去中心化的用户积分平台。在这个过程中,电子积分***的智能合约对于区块链上保存的业务数据进行增加、删除、修改、查询等操作是不可避免的。同时,由于电子积分***的业务逻辑的特殊性,积分智能合约的存储往往需要采用基于关系型的数据存储,以保证在发行积分、使用积分等逻辑中实现对批量积分用户的大规模操作。
现有使用区块链平台的数据库***,采用了独立解耦的方式来为其他区块链提供分布式去中心化的关系型数据存储。然而,这些产品并非实际的区块链***,而是一个相对独立的数据库***。虽然这种架构的设计能够解耦区块链***的存储逻辑和业务流程,但是整个***的安全性将会出现短板原理。而且,这些产品同样只能够进行历史哈希存证,而不能实现有效的历史回退功能。使用了这些产品的区块链***同样丧失了历史回退、分支切换等能力,仅能够在特定环境下有限的使用。
现有的区块链***中,智能合约的数据往往只能存储在Key-Value存储对象中,而缺乏有效的方法来实现关系型的数据存储。
发明内容
本发明的目的是提供基于区块链的数据存储方法、电子积分处理方法及***,以解决难以实现关系型数据的有效存储、对电子积分***进行历史回溯与历史回退困难的技术问题。
本发明的目的,可以通过如下技术方案实现:
一种区块链的数据存储方法,包括:
S1:获取区块链***中关系型数据表的数据,将所述数据对应的主键值存储在树状数据结构的叶子节点中;其中,所述叶子节点通过有向单链表连接成有序单链表;
S2:根据叶子节点对应数据的数据项值计算叶子节点的哈希值;
S3:将子节点的哈希值及相邻两个子节点的分割值存储在树状数据结构的非叶子节点中;其中,所述相邻两个子节点的分割值大于以左侧子节点为根节点的子树中叶子节点的最大值,且小于等于以右侧子节点为根节点的子树中叶子节点的最小值;每个非叶子节点的子节点数量不少于N/2且小于N,N为树状数据结构中非叶子节点的子节点数量的最大值;
S4:根据所述子节点的哈希值及相邻两个子节点的分割值计算所述非叶子节点的哈希值;
重复执行S1-S4直至将数据表中所有数据的主键值存储在所述树状数据结构的叶子节点中,并将树状数据结构的根节点的哈希值作为关系型数据表的哈希证明。
优选地,所述有序单链表中叶子节点的主键值从小到大排列。
优选地,将所述数据对应的主键值存储在树状数据结构的叶子节点中的具体过程为:
根据所述数据对应的主键值在有序链表找到相应位置并生成一个新的叶子节点,将所述新数据的主键值存储到新的叶子节点中;
更新叶子节点的父节点,当父节点的子节点数量等于N时,将所述父节点***为两个新的非叶子节点,并更新非叶子节点的父节点及其哈希值;其中,每个新的非叶子节点的子节点数量为N/2;
逐层向上检查非叶子节点并更新哈希值,直至确定所述树状数据结构的根节点及其哈希值。
优选地,删除数据表的一个数据后,更新对应的树状数据结构,具体过程为:
根据被删除数据的主键值在树状数据结构中找到相应的叶子节点并删除;
更新所述叶子节点的父节点及其哈希值,当所述父节点的子节点数量小于N/2时,对父节点进行调整以使得其子节点数量不少于N/2且小于N;
逐层向上检查非叶子节点并更新哈希值,直至确定所述树状数据结构的根节点及其哈希值。
优选地,当非叶子节点的子节点数量小于N/2时,维护非叶子节点以使得其子节点数量不少于N/2且小于N的具体过程为:
判断非叶子节点的相邻兄弟节点的子节点数量是否大于N/2时,若是,将相邻兄弟节点的一个子节点移动作为非叶子节点的子节点,更新非叶子节点的父节点;若否,将非叶子节点和相邻兄弟节点合并,更新非叶子节点的父节点。
本发明还提供了一种基于区块链的电子积分处理方法,应用了所述的区块链的数据存储方法存储电子积分***的关系型数据表,包括:
从电子积分***的智能合约账户中取出智能合约的业务代码,构建一个智能合约调用交易;所述业务代码包括对电子积分进行增加、删除、修改、查询操作的电子积分处理函数;
在智能合约虚拟机上执行所述智能合约调用交易,调用智能合约并执行智能合约的业务代码;
执行器解析业务代码对应的数据操作语句,并对电子积分***的关系型数据表进行数据操作;
当所述数据操作改变了数据表的数据时,更新数据表对应的树状数据结构,并重新生成数据表的哈希证明。
优选地,还包括:所述电子积分***的关系型数据表包括用户数据表和积分数据表,将用户数据表、积分数据表及对应的树状数据结构以页为单位存储在磁盘中。
优选地,还包括对电子积分进行历史回溯,其具体过程为:
找到需要回溯的历史状态,从历史状态的根节点开始,逐层往下查恢复出当前历史状态下的积分数据表和对应的树状数据结构;根据历史状态下的积分数据表和对应的树状数据结构,查找得到所需要的历史积分数据项。
优选地,还包括对错误修改的电子积分进行历史回退,其具体过程为:
找到需要回退的历史状态,从历史状态的根节点开始,逐层往下恢复出当前历史状态下的积分数据表和对应的树状数据结构;检查并修复所述树状数据结构的叶子节点的有序链表,重新建立正确的有序链表。
本发明还提供了一种基于区块链的电子积分***,应用了所述的电子积分处理方法,包括:
初始化模块,用于从电子积分***的智能合约账户中取出智能合约的业务代码,构建一个智能合约调用交易;所述业务代码包括对电子积分进行增加、删除、修改、查询操作的电子积分处理函数;
智能合约调用模块,在智能合约虚拟机上执行所述智能合约调用交易,调用智能合约并执行智能合约的业务代码;
数据操作执行模块,用于执行器解析业务代码对应的数据操作语句,并对电子积分***的关系型数据表进行数据操作;
树状数据结构更新模块,用于当所述数据操作改变了数据表的数据时,更新数据表对应的树状数据结构,并重新生成数据表的哈希证明。
本发明提供了一种区块链的数据存储方法、电子积分处理方法及***,其中,方法包括:S1:获取区块链***中关系型数据表的数据,将所述数据对应的主键值存储在树状数据结构的叶子节点中;其中,所述叶子节点通过有向单链表连接成有序单链表;S2:根据叶子节点对应数据的数据项值计算叶子节点的哈希值;S3:将子节点的哈希值及相邻两个子节点的分割值存储在树状数据结构的非叶子节点中;其中,所述相邻两个子节点的分割值大于以左侧子节点为根节点的子树中叶子节点的最大值,且小于等于以右侧子节点为根节点的子树中叶子节点的最小值;每个非叶子节点的子节点数量不少于N/2且小于N,N为树状数据结构中非叶子节点的子节点数量的最大值;S4:根据所述子节点的哈希值及相邻两个子节点的分割值计算所述非叶子节点的哈希值;重复执行S1-S4直至将数据表中所有数据的主键值存储在所述树状数据结构的叶子节点中,并将树状数据结构的根节点的哈希值作为关系型数据表的哈希证明。
本发明提供的基于区块链的数据存储方法、电子积分处理方法及***,带来的有益效果是:利用树状数据结构存储区块链智能合约电子积分***中关系型数据表的索引,能够对电子积分***的用户数据表和积分数据表进行有效的哈希证明,本发明提供的电子积分***在实现区块链平台关系型数据存储需求的同时,实现了历史回溯和历史回退功能,电子积分***更加透明公开,可以同时满足用户对于商家的监督需求和商家对于错误操作恢复的需求,实现了用户对商家的有效监督,保证了电子积分***一定的错误恢复能力。
附图说明
图1为本发明基于区块链的数据存储方法、电子积分处理方法及***的方法流程示意图;
图2为本发明基于区块链的数据存储方法、电子积分处理方法及***的第一实施例示意图;
图3为本发明基于区块链的数据存储方法、电子积分处理方法及***的第二实施例示意图;
图4为本发明基于区块链的数据存储方法、电子积分处理方法及***的使用树状数据结构维护数据表中数据示意图;
图5为本发明基于区块链的数据存储方法、电子积分处理方法及***对数据表进行哈希计算的示意图;
图6为本发明基于区块链的数据存储方法、电子积分处理方法及***在磁盘中存储数据表和树状数据结构的示意图;
图7为本发明基于区块链的数据存储方法、电子积分处理方法及***在KEY-VALUE中存储数据表的示意图;
图8为本发明基于区块链的数据存储方法、电子积分处理方法及***对电子积分进行历史回溯的示意图;
图9为本发明基于区块链的数据存储方法、电子积分处理方法及***对电子积分进行历史回退的示意图。
具体实施方式
术语解释:
区块链:区块链是使用密码学技术实现的,将时间顺序的多个数据块按照单向相连的方式组成的单向链式数据结构。使用区块链这一数据结构实现基于密码学保证的不可篡改和伪造的分布式账本技术被称之为区块链技术,有时也被简称为区块链。作为一种全新的分布式计算体系,区块链技术创新性地使用了区块以及区块链这一链式数据结构来实现***状态和数据的存储、更新和验证,同时通过巧妙地共识算法在分布式对等节点间达成对数据认证、变动的一致性,利用密码学原理保证了整个***中状态的健壮性与安全性。此外,通过利用由自动化脚本代码组成的智能合约,区块链还能够实现可编程的数据操作和状态变更,可以适应复杂多变的实际场景。
智能合约:智能合约是指在区块链***上运行的,依赖于区块链环境并且操作区块链链上数据与区块链状态的一些可执行代码片段。智能合约执行的结果将会通过区块链***被记录到区块之上,在所有的参与节点之间达成不可篡改的、可验证的执行共识。智能合约扩展了区块链的语义,赋予了区块链可编程的能力,是区块链***与实际应用需求的桥梁。
关系型数据库***:数据库是一种数据管理的计算机***,通过一定方式组织和存储特定的用户数据,并为用户提供数据查询与更新的接口。关系型数据库是建立在关系模型和关系代数上的数据库***,使用集合代数来描述***中存储的数据实体以及这些实体之间的关系,并在此之上提供基于关系操作的数据操作接口。关系型数据库***中使用的关系模型来表达实体与联系的方法具有一定的抽象能力,在业务使用中相较于非关系数据库可以实现更复杂的查询语义。
默克尔树:默克尔树是一种树形数据结构,可以实现高效的验证大型数据结构的哈希计算和验证过程。在默克尔树中,每个叶子都是对特定数据块的哈希数据值,而非叶子节点的哈希值则通过其孩子节点的哈希值计算得到。这样一来,只要一个叶子节点对应的数据受到更改,对应的叶子节点的哈希值也会发生变动,而叶子节点对应的亲节点的计算的哈希值也会发生变动,以此类推最终树根的哈希值也会变化。
B树、B+树:B树和B+树是一种树状数据结构,通常被用于数据库中的数据索引。B树和B+树的节点的子节点数量只能在N/2到N的范围内,其中N被称之为阶,是B树或者B+树的一个固定的属性值,在实践中可以是100以上的数量级。由于B树和B+树的节点的子节点数量有最小的下限,相比于二叉树等结构,整个索引树的高度可以得到有效的控制,从而减少了查找过程中的节点读取次数,这对于读写较慢的机械硬盘来说更为友好。B树中被索引数据既存放于非叶子节点中,也存放于叶子节点中,并不利于磁盘的连续读写,在B+树中这些数据全部存放于叶子节点中,并使用有序链表的形式将所有数据连接起来,进一步增加索引的性能。
哈希B+树:
哈希B+树是基于B+树结构的全新数据结构,针对区块链平台的特点,在B+树的基础上结合默克尔树的部分原理,在每一个节点上定义了哈希的计算方法,可以在进行数据索引的同时,实现高效的验证大型数据结构的哈希计算和验证过程。
本发明的实施例提供了基于区块链的数据存储方法、电子积分处理方法及***,以解决难以实现关系型数据的有效存储、对电子积分***进行历史回溯与历史回退困难的技术问题。
为了便于理解本发明,下面将参照相关附图对本发明进行更全面的描述。附图中给出了本发明的首选实施例。但是,本发明可以以许多不同的形式来实现,并不限于本文所描述的实施例。相反地,提供这些实施例的目的是使对本发明的公开内容更加透彻全面。
除非另有定义,本文所使用的所有的技术和科学术语与属于本发明的技术领域的技术人员通常理解的含义相同。本文中在本发明的说明书中所使用的术语只是为了描述具体的实施例的目的,不是旨在于限制本发明。本文所使用的术语“及/或”包括一个或多个相关的所列项目的任意的和所有的组合。
自从Nakamoto Satoshi提出去中心化数字货币比特币(Bitcoin)以来,区块链技术凭借着自身去中心化、抗篡改、强信任等优良性质,得到了众多开发者和投资者的关注。此后,Vitalik Buterin等人在以太坊(Ethereum)中提出可以利用区块链技术执行具有图灵完备功能的计算机程序,从而在区块链上实现更加复杂业务逻辑。这种在区块链上执行的程序被称之为智能合约。由于具有良好的可编程性,兼具去中心化、抗篡改等优秀性质,区块链技术备受关注,被视为新一轮科技革命和产业变革的一个重要基础技术。通过预先设定好的智能合约逻辑,区块链技术在可以保证存储的数据不被篡改,实现数据的可追溯的同时,实现在无须事先建立信任关系的前提下进行价值转移,或者其他业务逻辑。
随着区块链技术的崛起,越来越多的商家和政务部分选择了区块链智能合约作为去中心化的电子积分***的平台,用于向用户展示更公平、更透明、更公开同时去中心化的用户积分平台。在这个过程中,电子积分***的智能合约对于区块链上保存的业务数据进行增加、删除、修改、查询等操作是不可避免的。同时,由于电子积分***的业务逻辑的特殊性,积分智能合约的存储往往需要采用基于关系型的数据存储,以保证在发行积分、使用积分等逻辑中实现对批量积分用户的大规模操作。
在许多现有的区块链***,比如以太坊、Hyperledger Fabric之中,对于数据的存储使用了非关系型的Key-Value存储的方式。非关系型存储虽然具有较高的性能,但是往往不能够处理更为复杂的数据关系和数据结构,实现基于数据关系的批量化、结构化的数据操作。在结构化查询的需求之下,以太坊平台上诞生了类似UnorderedKeySet、SetType、EthAir Balloons等智能合约项目。EthAir Balloons旨在提供一个在以太坊存储的ORM查询绑定,而UnorderedKeySet和SetType则是提供了简单数据模型的操作接口。这些项目通过将增加、删除、修改和查询等操作转换为在Key-Value存储模型上的一系列操作,提供一定程度的结构化操作功能。然而,这个过程中会消耗大量的转换操作,对于使用gas作为执行代价的以太坊智能合约来说是一个巨大的缺陷。同时,这种转换也不能够提供十分复杂的操作逻辑,不能够满足复杂的业务需求。
另一方面,在联盟链的场景下,一些区块链***,例如FISCO-BCOS等,则尝试着直接将结构化查询和关系型数据库引入到区块链***中。然而,由于目前尚未有比较好的方案对智能合约存储的这些关系数据表进行一个哈希计算,区块计算合约状态哈希的时候,往往需要对整个数据表扫描并进行哈希计算,这对于智能合约执行和区块链***本身而言都是一个不小的开销。同时,由于没有合适的数据结构,这些关系型的数据存储并未具备历史回退功能,只能实现历史哈希存证,这将导致区块链***不能出现分叉和切换。可以说,这种方案牺牲了一定的安全性来实现查询的功能,比较适用于联盟链而不是公有链。
此外,还有诸如BigchainDB、OurSQL等使用区块链平台的数据库***,它们采用了独立解耦的方式来为其他区块链提供分布式去中心化的关系型数据存储。然而,这些产品并实际的区块链***,而是一个相对独立的数据库***。虽然这种架构的设计能够解耦区块链***的存储逻辑和业务流程,但是整个***的安全性将会出现短板原理。而且,这些产品同样只能够进行历史哈希存证,而不能实现有效的历史回退功能。使用了这些产品的区块链***同样丧失了历史回退、分支切换等能力,仅能够在特定环境下有限的使用。
对于本发明所要实现的基于关系型存储的区块链智能合约去中心化电子积分***而言,历史回溯与历史回退的能力是不可或缺的。一方面,对于***的参与者(用户)而言,需要有能有效监管积分的发放、使用和销毁等功能,做到对积分***的有效监控,以维护用户在***中的合法权益,这就需要能有效地回溯电子积分智能合约的存储历史;另一方面,对于***的维护者(商家、积分发行方而言),则需要为其提供一定的历史回退能力,用以保证在电子积分***受到恶意攻击、
现有的区块链***往往不会直接对于大量对象进行哈希计算,而是通过哈希树,也就是默克尔树来实现。由于具有快速重新计算、可以历史回退等优良特点,这种哈希数据结构和它的后续变体结构被广泛应用在区块链***中。而在关系型数据库***的设计中,数据的索引通常使用了树状数据结构进行维护,比如B树和B+树作为数据项的索引结构。利用数据表的索引和哈希树的原理,可以比较好的解决直接扫描数据表并哈希计算所产生的巨大开销,同时避免了只能进行哈希存证而不能历史回退的缺点,在此基础之上,构建了一个具备历史回溯和历史回退能力的区块链智能合约平台上的去中心化电子积分***。
本发明提供了实施例提供了一个区块链的数据存储方法、基于区块链的电子积分处理方法及电子积分***,提供的电子积分***是一个具备了历史回溯和历史回退能力的、基于关系型数据存储的区块链智能合约平台的去中心化电子积分***。为了使本发明的目的、技术方案以及优点阐述的更加清楚明白,以下参照附图进行进一步详细说明。
请参阅图5,以下为本发明提供的一种区块链的数据存储方法的实施例,包括:
S101:获取区块链***中关系型数据表的数据,将所述数据对应的主键值存储在树状数据结构的叶子节点中;其中,所述叶子节点通过有向单链表连接成有序单链表;
S102:根据叶子节点对应数据的数据项值计算叶子节点的哈希值;
S103:将子节点的哈希值及相邻两个子节点的分割值存储在树状数据结构的非叶子节点中;其中,所述相邻两个子节点的分割值大于以左侧子节点为根节点的子树中叶子节点的最大值,且小于等于以右侧子节点为根节点的子树中叶子节点的最小值;每个非叶子节点的子节点数量不少于N/2且小于N,N为树状数据结构中非叶子节点的子节点数量的最大值;
S104:根据所述子节点的哈希值及相邻两个子节点的分割值计算所述非叶子节点的哈希值;
重复执行S103、S104直至将数据表中所有数据的主键值存储在所述树状数据结构的叶子节点中,并将树状数据结构的根节点的哈希值作为关系型数据表的哈希证明。
现有的区块链***中,智能合约的数据往往只能存储在Key-Value存储对象中,而缺乏有效的方法来实现关系型的数据存储。本发明实施例提供的区块链的数据存储方法,将关系型数据表的主键使用哈希B+树作为索引项,并在构建和维护索引的同时完成对该数据表的所有数据项的哈希证明。
请参阅图4,通过哈希B+树维护关系型数据表具体有以下细节:
1、元数据表维护。对于智能合约的所有数据表,需要通过一个元数据表来维护数据表的一些基本信息,包括表的地址、表的结构和其他一些维护数据表的关键信息。智能合约执行过程中,关系型数据操作执行器可以使用元数据表来构建合约进行数据操作的对于逻辑,在上层积分***传入数据操作SQL语句的时候,将会使用元数据表中的列、数据类型等信息生成对应的数据查询和操作动作,并应用在存储的关系型数据之上。例如,在核销电子积分的过程中,执行引擎将会通过删除的SQL语句查询到积分表的元数据,并由此分析得到积分表中的索引信息和列信息,最终生成具体的数据执行操作计划。这里的元数据表中保存了用户数据表和积分数据表的哈希证明和对应的表的列、数据类型等信息。
2、数据表索引的维护。对于智能合约电子积分***的用户数据表和积分数据表,都有相应的主键。在用户表中主键为用户地址,也就是用户的唯一标识;在积分表中,主键为积分ID,这个积分ID是在商家创建积分的时候生成的唯一标识。数据表的主键将会使用哈希B+树作为索引项,并在构建和维护索引的同时完成对该数据表的所有数据项的哈希证明。
3、用户数据表和积分数据表的哈希证明。用户数据表和积分数据表存储的哈希证明通过哈希B+树进行计算。其中,叶子节点的哈希值为数据项的哈希值,在用户表中是<用户地址,名称,别称>的哈希值,在积分表中则是<积分ID,用户地址,价值>的哈希值。然后,对于非叶子节点的哈希值,则是通过其所有子节点的哈希值和分隔值计算得到哈希。最后,根节点的哈希值代表了索引的数据表的对应的哈希证明。
请参阅图5,对电子积分***数据表(以用户表为例)进行哈希计算和索引,哈希B+树可以通过分隔值和子树来表示索引的范围,并通过层级的哈希计算来得到整个数据表的哈希证明。具体为:
1、使用叶子节点对应的数据项的哈希值。叶子节点A对应的数据项是<0x01,甲,阿一>,因此叶子节点A的哈希值为:
Ha=Hash(<0x01,甲,阿一>)
用同样的方法计算叶子节点B、C的哈希值。
2、使用子节点和内部的分割值可以计算非叶子节点的哈希值。比如叶子节点A、B、C的父节点的哈希值为:
H=Hash(Ha,0x02,Hb,0x03,Hc,0x04)
3、通过哈希B+树查找用户表中的对应用户。对于需要查找的用户,比如用户0x03,通过节点的分隔值可以得知,用户0x03必然处在哈希值为H的节点之下,其所有叶子节点的地址范围为[0x01,0x04)。如此往下搜索,可以最终得到用户0x03的数据项并进行操作。
请参阅图6,在磁盘中存储电子积分***积分数据表和哈希B+树索引,电子积分***的用户数据表和积分数据表可以以页式管理的形式存储在机械磁盘之中,主要的细节有:
1、积分表数据项<积分ID,用户地址,价值>和对应的索引节点在磁盘中以页为单位进行存储,每个页为固定长度的连续存储数据块,页的内部可以有多个积分表数据项和对应的索引节点。
2、磁盘中的数据使用<页编号,偏移值,长度>作为磁盘上的查找方式,可以通过该磁盘指针获取到对应索引节点或者积分表数据项<积分ID,用户地址,价值>。
3、当磁盘中的<积分ID,用户地址,价值>数据项或者索引节点被加载到内存之后,在内存中缓存的哈希B+树节点将通过内存指针(地址)查找并使用。
请参阅图1,以下为本发明提供的一种基于区块链的电子积分处理方法,应用了所述的区块链的数据存储方法存储电子积分***的关系型数据表,包括:
从电子积分***的智能合约账户中取出智能合约的业务代码,构建一个智能合约调用交易;所述业务代码包括对电子积分进行增加、删除、修改、查询操作的电子积分处理函数;
在智能合约虚拟机上执行所述智能合约调用交易,调用智能合约并执行智能合约的业务代码;
执行器解析业务代码对应的数据操作语句,并对电子积分***的关系型数据表进行数据操作;
当所述数据操作改变了数据表的数据时,更新数据表对应的树状数据结构,并重新生成数据表的哈希证明。
请参阅图1,以商家核销用户电子积分的业务流程为例,具体说明该电子积分***的操作流程为:
1、取出代码。电子积分***的业务逻辑通过智能合约平台实现,业务代码存放在电子积分***智能合约的账户之中。当商家核销用户电子积分的时候,需要构建对应的智能合约调用的交易,这里为构建一个调用核销电子积分函数的智能合约调用的交易。区块链平台在执行交易之前,会先从电子积分***的智能合约账号中取出对应的业务逻辑代码,用以后续调用的执行。
2、执行代码。通过执行由商家构建的调用核销电子积分的智能合约函数交易,可以驱动电子积分智能合约并完成核销电子积分的操作。这一步中,会将需要核销的电子积分和积分对应的用户标识以参数的形式传入积分智能合约的核销电子积分函数,并在智能合约虚拟机上完成调用函数代码的执行。
3、调用关系型数据操作接口。在核销电子积分的业务逻辑中,将会通过合约调用的方式完成对底层积分数据表的特定电子积分数据项的删除操作。这一步中会将数据操作生成为SQL语句,并调用虚拟机内置的关系型数据操作函数。
4、解析并操作数据。上述对积分表的特定电子积分数据项的删除操作的SQL语句将会传入对应的SQL解析器中,解释为对积分数据表某一项数据项的删除操作并最终对电子积分***的积分数据表的该数据项的操作,该电子积分将被核销。
5、更新合约存储证明。电子积分数据项被删除后,需要重新维护索引项以保证积分表的索引的正确性。在哈希B+树的结构中,索引节点的子节点数量必须在N/2到N之间,其中N为哈希B+树的阶。当进行积分数据项的删除之后,索引项的父节点的子节点数量可能会少于N/2,不能够满足哈希B+树的结构要求,需要从当前节点的兄弟节点移动一个子节点到当前子节点。最后,在保证了积分表索引的哈希B+树的结构正确后,按照附图5中详细的计算方式,通过积分表的哈希B+树重新计算修改数据后的积分表哈希证明,完成整个商家核销用户电子积分的业务流程。由于哈希B+树的计算特性,重新计算积分表的哈希证明只需要计算变更过的积分数据项和哈希B+树维护过程中修改到的节点的哈希值即可。
请参阅图2,图2为电子积分***中用户对***操作的用例图,主要包含了以下操作:
1、获取电子积分。用户可以通过电子积分***获取到商家派发的电子积分。商家派发电子积分后,用户需要调用电子积分***的智能合约来完成对电子积分的所有权确认,最后在积分数据表上为该电子积分增加该用户的地址关联。
2、消费电子积分。用户在使用电子积分的时候,会通过调用电子积分***的智能合约来标记对应电子积分的消费,在商家进行确认核销之后,该电子积分将会被销毁,并取消与该用户地址的关联。
3、通过回溯***历史对商家行为进行监督。用户可以通过该电子积分***的智能合约平台实现对该***历史状态的回溯,并查询任意历史时刻上的积分状态,从而保证商家和用户行为的完全透明。
值得说明的是,合约指的是代码,合约账户是合约的数据,可以简单类比为web服务中的代码和数据库。图2和图3中的积分合约指调用合约。
请参阅图3,图3为电子积分***中商家对***操作的用例图,主要包含了以下操作:
1、发放电子积分。商家可以创建电子积分并进行发放,被发放的电子积分将会处于待领取的状态,等待用户进行领取。
2、核销电子积分。用户在使用电子积分之后,该电子积分将会处于待核销的状态,商家需要通过核销操作完成用户电子积分的整个使用流程。
3、通过回退***历史实现故障和错误的恢复。当***出现错误操作、被攻击等异常的时候,商家可以通过回退历史的方式将***重置为特定的历史状态。
请参阅图1,以下为一种基于区块链的电子积分***的实施例,应用了所述的电子积分处理方法,包括:
初始化模块,用于从电子积分***的智能合约账户中取出智能合约的业务代码,构建一个智能合约调用交易;所述业务代码包括对电子积分进行增加、删除、修改、查询操作的电子积分处理函数;
智能合约调用模块,在智能合约虚拟机上执行所述智能合约调用交易,调用智能合约并执行智能合约的业务代码;
数据操作执行模块,用于执行器解析业务代码对应的数据操作语句,并对电子积分***的关系型数据表进行数据操作;
树状数据结构更新模块,用于当所述数据操作改变了数据表的数据时,更新数据表对应的树状数据结构,并重新生成数据表的哈希证明。
本实施例中,通过结合树状哈希计算和B+树,设计了一个全新的哈希数据结构哈希B+树作为数据表的索引项,从而构建一个具有历史回退能力的支持关系型数据存储的区块链智能合约电子积分***。
具体的,为实现本实施例提供的电子积分***所需要的关系型数据存储和业务需求,需要解决数据存储、索引、数据的哈希计算以及历史回退功能的支持等要求,本实施例提供的电子积分***具有如下功能:
1、实现积分***的业务逻辑:
支持关系型数据存储的区块链智能合约电子积分***具有以下业务逻辑需求:
(1)商家可以通过电子积分***的智能合约向所有用户或者特定用户发放电子积分,每个发放的电子积分为最小单元,不可划分。
(2)商家可以在用户使用积分的时候进行积分核销,通过调用对应的电子积分智能合约销毁用户持有的电子积分。
(3)商家可以通过历史回退的方式驱动区块链***回退到错误发生前的历史状态,从而是电子积分***中的数据存储回退到特定的历史中。
(4)用户可以通过电子积分智能合约领取到商家发放的电子积分,在积分数据表中该电子积分将会与对应用户数据表中的用户身份产生关联。
(5)用户可以通过电子积分智能合约向商家进行兑换和使用自己所持有的电子积分,最后通过商家完成用户对应电子积分的销毁工作。
(6)用户可以通过该电子积分***的区块链平台实现特定的历史回溯,从而查询个人和商家的历史信息和存储,进而实现对商家的监督功能。
2、建立积分***的用户和积分数据表的索引:
为实现关系型数据的维护和查询工作,需要为用户和积分数据表的所有数据项建立合适的数据索引项。在现有的一部分支持关系型数据存储的智能合约平台上,数据项的索引是通过第三方的关系型数据引擎来实现的,底层使用了B树、B+树或者哈希表等作为索引的数据结构,不能够很好的契合区块链和智能合约的抗篡改、可溯源的特性。
3、支持对积分***的用户表和积分表的哈希计算:
由于区块链***的特性,基于状态变化的智能合约必须能够在每次执行交易之后发生一定的状态变化,并通过一定的哈希摘要过程将这个状态变化的结果保存到区块之中,最终在区块链的所有参与方之间就这次的状态变化达成一致认知,并将这个摘要哈希保存成不可篡改的历史结果。为此,实现基于关系型数据存储的智能合约电子积分***,必须能够对电子积分***中维护的用户数据表和积分数据表进行有效的哈希存证。
4、实现用户表和积分表数据的存储:
维护和存储用户和积分数据表,同样也是实现本申请智能合约电子积分***的一个重要要求。本申请智能合约电子积分***的用户和积分数据表以及数据表对应的哈希B+树索引必须要能够有效地保存起来,实现持久化存储。
5、支持用户对电子积分***的数据进行历史回溯:
历史回溯是区块链***的一个重要属性。通过历史回溯,***的使用者可以检视和查看特定历史时间下的***状态数据,甚至可以追踪特定数据的历史变更信息。在本申请去中心化的电子积分***中,用户可以通过历史回溯的方式实现对积分***过往历史数据的检查,用以监督商家在积分***上的数据操作和行为,从而实现更加透明的积分***。回溯过程中,电子积分***的当前存储状态不会发生改变,用户只能读取到历史的存储状态。
6、支持用户对电子积分***的数据进行历史回溯:
通过回退,可以将***的当前状态重置为某一个特定历史时间下的***状态。当区块链***出现分叉的时候,有一部分的节点必须进行分叉的切换,这就要求这些节点放弃从分叉区块开始后的状态变更,回退到分叉前的历史状态并在新的分叉上应用新分叉上的区块的交易和状态变更。目前支持关系型数据操作的智能合约平台和***都没有历史回溯和回退的能力,只能查找和使用最新的数据,也不能够支持回滚。在本申请去中心化的电子积分***中,需要实现对积分***的用户和积分数据表的历史回退支持,以保证在***故障或者分叉的时候,能够将***的积分数据和用户数据回退到特定安全的历史状态中,并重新开始执行。
本实施例中使用了全新的哈希B+树作为关系型数据的索引结构,在实现了智能合约对关系型数据的操作支持的同时,还实现了具备历史回溯和历史回退能力的关系型数据的存储和证明。该***设计有效的解决了上述的问题,具有如下优点:
1、通过哈希B+树索引本专利***的用户和积分数据表
在本专利的方案中,采用了全新的B+树结构的变体——哈希B+树作为用户和积分数据表的索引结构,这主要是因为树状的哈希结构能够进行层级的哈希计算,更能够符合区块链***中对数据进行高哈希计算的需求。新的索引在结构上与B+树相类似,同样具备B+树结构高扇出和磁盘IO友好的特点,能够有效的保证积分***对用户和积分数据表的读写性能,同时相较于传统的B树、B+树更能够符合区块链***和智能合约***的应用场景。
2、实现对电子积分***的用户和积分数据表的基于树状层级的高效哈希证明
在本专利方案中,类似于Merkle树的层级哈希计算过程,电子积分***的用户数据表或积分数据表的哈希值可以通过哈希B+树的索引结构进行层级的哈希计算,通过每一个节点的子节点来计算当前的节点的哈希值,最后计算得到全部数据的一个哈希值,即
Hash(Node)=Hash(Hash(Child1)+sep1+…+sepn-1+Hash(Childn))
其中,Child1...Childn∈Node.Children为节点的叶子节点,sep1...sepn-1为节点中的分隔值。在本专利***中,用户数据表和积分数据表进行修改后后,只需要重新计算哈希B+树索引中发生变化的节点的哈希值即可,不用重新对全部数据进行哈希计算。
3、实现基于磁盘的电子积分***的用户和积分数据表和索引存储
本专利***中,可以通过页式管理的方式维护和存储电子积分***智能合约的用户和积分数据表。在磁盘中,用户数据表和积分数据表和对应的哈希B+树节点都是以页为单位进行数据的存储和管理,每个页有若干个节点或者数据项。当两者对应哈希B+树节点或者维护的数据在磁盘中的时候,通过<页编号,偏移值,长度>的文件指针进行查找。
4、实现基于Key-Value的电子积分***的用户和积分数据表和索引存储
本专利***中,还可以通过Key-Value的存储来存储和维护的电子积分***的用户和积分数据表。每个用户数据表和积分数据表的数据项的哈希值,都是在Key-Value存储中对对应数据查询的键值。通过基于Key-Value的存储,本专利***可以在不直接操作磁盘的条件下维护和存储电子积分***的用户和积分数据表和索引,可以在更加去中心化的分布式Key-Value存储***上部署该电子积分***。
5、实现用户对电子积分***的用户和积分数据表的历史回溯
本文专利***中,通过保存哈希B+树更新过程中的保存历史节点的方式实现了对电子积分***的用户和积分数据表的历史回溯。在用户和积分数据表操作和修改的过程中,用户可以通过特定的历史用户数据表和积分数据表的哈希证明来重新查找该历史下的用户数据和积分数据,也就是历史回溯的功能。
6、实现商家对电子积分***的用户和积分数据表的历史回退
本专利***中,商家可以通过类似用户历史回溯的方式实现对电子积分***的用户数据表和积分数据表的历史回退。在出现操作错误或者受到恶意攻击的时候,只需要重建索引底层维护的用户数据项和积分数据项的链表,即可重新恢复历史状态下完整的用户数据表和积分数据表,完成历史回退。
本实施例提供的基于区块链的电子积分***,是一个具备历史回溯能力的,可以在智能合约中有效地维护关系型数据的区块链智能合约电子积分***。该积分***通过一种新型的数据索引来实现对大批量数据维护和哈希计算,同时还可以实现被索引数据的历史回退,是一个比现有解决方案更具有移植性和安全性的***。
本实施例提供的一个基于哈希B+树索引、使用关系型数据存储的区块链智能合约电子积分***,能够在使用关系型数据存储满足自身业务需求的同时,也支持了关系型数据存储的历史回溯和历史回退功能,可以同时满足用户对于商家的监督需求和商家对于错误操作恢复的需求,是一个更加公平和透明的去中心化电子积分***。
请参阅图7,在Key-Value存储中存储积分***积分数据,其中,非关系型的Key-Value存储介质既可以是单机的非关系型数据库或者哈希表,也可以是分布式的Key-Value存储***。与磁盘中直接存储类似,Key-Value中的<积分ID,用户地址,价值>数据项和节点在加载到内存后,将会以内存指针的方式查找。不同的是,Key-Value存储中可以直接使用索引节点或者<积分ID,用户地址,价值>数据项的哈希值作为键值来索引对应内容,从而不必再存储这些数据的时候额外存储磁盘指针。
请参阅图8,为用户对电子积分***进行历史回溯的过程,如图8所示,积分表中保存了积分1、2、3、4、5共五个积分,他们可以计算得到对应的哈希值1、2、3、4、5,并通过附图5中介绍的哈希B+树节点哈希值的计算方法得到哈希值A和哈希值B,最终得到整个表的根哈希值。在某时刻中,商家变更了积分3的数据为积分3.1,这时候积分3.1的哈希值将变为哈希3.1,对应的父节点的哈希值则会变更为哈希A.1,最终的积分表的根哈希值将会变更到新的根哈希值。其中,实线箭头代表了最新的哈希B+树的节点的指针,而虚线的箭头表示了历史状态中存在的哈希B+树的节点的指针。如用户需要查询商家进行积分3修改之前的历史数据,具体流程为:
1、找到需要回溯的历史状态。用户需要通过区块找回数据变更前的历史状态,也就是积分表的进行变更前的旧的根哈希值。
2、从历史根节点开始,逐层往下查找,可以恢复出当前历史状态下的积分数据表和对应的哈希B+树索引。请参阅图8,可以通过变更前的根哈希的指针得到历史的哈希B+树索引节点1,节点1中存储的哈希值为哈希A而非变更后的哈希A.1。根据哈希A可以继续获得变更前的节点2,节点2中保存了积分3变更前的哈希值和指针。
通过历史记录下的积分数据表和对应的哈希B+树索引,查找得到所需要的历史积分数据项。通过步骤2中获取得到的节点2的数据,可以在积分数据表的存储中获取得到变更前的积分3的数据项,用户可以查询到历史的积分3的整个数据项,从而完成了历史记录下积分的查询。
用户进行历史回溯的过程中,当前积分***的实际存储数据不会发生变化。用户只是通过历史的状态查询到历史时间下的存储内容,比如积分3,而实际积分***中存储的数据依然是被修改后的积分3.1。
请参阅图9,为商家对积分***进行历史回退的过程,如图9所示,积分表中保存了积分1、2、3、4、5共五个积分,他们可以计算得到对应的哈希值1、2、3、4、5,并通过附图5中介绍的哈希B+树节点哈希值的计算方法得到哈希值A和哈希值B,最终得到整个表的根哈希值。由于商家的错误操作,使得积分3的数据被修改为错误的积分3.1。通过附图5中介绍的哈希B+树哈希值的计算流程,错误的积分3.1的哈希值将变为哈希3.1,对应的父节点的哈希值则会变更为哈希A.1,最终的积分表的根哈希值将会变更到一个商家不希望得到的根哈希值。错误操作执行完毕之后,积分表中将会保存错误变更后的哈希B+树结构和积分3.1,商家需要通过历史回退的方式来撤销这一系列的错误结构。其中,实线箭头代表了错误变更前的哈希B+树的节点的指针,虚线的节点代表了因为错误变更产生的节点,而虚线的箭头表示了错误变更后的哈希B+树的节点的指针。这里商家错误的修改了积分3的数据内容,需要进行回退。回退的具体流程为:
1、找到需要回退的历史状态。图中商家要回退到对积分3错误修改之前的数据存储,需要从区块中获取到错误变更前的积分表状态,也就是变更前的积分表的根哈希值。
2、从历史根节点开始,逐层往下恢复出当前历史状态下的积分数据表和对应的哈希B+树索引。如图中所示,从变更前的根哈希开始,找到变更前的哈希B+树的根,并遍历得到变更前的哈希B+树节点1、节点2,以及在错误变更中没有发生变化的节点3。最后将会得到发生错误变更之前的积分数据表的数据项积分1、2、3、4和5,将积分3.1的错误结果回退为原有的积分3。
3、检查并修复当前哈希B+树索引的叶子节点链表,重新建立正确的链表指针。在发生错误变更的过程中,哈希B+树中的叶子节点,也就是积分2的数据项的后继指针将会变更为积分3.1的数据项,在进行回退的过程中,需要将积分2数据项的后继指针重新恢复为指向积分3的数据项。具体方法为,从变更前和变更后的哈希B+树结构开始遍历,对比找到变更的节点和变更的数据项,这里先会找到节点1和节点1.1,然后找到节点2和节点2.1,最终找到变更的数据项积分3和积分3.1;然后,在需要恢复的哈希B+树的叶子节点中找到积分3的前驱数据项,也就是积分2,并将其后继指针修改为指向积分3的数据节点。
历史回退过程结束后,将会得到图9中所示的实线节点、箭头和数据项组成的,在商家进行积分3错误变更前的哈希B+树索引和对应的变更前的积分数据表,而虚线节点、箭头和数据项组成的错误变更将会被撤销。与历史回溯不同的是,商家进行历史回退之后,当前积分***的存储将会发生改变,应用于积分3上的修改将会被撤销,重新变回修改前的积分3,而不是错误变更后的积分3.1。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的***,装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
在本申请所提供的实施例中,应该理解到,所揭露的***,装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个***,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-OnlyMemory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。