一种数据存储方法及装置
技术领域
本申请涉及区块链技术领域,特别涉及一种数据存储方法及装置。
背景技术
目前,区块链若采用单链模型,会存在上链确认速度慢,性能较低的问题,在这种背景下,区块链开始尝试采用具备并行处理能力的DAG模型,以改善单链模型存在的问题。
但是,DAG模型却难以为多个区块之间定义全局一致顺序,这将导致区块链对交易数据进行存储时,难以确定交易数据的交易顺序,因此会造成后续交易因基于交易顺序不正确的交易数据,出现错误,交易执行的可靠性差。
发明内容
为解决上述技术问题,本申请实施例提供一种数据存储方法及装置,以达到通过数据在多叉树中的深度,来确定数据的交易顺序,保证后续交易在数据的正确交易顺序下执行,提高交易执行的可靠性的目的,技术方案如下:
一种数据存储方法,包括:
接收待存储数据;
在预先构建的区块链中查找与所述待存储数据存在因果关系的数据,所述预先构建的区块链为按照多叉树结构将区块进行分布的区块链;
确定查找到的与所述待存储交易数据存在因果关系的数据,在所述多叉树结构的区块链中所处的层,将确定的层作为目标层;
从所述目标层以下的层所包含的区块中选择目标区块,将所述待存储数据存储在所述目标区块中。
优选的,所述从所述目标层以下的层所包含的区块中选择目标区块,包括:
从所述目标层以下的层所包含的区块中选择一个子交易数量未达到设定数量阈值上限的区块,作为目标区块。
优选的,所述方法还包括:
确定所述待存储数据的工作量证明;
将所述待存储数据的工作量证明存储在所述目标区块中。
优选的,所述确定所述待存储数据的工作量证明,包括:
确定对满足关系式F{r,hash(m)}<n*D(d)的随机数进行查找的时间,将确定出的时间作为所述待存储数据的工作量证明;
所述r表示随机数,所述m表示所述待存储数据,n表示系统常数,d表示预先设定的难度值,D()表示对d的递减函数,hash()表示哈希函数,F{}表示联合计算函数。
优选的,所述方法还包括:
确定一笔不小于设定最少手续费的手续费,作为所述待存储数据的手续费;
将所述待存储数据的手续费存储在所述目标区块中;
其中,所述待存储数据的手续费由所述目标区块所属层以下的层的区块按照设定要求进行共享。
优选的,所述工作量证明用于参与累积重量的计算,所述累积重量用于计算所述目标区块的置信度及作为在存在冲突交易时,判断合法交易的依据;
所述累积重量的计算过程为:获取引用所述目标区块的所有子交易的工作量证明,将所述引用所述目标区块的所有子交易的工作量证明之和作为累积重量;
计算所述目标区块的置信度的过程,包括:
将所述目标区块的累积重量与基于所述预先构建的区块链中作为根节点的区块的累积重量的比例,作为所述目标区块的置信度。
一种数据存储装置,包括:
接收模块,用于接收待存储数据;
查找模块,用于在预先构建的区块链中查找与所述待存储数据存在因果关系的数据,所述预先构建的区块链为按照多叉树结构将区块进行分布的区块链;
第一确定模块,用于确定查找到的与所述待存储交易数据存在因果关系的数据,在所述多叉树结构的区块链中所处的层,将确定的层作为目标层;
第一存储模块,用于从所述目标层以下的层所包含的区块中选择目标区块,将所述待存储数据存储在所述目标区块中。
优选的,所述第一存储模块,具体用于:
从所述目标层以下的层所包含的区块中选择一个子交易数量未达到设定数量阈值上限的区块,作为目标区块。
优选的,所述装置还包括:
第二确定模块,用于确定所述待存储数据的工作量证明;
第二存储模块,用于将所述待存储数据的工作量证明存储在所述目标区块中。
优选的,所述第二确定模块,具体用于:
确定对满足关系式F{r,hash(m)}<n*D(d)的随机数进行查找的时间,将确定出的时间作为所述待存储数据的工作量证明;
所述r表示随机数,所述m表示所述待存储数据,n表示系统常数,d表示预先设定的难度值,D()表示对d的递减函数,hash()表示哈希函数,F{}表示联合计算函数。
优选的,所述装置还包括:
第三确定模块,用于确定一笔不小于设定最少手续费的手续费,作为所述待存储数据的手续费;
第三存储模块,用于将所述待存储数据的手续费存储在所述目标区块中;
其中,所述待存储数据的手续费由所述目标区块所属层以下的层的区块按照设定要求进行共享。
优选的,所述工作量证明用于参与累积重量的计算,所述累积重量用于计算所述目标区块的置信度及作为在存在冲突交易时,判断合法交易的依据;
所述累积重量的计算过程为:获取引用所述目标区块的所有子交易的工作量证明,将所述引用所述目标区块的所有子交易的工作量证明之和作为累积重量;
计算所述目标区块的置信度的过程,包括:
将所述目标区块的累积重量与基于所述预先构建的区块链中作为根节点的区块的累积重量的比例,作为所述目标区块的置信度。
与现有技术相比,本申请的有益效果为:
在本申请中,采用多叉树结构的区块链对数据进行存储,实现了采用多叉树的深度(即层数)对存在因果关系的数据的交易顺序的定义,在定义了存在因果关系的数据的交易顺序之后,可以保证数据被存储后,通过数据在多叉树中的深度,来确定数据的交易顺序,保证后续交易在数据的正确交易顺序下执行,提高交易执行的可靠性。
附图说明
为了更清楚地说明本申请实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1是本申请提供的一种数据存储方法实施例1的流程图;
图2是本申请提供的一种预先构建的区块链的结构示意图;
图3是本申请提供的一种数据存储方法实施例2的流程图;
图4是本申请提供的一种数据存储方法实施例3的流程图;
图5是本申请提供的一种数据存储方法实施例4的流程图;
图6是本申请提供的一种数据存储装置的逻辑结构示意图。
具体实施方式
下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
在DAG模型难以为多个区块之间定义全局一致顺序的背景下,本领域技术人员尝试采用串行的交易顺序(可以理解为:区块链中的所有交易均按照一定的顺序排列)的方式,为DAG模型的区块链中的交易的顺序进行定义。
其中,采用串行的交易顺序的方式,需要为所有的交易定义一个全局一致的时间戳。然而,发明人发现为所有的交易定义一个全局一致的时间戳的方案难以实施,难以实施的主要原因有以下两点:
第一点为:区块链是去中心化的异步网络,不存在唯一的中心节点以领导者的身份确定顺序,因此无法定义以哪个节点的时间作为排序依据;
第二点为:若使用全球标准时间作为排序依据,会对硬件和网络提出很高的要求,且无法防止恶意更改时间的行为。因此,本方案暂时不考虑串行的交易顺序。
在为所有的交易定义一个全局一致的时间戳的方案难以实施的情况下,发明人也发现交易网络其实并不需要非常严格的串行的交易顺序,因为即便不去定义那些无关的交易之间的交易顺序,对那些交易的执行并不会产生影响。但是,有关的交易之间的交易顺序非常关键的,因而是有必要进行限制的,如,存在因果关系的两个交易需要定义其先后顺序。
因此,发明人基于存在因果关系的两个交易需要定义先后顺序,提出一种全新结构的区块链,对数据进行存储,保证存在因果关系的两个交易的数据的顺序可以在区块链中被定义。
接下来对本申请实施例公开的数据存储方法进行介绍,如图1所示的,为本申请提供的一种数据存储方法实施例1的流程图,可以包括以下步骤:
步骤S11、接收待存储数据。
步骤S12、在预先构建的区块链中查找与所述待存储数据存在因果关系的数据,所述预先构建的区块链为按照多叉树结构将区块进行分布的区块链。
可以理解的是,多叉树结构为允许每个节点包括多个子节点的树形数据结构。
按照多叉树结构将区块进行分布的区块链可以参见如图2,如图2所示,创世区块为根节点,基于多叉树结构的每个子节点只能引用其上一层的其中一个节点的属性及每个父节点可以被多个子节点引用的属性,预先构建的区块链中每个区块只能引用其上一层的其中一个区块,而一个区块可以被多个后续区块引用。
如图2所示,通过多叉树的层数,区块中数据的先后顺序可以被规定。在预先构建的区块链中查找与所述待存储数据存在因果关系的数据,可以理解为:
在预先构建的区块链中查找与所述待存储数据存在因果关系且在因果关系中作为原因的数据。
步骤S13、确定查找到的与所述待存储交易数据存在因果关系的数据,在所述多叉树结构的区块链中所处的层,将确定的层作为目标层。
步骤S14、从所述目标层以下的层所包含的区块中选择目标区块,将所述待存储数据存储在所述目标区块中。
本实施例中,并不限制是从目标层以下的哪一层所包含的区块中选择目标区块,只需要保证是从目标层以下的层所包含的区块中选择即可。
参见图2所示的区块链,若目标层为第1层,则可以从第2层至第n层中任意一层所包含的区块中选择目标区块。
将所述待存储数据存储在所述目标区块中,保证待存储数据存储的层在与其存在因果关系的数据所处的层之下,可以保证通过数据在多叉树中的层数,确定待存储数据及与所述待存储数据存在因果关系的数据的交易顺序。
在本申请中,采用多叉树结构的区块链对数据进行存储,实现了采用多叉树的深度(即层数)对存在因果关系的数据的交易顺序的定义,在定义了存在因果关系的数据的交易顺序之后,可以保证数据被存储后,通过数据在多叉树中的深度,来确定数据的交易顺序,保证后续交易在数据的正确交易顺序下执行,提高交易执行的可靠性。
并且,多叉树结构同样具备并行处理的能力,因此预先构建的区块链可以保证较快的上链确认速度及较高的性能。
作为本申请另一可选实施例,参照图3,为本申请提供的一种数据存储方法实施例2的流程示意图,本实施例主要是对上述实施例1描述的数据存储方法的细化方案,如图3所示,该方法可以包括但并不局限于以下步骤:
步骤S21、接收待存储数据。
步骤S22、在预先构建的区块链中查找与所述待存储数据存在因果关系的数据,所述预先构建的区块链为按照多叉树结构将区块进行分布的区块链。
步骤S23、确定查找到的与所述待存储交易数据存在因果关系的数据,在所述多叉树结构的区块链中所处的层,将确定的层作为目标层。
步骤S21-S23的详细过程可以参见实施例1中步骤S11-S13的相关介绍,在此不再赘述。
步骤S24、从所述目标层以下的层所包含的区块中选择一个子交易数量未达到设定数量阈值上限的区块,作为目标区块,将所述待存储数据存储在所述目标区块中。
一笔交易在理论上可以拥有无数的直接子交易。但是,过多的直接子交易会影响搜索效率,不利于网络健康。为了保证平衡性,预防懒交易,本实施例中对区块链中的区块设置一个设定数量阈值上限,在引用该区块的直接子交易(可以理解为直接子区块)的数量超过设定数量阈值上限时,新增的子交易(可以理解为子区块)可以引用该区块,但是将无法共享该区块的手续费。
从所述目标层以下的层所包含的区块中选择一个子交易数量未达到设定数量阈值上限的区块,作为目标区块,避免对区块链中区块的直接子交易过多,并保证该目标区块的手续费可以被待存储数据共享。
作为本申请另一可选实施例,参照图4,为本申请提供的一种数据存储方法实施例3的流程示意图,本实施例主要是对上述实施例1描述的数据存储方法的扩展方案,如图4所示,该方法可以包括但并不局限于以下步骤:
步骤S31、接收待存储数据。
步骤S32、在预先构建的区块链中查找与所述待存储数据存在因果关系的数据,所述预先构建的区块链为按照多叉树结构将区块进行分布的区块链。
步骤S33、确定查找到的与所述待存储交易数据存在因果关系的数据,在所述多叉树结构的区块链中所处的层,将确定的层作为目标层。
步骤S34、从所述目标层以下的层所包含的区块中选择目标区块,将所述待存储数据存储在所述目标区块中。
步骤S31-S34的详细过程可以参见实施例1中步骤S11-S14的相关介绍,在此不再赘述。
步骤S35、确定所述待存储数据的工作量证明。
本实施例中,确定待存储数据的工作量证明的过程可以包括但不局限于:
确定对满足关系式F{r,hash(m)}<n*D(d)的随机数进行查找的时间,将确定出的时间作为所述待存储数据的工作量证明;
所述r表示随机数,所述m表示所述待存储数据,n表示系统常数,d表示预先设定的难度值,D()表示对d的递减函数,hash()表示哈希函数,F{}表示联合计算函数。其中,F{}表示的联合计算函数指的是对r和hash(m)进行联合计算的函数,联合计算函数可以为但不局限于:相加计算函数、相减计算函数或相乘计算函数等。如,在联合计算函数为相加计算函数的情况下,对r和hash(m)进行相加。
确定对满足关系式F{r,hash(m)}<n*D(d)的随机数进行查找的时间,可以理解为:
S351、选择一个随机数,判断选择的该随机数是否满足关系式F{r,hash(m)}<n*D(d)表示的关系;
若是,执行步骤S352;若否,返回执行步骤S351;
S352、停止选择,并确定从最初选择随机数,到停止选择之间的时间。
本实施例中,确定对满足关系式F{r,hash(m)}<n*D(d)的随机数进行查找的时间,将确定出的时间作为所述待存储数据的工作量证明的方式,实现了可变的工作量证明机制,使用户可以在低上链时间和高回报之间进行选择。
步骤S36、将所述待存储数据的工作量证明存储在所述目标区块中。
将所述待存储数据的工作量证明存储在所述目标区块中,使黑客不能以极低成本发送虚假交易,破坏网络结构。
本实施例中,所述工作量证明可以用于参与累积重量的计算,所述累积重量用于计算所述目标区块的置信度及作为在存在冲突交易时,判断合法交易的依据。
所述累积重量的计算过程可以为:获取引用所述目标区块的所有子交易的工作量证明,将所述引用所述目标区块的所有子交易的工作量证明之和作为累积重量。
计算所述目标区块的置信度的过程,包括:
将所述目标区块的累积重量与基于所述预先构建的区块链中作为根节点的区块的累积重量的比例,作为所述目标区块的置信度。
本实施例中,引入累计重量计算目标区块的置信度,可以杜绝黑客以大规模低成本虚假交易的攻击手段,维护网络监控。
另外,由于网络的异步特性,或是黑客发起的攻击等原因,网络中会出现互相冲突的交易。当出现交易冲突时,需要达成一个全局共识,承认一个合法交易。本实施例中,可以采用最重树共识,解决交易冲突的问题。具体可以基于作为在存在冲突交易时,判断合法交易的依据的累计重量。具体实现过程可以为:取冲突交易中,累积重量最大的交易为合法交易。
对于被判定为非法的交易,其本身,及所有依赖该交易的子交易,均被认定为非法。除此之外,所有引用这些非法交易的子交易,所分享的手续费都为零,即使子交易本身是合法的。
最重树共识使网络可以很好的抵御双花攻击。假如黑客需要对某笔置信度较高的交易发起双花攻击,其必须首先构造另一笔同样的交易。考虑到网络由大部分诚实节点构成,则黑客必须同时构造一堆子交易,令这些子交易的累积重量超过原始交易。这需要黑客付出时间成本和手续费成本。当网络足够大,诚实节点足够多时,黑客的双花攻击成功概率将变得非常低。
作为本申请另一可选实施例,参照图5,为本申请提供的一种数据存储方法实施例4的流程示意图,本实施例主要是对上述实施例3描述的数据存储方法的扩展方案,如图5所示,该方法可以包括但并不局限于以下步骤:
步骤S41、接收待存储数据。
步骤S42、在预先构建的区块链中查找与所述待存储数据存在因果关系的数据,所述预先构建的区块链为按照多叉树结构将区块进行分布的区块链。
步骤S43、确定查找到的与所述待存储交易数据存在因果关系的数据,在所述多叉树结构的区块链中所处的层,将确定的层作为目标层。
步骤S44、从所述目标层以下的层所包含的区块中选择目标区块,将所述待存储数据存储在所述目标区块中。
步骤S45、确定所述待存储数据的工作量证明。
步骤S46、将所述待存储数据的工作量证明存储在所述目标区块中。
步骤S41-S46的详细过程可以参见实施例3中步骤S31-S36的相关介绍,在此不再赘述。
步骤S47、确定一笔不小于设定最少手续费的手续费,作为所述待存储数据的手续费。
本实施例中,设置设定最少手续费,防止有用户发起洪泛交易淹没网络。
可以理解的是,手续费可以视作是后续交易引用自己的激励。越高的手续费,能吸引越多的后续交易,从而使自己的交易更容易被永久承认。
步骤S48、将所述待存储数据的手续费存储在所述目标区块中;
其中,所述待存储数据的手续费由所述目标区块所属层以下的层的区块按照设定要求进行共享。
设定要求可以根据需要进行设置,在此不做限制。如,设定要求可以为但不局限于:目标区块所属层以下的其中3层分别按比例共享待存储数据的手续费。如,目标区块所属层以下的第一层共享待存储数据的手续费的30%,目标区块所属层以下的第2层共享待存储数据的手续费的30%,目标区块所属层以下的第3层共享待存储数据的手续费的40%。
目标区块所属层以下的某一层的区块可以按照工作量证明,对该层可以共享的手续费进行按比例获取。
在本实施例中,由于待存储数据的手续费存在设定最少手续费的限制,以及附带有工作量证明,因此将极大提高女巫攻击的黑客的作恶成本,以此减少黑客的攻击行为。
接下来对本申请提供的数据存储装置进行介绍,下文介绍的数据存储装置与上文介绍的数据存储方法可相互对应参照。
请参见图6,数据存储装置包括:接收模块11、查找模块12、第一确定模块13和第一存储模块14。
接收模块11,用于接收待存储数据;
查找模块12,用于在预先构建的区块链中查找与所述待存储数据存在因果关系的数据,所述预先构建的区块链为按照多叉树结构将区块进行分布的区块链;
第一确定模块13,用于确定查找到的与所述待存储交易数据存在因果关系的数据,在所述多叉树结构的区块链中所处的层,将确定的层作为目标层;
第一存储模块14,用于从所述目标层以下的层所包含的区块中选择目标区块,将所述待存储数据存储在所述目标区块中。
本实施例中,所述第一存储模块14,具体可以用于:
从所述目标层以下的层所包含的区块中选择一个子交易数量未达到设定数量阈值上限的区块,作为目标区块。
本实施例中,上述数据存储装置还可以包括:
第二确定模块,用于确定所述待存储数据的工作量证明;
第二存储模块,用于将所述待存储数据的工作量证明存储在所述目标区块中。
本实施例中,所述第二确定模块,具体可以用于:
确定对满足关系式F{r,hash(m)}<n*D(d)的随机数进行查找的时间,将确定出的时间作为所述待存储数据的工作量证明;
所述r表示随机数,所述m表示所述待存储数据,n表示系统常数,d表示预先设定的难度值,D()表示对d的递减函数,hash()表示哈希函数,F{}表示联合计算函数。
本实施例中,上述数据存储装置还可以包括:
第三确定模块,用于确定一笔不小于设定最少手续费的手续费,作为所述待存储数据的手续费;
第三存储模块,用于将所述待存储数据的手续费存储在所述目标区块中;
其中,所述待存储数据的手续费由所述目标区块所属层以下的层的区块按照设定要求进行共享。
本实施例中,所述工作量证明可以用于参与累积重量的计算,所述累积重量用于计算所述目标区块的置信度及作为在存在冲突交易时,判断合法交易的依据;
所述累积重量的计算过程为:获取引用所述目标区块的所有子交易的工作量证明,将所述引用所述目标区块的所有子交易的工作量证明之和作为累积重量;
计算所述目标区块的置信度的过程,包括:
将所述目标区块的累积重量与基于所述预先构建的区块链中作为根节点的区块的累积重量的比例,作为所述目标区块的置信度。
需要说明的是,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。对于装置类实施例而言,由于其与方法实施例基本相似,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
为了描述的方便,描述以上装置时以功能分为各种单元分别描述。当然,在实施本申请时可以把各单元的功能在同一个或多个软件和/或硬件中实现。
通过以上的实施方式的描述可知,本领域的技术人员可以清楚地了解到本申请可借助软件加必需的通用硬件平台的方式来实现。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施例或者实施例的某些部分所述的方法。
以上对本申请所提供的一种数据存储方法及装置进行了详细介绍,本文中应用了具体个例对本申请的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本申请的方法及其核心思想;同时,对于本领域的一般技术人员,依据本申请的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本申请的限制。