一种轻节点验证区块链状态转移的方法技术

技术编号:29984712 阅读:24 留言:0更新日期:2021-09-08 10:24
本发明专利技术提供了一种轻节点验证区块链状态转移的方法。该方法所验证的输入数据包括待验证的区块数据和区块状态转移证明两部分。该方法通过区块状态转移证明,验证区块中签名交易序列的执行过程,进一步确定该执行过程导致的状态转移是否与上一个区块出示的全局状态的梅克尔树根、本区块出示的全局状态的梅克尔树根表达的状态转移特征是否一致。本发明专利技术有效降低了数据存储代价和计算成本,具有广泛的应用场景。场景。场景。

【技术实现步骤摘要】
一种轻节点验证区块链状态转移的方法


[0001]本申请涉及区块链安全
,具体涉及一种轻节点验证区块链状态转移的方法。

技术介绍

[0002]区块链系统中的区块数据持续增长,使得作为全节点同步所有区块数据的代价持续加大,例如根据ycharts.com的统计,以太坊的区块数据在过去一年增长超过400G字节。区块数据的来源真实性可以通过交易的签名验证,区块数据的内容完整性可以通过合法出块节点对区块内容的hash签名,以及前后区块的hash衔接验证。虽然上述区块数据的真实性和完整性验证均简便易行,但是如果要验证区块内交易执行导致的状态转移,由于交易执行依赖全局状态提供的上下文信息,现有技术要求同步全部区块数据及全局状态之后,方可在本地执行区块中的交易序列,验证交易序列执行导致的状态迁移结果,进一步才有能力参与共识。随着区块数据和状态的不断膨胀,验证代价的攀高将导致公有链面临共识节点日益中心化风险;另一方面,现有的区块链分片扩容方案,由于分片之间的状态隔离,基于上述约束导致无法进行跨分片的状态转移验证,分片更加容易被恶意节点劫持,伪造恶意的状态转移结果,导致分片内部面临更高的安全风险。
[0003]现有的简单支付验证(SPV:Simple Payment Verification)技术仅仅能够对交易在区块中的存在性进行验证,无法验证区块执行导致的状态转移的正确性,即区块包含的签名交易序列执行的状态转移结果,与区块包含的全局状态梅克尔树根代表的状态的转移是否一致。综上所述,实现轻节点无需同步区块数据及状态,对区块的状态转移进行验证,是迫切需要解决的技术问题。

技术实现思路

[0004]为了解决上述技术问题,为了解决上述技术问题,本专利技术提供了一种无需同步区块数据和全局状态的验证区块状态转移正确性的方法。本专利技术所采用的技术方案如下:一种轻节点验证区块链状态转移的方法,该方法包括如下步骤:步骤201、为轻节点集成合约容器,并采用加载验证的状态读写接口Shim API Verify代替的直接读写状态的接口;步骤202、轻节点向全节点请求并获得待验证区块block、区块状态转移证明proof_block;轻节点从proof_block中提取合约证明数组proof_contracts,并逐条验证合约证明数组proof_contracts中的每条合约名、合约代码与对应的全局状态的梅克尔证明是否一致;如果不一致,返回验证失败并结束验证过程;如果一致,使用合约容器加载并执行合约;步骤203、轻节点向全节点请求并获取待验证区块的前一区块的区块头bh_prev,该区块头包含了前一区块的全局状态梅克尔树根mr_prev,设置i为初始序号1,并将签名交易tx_i执行前的全局状态梅克尔树根b_mr_i设置为前一区块的全局状态梅克尔树根mr_
prev;步骤204、轻节点按照区块内交易序列顺序逐条加载并执行签名交易tx_i,签名交易中指定了调用的合约名、合约方法名及方法参数,轻节点依据合约方法名加载合约逻辑,传入方法参数执行合约逻辑,合约逻辑执行过程中,用命令模式的状态读写接口执行对区块链状态的读写;步骤205、轻节点比对待验证区块的区块头包含的本区块的全局状态梅克尔树根mr_block与最后一笔交易的梅克尔状态树根e_mr_i是否一致,其中,梅克尔状态树根e_mr_i中i取值为区块包含的交易总数N;如果不一致,返回验证失败并结束验证过程;如果一致返回验证成功并结束验证过程。
[0005]进一步的,在步骤204中,所述用命令模式的状态读写接口执行对区块链状态的读写,具体包括:在读取状态时,依据该状态的名称sr_i_j_name,从交易状态转移证明proof_trans中找到对应的状态值sr_i_j_value、该状态的梅克尔证明sr_i_j_proof;轻节点首先对sr_i_j_name、sr_i_j_value、sr_i_j_proof执行梅克尔验证,比对计算结果与b_mr_i是否一致,如果不一致,返回验证失败并结束验证过程;如果一致,用sr_i_j_value作为状态读取的结果,继续合约逻辑执行;在写入状态时,依据该状态的名称sw_i_k_name,从交易状态转移证明proof_trans中找到对应的状态值sw_i_k_value、该状态的梅克尔证明sw_i_k_proof;轻节点首先对sw_i_k_name、sw_i_k_value、sw_i_k_proof执行梅克尔验证,比对计算结果与proof_block中当前交易结束时梅克尔状态树根e_mr_i是否一致,如果不一致,返回验证失败并结束验证过程;如果一致,继续合约逻辑执行。
[0006]进一步的,步骤204还包括:当本条交易tx_i正常执行完毕,将执行签名交易tx_i前的区块链全局状态梅克尔树根b_mr_i设置为当前交易结束时的全局状态梅克尔树根e_mr_i,将交易序号i+1,重复执行步骤204直到待验证区块的最后一条交易执行完毕。
[0007]进一步的,所述区块状态转移证明proof_block的生成包括如下步骤:步骤101、全节点的合约容器为读写状态的接口Shim API Prove增加状态记录和状态证明生成能力;步骤102、全节点在部署合约时,将合约名

合约代码通过所述读写状态的接口写入全局状态;步骤103、全节点在执行区块的交易序列前,依据交易调用的合约名从全局状态读取合约代码,并将合约名、合约代码记录在全局状态,生成梅克尔证明,组合区块内所有签名交易调用合约的全局状态读取记录以生成合约证明;步骤104、全节点按照区块内交易序列顺序逐条执行签名交易tx_i;步骤105、在执行每条签名交易tx_i的过程中,当读取了状态sr_i_j时,记录该状态的名称sr_i_j_name、值sr_i_j_value、以及该状态的梅克尔证明sr_i_j_proof,其中,j的取值范围1~Ri,Ri代表第i条交易执行过程读取的状态总数;步骤106、当签名交易tx_i执行结束之后,记录交易结束时刻区块链的全局状态梅克尔树根e_mr_i;将交易序号加1,重复步骤104直到区块内所有签名交易执行结束;步骤107、当i等于N,将本区块的全局状态梅克尔树根设置为e_mr_N,组合上述执
行所有签名交易形成的记录集合,生成签名交易的状态转移证明proof_trans,结合合约证明数组proof_contracts与签名交易的状态转移证明proof_trans以生成区块的状态转移证明proof_block,并将proof_block存储为结构化数据STP_Block。
[0008]进一步的,所述增加状态记录和状态证明生成能力,具体包括:该接口在写入状态名

状态值到键

值数据库时,按照状态唯一的名称,将状态写入全局状态的梅克尔树相应位置,并记录状态名、状态值、状态在全局状态的梅克尔证明;所述读写状态的接口在依据状态名读取状态值时,记录状态名、状态值、及状态在全局状态的梅克尔证明。
[0009]进一步的,在步骤104中本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种轻节点验证区块链状态转移的方法,其特征在于,该方法包括如下步骤:步骤201、为轻节点集成合约容器,并采用加载验证的状态读写接口Shim API Verify代替的直接读写状态的接口;步骤202、轻节点向全节点请求并获得待验证区块block、区块状态转移证明proof_block;轻节点从proof_block中提取合约证明数组proof_contracts,并逐条验证合约证明数组proof_contracts中的每条合约名、合约代码与对应的全局状态的梅克尔证明是否一致;如果不一致,返回验证失败并结束验证过程;如果一致,使用合约容器加载并执行合约;步骤203、轻节点向全节点请求并获取待验证区块的前一区块的区块头bh_prev,该区块头包含了前一区块的全局状态梅克尔树根mr_prev,设置i为初始序号1,并将签名交易tx_i执行前的全局状态梅克尔树根b_mr_i设置为前一区块的全局状态梅克尔树根mr_prev;步骤204、轻节点按照区块内交易序列顺序逐条加载并执行签名交易tx_i,签名交易中指定了调用的合约名、合约方法名及方法参数,轻节点依据合约方法名加载合约逻辑,传入方法参数执行合约逻辑,合约逻辑执行过程中,用命令模式的状态读写接口执行对区块链状态的读写;步骤205、轻节点比对待验证区块的区块头包含的本区块的全局状态梅克尔树根mr_block与最后一笔交易的梅克尔状态树根e_mr_i是否一致,其中,梅克尔状态树根e_mr_i中i取值为区块包含的交易总数N;如果不一致,返回验证失败并结束验证过程;如果一致返回验证成功并结束验证过程。2.根据权利要求1所述的方法,其特征在于,在步骤204中,所述用命令模式的状态读写接口执行对区块链状态的读写,具体包括:在读取状态时,依据该状态的名称sr_i_j_name,从交易状态转移证明proof_trans中找到对应的状态值sr_i_j_value、该状态的梅克尔证明sr_i_j_proof;轻节点首先对sr_i_j_name、sr_i_j_value、sr_i_j_proof执行梅克尔验证,比对计算结果与b_mr_i是否一致,如果不一致,返回验证失败并结束验证过程;如果一致,用sr_i_j_value作为状态读取的结果,继续合约逻辑执行;在写入状态时,依据该状态的名称sw_i_k_name,从交易状态转移证明proof_trans中找到对应的状态值sw_i_k_value、该状态的梅克尔证明sw_i_k_proof;轻节点首先对sw_i_k_name、sw_i_k_value、sw_i_k_proof执行梅克尔验证,比对计算结果与proof_block中当前交易结束时梅克尔状态树根e_mr_i是否一致,如果不一致,返回验证失败并结束验证过程;如果一致,继续合约逻辑执行。3.根据权利要求2所述的方法,其特征在于,步骤204还包括:当本条交易tx_i正常执行完毕,将执行签名交易tx_i前的区块链全局状态梅克尔树根b_mr_i设置为当前交易结束时的全局状态梅克尔树根e_mr_i,将交易序号i+1,重复执行步骤204直到待验证区块的最后一条交易执行完毕。4.根据权利要求1所述的方法,其特征在于,所述区块状态转移证明proof_block的生成包括如下步骤:步骤101、全节点的合约容器为读写状态的接口Shim API Prove增加状态记录和状态证明生成能力;
步骤102、全节点在部署合约时,将合约名

合约代码通过所述读写状态的接口写入全局状态;步骤103、全节点在执行区块的交易序列前,依据交易调用的合...

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

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

1