一种数据存储方法、装置及区块链***
技术领域
本发明涉及数据存储技术领域,更具体的,涉及一种数据存储方法、装置及区块链***。
背景技术
自比特币诞生以来,区块链技术蓬勃发展,以太坊、EOS等技术层出不穷,大大推动了区块链技术的发展。
目前,绝大多数区块链***采用的是一个账本的模式,即区块链中的各个节点都维护同一个账本,所有交易都在一个链上进行,交易速度较慢;同时,所有数据都存储在同一个链上,账本数据量大,区块链中的各个节点都需要存储链上数据,给节点带来了非常大的存储压力。
可见,目前的区块链***存在物理存储压力大、交易速度慢的问题。
发明内容
有鉴于此,本发明提供了一种数据存储方法,以及一种具有高伸缩性、高扩展性的区块链***,解决当前区块链***物理存储压力大,交易速度慢的问题。
为了实现上述发明目的,本发明提供的具体技术方案如下:
一种数据存储方法,应用于区块链***中的用户节点,所述区块链***中的业务预先被划分为多个业务域,所述用户节点中存储有与其用户标识相对应的至少一个用户链;每个用户链分别对应不同的业务域,所述方法包括:
确定当前交易的业务类型对应的目标业务域;
将所述当前交易的数据存储在节点中所述目标业务域相对应的用户链新建的最新区块中;
确定所述当前交易中的其他用户节点中存储所述当前交易的数据的区块;
建立其节点中存储所述当前交易的数据的最新区块与所述当前交易中的其他用户节点中存储所述当前交易的数据的区块之间的交易关联。
可选的,每个用户节点对应一个资源标识,对用户节点的标识进行处理得到一个n位01序列,得到相应的资源标识,按区块链***中每个用户节点对应的资源标识从小到大顺时针排列的顺序,对每个用户节点的标识进行排列,构成环状哈希表,在所述环状哈希表中,每个用户节点对应一个邻居节点集合,所述方法还包括:
定期对所述环状哈希表以及该用户节点对应的邻居节点集合进行更新。
可选的,所述对用户节点的标识进行处理得到一个n位01序列,得到相应的资源标识,包括:
依据预设散列算法,对用户节点的标识进行计算;
按预设规则从计算后得到的01序列中截取n位01序列,得到相应的资源标识。
可选的,所述方法还包括:
同步存储其所在的邻居节点集合对应的用户节点的数据。
可选的,所述方法还包括:
存储其他节点中所述目标业务域相对应的用户链中的数据。
可选的,所述方法还包括:
在检测到新用户节点加入其所对应的邻居节点集合的情况下,通知所述新用户节点同步存储该用户节点的数据。
可选的,所述同步存储其所在的邻居节点集合对应的用户节点的数据,包括:
在检测到其所在的邻居节点集合对应的用户节点更新的情况下,向更新的用户节点发送数据同步请求;
当接收到更新的用户节点的响应信息时,同步存储更新的用户节点的数据。
可选的,用户节点中的区块包括区块头、共识信息和交易数据,其中,所述区块头包括用户链标识、用户标识、前序区块哈希值和当前区块哈希值,所述用户链标识由业务域标识和用户标识组成。
一种数据存储装置,应用于区块链***中的用户节点,所述区块链***中的业务预先被划分为多个业务域,所述用户节点中存储有与其用户标识相对应的至少一个用户链;每个用户链分别对应不同的业务域,所述装置包括:
业务域确定单元,用于确定当前交易的业务类型对应的目标业务域;
数据存储单元,用于将所述当前交易的数据存储在节点中所述目标业务域相对应的用户链新建的最新区块中;
区块确定单元,用于确定所述当前交易中的其他用户节点中存储所述当前交易的数据的区块;
关联建立单元,用于建立其节点中存储所述当前交易的数据的最新区块与所述当前交易中的其他用户节点中存储所述当前交易的数据的区块之间的交易关联。
可选的,每个用户节点对应一个资源标识,对用户节点的标识进行处理得到一个n位01序列,得到相应的资源标识,按区块链***中每个用户节点对应的资源标识从小到大顺时针排列的顺序,对每个用户节点的标识进行排列,构成环状哈希表,在所述环状哈希表中,每个用户节点对应一个邻居节点集合,所述装置还包括:
数据更新单元,用于定期对所述环状哈希表以及该用户节点对应的邻居节点集合进行更新。
可选的,所述装置还包括:
同步存储单元,用于同步存储其所在的邻居节点集合对应的用户节点的数据。
可选的,所述同步存储单元,还用于存储其他节点中所述目标业务域相对应的用户链中的数据。
可选的,所述装置还包括:
通知单元,用于在检测到新用户节点加入其所对应的邻居节点集合的情况下,通知所述新用户节点同步存储该用户节点的数据。
可选的,所述同步存储单元,具体用于:
在检测到其所在的邻居节点集合对应的用户节点更新的情况下,向更新的用户节点发送数据同步请求;
当接收到更新的用户节点的响应信息时,同步存储更新的用户节点的数据。
可选的,用户节点中的区块包括区块头、共识信息和交易数据,其中,所述区块头包括用户链标识、用户标识、前序区块哈希值和当前区块哈希值,所述用户链标识由业务域标识和用户标识组成。
一种区块链***,包括多个用户节点;
每个所述用户节点,用于执行如上述中任意一项所述的数据存储方法。
相对于现有技术,本发明的有益效果如下:
本发明公开一种数据存储方法,区块链中的业务被划分为多个业务域,用户节点中存储有与其用户标识相对应的至少一个用户链,每个用户链分别对应不同的业务域。在用户节点参与交易的情况下,首先通过确定交易的业务类型对应的目标业务域,将交易数据存储在其节点中目标业务域对应用户链新建的最新区块中,实现从业务域维度和用户维度对交易数据进行动态分片存储,由于每个用户节点仅需存储其用户标识对应的用户链中的交易数据即可,降低了用户节点的物理存储压力。同时,用户节点通过确定当前交易中其他用户节点存储交易数据的区块,建立其节点中存储交易数据的最新区块与当前交易中其他用户节点中存储交易数据的区块之间的交易关联,通过这种交易关联可以实现对交易的追溯,即在满足区块链***中交易可追溯的同时,降低了用户节点的物理存储压力大,提升了交易速度。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。
图1为本发明实施例公开的一种数据存储方法的分业务域分用户存储示意图;
图2为本发明实施例公开的一种数据存储方法的流程示意图;
图3为本发明实施例公开的一种建立交易关联的示意图;
图4为本发明实施例公开的一种环状哈希表的示意图;
图5为本发明实施例公开的一种数据存储装置的结构示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
为了解决现有区块链***存在的物理存储压力大、交易速度慢的问题,本发明例提供了一种数据存储方法,应用于区块链中的用户节点,区块链中的业务被划分为多个业务域,用户节点中存储有与其用户标识相对应的至少一个用户链,每个用户链分别对应不同的业务域,具体如图1所示,每个用户节点可能对应多个业务域,每个业务域可能对应多个用户节点。用户节点在交易过程中,通过确定交易的业务类型对应的目标业务域,将交易数据存储在其节点中目标业务域对应用户链的最新区块中,实现从业务域维度和用户维度对交易数据进行动态分片存储,降低了用户节点的物理存储压力,提升了交易速度。
请参阅图2,图2为本实施例公开的一种数据存储方法的流程示意图,其中,数据存储方法应用于的用户节点,可以作为交易的发起方,也可以作为交易的接收方,具体的,本实施例公开的一种数据存储方法包括以下步骤:
S101:确定当前交易的业务类型对应的目标业务域;
区块链***中的每个节点预先存储有业务域配置信息,该业务域配置信息中包括每个业务域对应的业务类型。
交易信息中包括业务类型,根据该业务类型在业务域配置信息中进行查找,可以确定当前交易的业务类型对应的目标业务域。
S102:将所述当前交易的数据存储在节点中所述目标业务域相对应的用户链新建的最新区块中;
用户链标识由业务域标识和用户标识组成,每个用户节点对应唯一的用户标识,在确定目标业务域后,用户节点可以根据用户标识和目标业务域标识,找到需要存储当前交易的数据的用户链。
用户链由多个区块组成,区块包括区块头、共识信息和交易数据。
其中,区块头包括版本号、用户链标识、高度、用户标识、前序区块哈希值和当前区块哈希值和创建时间。版本号是指数据元信息的版本号,代码架构演进的过程中,区块里的信息往往会不一样,程序可以根据这个版本号进行不一样的处理逻辑;高度为当前区块的区块高度。
共识信息为当前区块提交的相关共识信息,由具体的共识策略决定。
交易数据包括交易的发起方信息、接收方信息、具体交易内容、接收方签名、发起方签名等数据。
S103:确定所述当前交易中的其他用户节点中存储所述当前交易的数据的区块;
当本用户节点为发起方节点时,则需要确定当前交易中接收方节点存储当前交易的数据的区块;当本用户节点为接收方节点时,则需要确定当前交易中发起方节点存储当前交易的数据的区块。
S104:建立其节点中存储所述当前交易的数据的最新区块与所述当前交易中的其他用户节点中存储所述当前交易的数据的区块之间的交易关联。
建立交易关联可以由发起方节点执行,也可以由接收方节点执行,也可以由发起方节点和接收方节点同时执行。
当交易关联由发起方节点执行时,在交易完成时,可以通过主动向接收方节点请求接收方节点存储当前交易的数据的区块的标识,确定当前交易中接收方节点存储当前交易的数据的区块;也可以通过等待接收由接收方节点发送的接收方节点存储当前交易的数据的区块的标识,确定当前交易中接收方节点存储当前交易的数据的区块。
当交易关联由接收方节点执行时,在交易完成时,可以通过主动向发起方节点请求接收方节点存储当前交易的数据的区块的标识,确定当前交易中发起方节点存储当前交易的数据的最新区块;也可以通过等待接收由发起方节点发送的发起方节点存储当前交易的数据的最新区块的标识,确定当前交易中发起方节点存储当前交易的数据的最新区块。
其中,可以通过交易号建立用户节点中存储所述当前交易的数据的最新区块与所述当前交易中的其他用户节点中存储所述当前交易的数据的区块之间的交易关联,该交易关联表示由发起方节点指向接收方节点。
任何业务域里,用户节点与用户节点之间的独立链式账本,即用户链,通过交易进行相互关联。随着区块链***中交易数量的增加以及关联交易的频繁发生,最终全局账本形成了相互关联又相互约束和相互可验证的有向无环图结构(DAG)。
具体的交易流程如图3所示:
1.用户节点B对用户节点A发起一笔交易,并同时对用户节点C发起了一笔交易,首先,两笔交易需要登记在用户节点B的用户链区块t2中;
2.作为交易的参与方(往往是权益的接收方),用户节点A将该笔交易登记在自己的用户链中,记录为s2区块,作为交易参与(权益接收)的凭证;同理,用户节点C也将该笔交易登记在自己的用户链中,记录为u2区块;
3.建立t2与s2之间的交易关联,将t2指向s2,表明s2是t2交易的接收区块;同理u2是t2区块的接收区块;
各个用户链之间通过这种有向的表达完成具体的业务交易关联,在整个业务域下,最终呈现出DAG的特征,通过这种关联信息,可以追溯历史上所有的交易。
本实施例中的数据存储方法,给每个业务分配不同的业务域,让不同的业务域,即不同的业务之间在参与方、数据、操作上能够保持互相独立,保证业务维度上的账本隔离。只有显示参与某业务域的用户节点,才有同步该业务域账本的权限。例如图1中用户节点1能同步业务域1下用户节点2的信息,不能同步业务域2下用户节点1的信息;对同一用户节点同时参与多个域,该用户节点通过一个用户节点同时同步多个业务域的数据,也可以通过不同的用户节点,同步不同的业务域的数据,在用户节点角度实现一定程度的隔离。
除了业务上的隔离以外,进一步对每个用户节点进行分片,即在某个业务上针对每个一个用户节点都有一条属于自己的用户链,而在具体的存储上,每个用户节点上将优先保存属于本用户节点的数据,并可以自由选择感兴趣的用户链进行存储。账本以链式进行表达,链上存储着与用户节点自身有关的交易数据。所有的用户节点在某个业务域上的用户链的数据,构成了这个业务域的全部数据和交易。
这样的设计使账本内容变得独立,账本体积将大大缩小,并且减少了交易的冲突,避免聚合账本的带来的交易性能问题,同时账本的体积减少,使账本能够很方便的传输、加载和使用,保证***的可扩展性。
为了便于管理,每个用户节点对应一个资源标识,对用户节点的标识进行处理得到一个n位01序列,得到相应的资源标识,如:依据预设散列算法,对用户节点的标识进行计算,按预设规则从计算后得到的01序列中截取n位01序列,得到相应的资源标识。其中,根据区块链***中节点规模的不同,可以选择对应的散列算法,如MD5算法的计算结果为128位,sha256算法的计算结果为256位。可以从前往后从计算后得到的01序列中截取n位01序列,得到资源标识。
按区块链***中每个用户节点对应的资源标识从小(全0)到大(全1)顺时针排列的顺序,对每个用户节点的标识进行排列,全0资源标识和全1资源标识相接,构成环状哈希表,在所述环状哈希表中,有2^n个位置,每个用户节点在所述环状哈希表中都对应一个位置,实际上所述环状哈希表中的用户节点往往是松散的,绝大多数位置并不存在具体的用户节点对应。
在环状哈希表中,每个用户节点对应一个邻居节点集合,邻居节点集合包括前序邻居集合和后继邻居集合,用户节点定期对所述环状哈希表以及该用户节点对应的邻居节点集合进行更新。
请参阅图4,假设前序邻居集合和后继邻居节点集合的大小为2,用户节点5、6、8、9是用户节点7的邻居节点,会备份用户节点7的数据,编号为9的用户节点的数据会被编号为7、8以及10、11的用户节点备份,同时,编号为8的用户节点中除了存放自身数据外,会备份编号为7、9的用户节点的数据。邻居节点的备份是相互的,在绝大多数情况下,A是B的邻居,B也是A的邻居;为保证相对平衡性,前序邻居集合和后续邻居集合的大小相等。
其中,数据备份机制:数据备份有push和pull两种机制:
Push:检测到新用户节点加入其所对应的邻居节点集合的情况下,通知所述新用户节点同步存储该用户节点的数据。
Pull:当用户节点发现自己有可能成为某用户节点的邻居节点后,主动向该用户节点发起同步数据请求,经过该用户节点验证后,开始同步该用户节点的数据。
用户节点在运行过程中需要维护其邻居节点集合的信息,包括前序邻居信息和后继邻居信息,在维护环状哈希表的同时,会定期对邻居节点集合进行更新。
当用户节点从环状哈希表中退出时,会将该用户节点从邻居节点集合中摘除;当用户节点加入环状哈希表中,会与当前的邻居节点比较,若距离更近,则加入当前的邻居节点集合并将最远的用户节点从邻居节点集合中排除。此外,需要定期向网络中已知节点发起邻居节点信息的查询请求,以获取并同步更新自身的邻居节点信息。
在用户节点加入和退出的时候,根据新的环状哈希表的情况动态调整数据备份,通过该机制,保证节点备份稳定不丢失,具体地,用户节点启动加入网络后,开始备份相邻节点的信息,而其他用户节点根据最新的节点分布情况调整自己的邻居节点集合信息,例如图4中,若新用户节点P加入到6、7用户节点之间,P用户节点代替用户节点5成为用户节点7的新邻居,并开始备份7的数据信息,5、6、7、8开始备份P的数据信息。由于网络情况的多变性,邻居5后续可能再次成为7的邻居,因此不会主动删除用户节点7的数据信息。
用户节点退出后,存活的用户节点在一定时间没接收到退出的用户节点发来的心跳后将其从邻居节点集合中摘除,新邻居节点会代替退出的用户节点备份数据,需要注意的是,用户节点退出后,大多数情况只是短暂离线,为保证数据不丢失,备份节点一般情况下不主动删除退出的用户节点的数据。
在此基础上,用户节点在共识过程中能够获得奖励,同时只有是其他用户节点的邻居节点并且保存其他节点账本的情况下,才能参与共识流程,通过token的激励,使用户能够主动保存其他用户节点的数据信息,同时促进交易的达成。
基于上述实施例公开的一种数据存储方法,本实施例对应公开了一种数据存储装置,该装置设置于区块链***中的用户节点,所述区块链***中的业务预先被划分为多个业务域,所述用户节点中存储有与其用户标识相对应的至少一个用户链;每个用户链分别对应不同的业务域,请参阅图5,所述装置包括:
业务域确定单元100,用于确定当前交易的业务类型对应的目标业务域;
数据存储单元200,用于将所述当前交易的数据存储在节点中所述目标业务域相对应的用户链新建的最新区块中;
区块确定单元300,用于确定所述当前交易中的其他用户节点中存储所述当前交易的数据的区块;
关联建立单元400,用于建立其节点中存储所述当前交易的数据的最新区块与所述当前交易中的其他用户节点中存储所述当前交易的数据的区块之间的交易关联。
可选的,每个用户节点对应一个资源标识,对用户节点的标识进行处理得到一个n位01序列,得到相应的资源标识,按区块链***中每个用户节点对应的资源标识从小到大顺时针排列的顺序,对每个用户节点的标识进行排列,构成环状哈希表,在所述环状哈希表中,每个用户节点对应一个邻居节点集合,所述装置还包括:
数据更新单元,用于定期对所述环状哈希表以及该用户节点对应的邻居节点集合进行更新。
可选的,所述装置还包括:
同步存储单元,用于同步存储其所在的邻居节点集合对应的用户节点的数据。
可选的,所述同步存储单元,还用于存储其他节点中所述目标业务域相对应的用户链中的数据。
可选的,所述装置还包括:
通知单元,用于在检测到新用户节点加入其所对应的邻居节点集合的情况下,通知所述新用户节点同步存储该用户节点的数据。
可选的,所述同步存储单元,具体用于:
在检测到其所在的邻居节点集合对应的用户节点更新的情况下,向更新的用户节点发送数据同步请求;
当接收到更新的用户节点的响应信息时,同步存储更新的用户节点的数据。
可选的,用户节点中的区块包括区块头、共识信息和交易数据,其中,所述区块头包括用户链标识、用户标识、前序区块哈希值和当前区块哈希值,所述用户链标识由业务域标识和用户标识组成。
一种区块链***,包括多个用户节点;
每个所述用户节点,用于执行如下数据存储方法:
确定当前交易的业务类型对应的目标业务域;
将所述当前交易的数据存储在节点中所述目标业务域相对应的用户链的最新区块中;
确定所述当前交易中的其他用户节点中存储所述当前交易的数据的最新区块;
建立其节点中存储所述当前交易的数据的最新区块与所述当前交易中的其他用户节点中存储所述当前交易的数据的最新区块之间的交易关联。
进一步,每个用户节点对应一个资源标识,对用户节点的标识进行处理得到一个n位01序列,得到相应的资源标识,按区块链***中每个用户节点对应的资源标识从小到大顺时针排列的顺序,对每个用户节点的标识进行排列,构成环状哈希表,在所述环状哈希表中,每个用户节点对应一个邻居节点集合,所述方法还包括:
定期对所述环状哈希表以及该用户节点对应的邻居节点集合进行更新。
进一步,所述对用户节点的标识进行处理得到一个n位01序列,得到相应的资源标识,包括:
依据预设散列算法,对用户节点的标识进行计算;
按预设规则从计算后得到的01序列中截取n位01序列,得到相应的资源标识。
进一步,所述方法还包括:
同步存储其所在的邻居节点集合对应的用户节点的数据。
进一步,所述方法还包括:
存储其他节点中所述目标业务域相对应的用户链中的数据。
进一步,所述方法还包括:
在检测到新用户节点加入其所对应的邻居节点集合的情况下,通知所述新用户节点同步存储该用户节点的数据。
进一步,所述同步存储其所在的邻居节点集合对应的用户节点的数据,包括:
在检测到其所在的邻居节点集合对应的用户节点更新的情况下,向更新的用户节点发送数据同步请求;
当接收到更新的用户节点的响应信息时,同步存储更新的用户节点的数据。
进一步,用户节点中的区块包括区块头、共识信息和交易数据,其中,所述区块头包括用户链标识、用户标识、前序区块哈希值和当前区块哈希值,所述用户链标识由业务域标识和用户标识组成。
本实施例公开一种区块链***,区块链中的业务被划分为多个业务域,用户节点中存储有与其用户标识相对应的至少一个用户链,每个用户链分别对应不同的业务域,从业务域维度和用户维度对交易数据进行动态分片存储,由于每个用户节点仅需存储其用户标识对应的用户链中的交易数据即可,降低了用户节点的物理存储压力。同时,用户链之间通过交易相互关联,通过这种交易关联可以实现对交易的追溯,即在满足区块链***中交易可追溯的同时,降低了用户节点的物理存储压力大,提升了交易速度。
本说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似部分互相参见即可。对于实施例公开的装置而言,由于其与实施例公开的方法相对应,所以描述的比较简单,相关之处参见方法部分说明即可。
还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
结合本文中所公开的实施例描述的方法或算法的步骤可以直接用硬件、处理器执行的软件模块,或者二者的结合来实施。软件模块可以置于随机存储器(RAM)、内存、只读存储器(ROM)、电可编程ROM、电可擦除可编程ROM、寄存器、硬盘、可移动磁盘、CD-ROM、或技术领域内所公知的任意其它形式的存储介质中。
对所公开的实施例的上述说明,使本领域专业技术人员能够实现或使用本发明。对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本发明的精神或范围的情况下,在其它实施例中实现。因此,本发明将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。