CN114936256A - 在区块链中执行交易的方法和区块链节点 - Google Patents
在区块链中执行交易的方法和区块链节点 Download PDFInfo
- Publication number
- CN114936256A CN114936256A CN202210602794.3A CN202210602794A CN114936256A CN 114936256 A CN114936256 A CN 114936256A CN 202210602794 A CN202210602794 A CN 202210602794A CN 114936256 A CN114936256 A CN 114936256A
- Authority
- CN
- China
- Prior art keywords
- transaction
- execution
- state
- variable
- transactions
- 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
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/27—Replication, distribution or synchronisation of data between databases or within a distributed database system; Distributed database system architectures therefor
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/07—Responding to the occurrence of a fault, e.g. fault tolerance
- G06F11/14—Error detection or correction of the data by redundancy in operation
- G06F11/1402—Saving, restoring, recovering or retrying
- G06F11/1474—Saving, restoring, recovering or retrying in transactions
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F12/00—Accessing, addressing or allocating within memory systems or architectures
- G06F12/02—Addressing or allocation; Relocation
- G06F12/08—Addressing or allocation; Relocation in hierarchically structured memory systems, e.g. virtual memory systems
- G06F12/0802—Addressing of a memory level in which the access to the desired data or data block requires associative addressing means, e.g. caches
- G06F12/0862—Addressing of a memory level in which the access to the desired data or data block requires associative addressing means, e.g. caches with prefetch
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/23—Updating
- G06F16/2365—Ensuring data consistency and integrity
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/23—Updating
- G06F16/2379—Updates performed during online database operations; commit processing
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/24—Querying
- G06F16/245—Query processing
- G06F16/2455—Query execution
- G06F16/24552—Database cache management
-
- 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/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5011—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals
- G06F9/5016—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals the resource being the memory
-
- 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/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5027—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resource being a machine, e.g. CPUs, Servers, Terminals
- G06F9/5038—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resource being a machine, e.g. CPUs, Servers, Terminals considering the execution order of a plurality of tasks, e.g. taking priority or time dependency constraints into consideration
-
- 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/08—Payment architectures
- G06Q20/10—Payment architectures specially adapted for electronic funds transfer [EFT] systems; specially adapted for home banking systems
- G06Q20/102—Bill distribution or payments
-
- 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/22—Payment schemes or models
- G06Q20/223—Payment schemes or models based on the use of peer-to-peer networks
-
- 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/3825—Use of electronic signatures
-
- 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/40—Authorisation, e.g. identification of payer or payee, verification of customer or shop credentials; Review and approval of payers, e.g. check credit lines or negative lists
- G06Q20/401—Transaction verification
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2201/00—Indexing scheme relating to error detection, to error correction, and to monitoring
- G06F2201/80—Database-specific techniques
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2212/00—Indexing scheme relating to accessing, addressing or allocation within memory systems or architectures
- G06F2212/10—Providing a specific technical effect
- G06F2212/1016—Performance improvement
- G06F2212/1024—Latency reduction
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2212/00—Indexing scheme relating to accessing, addressing or allocation within memory systems or architectures
- G06F2212/16—General purpose computing application
- G06F2212/163—Server or database system
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Business, Economics & Management (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Accounting & Taxation (AREA)
- General Engineering & Computer Science (AREA)
- Databases & Information Systems (AREA)
- Finance (AREA)
- General Business, Economics & Management (AREA)
- Data Mining & Analysis (AREA)
- Strategic Management (AREA)
- Software Systems (AREA)
- Computer Security & Cryptography (AREA)
- Computing Systems (AREA)
- Quality & Reliability (AREA)
- Development Economics (AREA)
- Economics (AREA)
- Computational Linguistics (AREA)
- Management, Administration, Business Operations System, And Electronic Commerce (AREA)
- Retry When Errors Occur (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
一种在区块链中执行交易的方法和区块链节点,所述方法由区块链中的第一节点执行,所述方法包括:在执行交易时,创建与所述交易对应的第一状态集和第二状态集;在根据所述交易对第一变量进行写入之前,读取所述第一变量的第一状态,所述第一状态为所述第一变量的当前状态,在所述第一状态集中存储所述第一变量的所述第一状态;在所述第二状态集中存储所述第一变量的第二状态,所述第二状态为根据所述交易写入的所述第一变量的状态;在确定所述交易的对所述第一变量的写入操作需要回滚时,至少根据所述第一状态集生成所述交易的写集。
Description
技术领域
本说明书实施例属于区块链技术领域,尤其涉及一种在区块链中执行交易的方法和区块链节点。
背景技术
区块链(Blockchain)是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。区块链系统中按照时间顺序将数据区块以顺序相连的方式组合成链式数据结构,并以密码学方式保证的不可篡改和不可伪造的分布式账本。由于区块链具有去中心化、信息不可篡改、自治性等特性,区块链也受到人们越来越多的重视和应用。
发明内容
本发明的目的在于提供一种在区块链中执行交易的方法,以用于在交易的执行回滚时有效地更改交易的读写集。
本说明书第一方面提供一种在区块链中执行交易的方法,所述方法由区块链中的第一节点执行,所述方法包括:
在执行交易时,创建与所述交易对应的第一状态集和第二状态集;
在根据所述交易对第一变量进行写入之前,读取所述第一变量的第一状态,所述第一状态为所述第一变量的当前状态,在所述第一状态集中存储所述第一变量的所述第一状态;
在所述第二状态集中存储所述第一变量的第二状态,所述第二状态为根据所述交易写入的所述第一变量的状态;
在确定所述交易的对所述第一变量的写入操作需要回滚时,至少根据所述第一状态集生成所述交易的写集。
本说明书第二方面提供一种在区块链中执行交易的方法,所述区块链包括第一节点和第二节点,所述第一节点中运行有预执行进程、缓存进程和第一共识进程,所述方法由所述第一节点执行,所述方法包括:
所述缓存进程将接收的交易发送给所述预执行进程;
所述预执行进程在预执行所述交易时,生成所述交易的预执行读集,在所述预执行进程的内存中创建与所述交易对应的第一状态集和第二状态集;在根据所述交易对第一变量进行写入之前,读取所述第一变量的第一状态,所述第一状态为所述第一变量的当前状态,在所述第一状态集中存储所述第一变量的所述第一状态;在所述第二状态集中存储所述第一变量的第二状态,所述第二状态为根据所述交易写入的所述第一变量的状态;在确定所述交易的对所述第一变量的写入操作需要回滚时,至少根据所述第一状态集生成所述交易的预执行写集;
所述预执行进程在预执行多个交易之后,将所述多个交易的预执行读集、预执行写集和预执行顺序发送给所述缓存进程;
所述共识进程从所述缓存进程接收所述多个交易的预执行读集、预执行写集和预执行顺序,生成共识提议,所述共识提议中包括所述多个交易的预执行读集、预执行写集和预执行顺序,将所述共识提议发送给所述第二节点。
本说明书第三方面提供一种在区块链中执行交易的方法,所述区块链包括第一节点和第二节点,所述第二节点中运行有第二共识进程、区块管理进程和N个计算进程,所述方法包括:
所述第二共识进程从所述第一节点接收共识提议,所述共识提议中包括多个交易的预执行读写集和预执行顺序,将所述多个交易的预执行读写集和预执行顺序发送给所述区块管理进程;
所述区块管理进程根据所述预执行读写集和所述预执行顺序对所述多个交易进行分组,得到多个交易组,将所述多个交易组的信息分配给所述N个计算进程;
所述N个计算进程在并行执行所述多个交易组的交易时,对于交易组中的每个交易,生成所述交易的执行读集,创建与所述交易对应的第三状态集和第四状态集;在根据所述交易对第一变量进行写入之前,读取所述第一变量的第三状态,所述第三状态为所述第一变量的当前状态,在所述第三状态集中存储所述第一变量的所述第三状态;在所述第四状态集中存储所述第一变量的第四状态,所述第四状态为根据所述交易写入的所述第一变量的状态;在确定所述交易的对所述第一变量的写入操作需要回滚时,至少根据所述第三状态集生成所述交易的执行写集;比较所述多个交易的执行读写集与所述多个交易的预执行读写集是否一致,在一致的情况中确认所述执行读写集正确,所述执行读写集包括所述执行读集和所述执行写集。
本说明书第四方面提供一种区块链中的第一节点,包括:
创建单元,用于在执行交易时,创建与所述交易对应的第一状态集和第二状态集;
第一存储单元,用于在根据所述交易对第一变量进行写入之前,读取所述第一变量的第一状态,所述第一状态为所述第一变量的当前状态,在所述第一状态集中存储所述第一变量的所述第一状态;
第二存储单元,用于在所述第二状态集中存储所述第一变量的第二状态,所述第二状态为根据所述交易写入的所述第一变量的状态;
生成单元,用于在确定所述交易的对所述第一变量的写入操作需要回滚时,至少根据所述第一状态集生成所述交易的写集。
本说明书第五方面提供一种区块链中的第二节点,包括:
接收单元,用于从所述区块链中的第一节点接收多个交易的预执行读写集和预执行顺序;
分组单元,用于根据所述预执行读写集和所述预执行顺序对所述多个交易进行分组,得到多个交易组;
第一生成单元,用于在并行执行所述多个交易组的交易时,对于交易组中的每个交易,生成所述交易的执行读集,创建与所述交易对应的第三状态集和第四状态集;
第一存储单元,用于在根据所述交易对第一变量进行写入之前,读取所述第一变量的第三状态,所述第三状态为所述第一变量的当前状态,在所述第三状态集中存储所述第一变量的所述第三状态;
第二存储单元,用于在所述第四状态集中存储所述第一变量的第四状态,所述第四状态为根据所述交易写入的所述第一变量的状态;
第二生成单元,用于在确定所述交易的对所述第一变量的写入操作需要回滚时,至少根据所述第三状态集生成所述交易的执行写集;
比较单元,用于比较所述多个交易的执行读写集与所述多个交易的预执行读写集是否一致,以确定所述多个交易的执行读写集是否正确,所述执行读写集包括所述执行读集和所述执行写集。
本说明书第六方面提供一种计算机可读存储介质,其上存储有计算机程序,当所述计算机程序在计算机中执行时,令计算机执行第一方面至第三方面所述的方法。
本说明书第七方面提供一种计算设备,包括存储器和处理器,所述存储器中存储有可执行代码,所述处理器执行所述可执行代码时,实现第一方面至第三方面所述的方法。
附图说明
为了更清楚地说明本说明书实施例的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本说明书中记载的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1示出本说明书实施例所应用的区块链架构图;
图2为本说明书实施例中的区块链节点的架构图;
图3为本说明书实施例中的在区块链中执行交易的方法流程图;
图4为本说明书一实施例中主节点中的结构示意图;
图5为本说明书另一实施例中主节点中的结构示意图;
图6为本说明书实施例中的在区块链中执行交易的方法流程图;
图7为本说明书实施例中的在区块链中执行交易的方法流程图;
图8为本说明书一实施例中的一种区块链中的第一节点的结构图;
图9为本说明书一实施例中的一种区块链中的第二节点的结构图。
具体实施方式
为了使本技术领域的人员更好地理解本说明书中的技术方案,下面将结合本说明书实施例中的附图,对本说明书实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本说明书一部分实施例,而不是全部的实施例。基于本说明书中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都应当属于本说明书保护的范围。
图1示出本说明书实施例所应用的区块链架构图。如图1中,区块链中例如包含主节点1、从节点2~从节点5共6个节点。节点之间的连线示意性的表示P2P(Peer to Peer,点对点)连接。这些节点上都存储全量的账本,即存储全部区块和全部账户的状态。其中,区块链中的每个节点通过执行相同的交易而产生区块链中的相同的状态,区块链中的每个节点存储相同的状态数据库。所不同的是,主节点1可负责从客户端接收交易,并向各个从节点发起共识提议,该共识提议中例如包括将要成块的区块(例如区块B1)中的多个交易及该多个交易的排列顺序等信息。在区块链中的节点对共识提议共识成功之后,各个节点可根据共识提议中的排列顺序执行该多个交易,从而生成区块B1。
可以理解,图1所示的区块链仅仅是示例性的,本说明书实施例不限于应用于图1所示的区块链,例如还可以应用于非主从结构的区块链系统中。
另外,图1中虽然示出了区块链中包括6个节点,本说明书实施例不限于此,而是可以包括其他数目的节点。具体是,区块链中包含的节点可以满足拜占庭容错(ByzantineFault Tolerance,BFT)要求。所述的拜占庭容错要求可以理解为在区块链内部可以存在拜占庭节点,而区块链对外不体现拜占庭行为。一般的,一些拜占庭容错算法中要求节点个数大于3f+1,f为拜占庭节点个数,例如实用拜占庭容错算法PBFT(Practical ByzantineFault Tolerance)。
区块链领域中的交易可以指在区块链中执行并记录在区块链中的任务单元。交易中通常包括发送字段(From)、接收字段(To)和数据字段(Data)。区块链中的交易可包括平台交易和合约交易。平台交易主要围绕着平台账号操作,包括创建账号、转账、冻结账号、解冻账号、发行资产、存证等。合约交易主要围绕着合约执行操作,包括部署合约、调用合约、升级合约等。
例如,在交易为转账交易的情况中,From字段表示发起该交易(即发起对另一个账户的转账任务)的账户地址,To字段表示接收该交易(即接收转账)的账户地址,Data字段中包括转账金额。在交易为调用合约的交易的情况中,From字段表示发起该交易的账户地址,To字段表示交易所调用的合约的账户地址,Data字段中包括调用合约中的函数名、及对该函数的传入参数等数据,以用于在交易执行时从区块链中获取该函数的代码并执行该函数的代码。
其中,区块链中的账户通常可以分为两种类型:
合约账户(contract account):存储执行的智能合约代码以及智能合约代码中状态的值,通常只能通过外部账户调用激活;
外部账户(Externally owned account):区块链用户的账户。
区块链中的智能合约是在区块链系统上可以被交易触发执行的合约。智能合约可以通过代码的形式定义。在区块链中调用智能合约,是发起一笔指向智能合约地址的交易,使得区块链中每个节点分布式地运行智能合约代码。需要说明的是,除了可以由用户创建智能合约,也可以在创世块中由系统设置智能合约。这类合约一般称为创世合约。一般的,创世合约中可以设置一些区块链的数据结构、参数、属性和方法。此外,具有系统管理员权限的账户可以创建系统级的合约,或者修改系统级的合约(简称为系统合约)。其中,所述系统合约可用于在区块链中增加不同业务的数据的数据结构。
在部署合约的场景中,例如,Bob将一个包含创建智能合约信息(即部署合约)的交易发送到如图1所示的区块链中,该交易的data字段包括待创建的合约的代码(如字节码或者机器码),交易的to字段为空,以表示该交易用于部署合约。节点间通过共识机制达成一致后,确定合约的合约地址“0x6f8ae93…”,各个节点在状态数据库中添加与该智能合约的合约地址对应的合约账户,分配与该合约账户对应的状态存储,并将合约代码保存在该合约的状态存储中,从而合约创建成功。
在调用合约的场景中,例如,Bob将一个用于调用智能合约的交易发送到如图1所示的区块链中,该交易的from字段是交易发起方(即Bob)的账户的地址,to字段中的“0x6f8ae93…”代表了被调用的智能合约的地址,交易的data字段包括调用智能合约的方法和参数。在区块链中对该交易进行共识之后,区块链中的各个节点可分别执行该交易,从而分别执行该合约,基于该合约的执行更新状态数据库。
在相关技术中,为了提高区块链中的每秒执行交易(TPS)指标,需要加快交易的执行速度。为此,区块链节点中可通过并行执行交易来加快交易的执行速度。通常,对于转账交易,区块链节点首先根据交易访问的账户将多个交易划分为多个交易组,各个交易组之间不访问相同的账户,从而可并行执行各个交易组。然而,当交易中调用智能合约时,在执行该交易之前不能预知该交易中访问的变量,从而无法对多个交易进行有效的分组,也就无法并行执行交易。在一种实施方式中,可由区块链中的第一节点(例如图1中的主节点1)对多个交易进行预执行,得到各个交易的预执行读写集,并通过与其他节点之间的共识过程将该预执行读写集发送给区块链中的其他节点(例如图1中的从节点)。交易的预执行读写集中例如包括预执行读集和预执行写集,所述预执行读集包括该交易在预执行中读取的变量的键值对,所述预执行写集包括该交易在预执行中写入的变量的键值对。所述变量例如包括区块链中的外部账户、或者为合约账户中定义的变量。区块链中的其他节点可根据多个交易的预执行读写集对多个交易进行分组,从而可根据分组结果并行执行该多个交易。
区块链中的节点在预执行交易时,有可能包括交易预执行失败或者交易中调用的合约预执行失败的情况,需要有效地更改该交易的预执行读写集。
图2为本说明书实施例中的区块链节点的架构图。如图2所示,图1所示区块链中的主节点1和各个从节点(例如图2中示出的从节点2)中均可运行多个进程以提供多种服务。具体是,主节点1中可包括用于提供缓存服务的缓存进程12、用于提供预执行服务的预执行进程111和预执行进程112、用于提供共识服务的共识进程13、用于提供区块管理服务的区块管理进程14等。所述预执行进程111和预执行进程112用于并行进行对主节点接收的交易的预执行。可以理解,本说明书实施例中,主节点1中不限于包括两个预执行进程,而是可包括一个预执行进程或者三个以上的预执行进程。此外,主节点1中还可以包括用于提供接入服务的接入进程、用于提供网络服务的网络进程、用于提供存储服务的存储进程等,图2中未示出。
从节点2中可包括用于提供缓存服务的缓存进程21、用于提供共识服务的共识进程22、用于提供区块管理服务的区块管理进程23、用于提供交易执行服务的计算进程241和计算进程242等。所述计算进程241和计算进程242用于并行进行对共识提议中的交易的执行。可以理解,本说明书实施例中,从节点2中不限于包括两个计算进程,而是可包括一个计算进程或者三个以上的计算进程。
其中进程是应用中具有一定独立功能的程序关于一个数据集合的一次运行活动,即进程是计算机中通过由CPU顺序执行应用程序中的指令而进行的一个过程。每个进程在创建时被分配自己的内存地址空间,该内存地址空间只能被进程自身访问。例如,预执行进程111被分配了内存113,预执行进程112被分配了内存114,缓存进程12被分配了内存120,缓存进程21被分配了内存210,计算进程241被分配了内存243,计算进程242被分配了内存244。
其中,主节点1中的多个进程可以为多个计算设备(或虚拟计算节点)中的多个进程,也可以为单个计算设备中的多个进程。类似地,各个从节点中的多个进程可以为多个计算设备(或虚拟计算节点)中的多个进程,也可以为单个计算设备中的多个进程。此外需要说明的是本说明书实施例提供的方案并不局限于主从架构的区块链系统。
图3为本说明书实施例中的在区块链中执行交易的方法流程图。该方法可由图1中的主节点1和各个从节点执行,图3中示出从节点2作为示例。
如图3所示,首先,在步骤S301,主节点1在预执行交易时,生成交易的预执行读集,创建交易的状态集Si0和状态集Si1,其中i对应于交易的交易编号,例如交易Tx1对应于状态集为S10和状态集S11。
该步骤可由图2中的预执行进程进行,在主节点1中包括一个预执行进程的情况中,该预执行进程可串行预执行接收的多个交易,在主节点1中包括多个预执行进程的情况中,该多个预执行进程可并行预执行接收的多个交易。其中,多个预执行进程并行执行交易的情况将在下文参考图6详细描述。
具体是,主节点1例如可不断从用户设备接收交易,并将接收的交易顺序存储到交易队列中。主节点1在接收到交易之后,可将该交易广播到区块链中,从而使得各个从节点也可以接收到该交易,并存储该交易。主节点1可定时从交易队列中获取多个交易串行地进行预执行。如上文所述,所述交易可以为平台交易或者合约交易。可以理解,主节点1中也可以并行地预执行多个交易,对此不作限制。
图4为本说明书一实施例中主节点1中的结构示意图。如图4所示,主节点1在预执行任一平台交易Txi时,在执行对变量(即外部账户)的写操作之前,生成状态集Si0和状态集Si 1,以基于状态集Si0和/或状态集Si1生成预执行写集,其中i对应于交易编号。具体是,状态集Si0和状态集Si1用于存储交易Txi中的写入操作涉及的外部账户的键值对。
另外,主节点1在预执行任一平台交易时,生成该交易的预执行读集,从而可得到该交易的预执行读写集,该预执行读写集中包括交易的预执行读集和预执行写集。
其中,图3所示的步骤S301~步骤S307可以由图2中的预执行进程111执行。例如,预执行进程111在预执行任一平台交易Txi时,可生成状态集Si0和状态集Si1,并将状态集Si0和状态集Si1存储到内存113中。
例如,所述多个交易中包括交易Tx1,交易Tx1为平台交易,其例如为由账户A发送,用于从账户A向账户B转账10元,其中,账户A和账户B都为区块链中的外部账户。主节点1在预执行交易Tx1时,为了进行从账户A至账户B的转账,首先,读取账户A的当前账户余额和账户B的当前账户余额。主节点1可确定内存中是否存储有账户A的余额和账户B的余额。在确定内存中没有账户A和/或账户B的余额时,主节点1可从状态数据库中读取账户A和/或账户B的余额,并将账户A和/或账户B的余额存储到内存中。在确定内存中存储有账户A和/或账户B的余额时,可从内存读取账户A和/或账户B的余额。主节点1在读取账户A和/或账户B的余额之后,生成交易Tx1的预执行读集,在预执行读集中记录账户A和账户B的键值对(key-value)。以账户A的键值对为例,其中key例如为账户A的账户地址,value为账户A的余额,例如,读取账户A的余额为50,则在交易Tx1的预执行读集中记录:账户A:50。
主节点1在内存中存储了账户A和账户B的余额之后,后续在交易的预执行过程中对账户A和/或账户B的余额进行更新时,直接内存中进行更新,并且,主节点1信任其自身的预执行结果,在预执行完多个交易之后,会基于该多个交易的预执行结果更新状态数据库中的状态,即将状态数据库中部分变量的状态更新为与内存中存储的该部分变量的状态一致。因此,主节点1在预执行多个交易的过程中在内存中存储的变量(例如账户或者合约变量)的状态就是主节点1中的该变量的最新世界状态。
主节点1在预执行交易Tx1的过程中在首次执行写操作之前,可创建交易Tx1的状态集S10和状态集S11。其中,状态集S10用于记录交易Tx1中的状态待更新(即待写入)的各个账户在状态更新之前的状态,以用于在交易Tx1预执行失败时进行回滚。状态集S11用于记录交易Tx1在预执行过程中写入的各个账户的最新世界状态。
另外,主节点1在预执行任一平台交易时,生成该交易的预执行读集,从而可得到该交易的预执行读写集。
图5为本说明书另一实施例中主节点1中的结构示意图。如图5所示,主节点1在预执行任一合约交易Txi时,假设该合约交易Txi中调用合约C1,合约C1中调用合约C2,从而主节点1在执行对变量(即外部账户或合约变量)的写操作之前,生成状态集Si0C1、Si0C2和状态集Si1,以基于状态集Si0C1、Si0C2和/或状态集Si1生成预执行写集,其中i对应于交易编号。具体是,状态集Si0C1、Si0C2和状态集Si1中可各自包括账户状态集和合约变量状态集,其中,账户状态集可用于更新世界状态树中的状态数据,合约变量状态集可用于更新合约状态树中的状态数据。
例如,所述多个交易中还包括交易Tx2,交易Tx2例如由外部账户C发送,交易Tx2例如调用合约C1,合约C1中例如还调用合约C2。主节点1在预执行交易Tx2时,在读取任一变量的状态时,在交易Tx2的预执行读集中记录该变量的键值对,该变量可以为区块链中的外部账户或者合约中定义的合约变量。主节点1在执行合约C1的过程中首次对变量写入之前,可生成与合约C1对应的状态集S20C1和与交易Tx2对应的状态集S21,其中,状态集S20C1用于记录合约C1的预执行过程中的状态待更新的各个变量在状态更新之前的状态,以用于在合约C1预执行失败时进行回滚。状态集S21用于记录交易Tx2在预执行过程中写入的各个变量的最新世界状态。主节点在执行合约C2的过程中首次对变量写入之前,可生成与合约C2对应的状态集S20C2,状态集S20C2用于记录合约C2的预执行过程中的状态待更新的各个变量在状态更新之前的状态,以用于在合约C2预执行失败时进行回滚。
在步骤S303,主节点1在根据交易对变量写入之前,读取变量的世界状态Vi1,将变量的状态Vi1存储到状态集Si0中,状态Vi1为变量的当前世界状态。
对于上述交易Tx1,主节点1可根据交易Tx1确定在转账之后账户A的余额为50-10=40,因此,主节点1可进行对账户A的写操作,以将账户A的世界状态更新为40。主节点1在对账户A进行写入之前,首先读取账户A的状态V11。主节点1可首先在主节点1的内存中存储的变量的最新世界状态中确定是否有账户A的状态,如果有的话,可从内存中直接读取账户A的状态V11,例如V11=50。在内存中未存储有账户A的状态的情况中,主节点1可从状态数据库中读取账户A的状态V11。主节点1在读取到账户A的状态V11之后,在状态集S10中存储账户A的键值对“账户A:V11”。
对于上述交易Tx2,假设合约C1中包括对变量a的写入操作,合约C2包括对变量b的写入操作。主节点1在执行合约C1的过程中将要对变量a进行写入时,读取变量a的世界状态V21a,将变量a的键值对“a:V21a”存储到状态集S20C1中,在执行合约C2的过程中将要对变量b进行写入时,读取变量b的世界状态V21b,将变量b的键值对“b:V21b”存储到状态集S20C2中。
在步骤S305,主节点1在状态集Si1中存储变量的写入状态Vi2。
具体是,对于上述交易Tx1,如上文所述,主节点1确定将对账户A写入状态40,因此,主节点1在状态集S11中存储账户A的键值对“账户A:40”。
对于上述交易Tx2,主节点1在执行合约C1时,将变量a的键值对“a:V22a”存储到状态集S21中,在执行合约C2时,将变量b的键值对“b:V22b”存储到状态集S21中。其中,V22a为在执行合约C1时对变量a写入的值,V22b为在执行合约C2时对变量b写入的值。
在步骤S307,主节点1在写入操作回滚时,至少根据状态集Si0生成交易的预执行写集。
具体是,对于交易Tx1,假设主节点1在将要对账户B进行写入时确定账户B不存在,或者确定账户B的余额在写入之后将超过预设的余额上限,在该情况下主节点1确定交易Tx1执行失败,需要对交易Tx1的全部操作进行回滚。具体是,参考图4,主节点1根据状态集S10生成交易Tx1的预执行写集,由于状态集S10中记录的账户A的状态与账户A的当前世界状态(即经回滚的世界状态)一致,因此可得出交易Tx1的预执行写集当前不包括变量的键值对。在一些实施方式中,主节点1在预执行交易Tx1时,由于交易Tx1为平台交易,主节点1可根据交易Tx1的数据量确定账户A的用户使用区块链处理交易Tx1的区块链使用费用(例如m元),并在交易Tx1的预执行写集中记录对账户A的余额扣除m之后的账户A的状态、以及对账户D增加m之后的账户D的状态,其中账户D为用于从区块链中的外部账户收取区块链的使用费用的系统账户。
对于交易Tx2,假设主节点1在执行合约C2的过程中确定合约C2执行失败,因此需要对合约C2的执行进行回滚。其中,在实际执行交易中的智能合约时,以下任一种情况都可能引起合约执行失败:用于执行交易的资源(GAS)余额不足、合约中存在非法指令、对存储单元的读写失败、虚拟机堆栈溢出、虚拟机内存溢出、转账失败、对合约的读取失败等等。
具体是,参考图5,主节点1根据状态集S20C2和状态集S21生成交易Tx2的预执行写集,由于状态集S20C2中记录的变量b的状态与变量b的当前世界状态(即经回滚的世界状态)一致,因此可得出交易Tx2的预执行写集当前不包括变量b的键值对,而只包括状态集S21中未回滚的变量a的键值对。在一些实施方式中,主节点1在预执行交易Tx2时,由于交易Tx2为合约交易,主节点1可根据交易Tx2调用合约的代码确定用户使用区块链处理交易Tx2的区块链使用费用(例如n元),并在交易Tx2的预执行写集中记录对账户C的余额扣除n之后的账户C的状态、以及对账户D增加n之后的账户D的状态。其中,在区块链的虚拟机中可对合约中不同的指令(例如加法指令、减法指令等)设置不同的使用费用,并在执行合约中的指令的过程中对区块链使用费用进行累计。在例如对合约C2的执行进行回滚的过程中,并不回滚在执行合约C2的过程中累计的区块链使用费用。
在另一种情况中,对于交易Tx2,假设主节点1在成功执行合约C2之后返回执行合约C1的过程中确定合约C1执行失败,因此需要对合约C1和合约C2的执行都进行回滚。具体是,主节点1根据状态集S20C1和状态集S20C2生成交易Tx2的预执行写集,即,主节点1可根据状态集S20C1和状态集S20C2确定状态集S20C1和状态集S20C2中记录的变量a的值和变量b的值与其当前世界状态一致,因此,在预执行写集中不需要包括变量a和变量b的键值对。类似地,在该预执行写集可包括账户C和账户D的键值对,所述账户C和账户D的键值对基于由虚拟机在执行合约C1和合约C2过程中累计的区块链使用费用确定。
主节点1在完成对交易的预执行之后,可基于该交易的预执行写集在内存中更新预执行写集中的变量的世界状态,以使得后续涉及该变量的交易在预执行时可从内存中读取该变量的世界状态。
在步骤S309,主节点1将多个交易的预执行读写集和预执行顺序发送给从节点2。
主节点1中的预执行进程在如上所述预执行多个交易,得到多个交易中各个交易的预执行读写集之后,可将多个交易的预执行读写集及预执行顺序发送给缓存进程12以存储到内存120中,从而共识进程13可从缓存进程12获取多个交易的预执行读写集及预执行顺序,并生成共识提议以发起共识,该共识提议中例如包括多个交易各自的预执行读写集和该多个交易的预执行顺序,其中,共识提议中的各个交易例如以该交易的哈希值作为交易标识。其中,主节点1在完成对每个交易的预执行之后,可将该交易的标识顺序存储到交易队列中,以用于指示该交易的预执行顺序。
共识进程13在生成共识提议之后,可将该共识提议发送给区块管理进程14,从而区块管理进程14可基于该共识提议更新状态数据块,并生成区块存储到区块数据库中。
主节点1在生成共识提议之后,将共识提议发送给其他从节点,以使得区块链中的各个节点基于共识机制对该共识提议进行共识。
所述共识机制是区块链节点就区块信息(或称区块数据)达成全网一致共识的机制,可以保证最新区块被准确添加至区块链。当前主流的共识机制包括:工作量证明(Proofof Work,POW)、股权证明(Proof of Stake,POS)、委任权益证明(Delegated Proof ofStake,DPOS)、实用拜占庭容错(Practical Byzantine Fault Tolerance,PBFT)算法等。
在一种实施方式中,主节点1在得到多个交易的预执行读写集之后,可对该多个预执行读写集进行噪点分析,以提高交易执行效率。具体是,例如,主节点1在确定所述多个交易仅包括对例如变量c的读取操作,不包括对变量c的写操作时,可删除所述多个交易的预执行读集中的变量c的键值对。由于多个交易中不包括对变量c的写操作,因此,在预执行多个交易的过程中,变量c的世界状态不发生变化,因此,对变量c进行读取的一个或多个交易不存在对变量c的访问冲突,通过删除所述多个交易的预执行读集中的变量c的键值对,可避免将对变量c进行读取的多个交易分到同一个组中。
在另一个实例中,所述多个交易中包括多个第一交易,所述第一交易用于对区块链中的第一账户转入预设金额,所述金额为正金额,从而,所述主节点1可删除所述多个第一交易的预执行读写集中的所述第一账户的键值对。例如,多个交易中的每个交易都需要向上述账户D转账,以对区块链使用费用进行交费。这种情况下,每笔交易都会因为账户D关联在一起,影响交易的分组。因此,通过从多个交易的读写集中删除账户D的键值对,有助于更有效地并行执行交易。
在步骤S311,从节点2在接收到多个交易的预执行读写集和预执行顺序之后,根据多个交易的预执行读写集对多个交易进行分组,根据分组结果并行执行多个交易。
从节点2在接收到共识提议之后,可由从节点2中的区块管理进程23根据共识提议中的预执行读写集对该多个交易进行分组,使得每两个分组中的全部交易不会访问相同的变量,从而使得各个分组可以并行执行,每个组中的多个交易按照其预执行顺序进行排列。区块管理进程23在进行对多个交易的分组之后,可将得到的多个交易组均匀分配给从节点2中的各个计算进程。在从节点2中的共识进程22与其他节点完成对共识提议的共识之后,从节点2中的各个计算进程可根据共识提议中各个交易的哈希值从所接收的交易中获取共识提议中提议的多个交易,根据分组结果并行执行该多个交易,以并行执行各个分组中的交易。
可以理解,本说明书实施例中不限于由从节点2进行对多个交易的分组,例如,也可以由主节点1根据多个交易的预执行读写集对对多个交易进行分组,并生成共识提议,该共识提议中包括多个交易的预执行读写集、预执行顺序和分组结果。
在步骤S313,从节点2在执行每个交易时,生成交易的执行读集,创建交易的状态集Sti0和状态集Sti1,其中i对应于交易的交易编号。
步骤S313~步骤S321可由图2中的每个计算进程(例如计算进程241和计算进程242)执行。
与预执行类似地,所述执行读集包括该交易在执行中读取的变量的键值对,执行写集包括交易在执行中写入的变量的键值对。因此,从节点2在执行交易时,每当进行读取变量的操作时,在执行读集中记录该读取的变量的键值对,从而生成交易的执行读集。
参考上文对步骤S301的描述,从节点2中可以在执行交易Txi的过程中在首次执行写操作之前,可创建交易Txi的状态集Sti0和状态集Sti1。状态集Sti0用于记录交易Txi中的状态待更新的各个变量在状态更新之前的状态,以用于在交易Txi执行失败时进行回滚。状态集Sti1用于记录交易Txi在执行过程中写入的各个账户的最新状态,所述状态即世界状态,所述变量可以为区块链中的外部账户,或者可以为合约中定义的合约变量。
在步骤S315,从节点2在根据交易对变量写入之前,读取变量的世界状态Vi1,将变量的状态Vi1存储到状态集Sti0。
在步骤S317,从节点2在状态集Sti1中存储变量的写入状态Vi2。
在步骤S319,从节点2在写入操作回滚时,至少根据状态集Sti0生成交易的执行写集。
其中,步骤S315~步骤S319可参考上文对步骤S303~步骤S307的描述,在此不再赘述。
在步骤S321,从节点2比较交易的预执行读写集与执行读写集是否一致。
从节点2在每执行完成一个交易之后都可以比较该交易的预执行读写集与执行读写集是否一致。在确定该交易的预执行读写集与执行读写集一致的情况中,从节点2可基于该交易的执行写集在内存中更新执行写集中的变量的世界状态,以使得后续涉及该变量的交易在执行时可从内存中读取该变量的世界状态。
在确定多个交易的预执行读写集与执行读写集都一致时,从节点2可确认主节点1没有作恶,多个交易的预执行读写集是正确的,因此,基于该预执行读写集的分组也是正确的,因此,在该分组下并行执行多个交易得到的交易执行结果也是正确的,即多个交易的执行读写集是正确的。各个计算进程可根据其执行分配给其的交易得到的各个交易的执行写集更新状态数据库,区块管理进程23在各个计算进程完成对交易的执行之后生成区块并存储到区块数据库中。
从节点2在确定该交易的预执行读写集与执行读写集不一致时,可确定主节点1存在作恶的行为,因此可终止对该多个交易的执行,与其他从节点进行用于更换主节点的操作。
图6为本说明书实施例中的在区块链中执行交易的方法流程图。该方法可由图2中的主节点1执行。
如图6所示,首先,在步骤S601,主节点1中的缓存进程12向预执行进程111发送多个交易。
如上文所示,主节点1中除了包括图2中所示的各个进程以外,还可以包括接入进程,该接入进程可从用户设备接收交易,并将接收的交易发送给缓存进程12,从而缓存进程12将从接入进程接收的交易按一定的顺序存储到缓存进程12的内存120中。例如,缓存进程12可按照接收交易的时间顺序存储交易,例如将接收的交易顺序存储到内存120中存储的交易队列中。
主节点1中还可以包括网络进程(图2中未示出),缓存进程12在接收到多个交易之后,可将该多个交易发送给网络进程,从而网络进程将该多个交易广播给区块链中的其他节点。
同时,对于每个预执行进程(包括预执行进程111和预执行进程112),缓存进程12可定期将交易队列中的预设数目的一批交易发送给该预执行进程,以使得各个预执行并行预执行交易队列中的交易。其中,缓存进程12可以将该批交易在交易队列中的排列顺序也发送给预执行进程,从而预执行进程可根据该交易队列中的排列顺序串行执行该批交易。
在步骤S603,预执行进程111预执行多个交易,得到各个交易的预执行读写集。
预执行进程111在从缓存进程12接收到多个交易之后,可首先对各个交易的签名进行验证,在验证通过之后,进行对所述多个交易的预执行。预执行进程111串行执行接收到的多个交易,例如,预执行进程111可按照接收到的多个交易的排列顺序串行执行多个交易。
在本说明书实施例中,内存113中可存储区块链中的部分变量的状态集,该部分变量包括区块链账户或者合约中定义的变量。预执行进程111在预执行交易的过程中读取或写入变量时,可更新本地缓存的状态集。预执行进程111可通过图3所示方法得到各个交易的预执行写集。
预执行进程111在预执行多个交易之后,得到多个交易各自的预执行读写集和多个交易的预执行顺序。
缓存进程12的内存120中存储有区块链中的部分变量的状态集,该状态集的更新可参考图6中后续步骤的描述。各个预执行进程在预执行交易的过程中读取变量时,首先确定预执行进程本地存储的状态集中是否包括该变量的值,如果没有,再确定缓存进程的内存中的状态集中是否包括该变量的值,如果还是没有,则从状态数据库读取该变量的值,并将该读取的变量的值存储到预执行进程本地的状态集中。
具体是,该多个交易中例如包括交易Tx3。假设交易Tx3中包括对变量a的读取操作,对变量b的写入操作,预执行进程111在执行交易Tx3中的对变量a的读取操作时,首先确定预执行进程111的内存113中是否存储了变量a的值,在内存113中存储变量a的值的情况中,可以基于该变量a的值完成对交易Tx3的预执行,生成交易Tx3的预执行读写集,例如,交易Tx3的预执行读集中包括变量a的键值对,预执行写集中包括变量b的键值对。在生成交易Tx3的预执行读写集中,预执行进程111基于交易Tx3的写集更新内存113中的状态集,在该状态集中存储交易Tx3在预执行中写入的变量b的值。
在另一种情况中,预执行进程111在确定内存113中的状态集中不包括变量a的值的情况中,可向缓存进程12请求读取变量a的值。缓存进程12在接收到该请求之后,确定内存120中的状态集中是否包括变量a的值,如果包括,则将该变量a的值发送给预执行进程111。预执行进程111可在接收到变量a的值之后,将该变量a的值存储到内存113中的状态集中,从而可用于执行后续的读取变量a的其他交易。如果内存120中的状态集中不包括变量a的值,则缓存进程12通知预执行进程111,预执行进程111从而从状态数据库中读取当前变量a的值,其中,状态数据库中存储有已执行完成的区块对应的世界状态。主节点1中例如还包括存储进程,预执行进程11例如可向存储进程发送读取变量a的请求,存储进程在接收到该请求之后,在状态数据库中读取变量a的值,并将变量a的值返回给预执行进程111。预执行进程111在从存储进程接收到变量a的值之后,类似地,将变量a的值存储到第一状态集中。预执行进程111通过将从内存113的外部读取的变量a的值存储到内存113中,使得预执行进程111在下次执行交易中读取变量a时,可直接从本地内存中读取到变量a的值,从而提高了交易执行速度。
预执行进程111在执行完成每个交易之后,还生成各个交易的交易收据。
在步骤S605,预执行进程111将多个交易的预执行读写集和预执行顺序发送给缓存进程12。
预执行进程111在如上所述完成对多个交易的预执行之后,将得到的多个交易的预执行读写集和预执行顺序一起发送给缓存进程12。另外,预执行进程111还将各个交易的交易收据发送给缓存进程12,以存储到内存120中。
在步骤S607,缓存进程12基于多个交易的预执行读写集更新本地状态。
缓存进程12在接收到多个交易的预执行读写集和预执行顺序之后,在主节点中只有一个预执行进程的情况中,由于预执行进程在首次读取一个变量时都是从存储进程接收变量值进行交易的预执行,并串行预执行多个交易,并随着各个交易的预执行更新预执行进程本地的状态集,再通过多个交易的预执行读写集来更新内存120中的状态集,因此,在将执行阶段的交易排列顺序设定为与该预执行顺序相同时,将使得各个交易的预执行读写集与执行读写集一致,因此,基于预执行读写集更新的内存113中的状态集也即为主节点1中的最新世界状态。缓存进程12可信任该多个交易的预执行读写集,并可直接基于该预执行读写集更新内存120中的状态集。在更新之后,内存120中的状态集也成为主节点1中的最新世界状态。
在主节点中有多个预执行进程(例如图2中的预执行进程111和预执行进程112)的情况中,两个预执行进程在并行预执行交易的过程中有可能同时对相同的变量进行读或写操作,从而可能导致其中一个交易的预执行结果不是基于主节点1中当前最新世界状态得到的,从而导致交易的预执行读写集与交易的执行读写集的不一致。
为此,缓存进程12在从预执行进程111接收到多个交易的预执行读写集之后,可顺序对每个交易的预执行读写集进行检测。具体是,例如对于交易Tx3,缓存进程12首先确定内存120中的状态集中是否包括交易Tx3的预执行读集中的变量a。如果没有,再类似地确定第二状态集中是否包括交易Tx3的预执行读集中的其他变量。如果内存120中的状态集中不包括交易Tx3的预执行读集中的全部变量,也就是说,之前提交到缓存进程12的交易还未对该交易Tx3读取的变量进行读写,则可确定交易Tx3的预执行读集与内存120中的状态集没有冲突。
如果缓存进程12确定内存120中的状态集中包括变量a的值,则确定预执行读集中的变量a的值与内存120中的状态集中的变量a的值是否一致,如果一致,说明该交易Tx3读取的变量a的值为预执行过程中变量a的最新状态。当缓存进程12对于交易Tx3预执行读集中的每个变量都确定所读取的值为预执行过程中的最新状态之后,可确定该交易Tx3的预执行读集与内存120中的状态集不存在冲突。在顺序确定多个交易的预执行读集与内存120中的状态集都不存在冲突的情况中,可基于该多个交易的预执行读写集更新内存120中的状态集。
如果缓存进程12确定交易Tx3的预执行读集中的变量a的值与内存120中的状态集中的变量a的值不一致,说明该交易Tx3读取的变量a的值不是预执行过程中的最新状态,因此,可确定交易Tx3的预执行读集与第二状态集存在冲突。在确定存在冲突的情况中,缓存进程12可指示预执行进程111对交易Tx3及在交易Tx3之后预执行的其他交易重新进行预执行。
另外,缓存进程12在接收到多个交易的预执行读写集和预执行顺序之后,可在内存120中存储该多个交易的预执行读写集,并在交易队列中按照该多个交易的预执行顺序存储该多个交易的标识,以指示该多个交易的预执行顺序。
在步骤S609,缓存进程12向共识进程13发送多个交易的预执行读写集和预执行顺序。
共识进程13定期调用缓存进程12提供的接口向缓存进程12请求获取待共识的一批交易进行共识。缓存进程12响应于该请求向共识进程13发送多个交易的预执行读写集及该多个交易的排列顺序,该排列顺序即为该多个交易的预执行顺序。其中,缓存进程12可与各个交易的哈希值关联地发送各个交易的预执行读写集。缓存进程12也可以在内存120中存储的交易的预执行读写集达到一定数据量时、或者在内存120中存储的交易的预执行读写集达到一定数量时向共识进程发送多个交易的预执行读写集及其预执行顺序。
在步骤S611,共识进程13生成共识提议,进行与其他节点的共识。
不同类型的区块链网络中,为了在各个记录账本的节点中保持账本的一致,通常采用共识算法来保证,即共识机制。例如,区块链节点之间可以实现区块粒度的共识机制,比如在节点(例如某个独特的节点)产生一个区块后,如果产生的这个区块得到其它节点的认可,其它节点记录相同的区块。再例如,区块链节点之间可以实现交易粒度的共识机制,比如在节点(例如某个独特的节点)获取一笔区块链交易后,如果这笔区块链交易得到其他节点的认可,认可该区块链交易的各个节点可以分别将该区块链交易添加至自身维护的最新区块中,并且最终能够确保各个节点产生相同的最新区块。共识机制是区块链节点就区块信息(或称区块数据)达成全网一致共识的机制,可以保证最新区块被准确添加至区块链。当前主流的共识机制包括:工作量证明(Proof of Work,POW)、股权证明(Proof ofStake,POS)、委任权益证明(Delegated Proof of Stake,DPOS)、实用拜占庭容错(Practical Byzantine Fault Tolerance,PBFT)算法等。其中,在各种共识算法中,通常在预设数目的节点对待共识的数据(即共识提议)达成一致之后,从而确定对该共识提议的共识成功。具体是,在PBFT算法中,对于N≥3f+1个共识节点,可容忍f个恶意节点,也就是说,当N个共识节点中2f+1个节点达成一致时,可确定共识成功。
具体是,共识进程13可生成共识提议,该共识提议中包括多个交易的预执行读写集及其预执行顺序,其中,该共识提议中的各个交易可以以该交易的哈希值进行标识。
在步骤S613,共识进程13将共识提议发送给区块管理进程14。
共识进程13在生成共识提议之后,可将共识提议发送给区块管理进程14。
在步骤S615,区块管理进程14生成并提交区块。
由于主节点信任自身的预执行没有作恶,并且主节点中对交易的预执行是根据正确的世界状态进行的,如果主节点再次依据状态数据库中的世界状态重新执行该多个交易,所得到的该多个交易的执行读写集与该多个交易的预执行读写集必然是一致的。因此,区块管理进程14可以直接将该多个交易的预执行读写集视为执行读写集,用来更新状态数据库中的世界状态,而不需要重新执行一次该多个交易。
从而,区块管理进程14可根据共识提议中多个交易的预执行读写集中的写集和预执行顺序顺序更新世界状态中各个账户和各个合约变量的状态,根据更新的世界状态更新状态树中各个节点的值,包括状态根((即状态树的根节点的哈希值))。区块管理进程14还可以从缓存进程13获取该多个交易各自的交易体和交易收据,并分别生成多个交易的交易树的交易根(即交易树的根节点的哈希值)和收据树的收据根(即收据树的根节点的哈希值)。
然后,区块管理进程14可生成包括所述多个交易的区块(例如区块B1),该区块B1可包括区块体和区块头,其中,区块头中可以包括区块号、交易根、状态根、收据根等信息,区块体可以包括各个交易的交易体集合和收据集合。区块管理进程14在生成区块之后,可提交该区块,以存储到图2中主节点1的区块数据库。例如,区块管理进程14可将该区块发送给存储进程,以使得存储进程在区块数据库中存储该区块。
其中,由于主节点信任自身的预执行读写集,因此,区块管理进程14可以在从共识进程13接收到共识提议之后立即进行对世界状态的更新和对区块的生成、提交操作。可以理解,区块管理进程14也可以在从共识进程13接收到共识成功的信息之后进行对世界状态的更新和对区块的生成、提交操作。
图7为本说明书实施例中的在区块链中执行交易的方法流程图。该方法可由图2中的从节点2执行。
如图7所示,首先,在步骤S701,从节点2中的共识进程22与区块链中的其他节点进行共识。
与主节点1类似的,从节点2中也可以包括接收进程和网络进程(图2中未示出),从节点2可通过接收进程从用户设备接收到交易,可通过网络进程接收到其他节点发送的交易。接收进程和网络进程在接收到交易之后将交易发送给缓存进程21,从而缓存进程21可在内存210以交易队列的形式存储接收的交易。与主节点1类似的,缓存进程21也可以将交易队列中的交易发送给网络进程,以广播给区块链中的其他节点。
主节点1中的网络进程将共识提议及主节点1的签名发送给其他各个节点的网络进程,从而从节点2中的网络进程可接收到该共识提议及主节点1的签名,并将该共识提议及主节点1的签名发送给共识进程22。共识进程22在接收到共识提议及其签名之后,开始进行共识过程。
在步骤S703,共识进程22将共识提议发送给区块管理进程23。
共识进程22在接收到共识提议之后,在对主节点的签名验证通过之后,就可以将该共识提议发送给区块管理进程23。
在步骤S705,区块管理进程23根据共识提议对多个交易进行分组,将多个组分配给多个计算进程。
区块管理进程23可根据共识提议中的预执行读写集对该多个交易进行分组,使得每两个分组中的全部交易不会访问相同的变量,从而使得各个分组可以并行执行,每个组中的多个交易按照其预执行顺序进行排列。在完成分组之后,区块管理进程23可将分组得到的多个组均匀分给多个计算进程。例如在从节点2中仅包括计算进程241和计算进程242的情况中,可以将多个组中的一半数量的组分给计算进程241,将另一半数量的组分给计算进程242。
可以理解,本说明书实施例中不限于由区块管理进程23进行对多个交易的分组,例如,也可以由共识进程22根据多个交易的预执行读写集对对多个交易进行分组,并将共识提议和分组结果发送给区块管理进程23。
在步骤S707,区块管理进程23将分配给各个进程的组和组内各个交易的预执行读写集发送给各个进程。
在步骤S709,计算进程执行交易,更新状态数据库。
以计算进程241为例,区块管理进程23可以对计算进程241分配一个或多个组。在区块管理进程23对计算进程241分配多个组的情况中,计算进程241中可通过多个线程并发处理多个组。同时,计算进程241按照一个组中多个交易的预执行顺序串行执行一个组中的多个交易。计算进程241在执行每个交易时,可通过图3所示的方法执行每个交易,在此不再赘述。
另外,如图2所示,计算进程241中包括内存243,计算进程241在开始执行多个组的交易之前,可根据多个组中的全部交易的读集,确定需要读取的全部变量,并从状态数据库进行对该全部变量的批量地(例如一次性地)读取,在读取到全部变量的状态(即世界状态)之后,进程241可以将该全部变量的值以键值对的形式存储到内存243中的状态集中。然后,计算进程241可基于内存243中的状态集执行各个组中的交易。计算进程241在根据交易执行读取变量的操作时,从内存243中的状态集中读取变量的值,在根据交易执行写入变量的操作时,将内存243中的状态集中该变量的值更新为此次写入的值,并据此生成交易的执行读写集。与预执行读写集类似地,执行读写集中包括执行读集和执行写集。执行读集中例如包括交易在执行过程中读取的变量的键值对,执行写集中例如包括交易在执行过程中写入的变量的键值对。通过批量预读的方式,计算进程241预先将需要从状态数据库读取的参数存储到本地的内存243中,从而计算进程241在执行交易的过程中可直接从内存中读取状态,而不需要从存储中读取状态,大大加快了交易执行速度。
由于各个组彼此不访问相同的变量,即不存在冲突交易,因此,计算进程241在完成对一个组中的全部交易的执行之后,可立即根据该组的各个交易的执行写集更新状态数据库中的世界状态,而不会影响其他组的交易执行。同时提高了交易执行速度。
在步骤S711,区块管理进程23生成并提交区块。
区块管理进程23在确定各个计算进程都完成对分配给其的组的交易执行和状态更新之后,根据更新的世界状态更新状态树中各个节点的值,包括状态根((即状态树的根节点的哈希值))。区块管理进程23还可以从缓存进程21获取多个交易各自的交易体和交易收据,并分别生成多个交易的交易树的交易根(即交易树的根节点的哈希值)和收据树的收据根(即收据树的根节点的哈希值)。
然后,区块管理进程23可生成包括所述多个交易的区块(例如区块B1),该区块B1可包括区块体和区块头,其中,区块头中可以包括区块号、交易根、状态根、收据根等信息,区块体可以包括各个交易的交易体集合和收据集合。区块管理进程23在生成区块之后,可提交该区块,以存储到图2中从节点2的区块数据库。
通过上述过程,在实现了区块链中各个节点的存储一致性的同时,利用区块链节点中多进程的架构,可使用多进程架构的优势进一步加快交易的执行速度,提高了区块链的系统效率。
图8为本说明书一实施例中的一种区块链中的第一节点的结构图,包括:
创建单元81,用于在执行交易时,创建与所述交易对应的第一状态集和第二状态集;
第一存储单元82,用于在根据所述交易对第一变量进行写入之前,读取所述第一变量的第一状态,所述第一状态为所述第一变量的当前状态,在所述第一状态集中存储所述第一变量的所述第一状态;
第二存储单元83,用于在所述第二状态集中存储所述第一变量的第二状态,所述第二状态为根据所述交易写入的所述第一变量的状态;
生成单元84,用于在确定所述交易的对所述第一变量的写入操作需要回滚时,至少根据所述第一状态集生成所述交易的写集。
图9为本说明书一实施例中的一种区块链中的第二节点的结构图,包括:
接收单元91,用于从所述区块链中的第一节点接收多个交易的预执行读写集和预执行顺序;
分组单元92,用于根据所述预执行读写集和所述预执行顺序对所述多个交易进行分组,得到多个交易组;
第一生成单元93,用于在并行执行所述多个交易组的交易时,对于交易组中的每个交易,生成所述交易的执行读集,创建与所述交易对应的第三状态集和第四状态集;
第一存储单元94,用于在根据所述交易对第一变量进行写入之前,读取所述第一变量的第三状态,所述第三状态为所述第一变量的当前状态,在所述第三状态集中存储所述第一变量的所述第三状态;
第二存储单元95,用于在所述第四状态集中存储所述第一变量的第四状态,所述第四状态为根据所述交易写入的所述第一变量的状态;
第二生成单元96,用于在确定所述交易的对所述第一变量的写入操作需要回滚时,至少根据所述第三状态集生成所述交易的执行写集;
比较单元97,用于比较所述多个交易的执行读写集与所述多个交易的预执行读写集是否一致,以确定所述多个交易的执行读写集是否正确,所述执行读写集包括所述执行读集和所述执行写集。
在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 (11)
1.一种在区块链中执行交易的方法,所述方法由区块链中的第一节点执行,所述方法包括:
在执行交易时,创建与所述交易对应的第一状态集和第二状态集;
在根据所述交易对第一变量进行写入之前,读取所述第一变量的第一状态,所述第一状态为所述第一变量的当前状态,在所述第一状态集中存储所述第一变量的所述第一状态;
在所述第二状态集中存储所述第一变量的第二状态,所述第二状态为根据所述交易写入的所述第一变量的状态;
在确定所述交易的对所述第一变量的写入操作需要回滚时,至少根据所述第一状态集生成所述交易的写集。
2.根据权利要求1所述的方法,所述区块链还包括第二节点,所述执行为对所述交易的预执行,所述写集为所述交易的预执行写集,所述方法还包括:在预执行交易时生成所述交易的预执行读集,在预执行多个交易之后,将所述多个交易的预执行读集、预执行写集和预执行顺序发送给所述第二节点。
3.根据权利要求1或2所述的方法,其中,所述第一变量为合约变量,所述第一状态集和所述第二状态集为合约变量状态集。
4.根据权利要求1或2所述的方法,其中,所述交易中调用第一合约,所述第一合约调用第二合约,所述第二合约包括对所述第一变量的写操作,所述第一状态集与所述第二合约对应,
所述在确定所述交易的对所述第一变量的写入操作需要回滚时,至少根据所述第一状态集生成所述交易的预执行写集包括:在确定所述第二合约的预执行失败需要回滚时,根据所述第一状态集和所述第二状态集生成所述交易的预执行写集。
5.根据权利要求2所述的方法,其中,所述多个交易仅包括对第二变量的读取操作,不包括对所述第二变量的写操作,所述方法还包括:在预执行所述多个交易得到所述多个交易的预执行读写集之后,删除所述多个交易的预执行读集中的所述第一变量的键值对。
6.根据权利要求2所述的方法,其中,所述多个交易中包括多个第一交易,所述第一交易用于对区块链中的第一账户转入预设金额,所述金额为正金额,所述方法还包括,删除所述多个第一交易的预执行读写集中的所述第一账户的键值对。
7.一种在区块链中执行交易的方法,所述区块链包括第一节点和第二节点,所述第一节点中运行有预执行进程、缓存进程和第一共识进程,所述方法由所述第一节点执行,所述方法包括:
所述缓存进程将接收的交易发送给所述预执行进程;
所述预执行进程在预执行所述交易时,生成所述交易的预执行读集,在所述预执行进程的内存中创建与所述交易对应的第一状态集和第二状态集;在根据所述交易对第一变量进行写入之前,读取所述第一变量的第一状态,所述第一状态为所述第一变量的当前状态,在所述第一状态集中存储所述第一变量的所述第一状态;在所述第二状态集中存储所述第一变量的第二状态,所述第二状态为根据所述交易写入的所述第一变量的状态;在确定所述交易的对所述第一变量的写入操作需要回滚时,至少根据所述第一状态集生成所述交易的预执行写集;
所述预执行进程在预执行多个交易之后,将所述多个交易的预执行读集、预执行写集和预执行顺序发送给所述缓存进程;
所述共识进程从所述缓存进程接收所述多个交易的预执行读集、预执行写集和预执行顺序,生成共识提议,所述共识提议中包括所述多个交易的预执行读集、预执行写集和预执行顺序,将所述共识提议发送给所述第二节点。
8.根据权利要求7所述的方法,所述缓存进程的内存中存储有区块链中至少部分变量的当前状态,所述方法还包括:所述缓存进程在从所述预执行进程接收所述多个交易的预执行读集、预执行写集和预执行顺序之后,根据所述缓存进程的内存中当前存储的状态数据对所述多个交易的预执行读集进行验证,在验证通过时,基于所述多个交易的预执行读集和预执行写集更新所述缓存进程的内存中存储的状态数据。
9.一种在区块链中执行交易的方法,所述区块链包括第一节点和第二节点,所述第二节点中运行有第二共识进程、区块管理进程和N个计算进程,所述方法包括:
所述第二共识进程从所述第一节点接收共识提议,所述共识提议中包括多个交易的预执行读写集和预执行顺序,将所述多个交易的预执行读写集和预执行顺序发送给所述区块管理进程;
所述区块管理进程根据所述预执行读写集和所述预执行顺序对所述多个交易进行分组,得到多个交易组,将所述多个交易组的信息分配给所述N个计算进程;
所述N个计算进程在并行执行所述多个交易组的交易时,对于交易组中的每个交易,生成所述交易的执行读集,创建与所述交易对应的第三状态集和第四状态集;在根据所述交易对第一变量进行写入之前,读取所述第一变量的第三状态,所述第三状态为所述第一变量的当前状态,在所述第三状态集中存储所述第一变量的所述第三状态;在所述第四状态集中存储所述第一变量的第四状态,所述第四状态为根据所述交易写入的所述第一变量的状态;在确定所述交易的对所述第一变量的写入操作需要回滚时,至少根据所述第三状态集生成所述交易的执行写集;比较所述多个交易的执行读写集与所述多个交易的预执行读写集是否一致,在一致的情况中确认所述执行读写集正确,所述执行读写集包括所述执行读集和所述执行写集。
10.一种区块链中的第一节点,包括:
创建单元,用于在执行交易时,创建与所述交易对应的第一状态集和第二状态集;
第一存储单元,用于在根据所述交易对第一变量进行写入之前,读取所述第一变量的第一状态,所述第一状态为所述第一变量的当前状态,在所述第一状态集中存储所述第一变量的所述第一状态;
第二存储单元,用于在所述第二状态集中存储所述第一变量的第二状态,所述第二状态为根据所述交易写入的所述第一变量的状态;
生成单元,用于在确定所述交易的对所述第一变量的写入操作需要回滚时,至少根据所述第一状态集生成所述交易的写集。
11.一种计算机可读存储介质,其上存储有计算机程序,当所述计算机程序在计算机中执行时,令计算机执行权利要求1-9中任一项的所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210602794.3A CN114936256A (zh) | 2022-05-30 | 2022-05-30 | 在区块链中执行交易的方法和区块链节点 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210602794.3A CN114936256A (zh) | 2022-05-30 | 2022-05-30 | 在区块链中执行交易的方法和区块链节点 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN114936256A true CN114936256A (zh) | 2022-08-23 |
Family
ID=82867231
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202210602794.3A Pending CN114936256A (zh) | 2022-05-30 | 2022-05-30 | 在区块链中执行交易的方法和区块链节点 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN114936256A (zh) |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2023231336A1 (zh) * | 2022-05-30 | 2023-12-07 | 蚂蚁区块链科技(上海)有限公司 | 执行交易的方法和区块链节点 |
WO2024066011A1 (zh) * | 2022-09-30 | 2024-04-04 | 蚂蚁区块链科技(上海)有限公司 | 一种共识节点类型的转换方法和共识节点 |
WO2024066007A1 (zh) * | 2022-09-30 | 2024-04-04 | 蚂蚁区块链科技(上海)有限公司 | 区块链系统中的交易执行方法、共识节点和区块链系统 |
-
2022
- 2022-05-30 CN CN202210602794.3A patent/CN114936256A/zh active Pending
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2023231336A1 (zh) * | 2022-05-30 | 2023-12-07 | 蚂蚁区块链科技(上海)有限公司 | 执行交易的方法和区块链节点 |
WO2024066011A1 (zh) * | 2022-09-30 | 2024-04-04 | 蚂蚁区块链科技(上海)有限公司 | 一种共识节点类型的转换方法和共识节点 |
WO2024066007A1 (zh) * | 2022-09-30 | 2024-04-04 | 蚂蚁区块链科技(上海)有限公司 | 区块链系统中的交易执行方法、共识节点和区块链系统 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109493223B (zh) | 一种记账方法及装置 | |
CN113743941B (zh) | 一种在区块链中执行交易的方法、区块链和主节点 | |
CN114827165B (zh) | 对多个交易进行分组的方法和区块链节点 | |
CN114936256A (zh) | 在区块链中执行交易的方法和区块链节点 | |
CN113743950B (zh) | 在区块链系统中执行交易的方法、节点和区块链系统 | |
CN113743940B (zh) | 在区块链中执行交易的方法、区块链、主节点和从节点 | |
WO2023231336A1 (zh) | 执行交易的方法和区块链节点 | |
CN113743942B (zh) | 交易执行方法、区块链、主节点和主存储设备 | |
WO2024001024A1 (zh) | 在区块链系统中执行交易的方法、区块链系统和节点 | |
CN114710507B (zh) | 一种共识方法、区块链节点、介质和共识节点 | |
CN113505024B (zh) | 联盟链的数据处理方法、装置、电子设备及存储介质 | |
WO2023231337A1 (zh) | 在区块链中执行交易的方法、区块链的主节点和从节点 | |
WO2023231335A1 (zh) | 在区块链中执行交易的方法及区块链的主节点 | |
WO2023160083A1 (zh) | 执行交易的方法、区块链、主节点和从节点 | |
CN113744061B (zh) | 在区块链系统中执行交易的方法、区块链系统、和从节点 | |
CN114547203A (zh) | 执行交易的方法、区块链、主节点和从节点 | |
CN113744062B (zh) | 在区块链中执行交易的方法、区块链节点和区块链 | |
WO2024001032A1 (zh) | 在区块链系统中执行交易的方法、区块链系统和节点 | |
WO2024001025A1 (zh) | 一种预执行缓存数据清理方法和区块链节点 | |
CN115640356A (zh) | 区块链系统中的交易执行方法、共识节点和区块链系统 | |
CN116881361A (zh) | 交易的执行方法、节点和区块链系统 | |
CN116305311A (zh) | 区块链系统中验证读写集的方法和装置 | |
Pankowski | Lorq: A system for replicated NoSQL data based on consensus quorum | |
CN115665164A (zh) | 区块链系统中的交易处理方法、装置及区块链系统 | |
CN114697344A (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 |