一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

区块链状态数据处理方法与流程

2022-03-02 02:35:07 来源:中国专利 TAG:


1.本技术涉及金融科技(fintech)领域,尤其涉及一种区块链状态数据处理方法。


背景技术:

2.随着计算机技术的发展,越来越多的技术应用在金融领域,传统金融业正在逐步向金融科技(fintech)转变,区块链(block chain)技术也不例外,但由于金融行业的安全性、实时性要求,也对技术提出的更高的要求。
3.目前,一般每个区块链节点都会用树状存储结构即状态树的形式,来保存区块链节点运行所必须的信息即状态数据,但是随着区块链系统不断运行,状态数据越来越多,状态树也越来越大,这就使得数据的检索和访问效率大大下降。
4.即现有技术中存在当区块链系统运行一段时间后状态数据的检索和访问的效率大幅下降的技术问题。


技术实现要素:

5.本技术提供一种区块链状态数据处理方法,以解决现有技术中存在当区块链系统运行一段时间后状态数据的检索和访问的效率大幅下降的技术问题。
6.第一个方面,本技术提供一种区块链状态数据处理方法,应用于区块链节点,该方法包括:
7.在每个时期en开始时,创建与时期en相对应的状态树sn;
8.获取状态数据,状态数据包括:时期标识以及区块链节点为处理传入的区块和/或接收到的业务事件所必须的信息;
9.根据时期标识以及预设要求,将状态数据存储到状态树sn中,以便于区块链节点在处理各项业务时调用状态数据;
10.其中,预设要求包括:每个时期en内生成的状态数据只能存储到与时期en对应的状态树sn中。
11.在一种可能的设计中,该方法还包括:在每个时期开始时,若区块链节点中存在前一个时期的第一历史状态树s
n-1
,则保存并冻结第一历史状态树s
n-1

12.在一种可能的设计中,当区块链节点为全节点时,在全节点中保存每个时期en对应的状态树sn;
13.当区块链节点为轻节点时,在轻节点中至少保存:状态树sn以及第一历史状态树s
n-1
,并在当前的时期en开始时,删除不满足预设存储要求的第二历史状态树sm。
14.在一种可能的设计中,预设存储要求包括:第二历史状态树sm对应的历史时期em与当前的时期en的时间间隔小于预设间隔。
15.在一种可能的设计中,轻节点中能够保存预设数量个连续的时期en所对应的所有状态树sn,预设数量大于或等于2。
16.在一种可能的设计中,获取状态数据,包括:
17.获取出块节点发送的区块,并根据区块确定状态数据;
18.或者,获取用户发送的交易请求,并根据交易请求确定状态数据。
19.在一种可能的设计中,状态数据对应的地址包括:时期标识以及地址编码,根据时期标识以及预设要求,将状态数据存储到状态树sn中,包括:
20.在当前时期e
now
对应的当前状态树s
now
上,根据地址判断是否存在对应的存储路径;
21.当存在存储路径时,根据存储路径将状态数据存入当前状态树s
now
中;
22.当不存在存储路径时,判断时期标识是否满足免证明要求;
23.若满足免证明要求,则在当前状态树s
now
上,根据地址编码创建对应的存储路径;
24.根据存储路径将状态数据存入当前状态树s
now
中。
25.在一种可能的设计中,根据时期标识判断是否满足免证明要求,包括:
26.判断在区块链网络的任意一个区块链节点中是否都储存有时期标识对应的状态树s0。
27.在一种可能的设计中,判断时期标识是否满足免证明要求,包括:
28.判断第一时期e0是否在当前时期e
now
之前的预设时间范围内,第一时期e0与时期标识相对应。
29.可选的,时间范围包括:k个周期,周期为每个时期en所持续的时间长度,k大于或等于1。
30.在一种可能的设计中,在判断时期标识是否满足免证明要求之后,还包括:
31.若不满足免证明要求,则根据地址,在各个历史时期对应的历史状态树上判断是否存在状态数据;
32.若不存在,则利用预设验证模型生成第一证明信息,且当区块链节点为出块节点时,将第一证明信息添加到状态数据对应的区块中,并将区块发送到区块链网络中进行共识,第一证明信息用于表征状态数据不在各个历史状态树上;
33.并在当前状态树s
now
上,根据地址编码创建存储路径,根据存储路径将状态数据存入当前状态树s
now
中。
34.在一种可能的设计中,根据地址,在各个历史时期对应的历史状态树上判断是否存在状态数据,包括:
35.在各个目标历史时期所对应的目标历史状态树上,根据地址编码判断是否存在状态数据,目标历史时期包括:从时期标识对应的第一时期e0开始的各个历史时期;
36.其中,目标历史状态树不包括已经存储在轻节点上的各个轻节点状态树,轻节点状态树至少包括:当前时期的状态树sn以及当前时期之前一个时期的第一历史状态树s
n-1

37.可选的,目标历史时期不包括:当前时期e
now
以及当前时期e
now
的前一个时期e
now-1

38.在一种可能的设计中,在各个目标历史时期所对应的目标历史状态树上,根据地址编码判断是否存在状态数据之后,还包括:
39.若存在,则利用预设验证模型生成第二证明信息,并且当区块链节点为出块节点时,将第二证明信息添加到状态数据对应的区块中,并将区块发送到区块链网络中进行共识,第二证明信息用于表征:状态数据在最后一次被修改时所对应的第二状态树s1上,并且在最后修改时期e1之后的各个历史状态树上都不存在状态数据,最后修改时期与第二状态
树s1相对应;
40.并在当前状态树s
now
上,根据地址编码创建存储路径,根据存储路径将状态数据存入当前状态树s
now
中。
41.在一种可能的设计中,在根据时期标识以及预设要求,将状态数据存储到状态树sn中之后,还包括:
42.当状态数据在当前时期e
now
发生改变时,在当前时期对应的当前状态树s
now
上更新状态数据;
43.区块链网络上的所有区块链节点将状态数据从各个历史状态树中删除,仅保留状态数据在各个状态树sn中对应的存储路径的哈希值。
44.在一种可能的设计中,在每个时期en开始时,创建与时期en相对应的状态树sn,包括:
45.将上一个时期e
n-1
对应的第一历史状态树s
n-1
中访问频率小于预设阈值的节点删除后,得到状态树sn。
46.第二方面,本技术提供一种区块链状态数据处理装置,包括:
47.处理模块,用于在每个时期en开始时,创建与时期en相对应的状态树sn;
48.获取模块,用于获取状态数据,状态数据包括:时期标识以及区块链节点为处理传入的区块和/或接收到的业务事件所必须的信息;
49.处理模块,还用于根据时期标识以及预设要求,将状态数据存储到状态树sn中,以便于区块链节点在处理各项业务时调用状态数据;
50.其中,预设要求包括:每个时期en内生成的状态数据只能存储到与时期en对应的状态树sn中。
51.第三个方面,本技术提供一种电子设备,包括:
52.存储器,用于存储程序指令;
53.处理器,用于调用并执行所述存储器中的程序指令,执行第一方面所提供的任意一种可能的物品存储信息确定方法。
54.第四方面,本技术提供一种存储介质,所述可读存储介质中存储有计算机程序,所述计算机程序用于执行第一方面所提供的任意一种可能的区块链状态数据处理方法。
55.第五方面,本技术还提供一种计算机程序产品,包括计算机程序,该计算机程序被处理器执行时实现第一方面所提供的任意一种可能的区块链状态数据处理方法。
56.本技术提供了一种区块链状态数据处理方法,通过在每个时期en开始时,创建与时期en相对应的状态树sn;获取状态数据,状态数据包括:时期标识以及区块链节点为处理传入的区块和/或接收到的业务事件所必须的信息;根据时期标识以及预设要求,将状态数据存储到状态树sn中,以便于区块链节点在处理各项业务时调用状态数据;其中,预设要求包括:每个时期en内生成的状态数据只能存储到与时期en对应的状态树sn中。解决了现有技术中存在的当区块链系统运行一段时间后状态数据的检索和访问的效率大幅下降的技术问题。达到避免状态数据爆炸增长而导致区块链节点对交易处理效率或处理能力下降的技术效果。
附图说明
57.此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本技术的实施例,并与说明书一起用于解释本技术的原理。
58.图1为本技术提供的一种状态树的结构示意图;
59.图2为本技术实施例提供的一种区块链状态数据处理方法的应用场景示意图;
60.图3为本技术提供的一种区块链状态数据处理方法的流程示意图;
61.图4为本技术实施提供的另一种区块链状态数据处理方法的流程示意图;
62.图5为本技术实施例提供的一种区块链状态数据处理装置的结构示意图;
63.图6为本技术提供的一种电子设备的结构示意图。
64.通过上述附图,已示出本技术明确的实施例,后文中将有更详细的描述。这些附图和文字描述并不是为了通过任何方式限制本技术构思的范围,而是通过参考特定实施例为本领域技术人员说明本技术的概念。
具体实施方式
65.为使本技术实施例的目的、技术方案和优点更加清楚,下面将结合本技术实施例中的附图,对本技术实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本技术一部分实施例,而不是全部的实施例。基于本技术中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,包括但不限于对多个实施例的组合,都属于本技术保护的范围。
66.本技术的说明书和权利要求书及上述附图中的术语“第一”、“第二”、“第三”、“第四”等(如果存在)是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本技术的实施例例如能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
67.下面对本技术所涉及到的专业名词作出解释:
68.(1)区块链中的状态和状态树:
69.一般地,区块链网络中的节点,在网络中运行段时间之后,都会在本地存储装置上保存一些数据,这些数据可以根据其时间属性分为两大类:历史数据(简称为“历史”)和当前数据(简称为“状态”)。
70.状态:是指区块链系统的节点为了能够处理新传入的区块和/或事件而必须持有或存储的信息。状态与历史是相对的。
71.历史:是对过去已经发生的事件的描述信息,历史保存下来后,可以用于对已经发生的事件进行回顾,或者说是重播,并且还可以对历史进行归档管理。
72.应用于金融领域的区块链系统中,状态包括:
73.1.账户的余额和/或非余额信息,比如nonce;
74.2.智能合约所对应的代码;
75.3.智能合约所对应的需要存储的数据;
76.4.各个节点间进行共识所需要的相关数据即共识数据,比如最近产生的若干区块的哈希值、数量、权益证明等共识数据。
77.随着时间的推移,随着新用户进入区块链网络,其创建新账户和新智能合约,调用智能合约中的函数,这些数据(即“状态”的具体承载形式)会不断增长。
78.在现有技术中,大部分区块链系统都是采用二叉(即有两个叶子节点)或六叉(即有六个叶子节点)的帕夏尔-默克尔树(状态树的一种)来维护和管理状态数据,其一般是以键值对的形式,如(键,值)的形式进行存储。
79.帕夏尔-默克尔树:是一种字典树,有根节点、中间节点和叶子节点,每个节点都有一个唯一的“键”,根据状态数据的“键”,可以在状态树中找到这个“键”对应的存储位置,然后在这个存储位置的存储槽中存放的状态数据中的“值”。
80.例如,一个账户,比如0x001d3f1ef827,可以拥有无数个状态数据,要将这些状态数据放入到状态树中,可以将其哈希值即hash(0x001d3f1ef827)的结果作为“键”,用以找到状态树中的中间节点(即以“键”代表中间节点的地址或用来查找该中间节点的路径),从而这个账户所有的状态数据都存储在这个中间节点的子树下。
81.沃克尔树:其本质上也是一种字典树,其存储和检索状态数据的方式和帕夏尔-默克尔树类似,但是沃克尔树更宽,即沃克尔树中一个节点的子节点数n1比帕夏尔-默克尔树中一个节点的子节点数n2要大很多(即n1》》n2),因此对于一个固定长度的键地址,沃克尔树的深度(即树分层的总层数)比帕夏尔-默克尔树小很多。由于深度小,沃克尔树对节点的增加和修改操作更加简单。更重要的是,对于节点的存在性证明(即验证数据),沃克尔树采用沃克尔证明,比帕夏尔-默克尔树的默克尔证明更加小。
82.沃克尔证明:是通过采用多项式承诺(向量承诺的一种),证明一个节点是其父节点的众多子节点中的一个。由于沃克尔树中父节点的值由所有子节点的值决定,所以相当于只需要证明一个节点的值与其父节点的值,这两者间的关系,而无需像默克尔证明那样提供所有兄弟节点的值才能验证该节点与父节点的关系。因此沃克尔证明非常小,并且验证效率更高。
83.(2)全节点、轻节点和验证者节点:
84.不同区块链系统有不同的节点角色区分,大体上可以分为:全节点、轻节点和验证者节点。
85.全节点:是指保存了区块链所有数据的节点。其保存有完整的“状态”数据和所有“历史”数据(有些联盟链会丢弃历史区块中的状态数据比如fisco bcos)。
86.轻节点:是指仅保存部分常用的状态数据的节点。这就使得轻节点相对于权节点来说更能够节省内存空间,同时又可以处理大部分用户的交易以及打包区块。需要说明的是,在不同区块链系统中,轻节点的功能不一定相同。
87.验证者节点:是指在共识体系中仅参与验证区块的正确性,但没有打包区块能力的节点。同样在不同区块链系统中验证者节点为了能够验证区块的正确性,需要存储的状态大小也不同。
88.还需要说明的是,全节点中包括:各种区块的本体部分(即body,一个区块可以分为头部header和本体body两部分),交易列表等等相关信息。全节点在本地保存了一个完整的区块链网络,在其上可进行任何查询、交易的验证与广播,正因为有全节点的存在,使得
区块链的去中心化成为了可能,同时使得区块链网络更加安全。需要说明的是,一般全节点需要一直保持在线状态。
89.轻节点与全节点不同的是,不需要保存所有的交易内容,只需要通过状态树的形式,来保存各个区块的头部header以及与节点自身相关的交易细节信息,并通过状态树所对应的验证方法(也称为“证明”)来判断交易是否在当前的区块链交易列表中。与全节点不同,轻节点不需要一直保持在线状态。
90.时期epoch:表示一个固定数量(比如10000个区块)的区块所经历的时间,在这个时期e内创建或修改的“状态”(即状态数据)到了下一个时期e 1自动变成过期的“状态”。
91.本技术发明人发现,现有的区块链系统中,一般每个区块链节点都会用树状存储结构即状态树的形式,来保存区块链节点运行所必须的信息即状态数据,但是随着区块链系统不断运行,状态数据越来越多,状态树也越来越大,这就使得数据的检索和访问效率大大下降。
92.为解决上述问题,一种思路是:对于“状态”的管理使用的“两树方案”:过期的状态组成一棵过期状态树,非过期的当前状态组成一棵活跃状态树。
93.在活跃状态树中,每个账户(包括智能合约)对应的叶子节点上的状态存储槽在被创建后即开始计时,如果状态存储槽中的状态数据在预设时间内被修改则重新计时,相反的,如果经过一段预设时间后,该账户的状态数据没有被修改,则将此状态数据放置到过期状态树上。
94.全节点需要存储这两棵树,其他节点如轻节点,只存储活跃状态树。用户如果想要访问某个账户过期的状态或者将某个账户过期的状态复活,必须提供该账户对应的状态在过期状态树上的证明(即验证数据)。
95.但是本技术发明人发现上述做法仍然会引发下面的技术问题:
96.1.如果打包出块的节点不是全节点,一个账户过期后将被移出活跃状态树,当其他用户创建了相同地址的账户(相当于创建了相同的账户名),则会妨碍原有账户对应的状态的恢复。或者若原有账户的拥有者无法提供证明(即验证数据),则会导致整个账户的信息被重构,甚至会导致和历史数据相冲突。
97.2.目前的区块链大部分都是使用六叉帕夏尔-默克尔树作为状态树,状态证明最大达到4mb,导致一个区块容纳不下几个包含状态证明的交易,即访问过期状态的交易,或者导致区块过大,从而影响共识的速度。
98.3.现有技术无法从根本上解决状态的爆炸增长问题,很多公链的做法无法直接用在联盟链中,尤其是没有代币机制的联盟链,现有的状态树结构难以结合高级密码学来提高状态数据管理和证明的效率。
99.为解决上述各个技术问题,本技术采用了另一种发明构思:
100.改变状态数据管理的根本逻辑,不再只是区分过期状态树和活跃状态树,而是在每个预设时间单元即时期,对应在每个节点建立新的状态树,这棵状态树只保存在当前的时期内发生的状态数据,或者是修改当前的时期内变化的状态数据,对于上一个时期或者未来的时期的状态数据都不会保存在当前的状态树当中。即每个时期都有一个对应的状态树,未来时期的状态树在当前不能操作,而过去时期的状态树要访问需要提供节点存在性证明。
101.并且,为了使得状态数据能够正确存储到正确时期的状态树上,那么就需要在原始地址上增加一个时期前缀,这样用户无法重新创建完全相同的地址,如果想要创建一个历史时期的地址,必须提供证明,以供节点验证这个地址从未出现过。用户也无法创建未来时期的地址,从而保证地址不会冲突,并且能够拓宽地址空间的可用性。
102.进一步的,还可以更改状态树的组织结构,即采用沃克尔树,从根本上替换现有的帕夏尔-默克尔树,但是不会改变原有的存储和检索逻辑,可以结合累加器来做出证明,证明的大小仅有约800kb,更加适合区块链中状态数据的维护和管理。这个特性使得区块链系统,允许完全无需存储任何状态数据的验证者节点存在,这就使得移动设备就可以完成验证,即移动设备即可成为验证者节点,使得区块链系统更加去中心化。
103.具体的,本技术发明人重新设置了对区块链中状态数据的处理逻辑:
104.(1)新的地址结构和状态树结构:
105.图1为本技术提供的一种状态树的结构示意图。如图1所示,每个时期都有独立的一颗状态树,所以状态包含了一列永远增长的树s0,s1,s2,s3…
,每个si表示第i个时期的状态树。因此状态是否过期无需额外的字段来表示,只有当前时期的状态树上的状态才是非过期状态。最后每棵状态树的树根10再形成一个总状态根100,这个总状态根100记录在每个区块的头部里,任何一棵状态树发生变化,总状态根100也会变化。可选的,状态树的类型包括沃克尔树。
106.需要说明的是,在区块链系统中必须存在至少一个存储所有的历史树的全节点,全节点的数量可以由区块链参与方决定。其他的节点根据实际情况来决定存储某些历史状态树,但是需要注意,虽然不存储所有的状态树,但是所有的状态树的树根节点都要存储,并且在每个区块链节点上至少存储上一个时期的状态树以及当前时期的状态树。
107.对于一个区块链节点中用于交易业务的账户来说,该账户包括:合约账户(contractaccounts)和外部账户(externally owned account,eoa)。例如,在以太坊中,合约账户是通过智能合约进行交易的账户,由智能合约的代码控制。只有合约账户才有代码,其中存储的是codehash(这个账户的以太坊虚拟机代码的哈希值),这个字段在生成后是不可修改的,这意味着智能合约代码是不可修改的。而外部账户是由以太坊网络的人类用户创建的帐户。它与公钥、私钥对相关,它是通过对公钥进行二次哈希后结果的最后20个字节导出的。
108.本技术定义了新的账户地址,该地址可以表示为一个元组(e,s),e为该地址所属时期的时期标识,用4个bytes表示,s为原始地址,即当前区块链普遍所用的20个bytes的地址编码。所以新的账户地址在二进制上表示为[e:s],即将时期标识与地址编码进行字节拼接。
[0109]
(2)状态树访问和修改规则:
[0110]
在当前的时期epoch e:
[0111]
1.只有当前的状态树se可以被修改。
[0112]
2.历史时期的状态树会被冻结,所有想要访问历史状态树的交易必须携带证明,以证明所要访问的状态在历史某个时期的状态树的位置,例如:该状态位置的沃克尔证明,沃克尔证明中包含了旧的状态数据值,这样才能访问历史状态树。由于所有的区块链节点都存储了上一个时期的状态树s
e-1
,如果用户需要访问状态树s
e-1
中的状态数据,区块链节
点会帮助用户提供对于该状态树的证明,而且大部分热数据都在这个状态树中,因此可以满足绝大部分用户。但是如果用户的交易想访问s
e-1
之前的树,必须寻找全节点来提供访问证明。
[0113]
3.未来时期的状态树可以事先建立好,但只有未来时期变成当前时期后才能修改,或者也可以说未来时期的状态树还没有被创建。到达新的时期后,节点立即启用或创建新的状态树,该未来时期对应的状态树可以是个空白的状态树,也可以附带上了存储某些经常被访问的状态数据的树节点。
[0114]
(3)账户访问和修改规则:
[0115]
账户(e,s)可以在任意f》e的时期被访问,其数据永远存储在状态树的固定位置hash(e,s),如果在当前时期epoch f,账户(e,s)的存储被修改,由于历史状态树不能修改,所以会在当前时期的状态树sf的hash(e,s)位置创建对应的存储槽。
[0116]
具体修改规则:
[0117]
1.如果账户(e,s)在epoch e被创建和修改,那么直接在树se的对应位置创建和修改;
[0118]
2.如果账户(e,s)在epoch e 1被创建或修改,那么直接在树s
e 1
的对应位置创建和修改;
[0119]
3.如果账户(e,s)在epoch f(f》e 1)被创建,而且在树sf和s
f-1
上对应位置还没有创建,那么需要提供证明:账户(e,s)在这些树se,s
e 1
,...,s
f-2
的对应位置都没有出现;
[0120]
4.如果账户(e,s)在epoch f(f》e 1)被修改,而且在树sf和sf-1上对应位置还没有创建,假设账户(e,s)最后一次被修改是在epoch e

(e≤e

《f),那么需要提供证明:账户(e,s)出现在状态树se′
的对应位置,而且在这些树se′
1
,se′
2.
..s
f-2
的对应位置都没有出现;
[0121]
5.如果账户(e,s)在epoch f(f》e)被修改,而且在树sf上对应位置已经创建,直接修改。
[0122]
(4)历史状态树修剪:
[0123]
由于本技术将区块链不同时期的状态树分别存储,如果不做“状态”去重,将会给区块链节点带来很大的存储开销,尤其是全节点。
[0124]
本技术采用历史状态树修剪的方式:如果某个账户的“状态”(即本文中的状态数据)在当前时期发生改变,那么当前时期的状态树会保存该账户的最新“状态”,因此所有节点可以将该账户的旧状态从各个历史状态树中删除,仅保留状态树中对应位置的节点哈希值。
[0125]
(5)证明的生成方式:
[0126]
当用户需要证明某个账户存在于某个历史状态树中或者不存在与某个历史状态树中,本发明采用密码学累加器来分别做出成员证明和非成员证明。
[0127]
如图1所示,每个时期对应的状态树100的深度为4,广度为4个字节,即每层的子节点数量最多为256个,用16进制表示即为00~ff。假设某个账户在状态树中对应的键为0x3a4b5c,在状态树中,该账户对应的键分别在每一层的节点序号为3a、4b和5c,这些序号也构成了一个对应账户信息存储在状态树中的唯一路径。因此,当用户需要做出该账户存在于这棵状态树的证明,系统需要为该账号对应的键的路径做出证明,即为路径中每层的节点序号分别做出成员证明。
[0128]
以上述的键为例,需要分别证明:3a节点在根节点的已经存在的子节点集合中;4b节点在3a的已经存在的子节点集合中;5c在4b的已经存在的子节点集合中。已经存在的子节点集合表达了所有以这些子节点为中间路径的已经存储状态数据的键,区块链节点或区块链系统维护状态树的每一层的已经存在的子节点集合,因此对于任意一棵状态树,第二层有1个已经存在的子节点集合,第三层最多有256个已经存在的子节点集合。
[0129]
具体以证明3a节点在根节点的已经存在的子节点集合中为例,使用密码学累加器做出3a的成员证明。用m表示已经存在的子节点集合累加器向量,m中记录着节点序号唯一对应的质数,用x
3a
表示3a节点对应的质数,a表示累加器的值,即m中所有质数的乘积。x
3a
的成员证明的计算简化逻辑可以用公式(1)来表示:
[0130][0131]
对应的验证逻辑可以用公式(2)来表示:
[0132][0133]
其中,g表示系统所使用的域的生成元。
[0134]
如果要证明另外一个节点假设为3b不在这个子节点集合中,用y表示3b节点对应的质数,y的非成员证明uy的计算简化逻辑可以用公式(3)来表示:
[0135][0136]
对应的验证逻辑可以用公式(4)来表示:
[0137][0138]
其中,bezout为贝祖定理,a和b是根据贝祖定理得到的两个系数。
[0139]
依次分别得到4b节点的成员证明和5c节点的成员证明合在一起既是该账户存在于这棵状态树的证明。如果一个交易涉及的两个账户都需要提供证明,可以在每一层一起做出成员证明,假设第二个账户在第一层经过3c节点,对应的质数为z,则只需做出x*z的成员证明,无需分别做出成员证明。
[0140]
下面以具体地实施例对本技术的技术方案以及本技术的技术方案如何解决上述技术问题进行详细说明。下面这几个具体的实施例可以相互结合,对于相同或相似的概念或过程可能在某些实施例中不再赘述。下面将结合附图,对本技术的实施例进行描述。
[0141]
图2为本技术实施例提供的一种区块链状态数据处理方法的应用场景示意图。如图2所示,用户20向区块链网络或者说是区块链系统中的任意一个区块链节点21发送交易请求,区块链节点21执行该交易请求对应的交易,使得该用户对应的用于交易的账户的各项状态数据发生了变化,接收用户20交易请求的区块链节点21也称为出块节点,其将该交易打包成区块发送到区块链网络中让其它区块链节点21进行共识。在出块节点中,在交易执行后,所产生的状态数据就对应存储在节点中当前时期对应的状态树上,而其它接收到区块的区块链节点21,也采用相同的状态数据处理方法在各自区块链节点21本地的状态树上更新状态数据。
[0142]
下面具体介绍本技术提供的状态数据处理方法:
[0143]
图3为本技术实施例提供的一种区块链状态数据处理方法的流程示意图。如图3所
示,该区块链状态数据处理方法的具体步骤,包括:
[0144]
s301、在每个时期en开始时,创建与时期en相对应的状态树sn。
[0145]
在本步骤中,在每个时期en开始时,区块链节点按照预设的状态树模板创建一棵新的状态树sn,同时,历史状态树即当前时期之前的时期的历史状态树会被冻结,历史状态树可以访问查询,但是不可以将新的状态数据再存入历史状态树。
[0146]
可选的,在本实施例中,状态树的类型为沃克尔树。
[0147]
在一种可能的设计中,在每个时期开始时,若区块链节点中存在前一个时期的第一历史状态树s
n-1
,则保存并冻结第一历史状态树s
n-1

[0148]
即在每个时期en开始时,对于刚结束的前一个时期e
n-1
所对应的状态树s
n-1
,并不直接删除,而是只将其冻结起来,但是仍然存储在区块链节点中。
[0149]
在另一种可能的设计中,整个区块链网络中的区块链节点可以分为两类:全节点和轻节点。
[0150]
当区块链节点为全节点时,在全节点中保存每个时期en对应的状态树sn;
[0151]
当区块链节点为轻节点时,在轻节点中至少保存:状态树sn以及第一历史状态树s
n-1
,并在当前的时期en开始时,删除不满足预设存储要求的第二历史状态树sm。
[0152]
在一种可能的设计中,预设存储要求包括:第二历史状态树sm对应的历史时期em与当前的时期en的时间间隔小于预设间隔。
[0153]
比如,当预设间隔为2时,轻节点只存储当前时期以及前一时期,这两个时期的状态树,而轻节点如果要访问其它时期的历史状态树,就需要向全节点提出访问请求,由全节点在对应的历史状态树上进行访问查询。
[0154]
当然,轻节点也可以保存更多的历史时期的状态树,比如,预设间隔的取值为3-6时,轻节点就可以存储连续3-5个时期的状态树。
[0155]
需要注意的是,轻节点也可以是非连续时期的历史状态树,比如:保存当前时期,前1个历史时期,前3个历史时期,这三个时期的状态树。
[0156]
保存的原则可以设置为:如果该历史时期状态数据的创建和/或修改量大于预设阈值,或者说该历史时期的交易量大于预设阈值,则证明该历史时期的状态数据有较大概率会被用到,则将该历史时期对应的状态树保留在区块链节点中,直至对应的状态数据的访问热度低于预设热度阈值后,才将该历史状态树删除。
[0157]
当然,本领域技术人员也可以根据实际情况设置轻节点保存状态树的数量和保存规则,但是至少要保证轻节点至少包括:当前状态树sn和前一个时期的状态树s
n-1
。即轻节点中能够保存预设数量个连续的时期en所对应的所有状态树sn,预设数量大于或等于2。
[0158]
在一种可能的设计中,在本步骤中,将上一个时期e
n-1
对应的第一历史状态树s
n-1
中访问频率小于预设阈值的节点删除后,得到当前时期en的状态树sn。
[0159]
s302、获取状态数据。
[0160]
在本步骤中,状态数据包括:时期标识以及所述区块链节点为处理传入的区块和/或接收到的业务事件所必须的信息。
[0161]
本步骤可以分为两种情况:
[0162]
第一种,当区块链节点为接收用户交易请求的节点时,由于区块链的共识机制,其需要将交易打包成区块,发布到区块链网络中进行共识,因此,此时该区块链节点也称为出
块节点。
[0163]
此时,获取状态数据,包括:获取用户发送的交易请求,并根据交易请求确定状态数据。
[0164]
第二种,当区块链节点不是接收用户交易请求的节点,而是区块链网络中执行共识的节点时,获取状态数据,包括:获取出块节点发送的区块,并根据区块确定状态数据。
[0165]
在本实施例中,状态数据对应的地址包括:时期标识以及地址编码。
[0166]
s303、根据时期标识以及预设要求,将状态数据存储到状态树sn中,以便于区块链节点在处理各项业务时调用状态数据。
[0167]
在本步骤中,预设要求包括:每个时期en内生成的状态数据只能存储到与时期en对应的状态树sn中。
[0168]
具体可以分为五种情况:
[0169]
1.如果账户(e,s)在时期e被创建和修改,那么直接在树se的对应位置创建和修改;
[0170]
2.如果账户(e,s)在时期e 1被创建或修改,那么直接在树s
e 1
的对应位置创建和修改;
[0171]
3.如果账户(e,s)在时期f(f》e 1)被创建,而且在树sf和s
f-1
上对应位置还没有创建,那么需要提供证明:账户(e,s)在这些树se,s
e 1
,...,s
f-2
的对应位置都没有出现;
[0172]
4.如果账户(e,s)在时期f(f》e 1)被修改,而且在树sf和sf-1上对应位置还没有创建,假设账户(e,s)最后一次被修改是在时期e

(e≤e

《f),那么需要提供证明:账户(e,s)出现在状态树se′
的对应位置,而且在这些树se′
1
,se′
2...s
f-2
的对应位置都没有出现;
[0173]
5.如果账户(e,s)在时期f(f》e)被修改,而且在树sf上对应位置已经创建,直接修改。
[0174]
在一种可能的设计中,该区块链状态数据处理方法,还包括:
[0175]
当所述状态数据在当前时期e
now
发生改变时,在所述当前时期对应的当前状态树s
now
上更新所述状态数据;
[0176]
区块链网络上的所有所述区块链节点将所述状态数据从各个历史状态树中删除,仅保留所述状态数据在各个所述状态树sn中对应的存储路径的哈希值。
[0177]
由于本技术将区块链不同时期的状态树分别存储,如果不做“状态”去重,将会给区块链节点带来很大的存储开销,尤其是全节点。
[0178]
本技术采用历史状态树修剪的方式:如果某个账户的“状态”(即本文中的状态数据)在当前时期发生改变,那么当前时期的状态树会保存该账户的最新“状态”,因此所有节点可以将该账户的旧状态从各个历史状态树中删除,仅保留状态树中对应位置的节点哈希值。
[0179]
本技术实施例提供了一种区块链状态数据处理方法,通过在每个时期en开始时,创建与时期en相对应的状态树sn;获取状态数据,状态数据包括:时期标识以及区块链节点为处理传入的区块和/或接收到的业务事件所必须的信息;根据时期标识以及预设要求,将状态数据存储到状态树sn中,以便于区块链节点在处理各项业务时调用状态数据;其中,预设要求包括:每个时期en内生成的状态数据只能存储到与时期en对应的状态树sn中。解决了现有技术中存在的当区块链系统运行一段时间后状态数据的检索和访问的效率大幅下降
的技术问题。达到避免状态数据爆炸增长而导致区块链节点对交易处理效率或处理能力下降的技术效果。
[0180]
图4为本技术实施提供的另一种区块链状态数据处理方法的流程示意图。如图4所示,该区块链状态数据处理方法的具体步骤包括:
[0181]
s401、在每个时期en开始时,创建与时期en相对应的状态树sn。
[0182]
s402、获取状态数据。
[0183]
步骤s401~s402的具体名词及原理解释可以参考s301~s302,在此不再赘述。
[0184]
s403、在当前时期e
now
对应的当前状态树s
now
上,根据地址判断是否存在对应的存储路径。
[0185]
在本步骤中,存储路径包括:状态树sn上的各个节点以及存储槽,节点包括中间节点以及叶子节点,存储槽设置在叶子节点上。
[0186]
当存在存储路径时,执行步骤s404,当不存在存储路径时,执行步骤s405。
[0187]
具体的,如果,如果还没有创建
[0188]
s404、根据存储路径将状态数据存入当前状态树s
now
中。
[0189]
在本步骤中,在当前状态树s
now
上已经创建了存储槽(如图1所示),则只需要在存储槽中更新状态数据。
[0190]
s405、判断时期标识是否满足免证明要求。
[0191]
在本步骤中,若满足,则执行步骤s406,若不满足,则执行步骤s407。
[0192]
在当前状态树s
now
上还没有创建与状态数据对应的存储槽,那么就需要去创建各个中间节点和叶子节点,同时在叶子节点上创建存储槽,再将状态数据存储到存储槽当中。
[0193]
但是,实际情况比较复杂,由于本技术对每个时期都建立了状态树,那么状态数据比如交易的账户,可能在之前的状态树中以及存储过了,因此需要去判断是否在历史状态树当中。
[0194]
在一种可能的设计中,根据时期标识判断是否满足免证明要求,包括:
[0195]
判断在区块链网络的任意一个区块链节点中是否都储存有时期标识对应的状态树s0。
[0196]
在本实施例中,根据时期标识判断是否满足免证明要求,包括:
[0197]
判断在区块链网络的任意一个区块链节点中是否都储存有时期标识对应的状态树s0。
[0198]
在本实施例中,区块链网络中至少包括两种区块链节点,即全节点和轻节点,全节点中保存了所有时期对应的状态树,但是轻节点中只保留了部分状态树,但是,轻节点中至少保存了当前状态树和前一时期的历史状态树。
[0199]
因此,免证明要求的实质是:如果状态数据的地址中的时期标识所对应的时期,能够在轻节点所保存的所有状态树所对应的各个时期中查找到,那么就可以直接在当前的状态树上根据地址创建存储路径,即各个中间节点、叶子节点和存储槽,然后将状态数据存入存储槽当中。
[0200]
比如,轻节点中存储了:当前时期e
now
,前一时期e
now-1
,前三时期e
now-3
以及前五时期e
now-5
这四个时期对应的状态树,那么如果状态树的时期标识与这四个时期中的任意一个相对应,那么就不需要区块链节点根据证明算法来计算证明,如沃克尔证明。(证明方法详
见上文记载的“证明的生成方式”)
[0201]
在一种可能的设计中,判断时期标识是否满足免证明要求,包括:
[0202]
判断第一时期e0是否在当前时期e
now
之前的预设时间范围内,第一时期e0与时期标识相对应。
[0203]
可选的,时间范围包括:k个周期,周期为每个时期en所持续的时间长度,k大于或等于1。
[0204]
例如,当轻节点中存储了当前时期e
now
以及前一时期e
now-1
对应的状态树时,预设时间范围就是1个周期,即前二时期e
now-2
就不做预设时间范围内。
[0205]
即对应s303中描述的:
[0206]
1.如果账户(e,s)在时期e被创建和修改,那么直接在树se的对应位置创建和修改;
[0207]
2.如果账户(e,s)在时期e 1被创建或修改,那么直接在树s
e 1
的对应位置创建和修改。
[0208]
5.如果账户(e,s)在时期f(f》e)被修改,而且在树sf上对应位置已经创建,直接修改。
[0209]
s406、在当前状态树s
now
上,根据地址编码创建对应的存储路径。
[0210]
在本步骤中,若满足免证明要求,直接在当前的状态树上根据地址创建存储路径,即各个中间节点、叶子节点和存储槽,然后执行步骤s404,将状态数据存入存储槽当中。
[0211]
s407、根据地址,在各个历史时期对应的历史状态树上判断是否存在状态数据。
[0212]
在本步骤中,若不存在,则执行步骤s408,若存在,则执行步骤s409。
[0213]
具体的,当不满足免证明要求时,需要进一步扩大历史状态树的范围。此时需要注意的是,轻节点当中并没有存储所有时期的状态树,因此,对于轻节点来说,本步骤的实施时,只能是向全节点发送证明请求,由全节点在其所存储的历史状态树中去查找是否存储对应的状态数据。
[0214]
在本实施例中,本步骤具体包括:
[0215]
在各个目标历史时期所对应的目标历史状态树上,根据地址编码判断是否存在状态数据,目标历史时期包括:从时期标识对应的第一时期e0开始的各个历史时期;
[0216]
其中,目标历史状态树不包括已经存储在轻节点上的各个轻节点状态树,轻节点状态树至少包括:当前时期的状态树sn以及当前时期之前一个时期的第一历史状态树s
n-1

[0217]
可选的,目标历史时期不包括:当前时期e
now
以及当前时期e
now
的前一个时期e
now-1

[0218]
s408、利用预设验证模型生成第一证明信息。
[0219]
在本步骤中,当区块链节点为出块节点时,需要将第一证明信息添加到状态数据对应的区块中,并将区块发送到区块链网络中进行共识,第一证明信息用于表征状态数据不在各个历史状态树上。然后,执行步骤s406。
[0220]
即对应s303中描述的:
[0221]
3.如果账户(e,s)在时期f(f》e 1)被创建,而且在树sf和s
f-1
上对应位置还没有创建,那么需要提供证明:账户(e,s)在这些树se,s
e 1
,...,s
f-2
的对应位置都没有出现。
[0222]
需要说明的是,只有生成了第一证明信息,才能够在当前状态树上创建存储路径,否则,是无法在当前状态树中存储状态信息。即在具体实现时,会设置对第一证明信息的检
验,如果没有第一证明信息,就无法进行下一步的存储操作。
[0223]
还需要说明的是,本步骤的第一证明信息的生成方式,包括沃克尔证明,或者是上文记载的“证明的生成方式”。
[0224]
s409、利用预设验证模型生成第二证明信息。
[0225]
在本步骤中,当区块链节点为出块节点时,将第二证明信息添加到状态数据对应的区块中,并将区块发送到区块链网络中进行共识,第二证明信息用于表征:状态数据在最后一次被修改时所对应的第二状态树s1上,并且在最后修改时期e1之后的各个历史状态树上都不存在状态数据,最后修改时期与第二状态树s1相对应。然后,执行步骤s406。
[0226]
即对应s303中描述的:
[0227]
4.如果账户(e,s)在时期f(f》e 1)被修改,而且在树sf和sf-1上对应位置还没有创建,假设账户(e,s)最后一次被修改是在时期e

(e≤e

《f),那么需要提供证明:账户(e,s)出现在状态树se′
的对应位置,而且在这些树se′
1
,se′
2
...s
f-2
的对应位置都没有出现。
[0228]
同理,需要说明的是,只有生成了第二证明信息,才能够在当前状态树上创建存储路径,否则,是无法在当前状态树中存储状态信息。即在具体实现时,会设置对第二证明信息的检验,如果没有第二证明信息,就无法进行下一步的存储操作。
[0229]
本步骤的第二证明信息的生成方式,包括沃克尔证明,或者是上文记载的“证明的生成方式”。
[0230]
s410、当状态数据在当前时期e
now
发生改变时,在当前时期对应的当前状态树s
now
上更新状态数据。
[0231]
在本步骤中,如果状态数据对应的账户,在同一时期内发生多次交易业务,那么直接在当前状态树的存储槽中更新状态数据。
[0232]
即对应s303中描述的:
[0233]
1.如果账户(e,s)在时期e被创建和修改,那么直接在树se的对应位置创建和修改;
[0234]
2.如果账户(e,s)在时期e 1被创建或修改,那么直接在树s
e 1
的对应位置创建和修改。
[0235]
5.如果账户(e,s)在时期f(f》e)被修改,而且在树sf上对应位置已经创建,直接修改。
[0236]
s411、将状态数据从各个历史状态树中删除,仅保留状态数据在各个状态树sn中对应的存储路径的哈希值。
[0237]
由于本技术将区块链不同时期的状态树分别存储,如果不做“状态”去重,将会给区块链节点带来很大的存储开销,尤其是全节点。
[0238]
本技术采用历史状态树修剪的方式:如果某个账户的“状态”(即本文中的状态数据)在当前时期发生改变,那么当前时期的状态树会保存该账户的最新“状态”,因此所有节点可以将该账户的旧状态从各个历史状态树中删除,仅保留状态树中对应位置的节点哈希值。
[0239]
本技术实施例提供了一种区块链状态数据处理方法,通过在每个时期en开始时,创建与时期en相对应的状态树sn;获取状态数据,状态数据包括:时期标识以及区块链节点为处理传入的区块和/或接收到的业务事件所必须的信息;根据时期标识以及预设要求,将
状态数据存储到状态树sn中,以便于区块链节点在处理各项业务时调用状态数据;其中,预设要求包括:每个时期en内生成的状态数据只能存储到与时期en对应的状态树sn中。解决了现有技术中存在的当区块链系统运行一段时间后状态数据的检索和访问的效率大幅下降的技术问题。达到避免状态数据爆炸增长而导致区块链节点对交易处理效率或处理能力下降的技术效果。
[0240]
为了便于理解上述两个实施例所提供的方法,下面从时间推进角度进行示例,涉及到三个时期:时期0、时期1和时期2,需要说明的是,时期0和时期1是相邻的两个时期,但是时期1和时期2并不一定相邻。
[0241]
在区块链系统初始化完成后,所有区块链系统中的节点分别创建与当前时期t0对应的的第一状态树s0。
[0242]
一、当时间运行到时期0时,即当前时期为时期0的时候:
[0243]
时期0开始时,所有节点分别创建第一状态树s0,s0即为当前时期的当前状态树。
[0244]
区块链网络中的任意一个用户端节点接收用户发起的交易,并为该交易创建对应的智能合约。
[0245]
然后出块节点接收并执行该交易,出块节点为智能合约生成一个合约地址,该合约地址包括:时期前缀以及地址编码,该时期前缀与当前时期相对应。
[0246]
然后,出块节点根据预先设定的对账户的访问和修改的第一规则要求(即:1.如果账户(e,s)在时期e被创建和修改,那么直接在树se的对应位置创建和修改)以及合约地址,确定智能合约在第一状态树s0上的存储地址,即在第一状态树s0上的若干中间节点上创建子节点和与该子节点对应的存储槽。需要说明的是,这些中间节点都包含在了存储地址的地址编码中,因为这些中间节点在状态树中都对应着至少一个子节点,所以也称这些中间节点为父节点。而且,可以将一个父节点所对应的子节点都放在一个子节点集合中,以便于对状态树进行检索和访问。
[0247]
接下来,出块节点将智能合约的数据保存在存储槽中。
[0248]
然后,出块节点更新各个子节点集合对应的累加器向量以及累加器值,该子节点集合对应的父节点包含在存储地址中,存储地址中包括至少一个父节点,该父节点为状态树上的中间节点。
[0249]
然后,出块节点将交易打包区块,并向区块链网络发布该区块。
[0250]
区块链网络上的其它节点收到该区块后,执行该交易,同样需要根据第一预设要求在节点自身的第一状态树s0上对应的位置创建子节点和存储槽,把智能合约的数据保存在对应的存储槽内,同时更新各个子节点集合对应的累加器向量以及累加器值。
[0251]
在时期0内的任意时刻,任意用户通过用户端节点发起的交易与上述智能合约进行交互,那么这个交易对应的出块节点直接在第一状态树s0上对应的存储槽修改数据,同时该交易的区块由出块节点发布到区块链网络进行共识后,其它所有的节点也会执行与区块节点同样的操作,即在各个节点的第一状态树s0上对应的存储槽修改数据。
[0252]
例如:在时期0开始时,即区块链系统完成初始化后,所有节点分别创建第一状态树s0;
[0253]
(1)张三发送交易创建一个智能合约c1,李四发送交易创建一个智能合约c2。
[0254]
(2)出块节点收到交易后执行交易,分别为智能合约c1生成一个地址(0,
0xabcdef)和智能合约c2生成一个地址(0,0x123456),根据账户访问和修改规则1(即:1.如果账户(e,s)在时期e被创建和修改,那么直接在树se的对应位置创建和修改),出块节点在第一状态树s0的0x3a4b5c和0x6d7e8f对应的位置创建子节点和存储槽,把智能合约的数据保存在了对应的存储槽,更新第一状态树s0中3a,4b,5c,6d,7e,8f所在的子节点集合累加器向量和累加器值。
[0255]
需要说明的是,这里生成地址的算法可以采用哈希算法,即hash(0,0xabcdef)=0x3a4b5c,hash(0,0x123456)=0x6d7e8f。
[0256]
(3)出块节点将该交易打包区块,其他节点收到区块后执行交易,在各自的状态树s0的0x3a4b5c和0x6d7e8f位置创建子节点和存储槽,把该智能合约的数据保存在了对应的存储槽,更新状态树s0中3a,4b,5c,6d,7e,8f所在的子节点集合累加器向量和累加器值。
[0257]
(4)在这个时期内,任意用户发送交易与智能合约c1或c2交互,直接在第一状态树s0的0x3a4b5c或0x6d7e8f位置对应的存储槽修改数据。其他同步区块的交易后执行同样的操作。
[0258]
二、当时间运行到了时期1时,即时期1为当前时期时:
[0259]
进入新的时期,所有节点都创建一棵新的空白状态树s1,保存状态树s0。
[0260]
(1)任意用户发送交易与地址为(0,0xabcdef)的智能合约c1交互;
[0261]
(2)出块节点收到交易后执行交易(无论出块节点是全节点还是轻节点),发现在状态树s1中没有键为0x3a4b5c的状态数据,然后在状态树s0中查找,找到了键0x3a4b5c的状态数据;
[0262]
(3)出块节点为这个交易构建证明证明键0x3a4b5c存在于状态树s0中,把该证明和交易绑定一起打包到区块中。
[0263]
(4)出块节点根据账户访问和修改规则2(即:2.如果账户(e,s)在时期e 1被创建或修改,那么直接在树s
e 1
的对应位置创建和修改),在状态树s1的0x3a4b5c位置创建子节点和存储槽,将交易执行后的状态数据存储到该位置,更新状态树s1中3a,4b,5c所在的子节点集合累加器向量和累加器值;
[0264]
(5)其他节点收到区块后执行交易,验证证明如果不正确则拒绝整个区块;如果正确,同样根据账户访问和修改规则2(即:2.如果账户(e,s)在时期e 1被创建或修改,那么直接在树s
e 1
的对应位置创建和修改),在各自的状态树s1的0x3a4b5c位置创建子节点和存储槽,把新的状态数据保存在了对应的存储槽,更新状态树s1中3a,4b,5c所在的子节点集合累加器向量和累加器值;
[0265]
(6)此后,在这个时期内,任意用户发送交易与智能合约c1交互,出块节点根据账户访问和修改规则2,直接在状态树s1的0x3a4b5c位置和对应的存储槽修改数据。其他同步区块的交易后执行同样的操作。
[0266]
三、当时间运行到了时期2时,即时期2为当前时期时:
[0267]
进入新的时期,所有节点都创建一棵新的空白状态树s2,保存状态树s1。全节点继续保存状态树s0,轻节点丢弃状态树s0。
[0268]
1.任意用户发送交易与地址为(0,0xabcdef)的智能合约c1交互,所有节点的处理方式与时期1一样;
[0269]
2.任意用户发送交易与地址为(0,0x123456)的智能合约c2交互:
[0270]
1)出块节点如果是全节点,发现在状态树s2中没有键为0x6d7e8f的状态数据,然后在历史状态树中查找,在s0找到了键0x6d7e8f的状态数据。全节点为该交易生成证明即证明键0x6d7e8f存在于状态树s0中且不存在于状态树s1中,把该证明和交易绑定一起打包到区块中。根据账户访问和修改规则4,在状态树s2的0x6d7e8f位置创建子节点和存储槽,将交易执行后的状态数据存储到该位置,更新状态树s2中6d,7e,8f所在的子节点集合累加器向量和累加器值,其他节点的操作与时期1中的第五步类似;
[0271]
2)出块节点如果是轻节点,发现在状态树s2和s1都中没有键为0x6d7e8f的状态数据,则向全节点请求该状态数据的证明,全节点的处理和上一步一样。出块节点得到证明后,验证并执行交易,后续操作与上一步的全节点一样。
[0272]
此后,在这个时期内,任意用户发送交易与智能合约c2交互,出块节点根据账户访问和修改规则5,直接在状态树s1的0x3a4b5c位置和对应的存储槽修改数据。其他同步区块的交易后执行同样的操作。
[0273]
3.王五使用一个(0,0x456789)地址发送交易:
[0274]
1)出块节点如果是全节点,发现在状态树s2中没有键为0xa1b2c3(假设hash(0,0x456789)=0xa1b2c3)的状态数据,然后在历史状态树中查找都没有找到键0xa1b2c3的状态数据。全节点为该交易生成证明态数据。全节点为该交易生成证明即证明键0xa1b2c3不存在于状态树s0和s1中,把该证明和交易绑定一起打包到区块中。根据账户访问和修改规则3,在状态树s2的0xa1b2c3位置创建子节点和存储槽,将交易执行后的状态数据存储到该位置,更新状态树s2中a1,b2,c3所在的子节点集合累加器向量和累加器值,其他节点的操作与时期1中的第五步类似;
[0275]
2)出块节点如果是轻节点,发现在状态树s2和s1都中没有键为0xa1b2c3的状态数据,则向全节点请求该状态数据的证明,全节点的处理和上一步一样。出块节点得到证明后,验证并执行交易,后续操作与上一步的全节点一样。
[0276]
此后,在这个时期内,王五使用该地址发送交易,出块节点根据账户访问和修改规则5,直接在状态树s2的0xa1b2c3位置和对应的存储槽修改数据。其他同步区块的交易后执行同样的操作。
[0277]
本技术提供的区块链状态数据处理方法,能够很好地永久性解决区块链状态的爆炸增长带给所有节点的存储压力,而且不会给普通用户带来任何体验上的区别,原有的智能合约编程方式没有改变,仅仅底层的虚拟机在修改账户状态的时候做出对应的改变。能够引入完全不需要存储区块链状态的验证者角色,使得更多人参与区块和交易的验证,增加区块链系统的安全性。轻节点的存在,使得处理交易和出块的效率更高,因为无需将计算资源浪费在修改庞大的状态树,全节点也可以采用一些策略将很久没有访问的过期状态存储在硬盘中,需要的时候再调出来。
[0278]
图5为本技术实施例提供的一种区块链状态数据处理装置的结构示意图。该区块链状态数据处理装置500可以通过软件、硬件或者两者的结合实现。
[0279]
如图5所示,该区块链状态数据处理装置500包括:
[0280]
处理模块502,用于在每个时期en开始时,创建与时期en相对应的状态树sn;
[0281]
获取模块501,用于获取状态数据,状态数据包括:时期标识以及区块链节点为处理传入的区块和/或接收到的业务事件所必须的信息;
[0282]
处理模块502,还用于根据时期标识以及预设要求,将状态数据存储到状态树sn中,以便于区块链节点在处理各项业务时调用状态数据;
[0283]
其中,预设要求包括:每个时期en内生成的状态数据只能存储到与时期en对应的状态树sn中。
[0284]
在一种可能的设计中,处理模块502,还用于在每个时期开始时,若区块链节点中存在前一个时期的第一历史状态树s
n-1
,则保存并冻结第一历史状态树s
n-1

[0285]
在一种可能的设计中,当区块链节点为全节点时,在全节点中保存每个时期en对应的状态树sn;
[0286]
当区块链节点为轻节点时,在轻节点中至少保存:状态树sn以及第一历史状态树s
n-1
,并在当前的时期en开始时,删除不满足预设存储要求的第二历史状态树sm。
[0287]
在一种可能的设计中,预设存储要求包括:第二历史状态树sm对应的历史时期em与当前的时期en的时间间隔小于预设间隔。
[0288]
在一种可能的设计中,轻节点中能够保存预设数量个连续的时期en所对应的所有状态树sn,预设数量大于或等于2。
[0289]
在一种可能的设计中,获取模块501,用于:
[0290]
获取出块节点发送的区块,并根据区块确定状态数据;
[0291]
或者,获取用户发送的交易请求,并根据交易请求确定状态数据。
[0292]
在一种可能的设计中,状态数据对应的地址包括:时期标识以及地址编码,对应的,处理模块502,用于:
[0293]
在当前时期e
now
对应的当前状态树s
now
上,根据地址判断是否存在对应的存储路径;
[0294]
当存在存储路径时,根据存储路径将状态数据存入当前状态树s
now
中;
[0295]
当不存在存储路径时,判断时期标识是否满足免证明要求;
[0296]
若满足免证明要求,则在当前状态树s
now
上,根据地址编码创建对应的存储路径;
[0297]
根据存储路径将状态数据存入当前状态树s
now
中。
[0298]
在一种可能的设计中,处理模块502,用于:
[0299]
判断在区块链网络的任意一个区块链节点中是否都储存有时期标识对应的状态树s0。
[0300]
在一种可能的设计中,处理模块502,用于:
[0301]
判断第一时期e0是否在当前时期e
now
之前的预设时间范围内,第一时期e0与时期标识相对应。
[0302]
可选的,时间范围包括:k个周期,周期为每个时期en所持续的时间长度,k大于或等于1。
[0303]
在一种可能的设计中,处理模块502,还用于:
[0304]
若不满足免证明要求,则根据地址,在各个历史时期对应的历史状态树上判断是否存在状态数据;
[0305]
若不存在,则利用预设验证模型生成第一证明信息,且当区块链节点为出块节点时,将第一证明信息添加到状态数据对应的区块中,并将区块发送到区块链网络中进行共识,第一证明信息用于表征状态数据不在各个历史状态树上;
[0306]
并在当前状态树s
now
上,根据地址编码创建存储路径,根据存储路径将状态数据存入当前状态树s
now
中。
[0307]
在一种可能的设计中,处理模块502,用于:
[0308]
在各个目标历史时期所对应的目标历史状态树上,根据地址编码判断是否存在状态数据,目标历史时期包括:从时期标识对应的第一时期e0开始的各个历史时期;
[0309]
其中,目标历史状态树不包括已经存储在轻节点上的各个轻节点状态树,轻节点状态树至少包括:当前时期的状态树sn以及当前时期之前一个时期的第一历史状态树s
n-1

[0310]
可选的,目标历史时期不包括:当前时期e
now
以及当前时期e
now
的前一个时期e
now-1

[0311]
在一种可能的设计中,处理模块502,还用于:
[0312]
若存在,则利用预设验证模型生成第二证明信息,并且当区块链节点为出块节点时,将第二证明信息添加到状态数据对应的区块中,并将区块发送到区块链网络中进行共识,第二证明信息用于表征:状态数据在最后一次被修改时所对应的第二状态树s1上,并且在最后修改时期e1之后的各个历史状态树上都不存在状态数据,最后修改时期与第二状态树s1相对应;
[0313]
并在当前状态树s
now
上,根据地址编码创建存储路径,根据存储路径将状态数据存入当前状态树s
now
中。
[0314]
在一种可能的设计中,处理模块502,还用于:
[0315]
当状态数据在当前时期e
now
发生改变时,在当前时期对应的当前状态树s
now
上更新状态数据;
[0316]
区块链网络上的所有区块链节点将状态数据从各个历史状态树中删除,仅保留状态数据在各个状态树sn中对应的存储路径的哈希值。
[0317]
在一种可能的设计中,处理模块502,用于:
[0318]
将上一个时期e
n-1
对应的第一历史状态树s
n-1
中访问频率小于预设阈值的节点删除后,得到状态树sn。
[0319]
值得说明的是,图5所示实施例提供的装置,可以执行上述任一方法实施例中所提供的方法,其具体实现原理、技术特征、专业名词解释以及技术效果类似,在此不再赘述。
[0320]
图6为本技术实施例提供的一种电子设备的结构示意图。如图6所示,该电子设备600,可以包括:至少一个处理器601和存储器602。图6示出的是以一个处理器为例的电子设备。
[0321]
存储器602,用于存放程序。具体地,程序可以包括程序代码,程序代码包括计算机操作指令。
[0322]
存储器602可能包含高速ram存储器,也可能还包括非易失性存储器(non-volatile memory),例如至少一个磁盘存储器。
[0323]
处理器601用于执行存储器602存储的计算机执行指令,以实现以上各方法实施例所述的方法。
[0324]
其中,处理器601可能是一个中央处理器(central processing unit,简称为
cpu),或者是特定集成电路(application specific integrated circuit,简称为asic),或者是被配置成实施本技术实施例的一个或多个集成电路。
[0325]
可选地,存储器602既可以是独立的,也可以跟处理器601集成在一起。当所述存储器602是独立于处理器601之外的器件时,所述电子设备600,还可以包括:
[0326]
总线603,用于连接所述处理器601以及所述存储器602。总线可以是工业标准体系结构(industry standard architecture,简称为isa)总线、外部设备互连(peripheral component,pci)总线或扩展工业标准体系结构(extended industry standard architecture,eisa)总线等。总线可以分为地址总线、数据总线、控制总线等,但并不表示仅有一根总线或一种类型的总线。
[0327]
可选的,在具体实现上,如果存储器602和处理器601集成在一块芯片上实现,则存储器602和处理器601可以通过内部接口完成通信。
[0328]
本技术实施例还提供了一种计算机可读存储介质,该计算机可读存储介质可以包括:u盘、移动硬盘、只读存储器(read-only memory,rom)、随机存取存储器(random access memory,ram)、磁盘或者光盘等各种可以存储程序代码的介质,具体的,该计算机可读存储介质中存储有程序指令,程序指令用于上述各方法实施例中的方法。
[0329]
本技术实施例还提供一种计算机程序产品,包括计算机程序,该计算机程序被处理器执行时实现上述各方法实施例中的方法。
[0330]
本领域技术人员在考虑说明书及实践这里公开的发明后,将容易想到本技术的其它实施方案。本技术旨在涵盖本技术的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本技术的一般性原理并包括本技术未公开的本技术领域中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本技术的真正范围和精神由本技术的权利要求书指出。
[0331]
应当理解的是,本技术并不局限于上面已经描述并在附图中示出的精确结构,并且可以在不脱离其范围进行各种修改和改变。本技术的范围仅由所附的权利要求书来限制。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献