区块链中的数据存储方法、装置、电子设备及存储介质与流程

文档序号:23729083发布日期:2021-01-26 19:17阅读:65来源:国知局
区块链中的数据存储方法、装置、电子设备及存储介质与流程

[0001]
本申请涉及区块链技术领域,特别涉及一种区块链中的数据存储方法、装置、电子设备及存储介质。


背景技术:

[0002]
以太坊是一个开源的有智能合约功能的公共区块链平台,通过其专用加密货币以太币提供去中心化的以太坊虚拟机(ethereum virtual machine,evm)来处理点对点合约。evm则是一个轻量级的虚拟机,其设计是用于在以太坊网络上运行智能合约。
[0003]
现有的,在以太坊中,对账户模型数据以及合约代码进行数据的存取,其底层就是对默克尔前缀树(merkle patricia tree,mpt)进行增加、读取、查询、更新、以及删除操作。
[0004]
但现有的树结构,由于一个节点的读取可能会读取多次磁盘(根据树高以及节点的大小来决定读取次数),而一个节点的变更可能会引起mpt多次的裂变。因此,现有的存储方式,随着合约代码的存储数据增大,会导致evm执行速度线性下降,执行效率降低。


技术实现要素:

[0005]
本申请的目的在于,针对上述现有技术中的不足,提供一种区块链中的数据存储方法、装置、电子设备及存储介质,应用于以太坊虚拟机时,可以提升数据的读取效率,保证以太坊虚拟机执行交易的速度。
[0006]
为实现上述目的,本申请实施例采用的技术方案如下:
[0007]
第一方面,本申请实施例提供了一种区块链中的数据存储方法,包括:
[0008]
根据合约代码中的初始关键字、合约账户的公钥地址,确定目标关键字;根据所述目标关键字和目标存储值,生成目标存储键值对,其中,所述目标存储值为所述初始关键字对应的存储值;将所述目标存储键值对存储至所述合约账户对应的哈希缓存层中,生成目标状态树;基于所述目标状态树进行共识处理,若达成共识,则将所述哈希缓存层中的所述目标存储键值对存入磁盘中。
[0009]
可选地,所述将所述目标存储键值对存储至合约账户对应的哈希缓存层中,包括:
[0010]
将所述目标存储键值对存储至所述合约账户对应的一级哈希缓存层中;基于哈希映射,将所述一级哈希缓存层中的所述目标存储键值对存储至所述合约账户对应的二级哈希缓存层中。
[0011]
可选地,所述方法还包括:
[0012]
获取待存储的数据;采用预设转换算法将所述待存储的数据转换为初始键值对,所述初始键值对包括:合约代码中的初始关键字和所述初始关键字对应的存储值。
[0013]
可选地,所述方法还包括:
[0014]
根据所述合约账户的公钥地址和所述哈希缓存层,确定合约账户;根据所述合约账户,确定所述合约代码中存放的目标关键字;根据所述目标状态树和所述目标关键字,查找所述目标关键字对应的存储值。
[0015]
可选地,所述根据所述目标状态树和所述目标关键字,查找所述目标关键字对应的存储值,包括:根据所述目标状态树和所述目标关键字,从所述一级哈希缓存层中查找所述目标关键字对应的存储值;若未查找到所述存储值,则根据所述目标状态树和所述目标关键字,从所述二级哈希缓存层中查找所述目标关键字对应的存储值。
[0016]
可选地,所述方法还包括:
[0017]
获取版本索引键值对集合和版本状态键值对集合,其中,所述版本索引键值对集合包括:至少一个版本索引键值对,所述版本索引键值对包括:发生变更的版本索引关键字和发生变更的版本索引值,所述发生变更的版本索引关键字包括当前已共识块高,所述发生变更的版本索引值包括当前已共识块高、合约账户的公钥地址以及发生变更的目标关键字;所述版本状态键值对集合包括:至少一个版本状态键值对,所述版本状态键值对包括:版本状态关键字和版本状态值,所述版本状态关键字包括当前已共识块高、合约账户的公钥地址以及发生变更的目标关键字;
[0018]
将所述版本索引键值对集合和所述版本状态键值对集合写入磁盘中。
[0019]
可选地,所述方法还包括:
[0020]
根据当前已共识块高、待回滚共识块高、所述版本索引键值对集合以及所述版本状态键值对集合,获取所有待回滚的版本状态关键字;根据所述所有待回滚的版本状态关键字和所述版本状态键值对集合,确定目标待回滚版本状态值;根据所述目标待回滚版本状态值,批量控制合约代码进行状态回滚。
[0021]
可选地,所述根据所述所有待回滚的版本状态关键字和所述版本状态键值对集合,确定目标待回滚版本状态值,包括:若至少有部分所述目标待回滚版本状态值不存在,则对所述待回滚共识块高进行减操作并重新确定所述目标待回滚版本状态值。
[0022]
第二方面,本申请实施例提供了一种区块链中的数据存储装置,包括:确定模块,用于根据合约代码中的初始关键字、合约账户的公钥地址,确定目标关键字;
[0023]
生成模块,用于根据所述目标关键字和目标存储值,生成目标存储键值对,其中,所述目标存储值为所述初始关键字对应的存储值;
[0024]
存储模块,用于将所述目标存储键值对存储至所述合约账户对应的哈希缓存层中,生成目标状态树;
[0025]
共识模块,用于基于所述目标状态树进行共识处理,若达成共识,则将所述哈希缓存层中的所述目标存储键值对存入磁盘中。
[0026]
可选地,所述存储模块,具体用于将所述目标存储键值对存储至所述合约账户对应的一级哈希缓存层中;基于哈希映射,将所述一级哈希缓存层中的所述目标存储键值对存储至所述合约账户对应的二级哈希缓存层中。
[0027]
可选地,所述装置还包括:转换模块,用于获取待存储的数据;采用预设转换算法将所述待存储的数据转换为初始键值对,所述初始键值对包括:合约代码中的初始关键字和所述初始关键字对应的存储值。
[0028]
可选地,所述装置还包括:查找模块,用于根据所述合约账户的公钥地址和所述哈希缓存层,确定合约账户;根据所述合约账户,确定所述合约代码中存放的目标关键字;根据所述目标状态树和所述目标关键字,查找所述目标关键字对应的存储值。
[0029]
可选地,所述查找模块,具体用于根据所述目标状态树和所述目标关键字,从所述
一级哈希缓存层中查找所述目标关键字对应的存储值;
[0030]
若未查找到所述存储值,则根据所述目标状态树和所述目标关键字,从所述二级哈希缓存层中查找所述目标关键字对应的存储值。
[0031]
可选地,所述装置还包括:写入模块,用于获取版本索引键值对集合和版本状态键值对集合,其中,所述版本索引键值对集合包括:至少一个版本索引键值对,所述版本索引键值对包括:发生变更的版本索引关键字和发生变更的版本索引值,所述发生变更的版本索引关键字包括当前已共识块高,所述发生变更的版本索引值包括当前已共识块高、合约账户的公钥地址以及发生变更的目标关键字;所述版本状态键值对集合包括:至少一个版本状态键值对,所述版本状态键值对包括:版本状态关键字和版本状态值,所述版本状态关键字包括当前已共识块高、合约账户的公钥地址以及发生变更的目标关键字;
[0032]
将所述版本索引键值对集合和所述版本状态键值对集合写入磁盘中。
[0033]
可选地,所述装置还包括:回滚模块,用于根据当前已共识块高、待回滚共识块高、所述版本索引键值对集合以及所述版本状态键值对集合,获取所有待回滚的版本状态关键字;
[0034]
根据所述所有待回滚的版本状态关键字和所述版本状态键值对集合,确定目标待回滚版本状态值;
[0035]
根据所述目标待回滚版本状态值,批量控制合约代码进行状态回滚。
[0036]
可选地,所述回滚模块,具体用于若至少有部分所述目标待回滚版本状态值不存在,则对所述待回滚共识块高进行减操作并重新确定所述目标待回滚版本状态值。
[0037]
第三方面,本申请实施例提供了一种电子设备,包括:处理器、存储介质和总线,存储介质存储有处理器可执行的机器可读指令,当电子设备运行时,处理器与存储介质之间通过总线通信,处理器执行机器可读指令,以执行上述第一方面的区块链中的数据存储方法的步骤。
[0038]
第四方面,本申请实施例提供了一种存储介质,存储介质上存储有计算机程序,计算机程序被处理器运行时执行上述第一方面的区块链中的数据存储方法的步骤。
[0039]
本申请的有益效果是:
[0040]
本申请实施例提供的区块链的数据存储方法、装置、电子设备及存储介质中,根据合约代码中的初始关键字、合约账户的公钥地址,确定目标关键字;根据目标关键字和目标存储值,生成目标存储键值对,其中,目标存储值为初始关键字对应的存储值,将目标存储键值对存储至合约账户对应的哈希缓存层中,生成目标状态树;基于目标状态树进行共识处理,若达成共识,则将哈希缓存层中的目标存储键值对存入磁盘中,应用本申请实施例,可以通过哈希缓存层实现对mpt存储结构的更换,进而将其应用于以太坊虚拟机进行合约数据的读取时,无需多次读取磁盘,可以有效提升数据的读取效率,保证以太坊虚拟机执行交易的速度。
附图说明
[0041]
为了更清楚地说明本申请实施例的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,应当理解,以下附图仅示出了本申请的某些实施例,因此不应被看作是对范围的限定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这
些附图获得其他相关的附图。
[0042]
图1为本申请实施例提供的一种区块链中的数据存储方法的流程示意图;
[0043]
图2为本申请实施例提供的另一种区块链中的数据存储方法的流程示意图;
[0044]
图3为本申请实施例提供的又一种区块链中的数据存储方法的流程示意图;
[0045]
图4为本申请实施例提供的另一种区块链中的数据存储方法的流程示意图;
[0046]
图5为本申请实施例提供的又一种区块链中的数据存储方法的流程示意图;
[0047]
图6为本申请实施例提供的另一种区块链中的数据存储方法的流程示意图;
[0048]
图7为本申请实施例提供的又一种区块链中的数据存储方法的流程示意图;
[0049]
图8为本申请实施例提供的一种区块链中的数据存储装置的功能模块示意图;
[0050]
图9为本申请实施例提供的另一种区块链中的数据存储装置的功能模块示意图;
[0051]
图10为本申请实施例提供的又一种区块链中的数据存储装置的功能模块示意图;
[0052]
图11为本申请实施例提供的一种电子设备结构示意图。
具体实施方式
[0053]
为使本申请实施例的目的、技术方案和优点更加清楚,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本申请一部分实施例,而不是全部的实施例。通常在此处附图中描述和示出的本申请实施例的组件可以以各种不同的配置来布置和设计。
[0054]
因此,以下对在附图中提供的本申请的实施例的详细描述并非旨在限制要求保护的本申请的范围,而是仅仅表示本申请的选定实施例。基于本申请中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
[0055]
应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。
[0056]
其中,在介绍本申请之前,为了便于更好的理解本申请,首先对相关名词进行解释。
[0057]
默克尔压缩前缀树(merkle patricia trie,mpt):一种经过改良的、融合了默克尔树以及紧凑前缀树两种特性的一个以太坊专有的数据结构,在以太坊中,帐户的交易信息、状态以及相应的状态变更,还有相关的交易信息等都使用mpt来进行管理,其是整个数据存储的重要一环。比如,某账户的地址,余额,交易的次数等;又或者,合约账户的地址,余额,合约代码等都是采用的mpt结构。
[0058]
默克尔压缩前缀树的根节点:mpt存储数据的根节点,通过该根节点,可以恢复整个mpt树中的所有内容,是account中的一个属性,account是以太坊中账户模型的数据结构。
[0059]
以太坊:是一个开源的有智能合约功能的公共区块链平台,通过其专用加密货币以太币提供去中心化的以太虚拟机(ethereum virtual machine,evm)来处理点对点合约。以太坊中有外部账户和合约账户两类账户,它们共用同一个地址空间,对于外部账户来说,该类账户被公钥-私钥对控制;对于合约账户来说,该类账户被存储在账户中的代码控制。其中,外部账户的地址是由公钥决定的,合约账户的地址是在创建改合约时确定的(由合约
创建者的地址和该地址发出过的交易数量计算得到),合约账户存储了代码,外部账户则没有,除了这点以外,这两类账户对于evm来说是一样的。另外,每个账户有一个key-value形式的持久化存储,其中,key和value的长度都是256bit;每个账户都有一个以太币余额,该账户余额可以通过向它发送带有以太币的交易来改变。
[0060]
以太坊地址address:一个以太坊地址就代表着一个以太坊账户,地址是账户的标识。
[0061]
以太坊虚拟机evm:是智能合约的运行环境,作为区块验证协议的一部分,参与网络的每个节点都会运行evm。他们会检查正在验证的块中列出的交易,并运行由evm中的交易触发的代码;evm不仅是沙盒封装的,而且是完全隔离的,也就是说在evm中运行的代码是无法访问网络、文件系统和其他进程的,甚至智能合约之间的访问也是受限的。
[0062]
智能合约:以字节码的格式(evm bytecode)存在于区块链上,智能合约通常以高级语言(solidity)编写,通过evm编译器编译为字节码,最终通过客户端上载部署到区块链网络中。
[0063]
状态回滚:区块链内容发生了重组织,链头发生切换,区块链的世界状态(账户信息)需要进行回滚,即对之前的操作进行撤销。mpt树提供了状态回滚机制,当区块碰撞发生了,零延迟地完成世界状态的回滚。其中,每个节点在数据库中的存储都是值驱动的,一个节点的内容发生了变化,其哈希值相应改变,而mpt将哈希值作为数据库中的索引,也就实现了对于每一个值,在数据库中都有一条确定的记录。而mpt是根据节点哈希来关联父子节点的,因此每当一个节点的内容发生变化,最终对于父节点来说,改变的只是一个哈希索引值;父节点的内容也由此改变,产生了一个新的父节点,递归地将这种影响传递到根节点。最终,一次改变对应创建了一条从被改节点到根节点的新路径,而旧节点依然可以根据旧根节点通过旧路径访问得到。
[0064]
目前,在以太坊合约数据存储的方式中,mpt账户存储不同的合约数据,而不同的合约账户其mpt根节点不同,则当两个不同的合约代码在存储数据时,如果计算出相同的存储关键字时,现有的通过mpt可以保证两个合约中的数据不会被覆盖,而所有的数据都是以kv键值对的形式进行存储。
[0065]
由上可知,在以太坊中,账户模型数据以及合约代码中数据的存取,其底层就是对mpt的增加、读取、查询、更新、以及删除操作,因此,一个节点的读取可能会读取多次磁盘(根据树高以及节点的大小来决定读取次数),而一个节点的变更可能会引起mpt多次的裂变,因此,随着合约代码的存储数据增大,会导致evm执行速度线性下降(生产环境中,以出现线性下降的情况)。
[0066]
有鉴于此,本申请实施例提供一种区块链中的数据存储方法,该方法中提供一种新的存储结构,可以保证evm的执行速度,提高执行效率。
[0067]
图1为本申请实施例提供的一种区块链中的数据存储方法的流程示意图,该方法的执行主体可以是区块链中的任一节点,该区块链可以包括多个节点,该节点对应的实体可以是计算机、服务器、处理器、移动终端等,在一些实施例中,该数据存储方法可以通过以太坊虚拟机(ethereum virtual machine,evm)来执行,evm可以安装于计算机、服务器、处理器等,在此不作限定。如图1所示,该方法包括:
[0068]
s101、根据合约代码中的初始关键字、合约账户的公钥地址,确定目标关键字。
tolerance,pbft)等,本申请在此不作限定。
[0080]
综上,本申请实施例所提供的区块链中的数据存储方法,包括:根据合约代码中的初始关键字、合约账户的公钥地址,确定目标关键字;根据目标关键字和目标存储值,生成目标存储键值对,其中,目标存储值为初始关键字对应的存储值;将目标存储键值对存储至合约账户对应的哈希缓存层中,生成目标状态树;基于目标状态树进行共识处理,若达成共识,则将哈希缓存层中的目标存储键值对存入磁盘中,应用本申请实施例,可以通过哈希缓存层实现对mpt存储结构的更换,进而将其应用于以太坊虚拟机进行合约数据的读取时,无需多次读取磁盘,可以有效提升数据的读取效率,保证以太坊虚拟机执行交易的速度。另外,合约账户的公钥地址也是唯一的,通过合约账户的公钥地址可以确保目标关键字的唯一性,从而可以解决关键字重复的问题。
[0081]
可选地,上述根据合约代码中的初始关键字、合约账户的公钥地址,确定目标关键字可以包括:根据合约代码中的初始关键字、合约账户的公钥地址以及预设标识,构造目标关键字。
[0082]
其中,预设标识可以包括字母、数字、符号等,比如,可以为“latest_”,但不以此为限,只要可以与初始关键字作以区别,保证目标关键字的唯一性即可。基于上述实施例的基础上进一步说明,可选地,可以参见下述方法构造目标关键字:new_store_key=sha3(“latest_”+account.address+store_key),其中,new_store_key表示目标关键字,latest_表示预设标识,account.address表示合约账户的公钥地址,store_key表示初始关键字,sha3()表示第三代安全散列函数,当然实际构造的方式并不以此为限。
[0083]
图2为本申请实施例提供的另一种区块链中的数据存储方法的流程示意图。本申请实施例中,将现有的mpt层,换成哈希缓存层,从而存储结构中可以包括两层哈希缓存层,分别为一级哈希缓存层和二级哈希缓存层。
[0084]
可选地,如图2所示,上述将目标存储键值对存储至合约账户对应的哈希缓存层中,包括:
[0085]
s201、将目标存储键值对存储至合约账户对应的一级哈希缓存层中。
[0086]
s202、基于哈希映射,将一级哈希缓存层中的目标存储键值对存储至合约账户对应的二级哈希缓存层中。
[0087]
其中,上述一级哈希缓存层可以用于存储账户变更状态,可以基于数据结构hashmap实现,对目标存储键值对进行存储时,可以先将该目标存储键值对存储至该一级哈希缓存层中,比如,可以采用put()函数实现存储。然后,基于哈希映射,可以将该一级哈希缓存层中的目标存储键值对存储至二级哈希缓存层中,可选地,此处也可以采用put()函数实现存储。其中,需要说明的是,存储至二级哈希缓存层时,可以构造目标状态树,当存储完成时,则可以生成目标状态树根节点。比如,可以采用基于第三代安全散列算法(secure hash algorithm 3,sha3)来获取该目标状态树中各节点的哈希值,但不以此为限。
[0088]
图3为本申请实施例提供的又一种区块链中的数据存储方法的流程示意图。可选地,如图3所示,上述方法还包括:
[0089]
s301、获取待存储的数据。
[0090]
s302、采用预设转换算法将待存储的数据转换为初始键值对,初始键值对包括:合约代码中的初始关键字和初始关键字对应的存储值。
[0091]
其中,待存储的数据可以是任意交易数据,比如,进行存证、交换有价物(例如,资产、产品、服务和货币)等交易过程中产生的交易数据,本申请在此不作限定。在一些实施例中,可以将采用预设转换算法将待存储的数据转换为初始键值对[store_key,business_value],其中,store_key表示合约代码中的初始关键字,也即要存放的关键字,business_value表示初始关键字对应的存储值,也即所要存放的值。比如,可以采用keccak256算法对合约代码中所要存放的key进行转换,从而获取其中的初始关键字store_key,其中,keccak256算法是一种单向散列函数算法,可以生成任意长度的散列值,但实际获取方式并不以此为限。
[0092]
可以理解的是,在获取到初始键值对之后,则可以基于该初始键值对来获取上述目标存储键值对,具体获取方式可参见前述相关内容,本申请在此不再赘述。
[0093]
图4为本申请实施例提供的另一种区块链中的数据存储方法的流程示意图。基于上述的数据存储方式,为了实现合约数据的读取,读取可以理解为存储互为反向的流程,可选地,如图4所示,上述方法还包括:
[0094]
s401、根据合约账户的公钥地址和哈希缓存层,确定合约账户。
[0095]
s402、根据合约账户,确定合约代码中存放的目标关键字。
[0096]
s403、根据目标状态树和目标关键字,查找目标关键字对应的存储值。
[0097]
合约数据的读取可以通过预设的读取指令实现,比如,sload指令,其中,可以先依据合约账户的公钥地址从哈希缓存层中查找出合约账户,然后,根据该合约账户确定合约代码中存放的目标关键字,根据该目标关键字、目标状态树的根节点从哈希缓存层中查找目标关键字对应的存储值,从而实现合约数据的读取。
[0098]
图5为本申请实施例提供的又一种区块链中的数据存储方法的流程示意图。可选地,如图5所示,上述根据目标状态树和目标关键字,查找目标关键字对应的存储值,包括:
[0099]
s501、根据目标状态树和目标关键字,从一级哈希缓存层中查找目标关键字对应的存储值。
[0100]
s502、若未查找到存储值,则根据目标状态树和目标关键字,从二级哈希缓存层中查找目标关键字对应的存储值。
[0101]
其中,哈希缓存层包括两个哈希缓存层时,则进行合约数据的读取时,可以先根据目标状态树和目标关键字,从一级哈希缓存层中查找目标关键字对应的存储值,若查找到,则可以返回该存储值,而若未查找到,则根据该目标状态树和目标关键字,从二级哈希缓存层中查找目标关键字对应的存储值,可以理解是的,由于本申请不再使用mpt的存储结构进行存储,而基于hashmap实现存储,因此,在进行合约数据的读取,一次读取不会读取多次磁盘,进而应用于以太坊虚拟机时,可以保证以太坊虚拟机执行交易的速度,有效提升数据的读取效率。
[0102]
在一些实施例中,可以采用如下方式进行读取:hash map->get(account.address),其中,account.address表示合约账户的公钥地址,hash map表示对应的数据存储结构,通过get()函数可以返回合约账户;而目标关键字对应的存储值可以采用如下方式进行读取:hash map->get(new_store_key),其中,new_store_key表示目标关键字,通过get()函数可以返回目标关键字对应的存储值,当然,实际读取方式并不以此为限。
[0103]
图6为本申请实施例提供的另一种区块链中的数据存储方法的流程示意图。基于上述数据存储的基础上,为了使得实现区块链状态的回滚,可选地,如图6所示,上述方法还包括:
[0104]
s601、获取版本索引键值对集合和版本状态键值对集合。
[0105]
其中,版本索引键值对集合包括:至少一个版本索引键值对,该版本索引键值对可以包括:发生变更的版本索引关键字和发生变更的版本索引值,发生变更的版本索引关键字包括当前已共识块高,发生变更的版本索引值包括当前已共识块高、合约账户的公钥地址以及发生变更的目标关键字。
[0106]
在一些实施例中,发生变更的版本索引关键字可以采用下述方式进行构建:version_state_key=“state_version_”+blocknum,其中,version_state_key表示发生变更的版本索引关键字,state_version_表示预设版本标记,blocknum表示当前已共识块高;发生变更的版本索引值可以通过遍历当前所有状态的变更值集合[new_store_key1:business_value1,new_store_key2:business_value2,

],使用预设符号(比如,:等)来拼接相应的关键字key,从而得到version_state_index_value=“{key1}:{key2}:
…”
;其中,version_state_index_value表示发生变更的版本索引值,key1的构造方式可以为key1=[blocknum+“_”+account.address+new_store_key1],key2的构造方式可以为key1[blocknum+“_”+account.address+new_store_key2],其中,new_store_key1、new_store_key2分别表示业务上不同的目标存储关键字,business_value1、business_value2分别表示对应的存储值,account.address表示合约账户的公钥地址,blocknum表示当前已共识块高,当然,实际构建方式并不以此为限。
[0107]
对于版本状态键值对集合来说,版本状态键值对集合可以包括:至少一个版本状态键值对,版本状态键值对包括:版本状态关键字和版本状态值,版本状态关键字包括当前已共识块高、合约账户的公钥地址以及发生变更的目标关键字。
[0108]
在一些实施例中,版本状态键值对集合可以表示为[key1:business_value1,key2:business_value2,

]其中,有关参数说明可参见上述版本索引键值对集合中的相关说明,本申请在此不再赘述。
[0109]
s602、将版本索引键值对集合和版本状态键值对集合写入磁盘中。
[0110]
如上,通过上述方式获取到版本索引键值对集合和版本状态键值对集合之后,则可将其写入磁盘中,以便后续进行区块链状态的回滚时,可以从磁盘中读取相应的数据,从而回滚到特定的版本状态下。
[0111]
图7为本申请实施例提供的又一种区块链中的数据存储方法的流程示意图。可选地,如图7所示,上述方法还包括:
[0112]
s701、根据当前已共识块高、待回滚共识块高、版本索引键值对集合以及版本状态键值对集合,获取所有待回滚的版本状态关键字。
[0113]
其中,当前已共识块高用于指示已经共识成功的块高,待回滚共识块高用于指示需要回滚到的块高,则根据该当前已共识块高、该待回滚共识块高和版本索引键值对集合,可以计算待回滚的版本索引关键字;根据该待回滚的版本索引关键字和版本状态键值对集合,可以计算所有待回滚的版本状态关键字。
[0114]
s702、根据所有版本状态关键字和版本状态键值对集合,确定目标待回滚版本状
态值。
[0115]
s703、根据目标待回滚版本状态值,批量控制合约代码进行状态回滚。
[0116]
其中,在得到所有版本状态关键字之后,则可以根据该所有版本状态关键字,从版本状态键值对集合中确定目标待回滚版本状态值,根据该目标待回滚版本状态值则可以批量控制合约代码进行状态回滚,从而回滚到特定的版本状态下。当然,需要说明的是,本申请在此并不限定目标待回滚版本状态值的数量,根据实际的应用场景可以有所不同。
[0117]
举例说明,记当前已共识块高为current_height、待回滚共识块高为rollback,其中,rollback小于current_height,则可以依据前述发生变更的版本索引关键字的构造方式可以先计算出待回滚的版本索引关键字roll_version_state_key=“state_version_”+rollback,进而根据该待回滚的版本索引关键字、版本索引键值对集合以及版本状态键值对集合可以获取所有待回滚的版本状态关键字rollback_state_keys;根据该所有待回滚的版本状态关键字和版本状态键值对集合,可以确定相应的目标待回滚版本状态值。
[0118]
可选地,上述根据所有待回滚的版本状态关键字和版本状态键值对集合,确定目标待回滚版本状态值,包括:
[0119]
若至少有部分目标待回滚版本状态值不存在,则对待回滚共识块高进行减操作并重新确定目标待回滚版本状态值。
[0120]
其中,可以理解的是,由于版本索引键值对集合存储的是发生变更的版本索引关键字和发生变更的版本索引值,也即,版本索引键值对集合中没有存储未发生变更版本索引关键字和版本索引值,因此,在待回滚共识块高下,无法获取到某些待回滚的版本状态关键字对应的目标待回滚版本状态值,在这种情况下,则可以对待回滚共识块高进行减操作并重新确定该部分目标待回滚版本状态值,其中,对待回滚共识块高进行减操作之后,则可以依据上述的方法重新确定目标待回滚版本状态值,具体可参见前述的相关过程,本申请在此不再赘述。
[0121]
综上,应用本申请实施例,当需要进行区块链的状态回滚时,可以批量控制合约代码回滚至特定的块高下,提高存储方法的适用性。
[0122]
图8为本申请实施例提供的一种区块链中的数据存储装置的功能模块示意图,该装置基本原理及产生的技术效果与前述对应的方法实施例相同,为简要描述,本实施例中未提及部分,可参考方法实施例中的相应内容。如图8所示,该数据存储装置100可以包括:
[0123]
确定模块110,用于根据合约代码中的初始关键字、合约账户的公钥地址,确定目标关键字;
[0124]
生成模块120,用于根据所述目标关键字和目标存储值,生成目标存储键值对,其中,所述目标存储值为所述初始关键字对应的存储值;
[0125]
存储模块130,用于将所述目标存储键值对存储至所述合约账户对应的哈希缓存层中,生成目标状态树;
[0126]
共识模块140,用于基于所述目标状态树进行共识处理,若达成共识,则将所述哈希缓存层中的所述目标存储键值对存入磁盘中。
[0127]
可选地,生成模块120,具体用于将目标存储键值对存储至合约账户对应的一级哈希缓存层中;基于哈希映射,将一级哈希缓存层中的目标存储键值对存储至合约账户对应的二级哈希缓存层中。
[0128]
图9为本申请实施例提供的另一种区块链中的数据存储装置的功能模块示意图。可选地,如图9所示,该数据存储装置100还包括:转换模块150,用于获取待存储的数据;采用预设转换算法将待存储的数据转换为初始键值对,初始键值对包括:合约代码中的初始关键字和初始关键字对应的存储值。
[0129]
可选地,如图9所示,该数据存储装置100还包括:查找模块160,用于根据合约账户的公钥地址和哈希缓存层,确定合约账户;根据合约账户,确定合约代码中存放的目标关键字;根据目标状态树和所述目标关键字,查找目标关键字对应的存储值。
[0130]
可选地,查找模块160,具体用于根据目标状态树和目标关键字,从一级哈希缓存层中查找目标关键字对应的存储值;若未查找到存储值,则根据目标状态树和目标关键字,从二级哈希缓存层中查找目标关键字对应的存储值。
[0131]
图10为本申请实施例提供的又一种区块链中的数据存储装置的功能模块示意图。可选地,如图10所示,该数据存储装置100还包括:写入模块170,用于获取版本索引键值对集合和版本状态键值对集合,其中,版本索引键值对集合包括:至少一个版本索引键值对,版本索引键值对包括:发生变更的版本索引关键字和发生变更的版本索引值,发生变更的版本索引关键字包括当前已共识块高,发生变更的版本索引值包括当前已共识块高、合约账户的公钥地址以及发生变更的目标关键字;版本状态键值对集合包括:至少一个版本状态键值对,版本状态键值对包括:版本状态关键字和版本状态值,版本状态关键字包括当前已共识块高、合约账户的公钥地址以及发生变更的目标关键字;将版本索引键值对集合和所述版本状态键值对集合写入磁盘中。
[0132]
可选地,该数据存储装置100还包括:回滚模块180,用于根据当前已共识块高、待回滚共识块高、版本索引键值对集合以及版本状态键值对集合,获取所有待回滚的版本状态关键字;根据所有待回滚的版本状态关键字和版本状态键值对集合,确定目标待回滚版本状态值;根据目标待回滚版本状态值,批量控制合约代码进行状态回滚。
[0133]
可选地,回滚模块180,具体用于若至少有部分目标待回滚版本状态值不存在,则对待回滚共识块高进行减操作并重新确定目标待回滚版本状态值。
[0134]
上述装置用于执行前述实施例提供的方法,其实现原理和技术效果类似,在此不再赘述。
[0135]
以上这些模块可以是被配置成实施以上方法的一个或多个集成电路,例如:一个或多个特定集成电路(application specific integrated circuit,简称asic),或,一个或多个微处理器(digital signal processor,简称dsp),或,一个或者多个现场可编程门阵列(field programmable gate array,简称fpga)等。再如,当以上某个模块通过处理元件调度程序代码的形式实现时,该处理元件可以是通用处理器,例如中央处理器(central processing unit,简称cpu)或其它可以调用程序代码的处理器。再如,这些模块可以集成在一起,以片上系统(system-on-a-chip,简称soc)的形式实现。
[0136]
图11为本申请实施例提供的一种电子设备结构示意图。如图11所示,该电子设备可以包括:处理器210、存储介质220和总线230,存储介质220存储有处理器210可执行的机器可读指令,当电子设备运行时,处理器210与存储介质220之间通过总线230通信,处理器210执行机器可读指令,以执行上述方法实施例的步骤。具体实现方式和技术效果类似,这里不再赘述。
[0137]
可选地,本申请还提供一种存储介质,存储介质上存储有计算机程序,计算机程序被处理器运行时执行上述方法实施例的步骤。具体实现方式和技术效果类似,这里不再赘述。
[0138]
在本申请所提供的几个实施例中,应该理解到,所揭露的装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
[0139]
作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
[0140]
另外,在本申请各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用硬件加软件功能单元的形式实现。
[0141]
上述以软件功能单元的形式实现的集成的单元,可以存储在一个计算机可读取存储介质中。上述软件功能单元存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)或处理器(英文:processor)执行本申请各个实施例方法的部分步骤。而前述的存储介质包括:u盘、移动硬盘、只读存储器(英文:read-only memory,简称:rom)、随机存取存储器(英文:random access memory,简称:ram)、磁碟或者光盘等各种可以存储程序代码的介质。
[0142]
需要说明的是,在本文中,诸如“第一”和“第二”等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个
……”
限定的要素,并不排除在包括要素的过程、方法、物品或者设备中还存在另外的相同要素。
[0143]
以上仅为本申请的优选实施例而已,并不用于限制本申请,对于本领域的技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。以上仅为本申请的优选实施例而已,并不用于限制本申请,对于本领域的技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1