验证区块状态证明的方法技术

技术编号:34013445 阅读:18 留言:0更新日期:2022-07-02 15:10
本申请提供一种验证区块状态证明的方法,包括:获取指定状态的状态证明;从状态证明获取指定状态对应区块的区块头和最新区块头;验证所述对应区块的区块头和最新区块头的合法性,以验证区块头包含的存在性承诺、不存在性承诺和过期区块高度未被篡改或伪造;验证存在性承诺;验证不存在性承诺。通过以区块为单位组织状态树,状态树的规模小,结合写入状态的过期机制,在全局状态规模巨大但活跃状态规模有限的场景下,极大降低了计算状态存在性证明的代价,缩短了状态证明数据的长度。缩短了状态证明数据的长度。缩短了状态证明数据的长度。

【技术实现步骤摘要】
验证区块状态证明的方法


[0001]本申请涉及区块链安全
,具体涉及一种生成区块状态承诺和证明及验证区块状态证明的方法。

技术介绍

[0002]区块链的状态验证方式可分为全节点验证和轻节点验证两类。前者通过在本地保存所有区块数据,能够通过按照区块高度验证区块合法性,按照区块内的签名交易顺序逐条执行签名交易,自行生成和验证账本状态;而对于本地无区块和账本数据的轻节点,由于不具备执行签名交易所需要的状态数据,只能依靠全节点生成的证明数据验证指定状态在指定的区块高度下的存在性。
[0003]目前最具代表性的状态验证方法是以太坊主链所采用的基于全局状态的梅克尔证明。该方法在每个区块的区块头中包含了区块内签名交易执行完毕,当前全局状态的梅克尔树根(即全局状态的存在性承诺),全节点向轻节点公示区块头、并出具指定状态名的状态值、状态的梅克尔路径,轻节点通过自行验证区块合法性、计算并比对梅克尔树根,可以验证在该区块高度上指定的状态是否存在。该方法面临“状态数据膨胀”难题。
[0004]“状态数据膨胀”指的是因为用户及合约的不断增加,以及合约执行中写入的状态键

值对增加,在全节点处保存的状态数据会越来越多,从而使得全局状态树的规模不断扩大,一方面会导致状态树树根的计算量持续增加,另一方面会导致作为状态证明的梅克尔路径的数据长度持续增长,以太坊为此提出两种解决方案:
[0005]一、状态到期:状态证明沿用目前的梅克尔帕特里夏树(Merkle Patricia Tree,简称MPT树)方式。从状态中移除最近没有被访问过的状态(例如:上一次访问还是去年),并需要全节点的状态证明(State Proof)才能恢复过期状态。这会将每个人需要存储的状态减少到大约20

50GB。这个方案的局限在于:a.以最近状态访问时间范围缩小单棵MPT树的数据规模,在面临短时间内大量非重复状态名的访问时,缩小的效果有限,状态证明的计算量和证明数据长度仍然太大;b.存在安全问题,对于存在于最新MPT树的状态,全节点可以进行“状态时效性欺骗”,对轻节点谎称实际存在的最新状态不存在,并从历史MPT树中生成过期状态的证明。
[0006]二、弱无状态:只需要区块提议者存储状态,并允许所有其他节点无状态地验证区块。在实践中实现这一点需要切换到沃克尔树(Verkle Tree)以减少生成证明数据的规模。这种方案的局限在于:a.沃克尔树采用的KZG承诺,虽然证明数据长度小,但是生成证明的计算量大。b.由于仍然维持全局的状态树,随着状态数据膨胀,生成证明的计算量将不断增长,当沃克尔树叶子节点达到一定数量时,生成证明的计算复杂度导致在工程上难以应用。

技术实现思路

[0007]本申请旨在提供一种生成区块状态承诺和证明及验证区块状态证明的方法,使得无区块数据和状态数据的轻节点能够验证区块链状态的存在性和时效性。
[0008]根据本申请的一方面,提出一种生成区块状态承诺的方法,包括:
[0009]每次在区块中写入状态时,记录写入状态的版本;
[0010]将所述写入状态的状态名和所述版本输入全局过滤器,得到过滤器结果,并在所述区块中记录所述过滤器结果作为不存在性承诺;
[0011]对所述区块所有写入状态的状态名和复合状态值组织状态树,并进行计算,将计算结果作为存在性承诺;
[0012]在区块中记录所述存在性承诺;
[0013]其中,所述区块包含全部区块的所有非过期写入状态的不存在性承诺。
[0014]根据一些实施例,前述方法包括:所述在所述区块中记录所述过滤器结果作为不存在性承诺,包括:
[0015]获取所述区块的写入状态集合;
[0016]根据写入状态的版本命名规则和上一版本,获取写入状态的当前版本;
[0017]对写入状态的状态名和当前版本进行编码,生成复合状态名;
[0018]将每个写入状态的所述复合状态名输入全局过滤器,进行过滤器计算,得到过滤器结果,作为不存在性承诺;
[0019]依据当前区块高度,对输入的复合状态名建立区块高度

复合状态名索引。
[0020]根据一些实施例,前述方法还包括:
[0021]根据所述状态的当前版本和所述版本命名规则,获取状态的下一版本;
[0022]根据写入状态的状态名和下一版本进行编码,生成下一版本的复合状态名;
[0023]对所述下一版本的复合状态名进行独立过滤器计算,将计算结果与所述不存在性承诺进行比对,判断下一版本的复合状态名是否已存在;
[0024]如果是,写入状态的当前版本切换到下一版本;
[0025]重复以上步骤,直至获得所述区块的所有写入状态的当前版本;
[0026]将每个写入状态当前版本的复合状态名输入到全局过滤器计算,得到过滤器结果,作为不存在性承诺。
[0027]根据一些实施例,前述方法包括:
[0028]从全局过滤器删除写入状态的最后写入版本的复合状态名,更新区块高度

复合状态名索引;
[0029]如果写入状态的版本是初始版本,或者写入的状态是过期状态,将全局过滤器的元素总数加1;
[0030]如果全局过滤器的元素总数超出预设上限,按照区块高度

复合状态名索引,从全局过滤器中删除1个最早写入的复合状态名,并更新区块高度

复合状态名索引;
[0031]如果删除之后该区块高度对应的状态列表不为空,记录该状态所在的区块高度为过期区块高度,否则增加区块高度,直到找到一个对应的状态列表不为空的区块高度,记录该区块高度为过期区块高度。
[0032]根据一些实施例,前述方法包括:所述独立过滤器和所述全局过滤器包括:布谷鸟过滤器。
[0033]根据一些实施例,前述方法包括:所述在区块中记录所述存在性承诺,包括:
[0034]获取所述区块的写入状态集合;
[0035]针对所述区块每个写入状态,对写入状态的原始值、状态的当前版本、所在区块高度进行编码,生成复合状态值;
[0036]对所述区块所有写入状态,将状态名和复合状态值作为键值对写入区块链的状态数据库;
[0037]对所述区块所有写入状态,依据状态名和复合状态值建立状态树,并计算状态树树根作为所有写入状态的存在性承诺。
[0038]根据一些实施例,前述方法包括:所述建立状态树包括:
[0039]通过梅克尔树或沃克尔树计算得到状态树。
[0040]根据一些实施例,前述方法包括:所述存在性承诺采用梅克尔树或沃克尔树的树根表示。
[0041]根据本申请的另一方面,提供一种生成区块状态证明的方法,包括:
[0042]获取状态名;
[0043]获取状态的最新版本;
[0044]获取状态的后续版本在全局的不存在性承诺;
[0045]基于状态的最新版本,以及状态的后本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种验证区块状态证明的方法,其特征在于,包括:获取指定状态的状态证明;从状态证明获取指定状态对应区块的区块头和最新区块头;验证所述对应区块的区块头和最新区块头的合法性,以验证区块头包含的存在性承诺、不存在性承诺和过期区块高度未被篡改或伪造;验证存在性承诺;验证不存在性承诺。2.根据权利要求1所述的方法,其特征在于,所述验证存在性承诺包括:从状态证明获取状态名、复合状态值和状态的存在性证明;从当前区块头中提取状态的存在性承诺,采用梅克尔树或沃克尔树方法计算,验证状态名和复合状态值是否存在于所述存在性承诺中。3.根据权利要求2所述的方法,其特征在于,所述验证不存在性承诺包括:从最新区块头中提取过期区块高度,如果过期区块高度不小于最后一次写入指定状态的区块高度,则验证不通过;如果上述验证通过,从最新区块头中提取状态的不存在性承诺,以验证指定状态对应区块是最后一次写入指定状态的区块;从复合状态值提取状态版本,根据状态版本和版本命名规则,获取状态的下一版本;根据所述状态名、状态的下一版本,生成下一版本的复合状态名;对下一版本的复合状态名进行独立过滤器计算,得到计算结果;将所述最新区块头中的不存在性承诺和所述计算结果进行比对,如果比对结果表明所述复合状态名在全局复合状态名集合中不存在,则验证通过。4.根据权利要求3所述的方法,其特征在于,所述独立过滤器包括:布谷鸟过滤器。5.一种区块链节点,其特征在于,包括:获取状态证明单元,获取指定状态的状态证明;获取区块头单元,从状态证明获取指定状态对应区块的区块头和最新区块头;验证区块头单元,用于验证所述对应区块的区块头和最新区块头的合法性...

【专利技术属性】
技术研发人员:陈胜蒋步云
申请(专利权)人:北京连琪科技有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1