CN116188160A - 在区块链系统中执行交易的方法和区块链节点 - Google Patents
在区块链系统中执行交易的方法和区块链节点 Download PDFInfo
- Publication number
- CN116188160A CN116188160A CN202211733445.1A CN202211733445A CN116188160A CN 116188160 A CN116188160 A CN 116188160A CN 202211733445 A CN202211733445 A CN 202211733445A CN 116188160 A CN116188160 A CN 116188160A
- Authority
- CN
- China
- Prior art keywords
- value
- field
- transaction
- account
- lock
- 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
- 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
- G06Q40/00—Finance; Insurance; Tax strategies; Processing of corporate or income taxes
- G06Q40/04—Trading; Exchange, e.g. stocks, commodities, derivatives or currency exchange
-
- 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
- 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/505—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 load
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Business, Economics & Management (AREA)
- General Physics & Mathematics (AREA)
- Physics & Mathematics (AREA)
- Accounting & Taxation (AREA)
- Finance (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Databases & Information Systems (AREA)
- General Business, Economics & Management (AREA)
- Technology Law (AREA)
- Strategic Management (AREA)
- Computing Systems (AREA)
- Marketing (AREA)
- Data Mining & Analysis (AREA)
- Economics (AREA)
- Development Economics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
- Management, Administration, Business Operations System, And Electronic Commerce (AREA)
- Financial Or Insurance-Related Operations Such As Payment And Settlement (AREA)
Abstract
本说明书实施例提供了一种在区块链系统中执行交易的方法,区块链系统包括至少两个分片,至少两个分片中包括第一分片,该方法由第一分片的区块链节点执行,第一分片中设有状态数据库,状态数据库存储有多个对象的状态数据,每个对象的状态数据中至少包括当前值字段、原始值字段和锁字段,该方法包括:响应于第一交易中对于第一分片中的第一对象的写入操作,读取第一对象的第一锁字段,其中,第一交易为跨片交易;若第一锁字段的值指示第一对象未被锁定,将第一锁字段的值更新为第一交易的标识,用于指示第一对象被锁定,将第一对象的第一原始值字段的值更新为第一当前值字段的当前值,将第一对象的第一当前值字段的值更新为写入操作对应的写入值。
Description
技术领域
本说明书实施例涉及区块链技术领域,更具体地,涉及一种在区块链中执行交易的方法和区块链节点。
背景技术
区块链(Blockchain)是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。区块链是一种按照时间顺序将数据区块以顺序相连的方式组合成的一种链式数据结构,并以密码学方式保证的不可篡改和不可伪造的分布式账本。由于区块链具有去中心化、信息不可篡改、自治性等特性,区块链也受到人们越来越多的重视和应用。
其中,区块链分片技术是一种用于对区块链进行扩容的方案。区块链分片的基本思路是将区块链网络中的节点分成若干个相对独立的子网络,每个子网络构成一个区块链,一个子网络也就是一个分片(shard)。通过多个分片的并行处理,可提升整个网络的吞吐量。
在区块链中,通常每执行一个区块之后,在区块数据库中更新该区块对应的世界状态。然而,当区块中存在产生跨片操作的跨片交易的情况中,如跨片交易要读写多个分片里的不同账户,交易需要跨多个分片,经过多个区块才能完成。通常在交易执行结束后,再对交易在各分片的修改进行提交或者回滚,而不立即将该交易的执行结果提交到状态数据库中。此时,通常在状态数据库之外,保存和维护交易执行的中间状态数据。
发明内容
本说明书实施例旨在提供一种更有效的在区块链系统中执行交易的方案,可以避免跨链交易中因账户访问冲突导致的错误,保证跨片交易执行的正确性;并且,还可以在跨片交易完成或回滚时,更加快捷地确定跨片交易对应的账户或账户包含的变量的状态。
为实现上述目的,本说明书第一方面提供一种在区块链系统中执行交易的方法,所述区块链系统包括至少两个分片,所述至少两个分片中包括第一分片,所述方法由第一分片的区块链节点执行,所述第一分片中设有状态数据库,所述状态数据库存储有多个对象的状态数据,每个对象的状态数据中至少包括当前值字段、原始值字段和锁字段,所述方法包括:响应于第一交易中对于第一分片中的第一对象的写入操作,从所述状态数据库中读取所述第一对象的第一锁字段,其中,所述第一交易为跨片交易;若所述第一锁字段的值指示所述第一对象未被锁定,将所述第一锁字段的值更新为所述第一交易的标识,以用于指示所述第一对象被锁定,将所述第一对象的第一原始值字段的值更新为所述第一对象的第一当前值字段的当前值,将所述第一对象的第一当前值字段的值更新为所述写入操作对应的写入值。
本说明书第二方面提供一种区块链节点,属于包括至少两个分片的区块链系统中的第一分片,所述第一分片中设有状态数据库,所述状态数据库存储有多个对象的状态数据,每个对象的状态数据中至少包括当前值字段、原始值字段和锁字段,所述区块链节点包括:第一响应单元,配置为,响应于第一交易中对于第一分片中的第一对象的写入操作,从所述状态数据库中读取所述第一对象的第一锁字段,其中,所述第一交易为跨片交易;第一更新单元,配置为,若所述第一锁字段的值指示所述第一对象未被锁定,将所述第一锁字段的值更新为所述第一交易的标识,以用于指示所述第一对象被锁定,将所述第一对象的第一原始值字段的值更新为所述第一对象的第一当前值字段的当前值,将所述第一对象的第一当前值字段的值更新为所述写入操作对应的写入值。
本说明书第三方面提供一种计算机可读存储介质,其上存储有计算机程序,当所述计算机程序由计算机或处理器执行时,令计算机或处理器执行如第一方面所述的方法。
本说明书第四方面提供一种区块链节点,包括存储器和处理器,所述存储器中存储有可执行代码,所述处理器执行所述可执行代码时,实现如第一方面所述的方法。
在本说明书实施例提供的在区块链系统中执行交易的方案中,在执行跨链交易中账户操作时,在状态树的账户或变量值中的附加字段中设置跨链交易的账户锁、以及操作前后的账户或变量中的原始值或当前值,从而,可以避免跨链交易中因账户访问冲突导致的错误,保证跨片交易执行的正确性。并且,还可以在跨片交易完成或回滚时,更加快捷地确定跨片交易对应的账户或账户包含的变量的状态、或者对于账户或变量的处理方式。
附图说明
通过结合附图描述本说明书实施例,可以使得本说明书实施例更加清楚:
图1是一实施例中区块链系统架构示意图;
图2是一实施例中区块链系统分片架构的示意图;
图3是一种区块链数据存储的结构示意图;
图4是一种区块链状态树的示意图;
图5是本说明书一实施例中的一种区块链状态树或存储树中的账户或账户变量的结构的示意图;
图6是本说明书一实施例中的一种在区块链系统中执行交易的方法的流程图;
图7是本说明书另一实施例中的一种在区块链系统中执行交易的方法的流程图;
图8是本说明书一实施例中的一种区块链节点的架构图;
图9是本说明书另一实施例中的一种区块链节点的架构图。
具体实施方式
下面将结合附图描述本说明书实施例。
为了使本技术领域的人员更好地理解本说明书中的技术方案,下面将结合本说明书实施例中的附图,对本说明书实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本说明书一部分实施例,而不是全部的实施例。基于本说明书中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都应当属于本说明书保护的范围。
目前限制区块链技术大规模落地应用的一个很重要因素是性能,即吞吐量,这个吞吐量一般可以通过每秒交易笔数(Transaction Per Second,TPS)来度量。开发者们提出了各种各样的方案来尝试提升区块的吞吐量,这一过程称为“扩容”。从扩容采用技术的方向上来说,可以分为链上扩容和链下扩容两个方向。链上扩容通常包括扩块、隔离见证、分片、共识层改进这些方案。链下扩容通常包括状态通道、侧链、链下计算这些方案。
分片技术是属于链上扩容的一种方案。分片概念源于数据库领域,本意是指数据库中数据的水平分区(将表的不同行分到不同的分区),每个分片都保存在一个单独的数据库服务器实例上,以分散负载。区块链分片的基本思路是将区块链网络中的节点分成若干个相对独立的子网络,每个子网络中包含一部分节点,一个子网络也就是一个分片(shard)。单个分片处理规模较小的事务,甚至只存储部分网络状态,多个分片并行处理事务,理论上整个网络的吞吐量将会提升。
分片技术根据不同的分片机制可以划分为三种:网络分片(network sharding),交易分片(transaction sharding),状态分片(state sharding)。网络分片是最基础的一种分片方式,包括将整个区块链网络划分成多个子网络,也就是多个分片。这样,区块链网络中的多个分片可以并行处理网络中不同的交易。交易分片是将交易按某种规则分配到不同分片,其思路为按一定规则将交易分配到同一个分片处理,这样既能够达到并行处理的目的又能避免双花问题。交易分片的前提是先进行网络分片。在所有的分片机制当中,状态分片是最具挑战的分片方式。状态分片的关键是将整个存储区分开,让不同的分片存储不同的部分,每个节点只负责存储自己的分片数据,而不是存储完整的区块链状态。状态分片能够解决存储能力瓶颈问题。
一些区块链系统架构如图1所示。如图1中,一个区块链系统例如包含A、B、C、D、E、F、G、H、I、J、K、L、M、N、O、P共16个全量节点。节点之间的连线示意性的表示P2P(Peer toPeer,点对点)连接。这些节点上都存储全量的账本,即承担着存储全部交易、智能合约和各种状态。随着区块链业务的增长,单个节点存储的数据量也会越来越大,有的达到T数量级(1TB=1024GB),甚至到达P或E的数量级(1PB=1024TB,1EB=1024PB)。为了支撑区块链系统的运行和应对业务的持续,对于每一个节点都需要寻求扩容(获得更大的存储空间)而进行巨大的花费。
基于此,本说明书实施例提供了一种区块链系统。区块链系统中的节点进行分片后例如如图2所示,分为4个分片。每个分片包括4个节点。每个分片内的节点之间的连线表示P2P连接,每个分片之间的连线也表示P2P连接。本实施例仅仅是为了便于举例而示意性的列举4个分片,每个分片包括4个节点。实际上,每个分片中节点的数量可以不同。此外,部分或者全部分片之间可能没有网络连接,也就是说,在一些情况下,部分或者全部分片之间可能并不直接通信。为了支持分片之间的通信,区块链网络中可以包括一个为所有分片提供服务的主链。这个主链在图2中并没有显示出。
为了说明本申请中的状态分片方法,先介绍本申请涉及的区块链状态存储结构。鉴于很多区块链平台和应用是基于以太坊(Ethereum)的底层技术而构建的,这里先介绍以太坊的状态存储结构。当然,基于其他区块链技术构建的区块链系统,也可能适用于本申请的核心内容,例如基于Fabric的超级账本(Hyperledger)和企业操作系统(EnterpriseOperating System,EOS)、Quorum、Corda等,不再赘述。
以太坊相比于比特币网络进行了拓展,采用账户系统和世界状态,可以直接用账户来显示的记录账户的余额和状态。以太坊的账户可以分为两种类型:
外部账户(Externally owned account):用户的账户,例如以太币拥有者账户。
合约账户(contract account):存储执行的智能合约代码以及智能合约代码中状态的值,通常只能通过外部账户调用激活。
外部账户和合约账户的设计,实际上是账户地址到账户状态的映射。账户的状态通常包括nonce、balance、storage_root、codeHash等字段。nonce、balance在外部账户和合约账户中都存在。codeHash和storage_root属性一般仅在合约账户上有效。
nonce:计数器。对于外部账户,这个数字代表从账户地址发送的交易数量;对于合约账户,是账户创建的合约数量。
balance:这个地址拥有的以太币的数量。
storage_root:一个MPT树根节点的哈希,这个MPT树对合约账户的状态变量的存储进行组织。
codeHash:智能合约代码的哈希值。对于合约账户,这是智能合约被哈希计算并存储的代码;对于外部账户,由于不包括智能合约,因此codeHash字段一般可以是空字符串/全0字符串。
MPT全称为Merkle Patricia Tree,是结合了Merkle Tree(默克尔树)和PatriciaTree(压缩前缀树,一种更节省空间的Trie树,字典树)的一种树形结构。Merkle Tree,默克尔树算法对每个交易都计算一个Hash值,然后两两连接再次计算Hash,一直到最顶层的Merkle根。以太坊中采用改进的MPT树,例如是16叉树的结构,通常也简称为MPT树。
以太坊MPT树的数据结构包括状态树(state trie)。状态树中包含以太坊网络中每个账户所对应的存储内容的键值对(key and value pair)。状态树中的“键”可以是一个的160bits标识符(以太坊账户的地址),这个账户地址分布于从状态树的根节点开始到叶子节点的存储中。状态树中的“值”是通过对以太坊账户的信息进行编码(使用递归长度字典编码(Recursive-Length Prefix encoding,RLP)方法)生成的。如前所述,对于外部账户来说,值可以例如包括nonce和balance;对于合约账户来说,值可以例如包括nonce、balance、codehash和storage_root。
合约账户用于存储智能合约相关的状态。智能合约在区块链上完成部署后,会产生一个对应的合约账户。这个合约账户一般会具有一些状态,这些状态由智能合约中状态变量所定义并在智能合约创建、执行时产生新的值。所述的智能合约通常是指在区块链环境中以数字形式定义的能够自动执行条款的合约。一旦某个事件触发合约中的条款(满足执行条件),代码即可以自动执行。在区块链中,合约的相关状态保存在存储树(storagetrie)中,存储树根节点的hash值即存储于上述storage_root中,从而将该合约的所有状态通过hash锁定到该合约账户下。存储树也是一个MPT树形结构,存储了状态地址到状态值的key-value映射。从存储树的根节点到叶子节点存储有一个状态的地址,一个叶子节点中存储一个状态的值。
图3是一个区块链数据存储的结构示意图。由图3所示的一些的区块链数据存储中,每一区块的区块头包括若干字段,例如上一区块哈希previous_Hash(图中的PrevHash,或称为父hash),随机数Nonce(在一些区块链系统中这个Nonce不是随机数,或者在一些区块链系统中不启用区块头中的Nonce),时间戳Timestamp,区块号BlockNum,状态根哈希State_Root,交易根哈希Transaction_Root,收据根哈希Receipt_Root等。其中,下一区块(如区块N+1)的区块头中的PrevHash指向上一区块(如区块N),即为上一区块的hash值。通过这种方式,区块链上通过区块头实现了下一区块对上一区块的锁定。特别的,如前所述,state_root是当前区块中所有账户的状态组成的MPT树的根的哈希值,即指向state_root的为一棵MPT形式的状态树。这个MPT树的根节点可以为一个扩展节点(Extension Node)或一个分支节点(Branch Node),state_root中存储的一般为这个根节点的hash值。从这个MPT的根节点到叶子节点中每个节点的一部分值按照顺序串联起来可以构成账户地址并作为key,叶子节点中存储的账户信息为这个账户地址对应的value,这样,构成了key-value键值对。具体的,这个key可以是sha3(Address),即账户地址的hash值(hash算法例如采用sha3算法),其存储的值value可以为rlp(Account),即账户信息的rlp编码。其中账户信息是[nonce,balance,storage_root,codeHash]构成的四元组。如前所述,对于外部账户来说,一般只有nonce和balance两项,而storage_root、codeHash字段默认存储空字符串/全0字符串。也就是说,外部账户不存储合约,也不存储合约执行后的产生的状态变量。合约账户一般包括nonce,balance,storage_root,codeHash。其中nonce是同一账户的交易计数器;balance是账户余额;storage_root对应另外一个MPT,通过storage_root能链接到合约相关的状态的信息;codeHash是合约代码的hash值。不论是外部账户还是合约账户,其账户信息一般都位于一个单独的叶子节点(Leaf Node)中。从根节点的扩展节点/分支节点到每个账户的叶子节点,可能中间会经过若干个分支节点以及扩展节点。
状态树可以是MPT形式的树,一般是16叉树,每一层最多可以有16个孩子节点,而最多可以有64层的深度。对于扩展节点,用于存储共同前缀,其一般有1个孩子节点,这个孩子节点可以是分支节点。对于分支节点,其最多可以有16个孩子节点,其中可能包括扩展节点和/或叶子节点。这样的MPT树最多可以有64层的深度。当区块链中的账户数量达到一定数量时,这棵MPT树可能接近或达到64层的深度。
智能合约中,例如通过以太坊提供的solidity高级开发语言中,可以定义的状态变量包括两种类型,一种是基本数据类型的状态变量,另一种是映射(map或mapping)类型的状态变量。以下是一个用solidity编写的智能合约的代码的片段:
其中,整形变量a、x都属于基本数据类型,在myfunc函数中,a赋值为8,x赋值为9。map类型数据结构中,上面代码中定义了外部账户地址到一种资产类型的余额(balanceA,不同于外部账户中的balance和合约账户中的balance)的映射,即地址address→balanceA的映射。在myfunc函数中,例如为外部账户的地址123初始化对应的balanceA为100。
以太坊和其它区块链系统中,例如可以在智能合约中按照ERC20标准创建新的数字资产,当然也可以是按照其他方式自定义的数字资产。例如上述的balanceA即可以为按照ERC20标准创建的一种数字资产。当然,在一个智能合约中,可以定义多个资产类型,例如balanceA、balanceB、balanceC、…。这个合约中的map可以为每个外部账户赋予持有和交易这种新创建的数字资产的能力。如上述代码的例子,一般的,每个外部账户都可以对应一个balanceA类型的资产。那么,如果区块链的状态树中存在10000个外部账户,则通过智能合约,每个外部账户可以对应持有/交易balanceA类型的资产,即存在10000个“外部账户→balanceA”的映射。
需要说明的是,这里的资产是广义的,还可以是余额外的其它内容。例如在区块链电子发票的场景中,资产可以定义为发票的代码集合,这个集合例如为balanceP。这样,在“外部账户→balanceP”的映射中,balanceP中可以包括一组发票的代码集合。这个发票代码集合中可能会增加新的发票代码。
上述的基本数据类型和map类型的状态变量,在存储树中都可以是以key-value键值对的形式存储。对于基本数据类型,key是合约中的状态变量声明的位置(从0开始计数)。对于map类型,key=SHA3(map中的关键字,变量声明位置),也就是把map中的关键字和状态变量声明位置拼在一起成为一定长度(例如64字节)的字符串后计算hash值。value可以存储状态变量的实际值。在另一种实施方式中,两种类型的状态变量的key都可以取为变量名称的哈希值,通过这样设置,各个状态变量的key的长度相同,便于以树的形式存储。
前面提到,如果区块链的状态树中存在10000个外部账户,则通过智能合约,每个外部账户可以对应持有/交易balanceA类型的资产,即存在10000个外部账户→balanceA的映射。具体的,该合约账户下,存储树中可以存储这些map的值。如上所述,具体是通过key-value的方式存储在存储树中。类似的,这个存储树也可以是MPT形式的树,一般也是16叉树,每一层最多可以有16个孩子节点,最多可以有64层的深度。从这个MPT的根节点到叶子节点中存储的一部分数据连起来可以作为key,叶子节点中存储的信息为这个key对应的value。这样,就构成了key-value键值对。
当区块链中的外部账户的数量达到一定量时,状态树的深度可能接近或达到64层的深度。类似的,合约中map类型的状态变量的数量也可能达到相同的量,这时存储树也接近或达到64层的深度。此外,对于一个智能合约来说,合约中基本数据类型的变量不会太多,一般不会超过32个。这样,当外部账户的数量较大时,加上合约中基本数据类型的变量,合约中的状态变量的总数与外部账户基本是差不多的。
图4是一种状态树的示意图。区块链系统中存在若干外部账户,例如图4中分别编号的外部账户1、外部账户2,…。此外,区块链系统中存在若干合约账户,例如图4中的分别编号的合约账户1,合约账户2,…。这些外部账户和合约账户及其信息内容例如通过MPT树的形式组织,构成状态树。区块头中的state_root存储这个MPT树的根节点的hash值。图4中以节点1、节点2、节点3共三个节点来示意性的表示MPT树的形式,具体的,可以表示MPT树中的扩展节点、分支节点。区块头中的state_root存储整个状态树的根节点的hash值。状态树的树形结构例如可以采用图3中的MPT,当然也可以采用其他组织形式,这一点以下类似,以MPT为例进行说明。如图4所示,MPT树中可以包括扩展节点、分支节点和叶子节点。叶子节点可以对应于外部账户或合约账户,叶子节点通常可以通过其对应账户的账户地址(账户地址通常对应于叶子节点的键(Key))访问。在一个例子中,与该key对应的值(Value)则可以包括例如nonce、balance等字段(其中保存该账户的nonce值、balance值等)。
外部账户可以通过创建合约的交易在区块链上部署智能合约。此外,智能合约也可以是原生合约,即融合在区块链平台的代码中,与区块链平台代码一同编译后完成部署。不论是哪种形式部署的智能合约,在合约创建后,区块链上出现一个与该智能合约对应的合约账户,并拥有一个特定的地址,合约代码和账户存储将保存在该合约账户中。智能合约的账户存储保存了这个合约的状态。合约创建之后,外部账户可以调用创建的智能合约,也可以是外部账户通过智能合约来调用智能合约(也可以通过1个或多个智能合约来调用智能合约)。被调用的智能合约,将产生的状态变量以key-value的形式写入该智能合约的账户存储中,如图4所示。这些key-value,可以组织成MPT树的形式,构成存储树。
如前所述,在区块链中,通常每执行一个区块之后,在区块数据库中更新该区块对应的世界状态。然而,当区块中存在产生跨片操作的跨片交易的情况中,如跨片交易要读写多个分片里的不同账户,交易需要跨多个分片才能完成。通常在交易执行结束后,根据交易执行结果,对交易在各分片的修改进行提交或者回滚。但是,在一些交易场景中,这种方案会存在如下的问题:第一,跨片交易执行中发生账户冲突的问题。例如,跨片交易Tx1需要修改分片S1中的账户A(在一个例子中,例如修改账户的值中的balance;在另一个例子中,例如账户中的状态变量的值)、以及分片S2中的账户B。只有对帐户A、账户B的操作都成功,Tx1才执行成功。在分片S1中,在Tx1开始执行并更新账户A后,将修改账户B的操作转发到分片S2中执行。如果在修改账户B的操作没有返回之前,S1中的后序交易Tx2也修改了账户A。并且,最终修改账户B的操作在S2执行失败,从而整个跨片交易Tx1执行失败。在S1上需要回滚账户A的状态,但是,在回滚后也丢失了Tx2对账户A的修改,这会造成Tx2的执行结果也混乱了。第二,跨片交易执行中的操作繁琐的问题。以执行对于账户状态的回滚为例,通常可以在状态树之外,保存和更新账户的中间状态信息,从而方便例如在交易失败时,根据以及账户的中间状态信息(例如账户修改前的余额和账户修改后的余额),进行账户状态的回滚。但是,这些账户的中间状态信息在状态树之外的保存和维护,需要交易中账户访问操作之外的较多繁琐的额外操作(例如,对于账户状态信息的保存、查询和更新)来进行。这些繁琐的额外操作,导致交易的执行效率较差。
为了解决上述技术问题,本说明书实施例提供了一种在区块链系统中执行交易的方法。其核心思想是,在状态树中外部账户的值或者合约账户的变量(可以在存储树中)的值中,添加若干扩展字段,例如,扩展字段可以包括用于在跨片交易中对账户或账户变量施加锁的锁字段(Lock)。从而,在各个分片的节点根据跨片交易对其本分片的账户或账户变量进行读、写操作时,利用Lock字段进行加锁,并在交易提交或回滚时进行解锁。从而,可以防止其他交易在该跨片交易执行期间更新账户或账户变量,导致该跨片交易执行期间的账户或账户变量的值不统一,或者说非原子化。在一个例子中,扩展字段还可以包括原始值字段(OriginValue)、以及当前值字段(CurrentValue),所述OriginValue字段用于指示账户或账户变量在跨片交易执行前的历史值,所述CurrentValue字段用于指示账户或账户变量的当前值。从而,可以在状态树(或存储树)中直接保存账户或账户在变量访问前的原始值、以及账户或账户在变量访问后的最新值。通过该设置,区块链节点无须在世界状态之外保存和维护账户或账户变量的中间状态,区块链节点在执行交易的过程中可直接读取世界状态中各个对象的Lock字段、原始值字段和最新值字段,不需要在世界状态之外读取对象的中间状态,提高了交易的执行效率。在一个例子中,扩展字段还包括用于指示存在标识字段(Exi st),Exist字段用于指示账户或账户变量在跨片交易执行前是否已存在。可以利用该Exist字段确定账户或账户变量是否是通过执行跨片交易而建立的。进而可根据该Exi st字段确定,当对应的跨片交易回滚时,是否需要删除该账户或账户变量,从而保证状态树或存储树中保存的账户或账户变量在回滚前后的一致性。
图5示出本说明书一实施例中的一种区块链状态树或存储树中的账户或账户变量的结构的示意图。如图5所示,例如,在状态树的节点-账户A的值中,可以包括Lock字段、Exist字段、CurrentValue字段和OriginValue字段。例如,在存储树的节点-变量a的值中,可以包括字段Lock字段、Exist字段、CurrentValue字段和OriginValue字段。
下面进一步详细叙述本说明书实施例提供的在区块链系统中执行交易的方法。图6是本说明书一实施例中的一种在区块链系统中执行交易的方法的流程图。该区块链系统包括至少两个分片,至少两个分片中包括第一分片,该方法由第一分片的区块链节点执行,第一分片中设有状态数据库,状态数据库存储有多个对象的状态数据,每个对象的状态数据中至少包括当前值字段、原始值字段和锁字段。如图6所示,该方法至少包括如下步骤:
步骤S601,响应于第一交易中对于第一分片中的第一对象的写入操作,从所述状态数据库中读取所述第一对象的第一锁字段,其中,所述第一交易为跨片交易;
步骤S603,若所述第一锁字段的值指示所述第一对象未被锁定,将所述第一锁字段的值更新为所述第一交易的标识,以用于指示所述第一对象被锁定,将所述第一对象的第一原始值字段的值更新为所述第一对象的第一当前值字段的当前值,将所述第一对象的第一当前值字段的值更新为所述写入操作对应的写入值。
首先,在步骤S601,响应于第一交易中对于第一分片中的第一对象的写入操作,从所述状态数据库中读取所述第一对象的第一锁字段。
该步骤中,第一交易为跨片交易。当执行该跨片交易中对于第一分片中账户或账户变量的写入时,确定账户或账户变量是否已经被锁定。
跨片交易,是其执行中,可以对于多个分片中的账户(或其变量)进行操作的交易。根据不同的实施方式,第一交易可以是不同的具体交易。在一个例子中,第一交易例如可以是跨片的转账交易。在另一个例子中,第一交易也可以是跨片的创建/调用合约的交易。以对于两个分片(分别为源分片和目标分片)的账户或其变量进行操作的跨片交易为例,客户端例如可以向与多个分片中的源分片包含的节点发起跨片交易请求。源分片中可以执行跨片交易包括的对于本分片的账户或变量的操作,生成待由目标分片执行的跨片操作(例如包括对目标分片上的账户或变量的操作)的信息以发送给目标分片,目标分片在执行跨片操作后向源分片返回操作执行结果。在源分片和目标分片均成功执行其本分片上的操作后,跨片交易才可以执行成功。在不同的例子中,源分片在执行跨片交易时,可以向多个目标分片发送了多个跨片操作信息,在源分片和多个目标分片上的交易操作均成功后,跨片交易才可以执行成功。
需要注意的是,第一分片并不限定必须为初始接收交易请求的源分片,也可以是接收源分片转发跨片操作的目标分片。也就是说,根据不同的实施方式,第一分片可以是源分片,也可以是目标分片。
状态数据库中存储的对象可以是不同的具体对象。在一个例子中,例如可以包括区块链账户或区块链账户中的变量。在一种实施方式中,可以在账户或账号变量的值中设置扩展的锁字段,用于标识账户或账号变量是否被锁。在一种具体的实施方式中,第一对象还可以包括锁字段;可以通过确定锁字段是否不为预设的第一值,确定第一对象是否已被设置锁。在不同的实施方式中,第一值可以是不同的具体值。在一种实施方式中,第一值可以为零。在本说明书中,除特别指示之外,在账户或账号变量的值中设置的扩展字段(或简称在账户或账号变量中设置的扩展字段、账户或账号变量包含的扩展字段),均指在状态树或存储树中账户或账号变量对应的键-值(Key-Value)对中的值(Value)中设置的扩展字段。
在一些场景中,对于写入操作指向的目标账户或变量进行写入操作前,该目标账户或变量未必存在。在此情况下,写入操作可以直接构建目标账户或变量。为了便于例如在交易失败的情况下对于目标账户或变量的状态的回滚,可以在状态树中目标账户或变量对应的值中设置扩展的存在标识字段,用于记录该目标账户或变量在第一交易之前是否存在。因此,在一种实施方式中,状态树中还可以包括第一对象的存在标识字段。可以响应于第一交易中对于第一分片中的第一对象的写入操作,确定在所述写入操作前所述状态数据库中是否已创建所述第一对象的状态数据,其意义在于确定在所述写入操作前是否所述第一对象是否已存在(而其实际效果等同于确定在所述第一交易前第一对象是否已存在)。若在所述写入操作前第一对象的状态数据已存在,则读取所述第一对象的第一锁字段。在一种实施方式中,可以通过在写入操作前从状态树中读取第一对象,确定写入操作前第一对象是否已存在。在一个例子中,如果在写入操作前读取不到第一对象,则可以确定写入操作前第一对象不存在。反之,则第一对象在写入操作前存在。
如前所述,当写入操作的目标账户或变量不存在时,可以构建该目标账户或变量,并在该目标账户或变量的值中设置存在标识字段,将存在标识字段设置为否,用于表示该目标账户或变量在第一交易前不存在。在另一个实施方式中,若在所述写入操作前第一对象的状态数据未创建,在状态数据库中创建第一对象的状态数据,并将第一对象的存在标识字段设置为指示在所述写入操作前所述第一对象不存在,将所述第一对象的第一当前值字段的值设置为所述写入操作对应的写入值,将第一对象的第一锁字段的值设置为所述第一交易的标识。
如果步骤S601中读取的第一锁字段的值指示所述第一对象未被锁定,则在步骤S603,将所述第一锁字段的值更新为所述第一交易的标识,以用于指示所述第一对象被锁定,将所述第一对象的第一原始值字段的值更新为所述第一对象的第一当前值字段的当前值,将所述第一对象的第一当前值字段的值更新为所述写入操作对应的写入值。在不同的实施方式中,第一交易的标识可以具有不同的具体形式。在一种实施方式中,第一交易的标识可以为第一交易的哈希值。
如果确定锁定第一对象的交易为第一交易,则可以将写入操作对应的写入值写入第一对象的当前值字段。因此,在一种实施方式中,如果步骤S601中读取的第一锁字段的值指示为所述第一交易的标识,则将所述第一当前值字段的值设置为所述写入操作对应的写入值。
如果确定锁定第一对象的交易不为第一交易,即第一对象已被其他交易锁定,因执行第一交易中对于第一对象的写入不能成功。因此,在一种实施方式中,如果步骤S601中读取的第一锁字段的值为第二交易的标识,则针对写入操作返回第一操作执行失败结果。在一个例子中,第一操作执行失败结果可以导致第一交易执行失败。
在一些区块链交易场景中,账户或账户变量的值可以在跨片交易中用于逻辑判断。例如,在调用合约的跨链交易Tx1的执行中,根据分片S1中变量v1的值是否大于预设值,确定对于分片S2中变量v2或v3进行操作。如果在Tx1执行中对于v1的读取后但对v2或v3交易并未操作之前,另一个交易Tx2修改了v1的值,例如将v1的值从小于该预设值修改为大于该预设值。这样,在Tx1的执行中v1并不唯一,先后具有两个值,且两个值分别指向对于S2中不同变量的操作。从而S2中实际操作结果与期望中对应的S1中实际状态并不一致,即Tx1的执行逻辑可以发生错误。为了避免上述问题,还可以在跨片交易读取账户或账户变量的值时,对读取账户或账户变进行锁定。在一个实施方式中,账户或其变量读取操作时的锁定可以具体通过如图7中所示的步骤S607~S609进行,具体如下:
在步骤S607,响应于第一交易中对于第一分片中的第一对象的读取操作,从所述状态数据库中读取所述第一对象的第一锁字段。
该步骤中,在执行第一交易中对于账户或账户变量的读取操作时,确定账户或账户变量是否已被设置锁。确定账户或账户变量是否已被设置锁的具体方式,与步骤S601中类似,参见对于步骤S601的描述,不再赘述。
如果步骤S607中读取的第一锁字段的值指示所述第一对象未被锁定,则可以在步骤S609中,将所述第一锁字段的值更新为所述第一交易的标识,将所述第一对象的第一原始值字段的值更新为所述第一对象的第一当前值字段的当前值,并针对所述读取操作返回第一当前值字段的当前值。也就是说,若确定读取的账户或账户变量未被锁定,则可以用第一交易将其锁定。并将该账户或账户变量原始值字段的值设置为当前值字段的值,并向读取操作返回当前值字段的值。
在一种实施方式中,可以响应于第一交易中对于第一分片中的第一对象的读取操作,确定在所述读取操作前第一对象是否已存在。确定第一对象是否已存在的具体方式,参见步骤S601中的类似处理,这里不再赘述。在一种实施方式中,若在所述读取操作前第一对象已存在,读取所述第一对象的第一锁字段。在一种实施方式中,若在所述读取操作前第一对象不存在,在状态数据库中创建第一对象的状态数据,并将第一对象的存在标识字段设置为指示在所述读取操作前所述第一对象不存在,将第一对象的第一锁字段的值设置为所述第一交易的标识,并针对所述读取操作返回原读取账户不存在结果。
根据一种实施方式,若步骤S607中读取的第一锁字段的值为第二交易的标识,则针对所述写入操作返回第二操作执行失败结果。在一个例子中,第二操作执行失败结果可以导致第一交易执行失败。
在跨片交易提交后,为了使得在该跨片交易中访问的对象(账户或变量)可以被其他交易访问,可以解除对于锁定的账户或账户的状态变量的锁。因此,根据一种实施方式,还可以响应于所述第一交易的提交,解除所述第一对象的锁。具体的,可以将所述锁字段设置为预设的第一值,用于指示该账户或账户变量未被锁定。在不同的实施方式中,第一值可以是不同的具体值,在一个例子中,例如为零。在一种实施方式中,为了减少对于状态树或存储树的存储空间的消耗,还可以在跨片交易提交后,可以将其访问的账户或状态变量的当前值字段(当前值字段可以例如表示账户变量的提交后的值本身)之外的其他扩展字段删除或设置为空。在一个例子中,例如可以将锁字段删除或设置为空,在此情况下,账户或账户变量的锁字段不存在或设置为空例如可以表示账户或账户变量未锁。在一个例子中,例如可以将存在标识字段删除或设置为空,当有新的跨链交易访问时,再添加存在标识字段并对其进行设置。在一个例子中,例如可以将原始值字段删除或设置为空,当有新的跨链交易访问时,再添加原始值字段并对其进行设置。
同理,在跨片交易例如因为失败而回滚后,可以将该跨片交易执行中对于账户或状态变量的操作进行回滚,恢复交易前账户或状态变量的状态,并解除对于锁定的账户或状态变量的锁。因此,根据一种实施方式,还可以响应于所述第一交易的回滚,将所述当前值字段的值设置为所述原始值字段的值,并将所述第一锁字段设置为第一值,用以解除所述第一对象的锁。在上述账户或账户变量的值中包括存在标识字段的实施方式中,可以响应于第一交易的回滚,读取第一对象的存在标识字段;若所述存在标识字段指示在第一交易包括的访问操作之前所述第一对象已存在,将所述第一当前值字段的值设置为所述第一原始值字段的值,并将所述第一锁字段设置为第一值。与跨片交易提交后类似,在一种实施方式中,为了减少对于状态树或存储树的存储空间的消耗,也可以在跨片交易回滚后,可以将其访问的账户或状态变量的当前值字段(当前值字段可以例如表示账户变量的提交后的值本身)之外的其他扩展字段删除或设置为空。在一个例子中,例如可以将锁字段删除或设置为空,在此情况下,账户或账户变量的锁字段不存在或设置为空例如可以表示账户或账户变量未锁。在一个例子中,例如可以将存在标识字段删除或设置为空,当有新的跨链交易访问时,再添加存在标识字段并对其进行设置。在一个例子中,例如可以将原始值字段删除或设置为空,当有新的跨链交易访问时,再添加原始值字段并对其进行设置。
综上所述,在本说明书实施例提供的执行跨链交易的方案中,在执行跨链交易中进行账户或变量访问时,通过对于状态树或存储树中账户或账户变量值中附加的锁定字段的设置,对访问的账户或账户变量进行锁定,禁止其他交易的访问;通过附加的存在标识字段记录在账户或账户变量访问前是否存在的标识,以及附加的当前值字段和原始值字段记录访问前和访问后的值。并且,在交易提交或回滚时,也可以通过对锁定字段的设置,对访问的账户或账户变量进行解锁,使得此后其他交易可以正常访问;通过存在标识字段,确定是否已经删除访问的账户或账户变量;通过,当前值字段和原始值字段,确定应保留的提交或回滚后应保留的账户或账户变量的值。从而,可以避免跨链交易中因账户访问冲突导致的错误,保证跨片交易执行的正确性。以及,在跨片交易完成或回滚时,依据状态树或存储树,快捷地确定跨片交易对应的账户或账户包含的变量的状态、以及对于账户访问的处理方式。
图8是本说明书一实施例中的一种区块链节点的架构图。该区块链节点属于包括至少两个分片的区块链系统中的第一分片,所述第一分片中设有状态数据库,所述状态数据库存储有多个对象的状态数据,每个对象的状态数据中至少包括当前值字段、原始值字段和锁字段。如图8所示,该区块链节点800至少包括:
第一响应单元801,配置为,响应于第一交易中对于第一分片中的第一对象的写入操作,从所述状态数据库中读取所述第一对象的第一锁字段,其中,所述第一交易为跨片交易;
第一更新单元802,配置为,若所述第一锁字段的值指示所述第一对象未被锁定,将所述第一锁字段的值更新为所述第一交易的标识,以用于指示所述第一对象被锁定,将所述第一对象的第一原始值字段的值更新为所述第一对象的第一当前值字段的当前值,将所述第一对象的第一当前值字段的值更新为所述写入操作对应的写入值。
在一种实施方式中,该区块链节点800,还包括:
第二响应单元,配置为,响应于第一交易中对于第一分片中的第一对象的读取操作,从所述状态数据库中读取所述第一对象的第一锁字段;
第二更新单元,配置为,若所述第一锁字段的值指示所述第一对象未被锁定,将所述第一锁字段的值更新为所述第一交易的标识,将所述第一对象的第一原始值字段的值更新为所述第一对象的第一当前值字段的当前值,并针对所述读取操作返回第一当前值字段的当前值。
在一种实施方式中,该区块链节点800,还包括:
第三响应单元,配置为,响应于所述第一交易的提交,将所述第一锁字段设置为第一值,所述第一值指示所述第一对象未被锁定。
在一种实施方式中,该区块链节点800还包括:
第四响应单元,配置为,响应于所述第一交易的回滚,将所述第一当前值字段的值设置为所述第一原始值字段的值,并将所述第一锁字段设置为第一值,所述第一值指示所述第一对象未被锁定。
本说明书实施例还提供一种计算机可读存储介质,其上存储有计算机程序,当所述计算机程序由计算机或处理器执行时,令计算机或处理器执行以上描述的方法。
本说明书实施例还提供一种区块链节点。如图9所示,该区块链节点900包括存储器901和处理器902,所述存储器901中存储有可执行代码,所述处理器902执行所述可执行代码时,实现以上描述的方法。
在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 (22)
1.一种在区块链系统中执行交易的方法,所述区块链系统包括至少两个分片,所述至少两个分片中包括第一分片,所述方法由第一分片的区块链节点执行,所述第一分片中设有状态数据库,所述状态数据库存储有多个对象的状态数据,每个对象的状态数据中至少包括当前值字段、原始值字段和锁字段,所述方法包括:
响应于第一交易中对于第一分片中的第一对象的写入操作,从所述状态数据库中读取所述第一对象的第一锁字段,其中,所述第一交易为跨片交易;
若所述第一锁字段的值指示所述第一对象未被锁定,将所述第一锁字段的值更新为所述第一交易的标识,以用于指示所述第一对象被锁定,将所述第一对象的第一原始值字段的值更新为所述第一对象的第一当前值字段的当前值,将所述第一对象的第一当前值字段的值更新为所述写入操作对应的写入值。
2.根据权利要求1所述的方法,还包括,
若所述读取的第一锁字段的值为所述第一交易的标识,则将所述第一当前值字段的值设置为所述写入操作对应的写入值。
3.根据权利要求1所述的方法,还包括,若所述读取的第一锁字段的值为第二交易的标识,则针对所述写入操作返回第一操作执行失败结果。
4.根据权利要求1所述的方法,还包括,
响应于第一交易中对于第一分片中的第一对象的读取操作,从所述状态数据库中读取所述第一对象的第一锁字段;
若所述第一锁字段的值指示所述第一对象未被锁定,将所述第一锁字段的值更新为所述第一交易的标识,将所述第一对象的第一原始值字段的值更新为所述第一对象的第一当前值字段的当前值,并针对所述读取操作返回第一当前值字段的当前值。
5.根据权利要求4所述的方法,还包括,
若所述读取的第一锁字段的值为所述第一交易的标识,则针对所述读取操作返回所述第一当前值字段的当前值。
6.根据权利要求2所述的方法,还包括,
若所述读取的第一锁字段的值为所述第二交易的标识,则针对所述写入操作返回第二操作执行失败结果。
7.根据权利要求1所述的方法,还包括,
响应于所述第一交易的提交,将所述第一锁字段设置为第一值,所述第一值指示所述第一对象未被锁定。
8.根据权利要求1所述的方法,还包括,
响应于所述第一交易的回滚,将所述第一当前值字段的值设置为所述第一原始值字段的值,并将所述第一锁字段设置为第一值,所述第一值指示所述第一对象未被锁定。
9.根据权利要求1所述的方法,其中,所述第一对象的状态数据中还包括存在标识字段;所述方法还包括:
响应于第一交易中对于第一分片中的第一对象的写入操作,确定在所述写入操作前在所述状态数据库中是否已创建所述第一对象的状态数据;
响应于第一交易中对于第一分片中的第一对象的写入操作,从所述状态数据库中读取所述第一对象的第一锁字段,包括:
若在所述写入操作前在所述状态数据库中已创建所述第一对象的状态数据,读取所述第一对象的第一锁字段。
10.根据权利要求9所述的方法,还包括,
若在所述写入操作前在所述状态数据库中未创建所述第一对象的状态数据,创建第一对象的状态数据,并将第一对象的存在标识字段设置为指示在所述写入操作前所述第一对象不存在,将所述第一对象的第一当前值字段的值设置为所述写入操作对应的写入值,将第一对象的第一锁字段的值设置为所述第一交易的标识。
11.根据权利要求2所述的方法,其中,所述第一对象的状态数据中还包括存在标识字段;所述方法还包括:
响应于第一交易中对于第一分片中的第一对象的读取操作,确定在所述读取操作前在所述状态数据库中是否已创建所述第一对象的状态数据;
响应于第一交易中对于第一分片中的第一对象的读取操作,从所述状态数据库中读取所述第一对象的第一锁字段,包括:
若在所述读取操作前在所述状态数据库中已创建所述第一对象的状态数据,读取所述第一对象的第一锁字段。
12.根据权利要求11所述的方法,还包括,
若在所述读取操作前在所述状态数据库中未创建所述第一对象的状态数据,在所述状态数据库中创建所述第一对象的状态数据,并将第一对象的存在标识字段设置为指示在所述读取操作前所述第一对象不存在,将第一对象的第一锁字段的值设置为所述第一交易的标识,并针对所述读取操作返回用于指示所述第一对象不存在的信息。
13.根据权利要求10所述的方法,其中,所述第一对象的状态数据中还包括存在标识字段;所述存在标识字段指示在第一交易包括的访问操作之前所述第一对象是否已存在;
响应于所述第一交易的回滚,将所述第一当前值字段的值设置为所述第一原始值字段的值,并将所述第一锁字段设置为第一值,所述第一值指示所述第一对象未被锁定,包括:
响应于第一交易的回滚,读取第一对象的存在标识字段;
若所述存在标识字段指示在第一交易包括的访问操作之前所述第一对象已存在,将所述第一当前值字段的值设置为所述第一原始值字段的值,并将所述第一锁字段设置为第一值。
14.根据权利要求13所述的方法,还包括:
若所述存在标识字段指示在第一交易包括的访问操作之前所述第一对象不存在,将所述第一对象的状态数据从所述状态数据库中删除。
15.根据权利要求11所述的方法,其中,所述对象包括区块链账户或区块链账户中的变量。
16.根据权利要求12所述的方法,其中,所述第一交易的标识为第一交易的哈希值。
17.一种区块链节点,属于包括至少两个分片的区块链系统中的第一分片,所述第一分片中设有状态数据库,所述状态数据库存储有多个对象的状态数据,每个对象的状态数据中至少包括当前值字段、原始值字段和锁字段,所述区块链节点包括:
第一响应单元,配置为,响应于第一交易中对于第一分片中的第一对象的写入操作,从所述状态数据库中读取所述第一对象的第一锁字段,其中,所述第一交易为跨片交易;
第一更新单元,配置为,若所述第一锁字段的值指示所述第一对象未被锁定,将所述第一锁字段的值更新为所述第一交易的标识,以用于指示所述第一对象被锁定,将所述第一对象的第一原始值字段的值更新为所述第一对象的第一当前值字段的当前值,将所述第一对象的第一当前值字段的值更新为所述写入操作对应的写入值。
18.根据权利要求17所述的区块链节点,还包括,
第二响应单元,配置为,响应于第一交易中对于第一分片中的第一对象的读取操作,从所述状态数据库中读取所述第一对象的第一锁字段;
第二更新单元,配置为,若所述第一锁字段的值指示所述第一对象未被锁定,将所述第一锁字段的值更新为所述第一交易的标识,将所述第一对象的第一原始值字段的值更新为所述第一对象的第一当前值字段的当前值,并针对所述读取操作返回第一当前值字段的当前值。
19.根据权利要求17所述的区块链节点,还包括,
第三响应单元,配置为,响应于所述第一交易的提交,将所述第一锁字段设置为第一值,所述第一值指示所述第一对象未被锁定。
20.根据权利要求17所述的区块链节点,还包括,
第四响应单元,配置为,响应于所述第一交易的回滚,将所述第一当前值字段的值设置为所述第一原始值字段的值,并将所述第一锁字段设置为第一值,所述第一值指示所述第一对象未被锁定。
21.一种计算机可读存储介质,其上存储有计算机程序,当所述计算机程序由计算机或处理器执行时,令计算机或处理器执行权利要求1-16中任一项的所述的方法。
22.一种区块链节点,包括存储器和处理器,所述存储器中存储有可执行代码,所述处理器执行所述可执行代码时,实现权利要求1-16中任一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211733445.1A CN116188160A (zh) | 2022-12-30 | 2022-12-30 | 在区块链系统中执行交易的方法和区块链节点 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211733445.1A CN116188160A (zh) | 2022-12-30 | 2022-12-30 | 在区块链系统中执行交易的方法和区块链节点 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN116188160A true CN116188160A (zh) | 2023-05-30 |
Family
ID=86450017
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202211733445.1A Pending CN116188160A (zh) | 2022-12-30 | 2022-12-30 | 在区块链系统中执行交易的方法和区块链节点 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN116188160A (zh) |
-
2022
- 2022-12-30 CN CN202211733445.1A patent/CN116188160A/zh active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110471795B (zh) | 区块链状态数据恢复方法及装置、电子设备 | |
CN110457319B (zh) | 区块链状态数据存储方法及装置、电子设备 | |
CN110347684B (zh) | 基于区块链的分级存储方法及装置、电子设备 | |
CN112257118B (zh) | 一种锁定包含分片的区块链系统中跨片事务的方法及系统 | |
CN112261163B (zh) | 一种区块链系统中的状态存储方法及区块链系统、节点 | |
CN113743941A (zh) | 一种在区块链中执行交易的方法、区块链和主节点 | |
CN112988912B (zh) | 区块链数据存储方法及装置、电子设备 | |
WO2023160083A1 (zh) | 执行交易的方法、区块链、主节点和从节点 | |
CN114706848A (zh) | 区块链数据存储、更新、读取方法及装置、电子设备 | |
CN112287032B (zh) | 一种区块链数据存储方法、装置及区块链节点 | |
CN112988909A (zh) | 区块链数据存储方法及装置、电子设备 | |
CN116303425A (zh) | 一种在区块链中创建账户的方法和区块链节点 | |
CN116188160A (zh) | 在区块链系统中执行交易的方法和区块链节点 | |
CN113641872B (zh) | 一种散列方法、装置、设备及介质 | |
CN112269423B (zh) | 一种锁定区块链系统中全局时钟的方法及区块链系统 | |
CN115098483A (zh) | 一种预执行缓存数据清理方法和区块链节点 | |
CN116484433A (zh) | 一种计算目标区块的状态根的方法和区块链节点 | |
CN112988910A (zh) | 区块链数据存储方法及装置、电子设备 | |
CN116862486A (zh) | 区块链系统中跨分片交易的处理方法和分片节点 | |
CN115982781A (zh) | 一种在区块链中创建账户的方法和区块链节点 | |
CN116186788A (zh) | 一种从区块链查询数据的方法和装置 | |
CN118861369A (zh) | 一种读取树结构的世界状态的方法及计算机设备 | |
CN118797106A (zh) | 一种构建基于树结构的世界状态的方法及计算机设备 | |
CN113641871B (zh) | 一种无锁散列方法、装置、设备及介质 | |
CN118797105A (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 |