CN113362068B - 一种轻节点验证区块链状态转移的方法 - Google Patents
一种轻节点验证区块链状态转移的方法 Download PDFInfo
- Publication number
- CN113362068B CN113362068B CN202110911606.0A CN202110911606A CN113362068B CN 113362068 B CN113362068 B CN 113362068B CN 202110911606 A CN202110911606 A CN 202110911606A CN 113362068 B CN113362068 B CN 113362068B
- Authority
- CN
- China
- Prior art keywords
- state
- block
- proof
- transaction
- contract
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06Q—INFORMATION AND COMMUNICATION TECHNOLOGY [ICT] SPECIALLY ADAPTED FOR ADMINISTRATIVE, COMMERCIAL, FINANCIAL, MANAGERIAL OR SUPERVISORY PURPOSES; SYSTEMS OR METHODS SPECIALLY ADAPTED FOR ADMINISTRATIVE, COMMERCIAL, FINANCIAL, MANAGERIAL OR SUPERVISORY PURPOSES, NOT OTHERWISE PROVIDED FOR
- G06Q20/00—Payment architectures, schemes or protocols
- G06Q20/38—Payment protocols; Details thereof
- G06Q20/382—Payment protocols; Details thereof insuring higher security of transaction
- G06Q20/3829—Payment protocols; Details thereof insuring higher security of transaction involving key management
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/60—Protecting data
- G06F21/62—Protecting access to data via a platform, e.g. using keys or access control rules
- G06F21/6218—Protecting access to data via a platform, e.g. using keys or access control rules to a system of files or objects, e.g. local or distributed file system or database
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/60—Protecting data
- G06F21/64—Protecting data integrity, e.g. using checksums, certificates or signatures
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/54—Interprogram communication
- G06F9/546—Message passing systems or structures, e.g. queues
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computer Security & Cryptography (AREA)
- General Engineering & Computer Science (AREA)
- Business, Economics & Management (AREA)
- Accounting & Taxation (AREA)
- Health & Medical Sciences (AREA)
- Bioethics (AREA)
- General Health & Medical Sciences (AREA)
- Computer Hardware Design (AREA)
- Finance (AREA)
- Strategic Management (AREA)
- General Business, Economics & Management (AREA)
- Databases & Information Systems (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明提供了一种轻节点验证区块链状态转移的方法。该方法所验证的输入数据包括待验证的区块数据和区块状态转移证明两部分。该方法通过区块状态转移证明,验证区块中签名交易序列的执行过程,进一步确定该执行过程导致的状态转移是否与上一个区块出示的全局状态的梅克尔树根、本区块出示的全局状态的梅克尔树根表达的状态转移特征是否一致。本发明有效降低了数据存储代价和计算成本,具有广泛的应用场景。
Description
技术领域
本申请涉及区块链安全技术领域,具体涉及一种轻节点验证区块链状态转移的方法。
背景技术
区块链系统中的区块数据持续增长,使得作为全节点同步所有区块数据的代价持续加大,例如根据ycharts.com的统计,以太坊的区块数据在过去一年增长超过400G字节。区块数据的来源真实性可以通过交易的签名验证,区块数据的内容完整性可以通过合法出块节点对区块内容的hash签名,以及前后区块的hash衔接验证。虽然上述区块数据的真实性和完整性验证均简便易行,但是如果要验证区块内交易执行导致的状态转移,由于交易执行依赖全局状态提供的上下文信息,现有技术要求同步全部区块数据及全局状态之后,方可在本地执行区块中的交易序列,验证交易序列执行导致的状态迁移结果,进一步才有能力参与共识。随着区块数据和状态的不断膨胀,验证代价的攀高将导致公有链面临共识节点日益中心化风险;另一方面,现有的区块链分片扩容方案,由于分片之间的状态隔离,基于上述约束导致无法进行跨分片的状态转移验证,分片更加容易被恶意节点劫持,伪造恶意的状态转移结果,导致分片内部面临更高的安全风险。
现有的简单支付验证(SPV:Simple Payment Verification)技术仅仅能够对交易在区块中的存在性进行验证,无法验证区块执行导致的状态转移的正确性,即区块包含的签名交易序列执行的状态转移结果,与区块包含的全局状态梅克尔树根代表的状态的转移是否一致。综上所述,实现轻节点无需同步区块数据及状态,对区块的状态转移进行验证,是迫切需要解决的技术问题。
发明内容
为了解决上述技术问题,为了解决上述技术问题,本发明提供了一种无需同步区块数据和全局状态的验证区块状态转移正确性的方法。本发明所采用的技术方案如下:
一种轻节点验证区块链状态转移的方法,该方法包括如下步骤:
步骤201、为轻节点集成合约容器,并采用加载验证的状态读写接口Shim APIVerify代替的直接读写状态的接口;
步骤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;如果不一致,返回验证失败并结束验证过程;如果一致返回验证成功并结束验证过程。
进一步的,在步骤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是否一致,如果不一致,返回验证失败并结束验证过程;如果一致,继续合约逻辑执行。
进一步的,步骤204还包括:当本条交易tx_i正常执行完毕,将执行签名交易tx_i前的区块链全局状态梅克尔树根b_mr_i设置为当前交易结束时的全局状态梅克尔树根e_mr_i,将交易序号i+1,重复执行步骤204直到待验证区块的最后一条交易执行完毕。
进一步的,所述区块状态转移证明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。
进一步的,所述增加状态记录和状态证明生成能力,具体包括:
该接口在写入状态名-状态值到键-值数据库时,按照状态唯一的名称,将状态写入全局状态的梅克尔树相应位置,并记录状态名、状态值、状态在全局状态的梅克尔证明;
所述读写状态的接口在依据状态名读取状态值时,记录状态名、状态值、及状态在全局状态的梅克尔证明。
进一步的,在步骤104中还包括:
在执行每条签名交易tx_i之前,记录当前的区块链全局状态梅克尔树根b_mr_i,其中区块链全局状态梅克尔树根b_mr_i中的i取值范围1~M,M代表区块包含的签名交易总数。
进一步的,在步骤105中,当写入了状态sw_i_k时,记录该状态的名称sw_i_k_name、值sw_i_k_value、该状态的梅克尔证明sw_i_k_proof,其中,k的取值范围1~Wi,Wi代表第i条交易执行过程写入的状态总数。
进一步的,区块的状态转移证明的结构化数据STP_Block包括:
区块高度height,用以对应待验证的区块高度;
区块包含的签名交易相关合约证明数组proof_contracts,该数组元素的类型为合约的状态证明SProof;
区块包含的签名交易状态转移证明数组proof_trans,其中存储了与区块包含的签名交易序列一一对应的交易状态转移证明STP_Transaction。
进一步的,所述状态证明SProof的数据项包括:状态名name、状态值value、状态的梅克尔分支路径path,通过将状态名name与状态值value合并为字节数组求哈希,进一步与梅克尔分支路径path进行多次合并之后求哈希计算,以获得所在状态梅克尔树的根,将计算所得的梅克尔树根与证明中出具的梅克尔树根比对,从而验证状态是否存在,以及状态值是否正确。
进一步的,交易状态转移证明STP_Transaction的数据项包括:交易执行前全局状态梅克尔树根b_mr、交易执行结束时全局状态梅克尔树根e_mr、读取状态的梅克尔证明数组sprs、写入状态的梅克尔证明数组spws,其中,sprs和spws这两组数组元素的类型为状态证明SProof。
通过本申请实施例,可以获得如下技术效果:与现有技术相比,本申请的区块数据验证方法,通过在全节点顺序执行区块内交易序列,记录执行过程中相关状态及其在全局状态中的梅克尔证明,能够对顺序执行区块内交易序列,导致的状态转移的正确性进行生成证明。轻节点在无需同步区块数据和状态的前提下,能够对该证明进行验证。本发明提供的方法能够应用在多种场景下,在无需付出全账本数据存储的高代价下,增强区块链服务的安全性。
附图说明
为了更清楚地说明本申请实施例中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1为梅克尔树及梅克尔证明原理图;
图2为生成区块状态转移证明的流程示意图;
图3为区块状态转移证明的数据结构示意图;
图4为全局状态示意图;
图5为验证区块状态转移证明的流程示意图。
具体实施方式
为使本申请实施例的目的、技术方案和优点更加清楚,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的全部其他实施例,都属于本申请保护的范围。
在对本发明的技术方案进行详细描述之前,首先对本发明中使用的术语约定进行如下介绍:
Hash(哈希或散列)算法,又常被称为指纹(finger print)或摘要(digest)算法,是非常基础也非常重要的一类算法。可以将任意长度的二进制明文串映射为较短的(通常是固定长度的)二进制串(Hash值),并且不同的明文很难映射为相同的Hash值;
梅克尔树(Merkle tree):又被称做哈希树(hash tree),在密码学及计算机科学中是一种树形数据结构,每个叶节点均以数据块的哈希作为标签,而除了叶节点以外的节点则以其子节点标签的加密哈希作为标签。梅克尔树能够高效、安全地验证大型数据结构的内容。附图1展示了一种二叉树的梅克尔树,最顶层的节点被称作梅克尔树根(Merkletree root)。
梅克尔证明(Merkle proofs):一个梅克尔证明包含了一个数据块,数据块所在梅克尔树的根哈希,以及包含了所有沿数据块到根路径哈希的“分支”路径。验证方沿着出具的分支路径逐步计算哈希,直到算出梅克尔树的根,与可信的梅克尔树的根比较,如果一致,可以证明数据块的内容可信。如附图1,在一个包含a~h共8个状态的区块链中,要证明状态Sc的存在,只需要出具数据块Sc(状态名+状态值)、Hd、Hab、Hefgh,经过4次哈希计算,可以获得该梅克尔树的根哈希Habcdefgh,与梅克尔证明中出具的根哈希比较,如果一致则表明状态Sc可信。
合约:即智能合约,可以被区块链合约容器加载和执行的代码,合约拥有唯一标识、合约包含供签名交易调用的方法,合约方法通过合约容器提供的接口读写外部状态。本发明中的“操作”是指通过签名交易调用合约方法;
合约上下文(Contract Context):即合约方法执行的上下文环境,包括调用合约方法的签名交易,访问区块数据和world State世界状态的Shim API接口;
世界状态(World State):区块链账本的外部状态,简称状态,所有状态构成区块链的全局状态。合约容器上下文接口Shim API中提供了读写状态的接口,支持向键-值数据库读写Key-Value状态键值对;
签名:本发明中的签名包含账户标识和数字签名两部分,其中数字签名是使用了公钥加密领域的技术实现,用于鉴别数字信息的方法;账户标识用于从关联交易中提取签名者的公钥,用以验证其数字签名;
签名交易:包含交易发起方签名的结构化数据,代表了签名者的授权行为,签名交易中指定了调用的合约名、合约方法及调用参数。
全节点:区块链组网中同步和拥有全部区块数据和全局状态的组网节点。与之对应的是不拥有区块数据和全局状态的轻节点。本发明中的轻节点包含了能够执行合约逻辑的合约容器。
图2为生成区块状态转移证明的流程示意图。本发明的生成区块状态转移证明包括如下步骤:
步骤101、全节点的合约容器为读写状态的接口Shim API Prove增加状态记录和状态证明生成能力;
所述增加状态记录和状态证明生成能力,具体包括:
该接口在写入状态名-状态值到键-值数据库时,按照状态唯一的名称,将状态写入全局状态的梅克尔树相应位置,并记录状态名、状态值、状态在全局状态的梅克尔证明;
所述读写状态的接口在依据状态名读取状态值时,记录状态名、状态值、及状态在全局状态的梅克尔证明;
其中,所述读写状态的接口Shim API Prove通过如下函数定义:
//全节点合约容器实现的生成状态证明的状态读写API//
class Shim API Prove() {
type Key = String
type Value = Array[Byte]
...
//读取状态证明集合
val kset_read = Set[SProof]()
//写入状态证明集合
val kset_write = Set[SProof]()
def setState(key: Key, value: Value): Unit = {
//键值加入写入集合,更新梅克尔树
put(key, value)
//增加写入的状态证明
kset_write.add(SProof(key,value,getMerkleProof(key)))
}
//根据传入的唯一状态名,返回该状态的梅克尔证明
//如果状态值为空,按照状态名插入梅克尔节点并初始化为空值
def getMerkleProof(key: Key):Array[Array[Byte] ={
...
}
def getState(key: Key): Value= {
//键值加入读取集合
val value = get(key)
//增加读取的状态证明
kset_read.add(SProof(key,value,getMerkleProof(key)))
return value
}
...
}
步骤102、全节点在部署合约时,将合约名-合约代码通过所述读写状态的接口写入全局状态;
步骤103、全节点在执行区块的交易序列前,依据交易调用的合约名从全局状态读取合约代码,并将合约名、合约代码记录在全局状态,生成梅克尔证明,组合区块内所有交易调用合约时的全局状态读取记录以生成合约证明;
步骤104、全节点按照区块内交易序列顺序逐条执行签名交易tx_i;
在步骤104中还包括:
在执行每条签名交易tx_i之前,记录当前的区块链全局状态梅克尔树根b_mr_i,其中区块链全局状态梅克尔树根b_mr_i中的i取值范围1~M,M代表区块包含的签名交易总数;
步骤105、在执行每条签名交易tx_i的过程中,当读取了状态sr_i_j时,记录该状态的名称sr_i_j_name、值sr_i_j_value、以及该状态的梅克尔证明sr_i_j_proof,其中,j的取值范围1~Ri,Ri代表第i条交易执行过程读取的状态总数;
当写入了状态sw_i_k时,记录该状态的名称sw_i_k_name、值sw_i_k_value、该状态的梅克尔证明sw_i_k_proof,其中,k的取值范围1~Wi,Wi代表第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。
图3为区块状态转移证明的数据结构示意图。
区块的状态转移证明的结构化数据STP_Block包括:
区块高度height,用以对应待验证的区块高度;
区块包含的签名交易相关合约证明数组proof_contracts,该数组元素的类型为合约的状态证明SProof;
其中,所述状态证明SProof的数据项包括:状态名name、状态值value、状态的梅克尔分支路径path,通过将状态名name与状态值value合并为字节数组求哈希,进一步与梅克尔分支路径path进行多次合并之后求哈希计算,以获得所在状态梅克尔树的根,将计算所得的梅克尔树根与证明中出具的梅克尔树根比对,从而验证状态是否存在,以及状态值是否正确;
区块包含的签名交易状态转移证明数组proof_trans,其中存储了与区块包含的签名交易序列一一对应的交易状态转移证明STP_Transaction;
交易状态转移证明STP_Transaction的数据项包括:交易执行前全局状态梅克尔树根b_mr、交易执行结束时全局状态梅克尔树根e_mr、读取状态的梅克尔证明数组sprs、写入状态的梅克尔证明数组spws,其中,sprs和spws这两组数组元素的类型为状态证明SProof。
对上述数据结构的类型及数据项定义如下:
/*** 状态证明
* name:状态名, value:状态值, path:状态在全局状态中的梅克尔证明**/
final case class SProof(name:String, value:Array[Byte], path: Array[Array[Byte]])
/*** 交易状态转移证明
* sprs:读取状态的梅克尔证明, spws:写入状态的梅克尔证明,
* b_mr:交易执行前状态梅克尔树根,e_mr: 交易执行结束状态梅克尔树根**/
final case class STP_Transaction(sprs:Array[SProof], spws: Array[SProof],b_mr:Array[Byte], e_mr:Array[Byte])
/***区块状态转移证明
*height:区块高度,proof_contracts:合约证明数组,proof_trans:交易状态转移证明数组**/
final case class STP_Block(height: Long, proof_contracts: Array[SProof], proof_trans: Array[STP_Transaction])
图4为全局状态示意图。通过步骤102,图中的状态Sa中保存了一个如下定义的转账合约ContractAssets,该合约包含了一个转账方法transfer。上述功能通过如下函数实现。
/** 转账合约类**/
class ContractAssets extends IContract{
...
/** 转账方法,c:合约上下文,from:来源账户,to:目标账户,amount:转账金额
**/
def transfer(c: ContractContext, from, to, amount) ={
//读取发送方账户余额
val dfrom = c.api.getState(from)
//读取接收方账户余额
var dto = c.api.getState(to)
//如果余额不足,抛出异常
if(dfrom < amount)
throw ContractException("余额不足")
//发送方账户余额扣除发送金额
c.api.setState(from,dfrom - amount)
//接收方账户余额加上发送金额
c.api.setState(to,dto + data.amount)
}
}
在步骤103,接口Shim API Prove读取状态Sa并生成了该合约状态的梅克尔证明,即附图4中的对应路径;随后账户c通过区块内的交易调用合约的转账方法transfer,向账户f转账50元。transfer方法首先通过c.api.getState调用接口Shim API Prove读取了分别存储账户余额的两个状态Sc和Sf,生成了对应的读取状态梅克尔证明,随后transfer方法通过c.api.setState调用接口Shim API Prove写入了两个状态Sc和Sf,写入状态导致状态Hash值变更为Hc'和Hf',全局状态的梅克尔树随之更新,接口Shim API Prove为新的状态值Sc'和Sf'记录了更新后的梅克尔证明。
图5为验证区块状态转移证明的流程示意图。
步骤201、为轻节点集成合约容器,并采用加载验证的状态读写接口Shim APIVerify代替的直接读写状态的接口;
该Shim API Verify接口在写入状态名-状态值时,使用空操作代替对键-值数据库的写入,并能够验证写入状态对应的全局状态梅克尔证明;该Shim API Verify接口在读取状态值时,用记录中的状态值作为返回值,代替对键-值数据库的读取,并验证读取状态在全局状态的梅克尔证明;
该Shim API Verify接口的关键方法定义如下:
/**轻节点合约容器实现的验证状态的状态读写API
* kset_read,kset_write:区块状态转移证明中相关的状态证明,
* b_mr 读取状态对应的全局状态梅克尔根,
* e_mr 写入状态对应的全局状态梅克尔根
**/
class ShimAPIVerify(kset_read:Set[SProof],kset_write:Set[SProof],
b_mr:Array[Byte], e_mr:Array[Byte]) {
type Key = String
type Value = Array[Byte]
...
def setState(key: Key, value: Value): Unit = {
//增加写入的状态验证
if(!verifyProof(getProofWrite(key),er))
throw new Exception("状态验证失败")
}
def verifyProof(p:SProof, mr:Array[Byte]):Boolean={
return getMerkleRoot(p) == mr
}
//根据传入的唯一状态名,返回该状态的梅克尔证明
def getProofRead(key:Key)={
for(e<-kset_read) if(e.name==key) e
}
//根据传入的唯一状态名,返回该状态的梅克尔证明
def getProofWrite(key:Key)={
for(e<-kset_write) if(e.name==key) e
}
def getState(key: Key): Value= {
//键值加入读取集合
val s = getProofRead(key)
//增加读取的状态验证
if(!verifyProof(getProofRead(key),mr))
throw new Exception("状态验证失败")
return s.value
}
...
}
步骤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,签名交易中指定了调用的合约名、合约方法名及方法参数,轻节点依据合约方法名加载合约逻辑,传入方法参数执行合约逻辑,合约逻辑执行过程中,用命令模式的状态读写接口执行对区块链状态的读写;
在读取状态时,依据该状态的名称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是否一致,如果不一致,返回验证失败并结束验证过程;如果一致,继续合约逻辑执行;
当本条交易tx_i正常执行完毕,将执行签名交易tx_i前的区块链全局状态梅克尔树根b_mr_i设置为当前交易结束时的全局状态梅克尔树根e_mr_i,将交易序号i+1,重复执行步骤204直到待验证区块的最后一条交易执行完毕;
步骤205、轻节点比对待验证区块的区块头包含的本区块的全局状态梅克尔树根mr_block与最后一笔交易的梅克尔状态树根e_mr_i是否一致,其中,梅克尔状态树根e_mr_i中i取值为区块包含的交易总数N;如果不一致,返回验证失败并结束验证过程;如果一致返回验证成功并结束验证过程。
本申请的方法要求全节点提供区块内交易调用合约的合约证明数组proof_contracts,以及每条签名交易的状态转移证明信息,以第i条交易为例,其中i取值范围1~M,M代表区块包含的签名交易总数。具体包括:交易执行前的全局状态梅克尔树根b_mr_i、交易执行过程中,读取的状态的名称sr_i_j_name,其中j的取值范围1~Ri,Ri代表第i条交易执行过程读取的状态总数;读取的状态的值sr_i_j_value、以及读取的状态在交易执行前的梅克尔证明sr_i_j_proof;写入的状态名sw_i_k_name,其中k的取值范围1~Wi,Wi代表第i条交易执行过程写入的状态总数;写入的状态值sw_i_k_value、写入的状态在交易执行之后的梅克尔证明sw_i_k_proof、以及交易执行后的全局状态梅克尔树根e_mr_i,从而实现在无需同步区块链账本的前提下,验证区块中交易序列的执行过程,确定该执行过程导致的状态转移是否与上一个区块出示的全局状态梅克尔树根、本区块出示的全局状态的梅克尔树根代表的状态转移是否一致。
综上所述,本申请的技术方案实现了如下功能:
1)轻节点对交易执行状态转移的验证:区块链的轻节点在通过同步区块头,进行简单支付验证确定交易存在性之外,采用本发明提供的方法,可要求全节点提供交易所在区块的状态转移证明,进一步对该交易执行导致的状态转移进行验证;
2)跨分片的区块状态转移验证:对于采用分片扩容的区块链,由于各分片只维护片内状态,无法进行跨片验证,加剧恶意算力控制单一分片的风险。采用本发明提供的方法,可以要求分片内的全节点提供区块的状态转移证明,由全网节点在无需同步区块和全局账本的前提下,进行跨片的区块正确性验证,降低由于状态分片导致的安全风险;
3)全链区块状态转移验证:采用本方法从创世块开始,按照区块高度逐一对区块进行验证,将经过验证的前一区块的全局状态梅克尔树根,作为保证后一区块的初始状态可信的前提,即使所有共识节点串通作恶,轻节点也可以发现第一处被恶意篡改的状态。
在一些实施例中,计算机程序的部分或者全部可以经由ROM而被载入和/或安装到设备上。当计算机程序加载并被执行时,可以执行上文描述的方法的一个或多个步骤。
本申请中以上描述的功能可以至少部分地由一个或多个硬件逻辑部件来执行。例如,非限制性地,可以使用的示范类型的硬件逻辑部件包括:场可编程门阵列(FPGA)、专用集成电路(ASIC)、专用标准产品(ASSP)、芯片上系统的系统(SOC)、负载可编程逻辑设备(CPLD)等等。
用于实施本公开的方法的程序代码可以采用一个或多个编程语言的任何组合来编写。这些程序代码可以提供给通用计算机、专用计算机或其他可编程数据处理装置的处理器或控制器,使得程序代码当由处理器或控制器执行时使流程图和/或框图中所规定的功能/操作被实施。程序代码可以完全在机器上执行、部分地在机器上执行,作为独立软件包部分地在机器上执行且部分地在远程机器上执行或完全在远程机器或服务器上执行。
在本公开的上下文中,机器可读介质可以是有形的介质,其可以包含或存储以供指令执行系统、装置或设备使用或与指令执行系统、装置或设备结合地使用的程序。机器可读介质可以是机器可读信号介质或机器可读储存介质。机器可读介质可以包括但不限于电子的、磁性的、光学的、电磁的、红外的、或半导体系统、装置或设备,或者上述内容的任何合适组合。机器可读存储介质的更具体示例会包括基于一个或多个线的电气连接、便携式计算机盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦除可编程只读存储器(EPROM或快闪存储器)、光纤、便捷式紧凑盘只读存储器(CD-ROM)、光学储存设备、磁储存设备、或上述内容的任何合适组合。
此外,虽然采用特定次序描绘了各操作,但是这应当理解为要求这样操作以所示出的特定次序或以顺序次序执行,或者要求所有图示的操作应被执行以取得期望的结果。在一定环境下,多任务和并行处理可能是有利的。同样地,虽然在上面论述中包含了若干具体实现细节,但是这些不应当被解释为对本公开的范围的限制。在单独的实施例的上下文中描述的某些特征还可以组合地实现在单个实现中。相反地,在单个实现的上下文中描述的各种特征也可以单独地或以任何合适的子组合的方式实现在多个实现中。
尽管已经采用特定于结构特征和/或方法逻辑动作的语言描述了本主题,但是应当理解所附权利要求书中所限定的主题未必局限于上面描述的特定特征或动作。相反,上面所描述的特定特征和动作仅仅是实现权利要求书的示例形式。
Claims (8)
1.一种轻节点验证区块链状态转移的方法,其特征在于,该方法包括如下步骤:步骤201、为轻节点集成合约容器,并采用加载验证的状态读写接口Shim APIVerify代替的直接读写状态的接口;步骤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;如果不一致,返回验证失败并结束验证过程;如果一致返回验证成功并结束验证过程;
在步骤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是否一致,如果不一致,返回验证失败并结束验证过程;如果一致,继续合约逻辑执行;
步骤204还包括:当本条交易tx_i正常执行完毕,将执行签名交易tx_i前的区块链全局状态梅克尔树根b_mr_i设置为当前交易结束时的全局状态梅克尔树根e_mr_i,将交易序号i+1,重复执行步骤204直到待验证区块的最后一条交易执行完毕。
2.根据权利要求1所述的方法,其特征在于,所述区块状态转移证明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。
3.根据权利要求2所述的方法,其特征在于,所述增加状态记录和状态证明生成能力,具体包括:该接口在写入状态名-状态值到键-值数据库时,按照状态唯一的名称,将状态写入全局状态的梅克尔树相应位置,并记录状态名、状态值、状态在全局状态的梅克尔证明;所述读写状态的接口在依据状态名读取状态值时,记录状态名、状态值、及状态在全局状态的梅克尔证明。
4.根据权利要求2所述的方法,其特征在于,在步骤104中还包括:在执行每条签名交易tx_i之前,记录当前的区块链全局状态梅克尔树根b_mr_i,其中区块链全局状态梅克尔树根b_mr_i中的i取值范围1~M,M代表区块包含的签名交易总数。
5.根据权利要求2所述的方法,其特征在于,在步骤105中,当写入了状态sw_i_k时,记录该状态的名称sw_i_k_name、值sw_i_k_value、该状态的梅克尔证明sw_i_k_proof,其中,k的取值范围1~Wi,Wi代表第i条交易执行过程写入的状态总数。
6.根据权利要求2所述的方法,其特征在于,区块的状态转移证明的结构化数据STP_Block包括:区块高度height,用以对应待验证的区块高度;区块包含的签名交易相关合约证明数组proof_contracts,该数组元素的类型为合约的状态证明SProof;区块包含的签名交易状态转移证明数组proof_trans,其中存储了与区块包含的签名交易序列一一对应的交易状态转移证明STP_Transaction。
7.根据权利要求6所述的方法,其特征在于,所述状态证明SProof的数据项包括:状态名name、状态值value、状态的梅克尔分支路径path,通过将状态名name与状态值value合并为字节数组求哈希,进一步与梅克尔分支路径path进行多次合并之后求哈希计算,以获得所在状态梅克尔树的根,将计算所得的梅克尔树根与证明中出具的梅克尔树根比对,从而验证状态是否存在,以及状态值是否正确。
8.根据权利要求6所述的方法,其特征在于,交易状态转移证明STP_Transaction的数据项包括:交易执行前全局状态梅克尔树根b_mr、交易执行结束时全局状态梅克尔树根e_mr、读取状态的梅克尔证明数组sprs、写入状态的梅克尔证明数组spws,其中,sprs和spws这两组数组元素的类型为状态证明SProof。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110911606.0A CN113362068B (zh) | 2021-08-10 | 2021-08-10 | 一种轻节点验证区块链状态转移的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110911606.0A CN113362068B (zh) | 2021-08-10 | 2021-08-10 | 一种轻节点验证区块链状态转移的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN113362068A CN113362068A (zh) | 2021-09-07 |
CN113362068B true CN113362068B (zh) | 2022-03-29 |
Family
ID=77540754
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110911606.0A Active CN113362068B (zh) | 2021-08-10 | 2021-08-10 | 一种轻节点验证区块链状态转移的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113362068B (zh) |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN114691687B (zh) * | 2021-12-30 | 2022-12-06 | 北京连琪科技有限公司 | 验证区块状态证明的方法 |
CN115186304B (zh) * | 2022-09-13 | 2023-01-17 | 天聚地合(苏州)科技股份有限公司 | 一种基于区块链的交易数据校验方法和系统 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109345388A (zh) * | 2018-09-20 | 2019-02-15 | 百度在线网络技术(北京)有限公司 | 区块链智能合约验证方法、装置及存储介质 |
CN109508982A (zh) * | 2018-11-21 | 2019-03-22 | 北京蓝石环球区块链科技有限公司 | 基于区块链主链加并行多子链的repb共识 |
CN110009334A (zh) * | 2018-11-07 | 2019-07-12 | 阿里巴巴集团控股有限公司 | 一种构建梅克尔树、简单支付验证方法及装置 |
CN110011800A (zh) * | 2018-11-07 | 2019-07-12 | 阿里巴巴集团控股有限公司 | 一种区块链数据读取方法及装置 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20190188698A1 (en) * | 2017-12-19 | 2019-06-20 | Tbcasoft, Inc. | Computer apparatus for cross-ledger transfers between distributed ledgers |
-
2021
- 2021-08-10 CN CN202110911606.0A patent/CN113362068B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109345388A (zh) * | 2018-09-20 | 2019-02-15 | 百度在线网络技术(北京)有限公司 | 区块链智能合约验证方法、装置及存储介质 |
CN110009334A (zh) * | 2018-11-07 | 2019-07-12 | 阿里巴巴集团控股有限公司 | 一种构建梅克尔树、简单支付验证方法及装置 |
CN110011800A (zh) * | 2018-11-07 | 2019-07-12 | 阿里巴巴集团控股有限公司 | 一种区块链数据读取方法及装置 |
CN109508982A (zh) * | 2018-11-21 | 2019-03-22 | 北京蓝石环球区块链科技有限公司 | 基于区块链主链加并行多子链的repb共识 |
Non-Patent Citations (3)
Title |
---|
Fraud Proofs: Maximising Light Client Security;Mustafa Al-Bassam 等;《arXiv》;20180930;全文 * |
人工智能 introduction to fraud proof;ninejean;《大专栏》;20200604;全文 * |
以太坊Merkle;charlieyan;《简书》;20190515;全文 * |
Also Published As
Publication number | Publication date |
---|---|
CN113362068A (zh) | 2021-09-07 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108389129B (zh) | 基于区块链的交易执行方法及装置、电子设备 | |
CN112686671B (zh) | 基于区块链的智能合约部署方法、装置、设备以及介质 | |
CN111737654B (zh) | 基于区块链的侵权检测方法及装置、电子设备 | |
CN111539731A (zh) | 基于区块链的联邦学习方法及装置和电子设备 | |
US20200273026A1 (en) | Blockchain-based system for efficient storage and retrieval of disparate supply-side transaction information | |
US20210049715A1 (en) | Blockchain-based data procesing method, apparatus, and electronic device | |
CN111461751B (zh) | 基于区块链的房产信息链上组织方法、历史状态追溯方法及装置 | |
CN113065169B (zh) | 一种文件存证方法、装置及设备 | |
CN111444196B (zh) | 块链式账本中全局状态的哈希的生成方法、装置及设备 | |
KR20220143705A (ko) | 블록체인과 연관된 서비스들의 플랫폼을 위한 컴퓨팅 서비스들 | |
CN112862490B (zh) | 一种异步网络下的输出共识方法 | |
CN113362068B (zh) | 一种轻节点验证区块链状态转移的方法 | |
CN110930152B (zh) | 一种基于区块链的数据处理方法及相关设备 | |
CN112287033B (zh) | 一种数据同步方法、设备以及计算机可读存储介质 | |
CN112258189A (zh) | 基于区块链的签约管理方法及装置和电子设备 | |
WO2023051308A1 (zh) | 数据校验方法、装置、设备及存储介质 | |
CN117376366A (zh) | 区块链交易处理方法、装置、介质及电子设备 | |
CN113810185A (zh) | 一种抗陷门泄露的链上数据修复系统及方法 | |
CN116938523A (zh) | 区块链系统、运行方法、电子设备和存储介质 | |
CN114358948A (zh) | Nft原子交换方法、系统、计算机可读存储介质及终端设备 | |
CN115203747A (zh) | 数据账户创建方法及装置 | |
US11468038B1 (en) | System and method for interfacing a database system with a consensus system | |
CN115203746A (zh) | 数据账户的访问授权方法及装置 | |
CN114491662A (zh) | 一种基于区块链的数据资产审计方法、系统及设备 | |
CN114331451B (zh) | 一种基于双哈希链的区块链上的数据修改方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |