CN116305311A - 区块链系统中验证读写集的方法和装置 - Google Patents
区块链系统中验证读写集的方法和装置 Download PDFInfo
- Publication number
- CN116305311A CN116305311A CN202211710092.3A CN202211710092A CN116305311A CN 116305311 A CN116305311 A CN 116305311A CN 202211710092 A CN202211710092 A CN 202211710092A CN 116305311 A CN116305311 A CN 116305311A
- Authority
- CN
- China
- Prior art keywords
- read
- transaction
- execution
- indication information
- key
- 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.)
- Pending
Links
Images
Classifications
-
- 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
Landscapes
- Engineering & Computer Science (AREA)
- Computer Security & Cryptography (AREA)
- Theoretical Computer Science (AREA)
- Health & Medical Sciences (AREA)
- Bioethics (AREA)
- General Health & Medical Sciences (AREA)
- Computer Hardware Design (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本说明书提供一种在区块链系统验证读写集的方法和装置,其中区块链系统包括主节点和从节点,该验证方法由从节点执行,并具体包括以下步骤。首先获取第一交易组对应的第一预执行读写集,所述第一预执行读写集根据主节点的预执行结果生成,其中包括第一读集。在执行第一交易组之前,从状态数据库中批量读取第一读集涉及的状态数据,将其存入第一存储区。在执行第一交易组中的第一交易过程中,查询第一存储区,若在第一存储区无法查询到第一交易需要读取的目标变量,确定存在验证异常。
Description
技术领域
本说明书一个或多个实施例涉及区块链技术领域,特别涉及一种在区块链系统中进行验证的方法和装置。
背景技术
区块链(Blockchain)是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。在区块链中按照时间顺序将数据区块以顺序相连的方式组合成链式数据结构,并以密码学方式保证数据区块不可篡改和不可伪造。由于区块链具有去中心化、信息不可篡改、自治性等特性,区块链也受到人们越来越多的重视和应用。
目前来说,区块链系统的可靠性有待进一步提升,需要一种区块链交易执行中的验证方案。
发明内容
本说明书一个或多个实施例提供一种区块链系统中的验证方法和装置,可以对预执行读写集进行正确性验证。
根据第一方面,提供一种区块链系统中的验证方法,所述区块链系统包括主节点和从节点,所述方法由所述从节点执行,包括:
获取第一交易组对应的第一预执行读写集,所述第一预执行读写集根据所述主节点的预执行结果生成,其中包括第一读集;
从状态数据库中批量读取所述第一读集涉及的状态数据,将其存入第一存储区;
在执行所述第一交易组中的第一交易过程中,查询所述第一存储区,若在所述第一存储区无法查询到所述第一交易需要读取的目标变量,确定存在验证异常。
根据第二方面,提供一种区块链系统中的验证装置,部署在区块链系统的从节点中,所述区块链系统还包括主节点,所述验证装置包括:
获取单元,用于获取第一交易组对应的第一预执行读写集,所述第一预执行读写集根据所述主节点的预执行结果生成,其中包括第一读集;
批量读取单元,用于从状态数据库中批量读取所述第一读集涉及的状态数据,将其存入第一存储区;
确定单元,用于在执行所述第一交易组中的第一交易过程中,查询所述第一存储区,若在所述第一存储区无法查询到所述第一交易需要读取的目标变量,确定存在验证异常。
根据第三方面,提供一种计算机可读存储介质,所述存储介质存储有计算机程序,所述计算机程序被处理器执行时实现上述第一方面所述的方法。
根据第四方面,提供一种计算设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现上述第一方面所述的方法。
根据本说明书的实施例提供的验证方法,从节点的计算进程在执行一组交易之前,根据该组交易的预执行读集,从状态数据库中读取状态数据,存入计算进程本地的存储区。在执行该组交易过程中,若从上述存储区无法查询到要读取的变量,则可以确定,对读集的验证存在异常。如此,可以高效准确地对读集进行验证。还可以可选地对预执行写集中的key,以及进一步的value进行验证,从而更加全面地对预执行读写集进行验证。
应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本申请。
附图说明
为了更清楚地说明本说明书实施例的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本说明书中记载的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1是本说明书实施例所应用的区块链系统架构图;
图2是本说明书根据一示例性实施例示出的PBFT共识算法中的共识过程示意图;
图3是本说明书根据一示例性实施例示出的区块链的主节点和从节点的结构图;
图4是本说明书根据一示例性实施例示出的验证方法流程图;
图5示出默克尔树的结构示意图;
图6是本说明书根据一示例性实施例示出的一种验证装置的框图。
具体实施方式
为了使本技术领域的人员更好地理解本说明书中的技术方案,下面将结合本说明书实施例中的附图,对本说明书实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本说明书一部分实施例,而不是全部的实施例。基于本说明书中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都应当属于本说明书保护的范围。
区块链一般被划分为三种类型:公有链(Public Blockchain),私有链(PrivateBlockchain)和联盟链(Consortium Blockchain)。此外,还有多种类型的结合,比如私有链+联盟链、联盟链+公有链等不同组合形式。其中去中心化程度最高的是公有链。公有链以比特币、以太坊为代表,加入公有链的参与者可以读取链上的数据记录、参与交易以及通过共识竞争新区块的记账权等。在私有链中,网络的写入权限由某个组织或者机构控制,数据读取权限受组织规定。联盟链是介于公有链以及私有链之间的区块链,可实现“部分去中心化”。联盟链中各个节点通常有与之相对应的实体机构或者组织;参与者通过授权加入网络并组成利益相关联盟,共同维护区块链运行。
如图1所示,是本说明书实施例所应用的区块链架构图。
在图1所示的区块链架构图中,区块链中例如包含主节点1、从节点2~从节点6共6个节点。节点之间的连线示意性的表示P2P(Peer to Peer,点对点)连接。这些节点上可存储全量的账本,即存储全部区块和全部账户的状态。其中,区块链中的每个节点可通过执行相同的交易而产生区块链中的相同的状态,区块链中的每个节点可存储相同的状态数据库。所不同的是,主节点1可负责向各个从节点发起共识提议,该共识提议中例如包括将要成块的区块(例如区块B1)中的多个交易及各个交易的执行顺序等信息。在区块链中的各个节点对共识提议共识成功之后,各个从节点可根据共识提议中的顺序执行该多个交易,从而生成区块B1。
可以理解,图1中虽然示出了区块链中包括6个节点,本说明书实施例不限于此,而是可以包括其他数目的节点。具体是,区块链中包含的节点可以满足拜占庭容错(Byzantine Fault Tolerance,BFT)要求。所述的拜占庭容错要求可以理解为在区块链内部可以存在拜占庭节点,而区块链对外不体现拜占庭行为。一般的,一些拜占庭容错算法中要求节点个数大于3f+1,f为拜占庭节点(即恶意节点)个数,例如实用拜占庭容错算法PBFT(Practical Byzantine Fault Tolerance)。
区块链领域中的交易可以指在区块链中执行并记录在区块链中的任务单元。交易中通常包括发送字段(From)、接收字段(To)和数据字段(Data)。其中,在交易为转账交易的情况中,From字段表示发起该交易(即发起对另一个账户的转账任务)的账户地址,To字段表示接收该交易(即接收转账)的账户地址,Data字段中包括转账金额。在交易调用区块链中的智能合约的情况中,From字段表示发起该交易的账户地址,To字段表示交易所调用的合约的账户地址,Data字段中包括调用合约中的函数名、及对该函数的传入参数等数据,以用于在交易执行时从区块链中获取该函数的代码并执行该函数的代码。
区块链中可提供智能合约的功能。区块链上的智能合约是在区块链系统上可以被交易触发执行的合约。智能合约可以通过代码的形式定义。在区块链中调用智能合约,是发起一笔指向智能合约地址的交易,使得区块链中每个节点分布式地运行智能合约代码。需要说明的是,除了可以由用户创建智能合约,也可以在创世块中由系统设置智能合约。这类合约一般称为创世合约。一般的,创世合约中可以设置一些区块链的数据结构、参数、属性和方法。此外,具有系统管理员权限的账户可以创建系统级的合约,或者修改系统级的合约(简称为系统合约)。其中,所述系统合约可用于在区块链中增加不同业务的数据的数据结构。
在部署合约的场景中,例如,Bob将一个包含创建智能合约信息(即部署合约)的交易发送到如图1所示的区块链中,该交易的data字段包括待创建的合约的代码(如字节码或者机器码),交易的to字段为空,以表示该交易用于部署合约。节点间通过共识机制达成一致后,确定合约的合约地址“0x6f8ae93…”,各个节点在状态数据库中添加与该智能合约的合约地址对应的合约账户,分配与该合约账户对应的状态存储,并将合约代码保存在该合约的状态存储中,从而合约创建成功。
在调用合约的场景中,例如,Bob将一个用于调用智能合约的交易发送到如图1所示的区块链中,该交易的from字段是交易发起方(即Bob)的账户的地址,to字段中的“0x6f8ae93…”代表了被调用的智能合约的地址,交易的data字段包括调用智能合约的方法和参数。在区块链中对该交易进行共识之后,区块链中的各个节点可分别执行该交易,从而分别执行该合约,基于该合约的执行更新状态数据库。
区块链技术区别于传统技术的去中心化特点之一,就是在各个节点上进行记账,或者称为分布式记账,而不是传统的集中式记账。区块链系统要成为一个难以攻破的、公开的、不可篡改数据记录的去中心化诚实可信系统,需要在尽可能短的时间内做到分布式数据记录的安全、明确及不可逆。不同类型的区块链网络中,为了在各个记录账本的节点中保持账本的一致,通常采用共识算法来保证,即前述提到的共识机制。
例如,区块链节点之间可以实现区块粒度的共识机制,比如在节点(例如某个独特的节点)产生一个区块后,如果产生的这个区块得到其它节点的认可,其它节点记录相同的区块。再例如,区块链节点之间可以实现交易粒度的共识机制,比如在节点(例如某个独特的节点)获取一笔区块链交易后,如果这笔区块链交易得到其他节点的认可,认可该区块链交易的各个节点可以分别将该区块链交易添加至自身维护的最新区块中,并且最终能够确保各个节点产生相同的最新区块。共识机制是区块链节点就区块信息(或称区块数据)达成全网一致共识的机制,可以保证最新区块被准确添加至区块链。
当前主流的共识机制包括:工作量证明(Proof of Work,POW)、股权证明(Proofof Stake,POS)、委任权益证明(Delegated Proof of Stake,DPOS)、实用拜占庭容错(Practical Byzantine Fault Tolerance,PBFT)算法等。其中,在各种共识算法中,通常在预设数目的节点对待共识的数据(即共识提议)达成一致之后,从而确定对该共识提议的共识成功。具体是,在PBFT算法中,对于N≥3f+1个共识节点,可容忍f个恶意节点,也就是说,当N个共识节点中2f+1个节点达成一致时,可确定共识成功。
图2为PBFT共识算法中的共识过程示意图。
如图2所示,根据PBFT共识算法,可将完整的共识过程划分为请求(Request)、预备(Pre-Prepare)、准备(Prepare)和提交(Commit)四个阶段。假设一区块链中包括节点n1-节点n4四个共识节点,其中,节点n1例如为主节点,节点n2-节点n4例如为从节点,根据PBFT算法,在节点n1-节点n4中可容忍f=1个恶意节点。
具体是,在请求阶段,区块链的用户可通过其用户设备向节点n1发送请求,该请求例如为区块链交易的形式。节点n1可以从一个或多个用户设备接收到多个交易,并将接收到的交易存储在交易队列中。在预备阶段,节点n1可以从交易队列中取出属于一个区块的多个交易,并针对该多个交易生成共识提议,将该共识提议及节点n1对该共识提议的签名广播给其他共识节点(即节点n2-节点n4),以使共识节点继续对该区块进行共识,该共识提议中例如可包括该多个交易的交易体和该多个交易的执行顺序等信息。
在准备阶段,各个从节点可对共识提议进行签名并发送给其他各个节点。假设节点n4为恶意节点,节点n1、节点n2和节点n3在分别接收到2f=2个其他共识节点的对共识提议的签名之后,可确定准备阶段完成,可进入提交阶段。例如,如图2中所示,节点n1在接收到节点n2和节点n3的签名之后,验证节点n2和节点n3的签名都是正确的对共识提议的签名,则确定准备阶段完成,节点n2在接收到节点n3的签名和预备阶段节点n1的签名并验证通过之后,确定准备阶段完成。
在提交阶段,各个共识节点对共识提议进行提交阶段的签名并发送给其他各个共识节点,各个共识节点在接收到2f=2个其他共识节点的提交阶段的签名之后,可确定提交阶段完成,共识成功。例如,节点n1在接收到节点n2和节点n3的提交阶段的签名并验证之后,确定提交阶段完成,从而,节点n1可根据执行该多个交易得到的执行结果更新世界状态,生成并存储包括该多个交易的区块(例如区块B1),并将多个交易的执行结果返回给用户设备。类似地,节点n2和节点n3在确定提交阶段完成之后,执行该多个交易,生成并存储区块B1,并根据多个交易的执行结果更新世界状态。
通过上述过程,实现了节点n1、节点n2和节点n3的存储一致性。也就是说,节点n1-节点n4在存在一个恶意节点的情况下仍可以实现对共识提议的共识成功,完成对区块的执行。
在相关技术中,为了提高执行效率,采用预执行和并行执行的机制,来加速区块链中的交易执行和共识。具体来说,区块链的主节点获取区块N的多个交易之后,首先对区块N的各个交易进行预执行,从而得到各个交易各自对应的预执行读写集,该预执行读写集可以用于对区块N的多个交易进行分组。在完成对区块N的各个交易进行的预执行之后,主节点可以对区块N进行共识的预备阶段(以下简称PP阶段),即生成针对区块N的共识提议,并向各个从节点广播该共识提议,该共识提议例如可以包括区块N的各个交易的哈希值,各个交易的预执行读写集的相关信息以及区块N的各个交易的预执行顺序。
各个从节点在接收到主节点发送的共识提议之后,在对区块N共识的过程中,可以并行地基于主节点发送的预执行读写集以及预执行顺序对区块N的交易进行分组,并按照分组并行地执行区块N的各个交易。
图3示出了本说明书实施例提供的区块链的主节点和从节点的结构图。
如图3所示,主节点中可以包括接入进程11、预执行进程12、缓存进程13、共识进程14、存储进程15、管理进程16和通信进程17,从节点中可以包括接入进程21、预执行进程22、缓存进程23、共识进程24、存储进程25、管理进程26、通信进程27和计算进程28。这里的每个进程可以理解为节点设备中相对独立的服务模块。
其中,主节点例如可以通过接入进程11与客户端交互,接入进程11可以从客户端接收多个交易,并将多个交易传输给缓存进程13,由缓存进程13将接收到的交易放入交易队列中。另外,缓存进程13中还存储有区块链当前最新的世界状态的状态数据。预执行进程12每隔预设时段从缓存进程13的交易队列中获取一批交易,并对获取的交易进行预执行,得到各个交易的预执行读写集。
在一种实施方式中,任一交易Tx的预执行读写集可以包括预执行读集和预执行写集,预执行读集具体可以为在预执行交易Tx的过程中生成的、读取的变量的键值对(key-value),其中,key表示读取的第一变量的变量标识,value表示第一变量的当前状态值。预执行写集具体可以为在预执行交易Tx的过程中生成的、写入的第二变量的键值对,其中,key表示写入的第二变量的变量标识,value表示执行交易后得到的第二变量的状态值。上述第一变量和第二变量,既可以为区块链中的外部账户,也可以是合约中定义的合约变量。
在预执行交易的过程中,可以从缓存进程13存储的最新状态数据中获取交易的读集中各个变量的状态值。每预执行完一个交易,可以将该交易的预执行读写集提交给缓存进程13进行存储,并利用预执行该交易得到的写集中各个变量的状态值更新缓存进程13中存储的状态数据。
因此,缓存进程13中不仅存储有各个交易,还存储有预执行各个交易得到的预执行读写集以及各个交易的预执行顺序。每隔一段时间,共识进程14可以从缓存进程13中获取一个区块对应的待共识数据,该待共识数据可以包括该区块的各个交易各自的哈希值/交易标识/交易体,交易的预执行读写集信息以及各个交易的预执行顺序。共识进程14可以生成携带待共识数据的共识提议,并通过通信进程17将该共识提议广播给区块链中的其它从节点,其它从节点对该区块进行共识的过程中,可以通过通信进程17向共识进程14返回共识产生的信息。此外,共识进程14还可以将该区块的多个交易的交易体,预执行读写集以及预执行顺序发送给管理进程16。在完成共识之后,共识进程14可以将共识结果也发送给管理进程16。管理进程16可以利用预执行该区块得到的写集中各个变量的状态值更新存储进程15中的状态数据库。并基于该区块的多个交易的交易体,预执行读写集以及分组信息等信息,生成该区块的区块数据,并将该区块数据存入存储进程15中的区块数据库。
从节点例如可以通过接入进程21与客户端交互,接入进程21可以从客户端接收多个交易,并将多个交易传输给缓存进程23,由缓存进程23将接收到的交易放入交易队列中。预执行进程22每隔预设时段从缓存进程23的交易队列中获取一批交易,并对获取的交易进行验证,将验证通过的交易返回给缓存进程23。缓存进程23可以通过通信进程27将验证通过的交易广播给主节点和其它从节点,同时,缓存进程23也可以通过通信进程27接收来自其它节点的交易。
共识进程24可以通过通信进程27接收主节点发起的共识提议,并基于共识提议对区块进行共识。同时,共识进程24可以将共识提议包括的区块的多个交易各自的预执行读写集信息以及预执行顺序等数据发送给管理进程26。
管理进程26可以基于区块的多个交易各自的预执行读写集信息以及预执行顺序,对区块的多个交易进行分组,得到多个交易组。然后,将多个交易组分配给计算进程28。
计算进程28可以有多个,多个计算进程28可以并行地执行交易组。计算进程28在执行一组交易时,可以对该组交易的预执行读写集进行验证,以保证执行结果的一致性。如果验证通过,就可以基于该交易组的执行结果更新存储进程25中存储的区块链的状态数据库。如果验证未通过,则存在主节点作恶的可能,或者并行执行出错的可能,需进行进一步处理。例如,在确定主节点作恶的情况下,计算进程28可以通知管理进程26,由管理进程26通过共识进程24向其他从节点发起换主请求,以更换主节点。
在验证通过的情况下,最后,管理进程26基于该区块的多个交易的交易体,执行读写集以及分组信息等信息,生成该区块的区块数据,并将该区块数据存入存储进程25中的区块数据库中。
在以上过程中,计算进程对读写集的验证至关重要。下面参考图4所示的验证方法流程图描述对读写集进行验证的过程。需理解,图4所示的流程通过区块链系统中的任一从节点执行,即,其中的管理进程41、第一计算进程42和存储进程43均为从节点中的进程。为了简洁,没有示出其他进程。
如图4所示,首先,在步骤401,管理进程41获取各个交易组对应的预执行读写集。
在一个实施例中,主节点发送的共识提议中包含一个区块的多个交易的预执行读写集信息以及预执行顺序。管理进程41可以基于上述预执行读写集信息以及预执行顺序,对区块的多个交易进行分组。分组的原则包括,使得不同交易组的交易不存在冲突的变量,同一交易组的交易顺序与预执行的顺序一致。从而,管理进程41得到多个交易组。管理进程41还可以根据主节点发送的预执行读写集信息,确定出各个交易组对应的预执行读写集。
在另一实施例中,主节点也可以在生成各个交易的预执行读写集后,自行对交易进行分组,并确定出各个交易组对应的预执行读写集信息。主节点可以将分组信息和各个交易组对应的预执行读写集包含在共识提议中,广播给从节点。于是,从节点的管理进程41可以从共识提议中直接获得分组信息,及各交易组的预执行读写集。
管理进程41可以多个交易组分配给多个计算进程并行执行。对于多个交易组中的任意的一个交易组,下文称为第一交易组,假定管理进程41确定将其分配给第一计算进程42。于是,在步骤402,管理进程41将该第一交易组中的交易信息,以及该第一交易组对应的第一预执行读写集发送给第一计算进程42。从而,第一计算进程42获取到第一交易组对应的第一预执行读写集。具体的,第一预执行读写集可以包括第一读集和第一写集。第一读集指示通过预执行确定的、第一交易组中的交易读取的变量信息;第一写集指示,通过预执行确定的、第一交易组中的交易写入的变量信息。
在步骤403,第一计算进程42从状态数据库中批量读取第一读集涉及的状态数据,将其存入第一存储区。
具体的,存储进程43可以用于存储和更新区块链的状态数据库。第一计算进程42可以通过与存储进程43交互,访问状态数据库,从中读取第一读集涉及的状态数据,并将其存入第一计算进程42本地的第一存储区。
在一个实施例中,第一读集包括若干第一变量的第一key。例如,第一读集可以是以下形式:{K1,K2,…,Kn},其中任意的Ki表示,第一交易组中的交易在执行时需要读取的变量的key。当该变量是外部账户,key可以是外部账户的地址(或其哈希值);当该变量是合约中定义的合约变量,key可以是合约变量的唯一标识。
于是,第一计算进程42可以基于上述第一读集,从状态数据库中读取各个第一key对应的第一变量的状态值,将读取结果存入所述第一存储区。
更具体的,可以设置两个集合,第一集合和第二集合。对于第一读集中的任意一个第一key,若从状态数据库中读取到该第一key对应的目标状态值,将该第一key和目标状态值的键值对(K,V),存入第一集合。如果从状态数据库中读取不到该第一key对应的目标状态值,将该第一key存入第二集合。在状态数据库中查询不到某个第一key的状态值,可能由于主节点作恶,导致第一读集有误,或者也可能是其他原因,例如本地状态数据库更新出现异常。
通过以上步骤403,第一计算进程42在执行第一交易组之前,批量读取第一读集涉及的状态数据,将其存入本地的第一存储区。
从而,在步骤404,第一计算进程42可以基于第一存储区,执行第一交易组,并在执行过程中,验证第一读集。
具体的,第一计算进程42按照第一交易组中的顺序,逐个执行各个交易。对于其中任意的第一交易Tx1,可以通过查询该第一存储区,执行该交易,并验证第一读集。更具体的,假定在执行第一交易Tx1过程中,需要读取目标变量x。那么,第一计算进程42可以在第一存储区中查询目标变量x的key,即Kx。如果可以查询到,则可以基于之前批量读取的Kx对应的状态值执行交易Tx1。如果查询不到,则说明在交易执行过程中产生了新的变量key,第一读集的正确性验证不通过。
在第一存储区采用两个集合进行存储的情况下,上述查询第一存储区,可以包括,首先在第一集合中查询目标变量x对应的Kx。如果可以查询到,则一并读取Kx所在键值对中的目标状态值Vx,从而可以基于目标状态值Vx执行第一交易Tx1。如果在第一集合中查询不到Kx,则在第二集合中进行查询。若在第二集合中查询不到Kx,则可以断定,Kx是交易执行过程中产生的新变量key,从而确定,第一读集不准确。
通过以上过程可以看到,通过将第一读集涉及的变量批量读取并存入本地,在执行第一交易组过程中,在正常情况下,第一计算进程41可以在进程本地的存储空间获取到要读取的变量的状态值,而不必针对每个变量访问一次状态数据库,从而加速交易的执行。如果在本地存储空间查询不到要读取的变量的key,则可验证出,第一读集不准确,验证不通过。
在第一计算进程41执行各条交易的过程中,可以产生执行写集,其中包括,执行交易过程中写入变量的信息。第一计算进程41可以基于执行写集,对预执行产生的第一写集进行验证。
具体的,在步骤405,第一计算进程验证写集的key,即验证第一写集中key的指示信息与执行写集中key的指示信息是否一致。
在一个实施例中,第一写集具体包括,主节点在预执行阶段产生的若干第二变量的第二key的列表。相应的,在该步骤405中,第一计算进程可以获取执行写集中实际写入变量的第三key的列表,比对第二key的列表和第三key的列表是否一致。若二者不一致,则说明第一写集不准确。
在另一实施例中,为了节省网络传输,主节点并不会将预执行阶段产生的所有写入变量的key的完整列表发给从节点,而是在确定交易分组后(可以是自行分组,或者由从节点通知其分组方式),将一个交易组的写入变量的key整理成一棵默克尔树(MerkelTree),将对应的默克根group_write_key_root发送给从节点。
图5示出默克尔树的结构示意图。由图5可见,在默克儿树中,对于非叶子层的任一节点,其根据两个子节点的哈希值进行进一步哈希运算而得到。如此,任何一个叶子节点的节点值的变化,都会影响根节点的值。在基于写入变量的key生成的默克尔树中,以一组交易中写入变量的key作为叶子节点,逐层运算,得到默克尔根。
根据该实施例,第一交易组的第一读集中的写入变量信息可以是,基于预执行阶段产生的若干第二变量的第二key形成的第一默克尔根。相应地,第一计算进程41可以在执行第一交易组后,根据实际写入变量的第三key也形成一个默克尔树,得到第二默克尔根。在该步骤405中,判断第一默克尔根和第二默克尔根是否一致。如果不同,则说明实际执行时,写入变量的key与预执行时不同,第一读集可能不准确。
通过验证第一读集的key,和第一写集的key,理论上可以验证出主节点主动作恶导致的读写集不正确。但是区块链系统不仅要解决主动作恶(BFT问题),也需要解决系统不稳定下读写集是否正确的问题(CFT问题)。下面考虑一种系统不稳定导致的潜在风险情况。如本领域技术人员所知,在区块链的虚拟机中可对合约交易中不同的指令(例如加法指令、减法指令等)设置不同的使用费用,并在执行合约中的指令的过程中对区块链使用费用进行累计。该使用费用通常表示为gas。即使是在合约执行失败而回滚的情况下,仍然会对使用的费用gas_used进行累计。假定主节点执行某笔交易失败,而从节点在系统内存不足的情况下,也会出现在虚拟机中执行交易申请内存失败的问题。因为从节点申请内存失败在执行过程中是随机性出现的,那么有可能不同从节点执行合约指令数是不相同的,这样它们交易的gas_used的结果可能和主节点不同。但是,仍可能概率性的出现所有节点的gas_used相同,但实际上执行了不同的指令的情况(可能导致写入变量value不同)。在该情况下,由于从节点的gas_used都相同,不会影响状态数据的根,也不会对key产生影响。而步骤404和405,只能检测出交易分组正确,读写集的key正确,却无法检测出以上情况下的异常。
因此,在本说明书的一些实施例中,第一计算进程41除对写集的key进行验证之外,还如步骤406所示,验证写集的value。在此情况下,基于预执行产生的第一写集还需包括,写入的第二变量的状态值的指示信息。第一计算进程在执行第一交易组过程中产生的执行写集还包括,实际写入变量的状态值的指示信息。在该步骤406,第一计算进程41对上述两项指示信息进行比较,若二者不一致,确定存在验证异常。
在一个实施例中,上述第二变量的状态值与前述的第二key以键值对的形式包含在第一写集中。执行写集对应也可以包括,实际写入变量的第三key和实际写入状态值构成的键值对。在这样的情况下,该步骤406可以与前述步骤405一并执行。即,分别比较执行写集中的键值对与第一写集中的键值对。在该过程中,不仅对key进行比较验证,也对value(状态值)进行比较验证。
在另一实施例中,为了节省网络传输,主节点将一个交易组的写入变量的value整理成另一棵默克尔树(Merkel Tree),将对应的默克根group_write_value_root发送给从节点。根据该实施例,第一交易组的第一读集中的状态值的指示信息可以是,基于预执行阶段产生的若干第二变量的状态值形成的第三默克尔根。相应地,第一计算进程41可以在执行第一交易组后,根据实际写入变量的状态值也形成一个默克尔树,得到第四默克尔根。在该步骤406中,判断第三默克尔根和第四默克尔根是否一致。如果不同,则说明实际执行时,写入变量的value与预执行时不同,确定存在验证异常。
通过以上步骤404,405和406,可以对预执行读写集进行全面的验证。验证异常的出现,有可能是主节点作恶导致,或者,与并行执行相关的系统不稳定导致。为了增加稳定性,在一个实施例中,在上述任意一个验证步骤出现验证异常的情况下,将所有交易组转交给一个计算进程,由该计算进程进行串行执行,并重新校验预执行读写集。如此,进一步降低系统风险。
应当注意,尽管在上述实施例中,以特定顺序描述了本说明书实施例的方法的操作,但是,这并非要求或者暗示必须按照该特定顺序来执行这些操作,或是必须执行全部所示的操作才能实现期望的结果。相反,流程图中描绘的步骤可以改变执行顺序。附加地或备选地,可以省略某些步骤,将多个步骤合并为一个步骤执行,和/或将一个步骤分解为多个步骤执行。
与前述在区块链中进行验证的方法实施例相对应,本说明书还提供了在区块链系统进行验证的装置的实施例。
如图6所示,图6是本说明书根据一示例性实施例示出的一种验证装置的框图,该验证装置部署在区块链系统的从节点中,该区块链系统还包括主节点。如图所示,该验证装置600可以包括:
获取单元61,用于获取第一交易组对应的第一预执行读写集,所述第一预执行读写集根据所述主节点的预执行结果生成,其中包括第一读集;
批量读取单元62,用于从状态数据库中批量读取所述第一读集涉及的状态数据,将其存入第一存储区;
确定单元63,用于在执行所述第一交易组中的第一交易过程中,查询所述第一存储区,若在所述第一存储区无法查询到所述第一交易需要读取的目标变量,确定存在验证异常。
对于装置实施例而言,由于其基本对应于方法实施例,所以相关之处参见方法实施例的部分说明即可。以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本说明书一个或多个实施例方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。
本说明书一个或多个实施例还提供了一种计算机可读存储介质,该存储介质存储有计算机程序,计算机程序可用于执行上述图4实施例提供的在区块链中的验证方法。
本说明书一个或多个实施例还提供了一种计算设备,包括存储器和处理器,所述存储器中存储有可执行代码,所述处理器执行所述可执行代码时,实现上述图4实施例提供的在区块链中的验证方法。
在20世纪90年代,对于一个技术的改进可以很明显地区分是硬件上的改进(例如,对二极管、晶体管、开关等电路结构的改进)还是软件上的改进(对于方法流程的改进)。然而,随着技术的发展,当今的很多方法流程的改进已经可以视为硬件电路结构的直接改进。设计人员几乎都通过将改进的方法流程编程到硬件电路中来得到相应的硬件电路结构。因此,不能说一个方法流程的改进就不能用硬件实体模块来实现。例如,可编程逻辑器件(Programmable Logic Device,PLD)(例如现场可编程门阵列(Field Programmable GateArray,FPGA))就是这样一种集成电路,其逻辑功能由用户对器件编程来确定。由设计人员自行编程来把一个数字系统“集成”在一片PLD上,而不需要请芯片制造厂商来设计和制作专用的集成电路芯片。而且,如今,取代手工地制作集成电路芯片,这种编程也多半改用“逻辑编译器(logic compiler)”软件来实现,它与程序开发撰写时所用的软件编译器相类似,而要编译之前的原始代码也得用特定的编程语言来撰写,此称之为硬件描述语言(Hardware Description Language,HDL),而HDL也并非仅有一种,而是有许多种,如ABEL(Advanced Boolean Expression Language)、AHDL(Altera Hardware DescriptionLanguage)、Confluence、CUPL(Cornell University Programming Language)、HDCal、JHDL(Java Hardware Description Language)、Lava、Lola、MyHDL、PALASM、RHDL(RubyHardware Description Language)等,目前最普遍使用的是VHDL(Very-High-SpeedIntegrated Circuit Hardware Description Language)与Verilog。本领域技术人员也应该清楚,只需要将方法流程用上述几种硬件描述语言稍作逻辑编程并编程到集成电路中,就可以很容易得到实现该逻辑方法流程的硬件电路。
控制器可以按任何适当的方式实现,例如,控制器可以采取例如微处理器或处理器以及存储可由该(微)处理器执行的计算机可读程序代码(例如软件或固件)的计算机可读介质、逻辑门、开关、专用集成电路(Application Specific Integrated Circuit,ASIC)、可编程逻辑控制器和嵌入微控制器的形式,控制器的例子包括但不限于以下微控制器:ARC 625D、Atmel AT91SAM、Microchip PIC18F26K20以及Silicone Labs C8051F320,存储器控制器还可以被实现为存储器的控制逻辑的一部分。本领域技术人员也知道,除了以纯计算机可读程序代码方式实现控制器以外,完全可以通过将方法步骤进行逻辑编程来使得控制器以逻辑门、开关、专用集成电路、可编程逻辑控制器和嵌入微控制器等的形式来实现相同功能。因此这种控制器可以被认为是一种硬件部件,而对其内包括的用于实现各种功能的装置也可以视为硬件部件内的结构。或者甚至,可以将用于实现各种功能的装置视为既可以是实现方法的软件模块又可以是硬件部件内的结构。
上述实施例阐明的系统、装置、模块或单元,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。一种典型的实现设备为服务器系统。当然,本申请不排除随着未来计算机技术的发展,实现上述实施例功能的计算机例如可以为个人计算机、膝上型计算机、车载人机交互设备、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件设备、游戏控制台、平板计算机、可穿戴设备或者这些设备中的任何设备的组合。
虽然本说明书一个或多个实施例提供了如实施例或流程图所述的方法操作步骤,但基于常规或者无创造性的手段可以包括更多或者更少的操作步骤。实施例中列举的步骤顺序仅仅为众多步骤执行顺序中的一种方式,不代表唯一的执行顺序。在实际中的装置或终端产品执行时,可以按照实施例或者附图所示的方法顺序执行或者并行执行(例如并行处理器或者多线程处理的环境,甚至为分布式数据处理环境)。术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、产品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、产品或者设备所固有的要素。在没有更多限制的情况下,并不排除在包括所述要素的过程、方法、产品或者设备中还存在另外的相同或等同要素。例如若使用到第一,第二等词语用来表示名称,而并不表示任何特定的顺序。
为了描述的方便,描述以上装置时以功能分为各种模块分别描述。当然,在实施本说明书一个或多个时可以把各模块的功能在同一个或多个软件和/或硬件中实现,也可以将实现同一功能的模块由多个子模块或子单元的组合实现等。以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
本发明是参照根据本发明实施例的方法、装置(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
在一个典型的配置中,计算设备包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。内存是计算机可读介质的示例。
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储、石墨烯存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
本领域技术人员应明白,本说明书一个或多个实施例可提供为方法、系统或计算机程序产品。因此,本说明书一个或多个实施例可采用完全硬件实施例、完全软件实施例或结合软件和硬件方面的实施例的形式。而且,本说明书一个或多个实施例可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本说明书一个或多个实施例可以在由计算机执行的计算机可执行指令的一般上下文中描述,例如程序模块。一般地,程序模块包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等等。也可以在分布式计算环境中实践本本说明书一个或多个实施例,在这些分布式计算环境中,由通过通信网络而被连接的远程处理设备来执行任务。在分布式计算环境中,程序模块可以位于包括存储设备在内的本地和远程计算机存储介质中。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于系统实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。在本说明书的描述中,参考术语“一个实施例”、“一些实施例”、“示例”、“具体示例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本说明书的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不必须针对的是相同的实施例或示例。而且,描述的具体特征、结构、材料或者特点可以在任一个或多个实施例或示例中以合适的方式结合。此外,在不相互矛盾的情况下,本领域的技术人员可以将本说明书中描述的不同实施例或示例以及不同实施例或示例的特征进行结合和组合。
以上所述仅为本说明书一个或多个实施例的实施例而已,并不用于限制本本说明书一个或多个实施例。对于本领域技术人员来说,本说明书一个或多个实施例可以有各种更改和变化。凡在本说明书的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在权利要求范围之内。
Claims (14)
1.一种区块链系统中验证读写集的方法,所述区块链系统包括主节点和从节点,所述方法由所述从节点执行,包括:
获取第一交易组对应的第一预执行读写集,所述第一预执行读写集根据所述主节点的预执行结果生成,其中包括第一读集;
从状态数据库中批量读取所述第一读集涉及的状态数据,将其存入第一存储区;
在执行所述第一交易组中的第一交易过程中,查询所述第一存储区,若在所述第一存储区无法查询到所述第一交易需要读取的目标变量,确定存在验证异常。
2.根据权利要求1所述的方法,其中,所述第一交易组通过第一计算进程执行;所述第一存储区位于所述第一计算进程本地的存储空间。
3.根据权利要求1所述的方法,其中,所述第一读集包括若干第一变量的第一key;
从状态数据库中批量读取所述第一预执行读集涉及的状态数据,将其存入第一存储区,包括:
从状态数据库中读取各个第一key对应的第一变量的状态值,将读取结果存入所述第一存储区。
4.根据权利要求3所述的方法,其中,所述第一存储区包括第一集合和第二集合;
将读取结果存入所述第一存储区,包括:
对于任意一个第一key,若从状态数据库中读取到该第一key对应的目标状态值,将该第一key和目标状态值的键值对,存入第一集合;
若从状态数据库中读取不到该第一key对应的目标状态值,将该第一key存入第二集合。
5.根据权利要求4所述的方法,其中,查询所述第一存储区,包括:
在所述第一集合中查询所述目标变量的key;
若在所述第一集合中查询不到,则在所述第二集合中查询所述目标变量的key;
若在所述第二集合中查询不到,则确定在所述第一存储区无法查询到所述目标变量。
6.根据权利要求1所述的方法,其中,所述第一预执行读写集还包括第一写集,所述第一写集包括,若干第二变量的第二key的第一指示信息,所述方法还包括:
在执行所述第一交易组中的各个交易过程中,生成执行写集,所述执行写集包括,执行交易过程中写入变量的第三key的第二指示信息;
比较所述第一指示信息和所述第二指示信息,若二者不一致,确定存在验证异常。
7.根据权利要求6所述的方法,其中,所述第一指示信息包括第二key的列表;所述第二指示信息包括第三key的列表;
比较所述第一指示信息和所述第二指示信息,包括:比较第二key的列表和第三key的列表是否一致。
8.根据权利要求6所述的方法,其中,所述第一指示信息包括第二key形成的第一默克尔根;所述第二指示信息包括第三key形成的第二默克尔根;
比较所述第一指示信息和所述第二指示信息,包括:判断第一默克尔根和第二默克尔根是否一致。
9.根据权利要求6所述的方法,其中,所述第一写集还包括,所述第二变量的状态值的第三指示信息;所述执行写集还包括,所述写入变量的状态值的第四指示信息;所述方法还包括:
比较所述第三指示信息和所述第四指示信息,若二者不一致,确定存在验证异常。
10.根据权利要求9所述的方法,其中,所述第三指示信息包括所述第二变量的状态值形成的第三默克尔根;所述第四指示信息包括所述写入变量的状态值形成的第四默克尔根;
比较所述第三指示信息和所述第四指示信息,包括:判断第三默克尔根和第四默克尔根是否一致。
11.根据权利要求1或6或9所述的方法,还包括:
在确定存在验证异常的情况下,通过目标进程串行执行所述第一交易组所在区块的所有交易。
12.一种区块链系统中验证读写集的验证装置,部署在区块链系统的从节点中,所述区块链系统还包括主节点,所述验证装置包括:
获取单元,用于获取第一交易组对应的第一预执行读写集,所述第一预执行读写集根据所述主节点的预执行结果生成,其中包括第一读集;
批量读取单元,用于从状态数据库中批量读取所述第一读集涉及的状态数据,将其存入第一存储区;
确定单元,用于在执行所述第一交易组中的第一交易过程中,查询所述第一存储区,若在所述第一存储区无法查询到所述第一交易需要读取的目标变量,确定存在验证异常。
13.一种计算机可读存储介质,其上存储有计算机程序,当所述计算机程序在计算机中执行时,令所述计算机执行权利要求1-11中任一项所述的方法。
14.一种计算设备,包括存储器和处理器,所述存储器中存储有可执行代码,所述处理器执行所述可执行代码时,实现权利要求1-11中任一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211710092.3A CN116305311A (zh) | 2022-12-29 | 2022-12-29 | 区块链系统中验证读写集的方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211710092.3A CN116305311A (zh) | 2022-12-29 | 2022-12-29 | 区块链系统中验证读写集的方法和装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN116305311A true CN116305311A (zh) | 2023-06-23 |
Family
ID=86812037
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202211710092.3A Pending CN116305311A (zh) | 2022-12-29 | 2022-12-29 | 区块链系统中验证读写集的方法和装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN116305311A (zh) |
-
2022
- 2022-12-29 CN CN202211710092.3A patent/CN116305311A/zh active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109949157B (zh) | 一种业务数据的上链方法、装置及系统 | |
CN114827165B (zh) | 对多个交易进行分组的方法和区块链节点 | |
CN114710507B (zh) | 一种共识方法、区块链节点、介质和共识节点 | |
CN115098594A (zh) | 在区块链系统中执行交易的方法、区块链系统和节点 | |
CN113743950A (zh) | 在区块链中执行交易的方法、区块链节点和区块链 | |
CN114942847A (zh) | 执行交易的方法和区块链节点 | |
WO2023231335A1 (zh) | 在区块链中执行交易的方法及区块链的主节点 | |
CN114971827A (zh) | 一种基于区块链的对账方法、装置、电子设备及存储介质 | |
CN114936256A (zh) | 在区块链中执行交易的方法和区块链节点 | |
WO2023231337A1 (zh) | 在区块链中执行交易的方法、区块链的主节点和从节点 | |
CN116366666A (zh) | 区块链系统中的链状态更新方法和区块链节点 | |
CN114785800B (zh) | 跨链通信方法、装置、存储介质及计算设备 | |
CN115150409A (zh) | 在区块链系统中执行交易的方法、区块链系统和节点 | |
CN116305311A (zh) | 区块链系统中验证读写集的方法和装置 | |
CN114782016A (zh) | 基于智能合约的债权数据处理方法、装置及区块链系统 | |
CN115865365B (zh) | 基于区块链的分账处理方法、装置及系统 | |
CN117893315A (zh) | 区块链中交易执行证明的生成和验证方法及装置 | |
CN114697344B (zh) | 区块链系统中共识节点的确定方法、区块链系统、节点、存储介质及计算设备 | |
CN114862380B (zh) | 额度共享处理方法及装置 | |
CN116668001A (zh) | 区块链中的交易处理方法和区块链节点 | |
CN116668002A (zh) | 区块链系统中的交易分发方法、区块链节点和区块链系统 | |
CN116186763A (zh) | 在区块链系统中处理区块数据的方法和装置 | |
CN116455728A (zh) | 状态数据软件版本切换方法、区块链节点和区块链系统 | |
CN115114334A (zh) | 在区块链中查询数据的方法及装置 | |
CN115760386A (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 |