在区块链中执行智能合约的方法和装置与流程

文档序号:23093082发布日期:2020-11-27 12:48阅读:179来源:国知局
在区块链中执行智能合约的方法和装置与流程

本说明书实施例涉及区块链技术领域,更具体地,涉及一种在区块链中执行智能合约的方法和装置。



背景技术:

区块链技术是构建在点对点(p2p)网络上,利用链式数据结构来验证与存储数据,利用分布式节点共识算法来生成和更新数据,利用密码学的方式保证数据传输和访问的安全,利用由自动化脚本代码组成的智能合约来编程和操作数据的一种全新的分布式基础架构与计算范式。在区块链中,通过发送交易并使得由节点执行该交易,从而产生区块链中的共识数据。所述交易中可能包括对智能合约的调用,从而,在执行该交易时,通过执行智能合约而产生对世界状态的改变,所述世界状态例如包括账户余额、智能合约的存储变量等。另外,在交易中调用的合约a可能调用合约b,如果合约b执行失败,合约a需要回滚在执行合约b时进行的对世界状态的修改,否则会影响世界状态的正确性。在现有技术中,为了解决上述问题,当执行合约a中调用的合约b时,相对于合约b复制一份世界状态副本,其中,该世界状态副本中包括合约b中出现的全部存储变量的键值对,仅当合约b执行成功时,才将世界状态副本更新到世界状态中,如果合约b执行失败,则丢弃世界状态副本。在该方法中,合约b对应的世界状态副本中需要包括合约b中出现的全部存储变量的键值对,数据量较大。

因此,需要一种更有效的执行智能合约的方案。



技术实现要素:

本说明书实施例旨在提供一种更有效的执行智能合约的方案,以解决现有技术中的不足。

为实现上述目的,本说明书一个方面提供一种在区块链中执行智能合约的方法,所述方法包括:

在开始执行交易中调用的第一智能合约之后,在与所述交易对应的存储空间中分配与所述第一智能合约对应的第一子空间;

在根据所述第一智能合约对第一变量进行修改之前,读取第一变量的当前状态值作为所述第一变量的第一值;

将所述第一变量的第一值存入所述第一子空间;

根据所述第一智能合约修改所述第一变量的状态值;

在对所述第一智能合约执行结束之后,读取并删除所述第一子空间,以获取所述第一变量的第一值;

在对所述第一智能合约执行失败的情况中,将所述第一变量的状态值恢复为所述第一值。

在一种实施方式中,所述第一子空间用于指示所述第一智能合约在所述交易中的调用顺序,

读取并删除所述第一子空间包括,基于所述存储空间中的各个子空间指示的对应的智能合约的调用顺序,读取并删除当前最晚分配的子空间。

在一种实施方式中,将所述第一变量的第一值存入所述第一子空间包括,将所述第一变量的第一键值对存入所述第一子空间,所述第一键值对中包括所述第一值。

在一种实施方式中,所述交易中调用第二智能合约,所述第二智能合约中调用所述第一智能合约,在与所述交易对应的存储空间中还包括与所述第二智能合约对应的第二子空间,所述方法还包括,在对所述第一智能合约执行成功的情况中,将所述第一变量的第一值以预定顺序加入所述第二子空间中。

在一种实施方式中,所述第一智能合约中调用第三智能合约,所述第三智能合约中包括对所述第一变量的修改,读取并删除所述第一子空间,以获取所述第一变量的第一值包括,从所述第一子空间中读取第一变量的至少两个值,基于所述至少两个值在所述第一子空间中的排列顺序,从所述至少两个值中获取最早存入的值。

在一种实施方式中,所述第三智能合约中包括对第二变量的修改,读取并删除所述第一子空间还包括,读取并删除所述第一子空间,以获取所述第二变量的第一值,所述方法还包括,在对所述第一智能合约执行失败的情况中,在所述状态数据库中将所述第二变量的状态值恢复为所述第二变量的第一值。

在一种实施方式中,所述存储空间为顺序表,其中,在与所述交易对应的存储空间中分配与所述第一智能合约对应的第一子空间包括,在所述顺序表中分配相对于其它表元素顺序排列的第一表元素,

读取并删除当前最晚分配的子空间包括,基于所述顺序表中各个表元素的排列顺序,读取并删除当前最晚分配的表元素。

在一种实施方式中,所述存储空间为栈,其中,在与所述交易对应的存储空间中分配与所述第一智能合约对应的第一子空间包括,在所述栈中入栈第一元素作为栈顶元素,

读取并删除当前最晚分配的子空间包括,读取并删除所述栈的当前栈顶元素。

在一种实施方式中,所述第一变量为所述区块链的账户余额或者为所述第一智能合约中包括的存储变量。

在一种实施方式中,读取第一变量的当前状态值作为所述第一变量的第一值包括,从内存中读取第一变量的当前状态值作为所述第一变量的第一值,根据所述第一智能合约修改所述第一变量的状态值包括,根据所述第一智能合约在内存中修改所述第一变量的状态值。

本说明书另一方面提供一种在区块链中执行智能合约的装置,所述装置包括:

分配单元,配置为,在开始执行交易中调用的第一智能合约之后,在与所述交易对应的存储空间中分配与所述第一智能合约对应的第一子空间;

读取单元,配置为,在根据所述第一智能合约对第一变量进行修改之前,读取第一变量的当前状态值作为所述第一变量的第一值;

存入单元,配置为,将所述第一变量的第一值存入所述第一子空间;

修改单元,配置为,根据所述第一智能合约修改所述第一变量的状态值;

读取和删除单元,配置为,在对所述第一智能合约执行结束之后,读取并删除所述第一子空间,以获取所述第一变量的第一值;

第一恢复单元,配置为,在对所述第一智能合约执行失败的情况中,将所述第一变量的状态值恢复为所述第一值。

在一种实施方式中,所述第一子空间用于指示所述第一智能合约在所述交易中的调用顺序,

所述读取和删除单元还配置为,基于所述存储空间中的各个子空间指示的对应的智能合约的调用顺序,读取并删除当前最晚分配的子空间。

在一种实施方式中,所述存入单元还配置为,将所述第一变量的第一键值对存入所述第一子空间,所述第一键值对中包括所述第一值。

在一种实施方式中,所述交易中调用第二智能合约,所述第二智能合约中调用所述第一智能合约,在与所述交易对应的存储空间中还包括与所述第二智能合约对应的第二子空间,所述装置还包括,加入单元,配置为,在对所述第一智能合约执行成功的情况中,将所述第一变量的第一值以预定顺序加入所述第二子空间中。

在一种实施方式中,所述第一智能合约中调用第三智能合约,所述第三智能合约中包括对所述第一变量的修改,所述读取和删除单元包括,读取子单元,配置为,从所述第一子空间中读取第一变量的至少两个值,获取子单元,配置为,基于所述至少两个值在所述第一子空间中的排列顺序,从所述至少两个值中获取最早存入的值。

在一种实施方式中,所述第三智能合约中包括对第二变量的修改,所述读取和删除单元还配置为,读取并删除所述第一子空间,以获取所述第二变量的第一值,所述装置还包括,第二恢复单元,配置为,在对所述第一智能合约执行失败的情况中,在所述状态数据库中将所述第二变量的状态值恢复为所述第二变量的第一值。

在一种实施方式中,所述存储空间为顺序表,其中,所述分配单元还配置为,在所述顺序表中分配相对于其它表元素顺序排列的第一表元素,

所述读取和删除单元还配置为,基于所述顺序表中各个表元素的排列顺序,读取并删除当前最晚分配的表元素。

在一种实施方式中,所述存储空间为栈,其中,所述分配单元还配置为,在所述栈中入栈第一元素作为栈顶元素,

所述读取和删除单元还配置为,读取并删除所述栈的当前栈顶元素。

在一种实施方式中,所述第一变量为所述区块链的账户余额或者为所述第一智能合约中包括的存储变量。

在一种实施方式中,所述读取单元还配置为,从内存中读取第一变量的当前状态值作为所述第一变量的第一值,所述修改单元还配置为,根据所述第一智能合约在内存中修改所述第一变量的状态值。

本说明书另一方面提供一种计算机可读存储介质,其上存储有计算机程序,当所述计算机程序在计算机中执行时,令计算机执行上述任一项方法。

本说明书另一方面提供一种计算设备,包括存储器和处理器,所述存储器中存储有可执行代码,所述处理器执行所述可执行代码时,实现上述任一项方法。

通过根据本说明书实施例的执行智能合约的方案,使用栈等数据结构来指示交易中合约的调用层次,使用栈元素存放在执行该合约修改变量前该变量的值,当合约调用失败的情况中,可根据栈顶元素回滚世界状态,从而提高了执行合约的效率,提高了区块链的性能。

附图说明

通过结合附图描述本说明书实施例,可以使得本说明书实施例更加清楚:

图1是在区块链100中执行智能合约的过程示意图;

图2示出根据本说明书实施例的一种在区块链中执行智能合约的方法流程图;

图3示出了节点1中执行交易1中的合约a的过程示意图;

图4示出在执行合约b之后在节点1的内存12中存储的数据示意图;

图5示出在执行合约c之后在节点1的内存12中存储的数据示意图;

图6示意示出在进行该追加之后的栈121的示意图;

图7示出根据本说明书实施例的一种在区块链中执行智能合约的装置700。

具体实施方式

下面将结合附图描述本说明书实施例。

图1是在区块链100中执行智能合约的过程示意图。如图1中所示,区块链100包括多个相互连接的节点,其中例如包括节点1和节点2。假定节点2对应的用户alice想要调用区块链100中已经部署的智能合约(如图1中的合约postingdata),那么节点2可以向区块链100中任一节点发起一笔交易(tx),进行合约调用。

具体而言,在交易内容中,from字段可以是调用者alice的账户地址,to字段即为上述postingdata合约的合约地址0x6f…,表示该交易所调用的智能合约。在data字段,包含要调用的合约中的方法或函数名称(set)和传入的参数(“绿色公益”)。

区块链中的记账节点在接收到上述交易之后将该交易打包到区块中,并在对该区块进行共识之后,将该区块发送给区块链中的其他节点。区块链100中的其他节点在接收到该区块之后,执行该区块中的每个交易,在内存中分配与该区块对应的存储空间,用于存储区块中各个交易包括的多个变量的世界状态,并在对该区块中的全部交易执行完成之后,将所述多个变量的世界状态更新到账户状态数据库11中,并删除在内存中分配的与该区块对应的存储空间。虽然在上文描述了在执行区块的交易中,在内存中缓存变量的世界状态,并在区块中的全部交易执行完成之后再将变量的世界状态更新到账户状态数据库,本说明书实施例不限于此。例如,在本说明书实施例中,也可以在执行完每个交易之后将变量的状态值更新到账户状态数据库中。

图1中示出了节点1中的账户状态数据库11,该账户状态数据库11例如以mpt(merklepatriciatrie)状态树的形式来记录区块链中各个账户的世界状态。其中,mpt状态树以树状结构存储账户和账户数据的对应关系,树中的节点通过哈希进行连接,即基于子节点生成哈希值,存储在父节点中。在mpt树中,除了根节点之外,每个节点与至少一个字符相对应,从根节点到特定节点的路径上的字符连续拼接即为该特定节点对应的账户的账户地址,该特定节点中存储的内容为该特定节点对应的账户的账户状态或账户内容(或者世界状态)。以太坊区块链中的账户可以包括外部账户和合约账户,其中外部账户为用户的账户。外部账户的账户状态中例如包括账户余额,合约账户的账户状态中例如包括账户余额、合约中的存储变量的值等数据,这些数据都以键值对的形式记录在mpt状态树中。

例如,区块链100中的节点1在执行上述交易时,执行set函数,从而在内存中将智能合约postingdata的账户状态中的存储变量postdata值修改为“绿色公益”,即修改了内存中记录的存储变量postdata的世界状态。而内内存中记录的存储变量postdata的世界状态将在执行完成区块中的全部交易之后更新到账户状态数据库11。

而在实际执行交易中的智能合约时,可能存在合约执行失败的情况。例如,以下任一种情况都可能引起合约执行失败:用于执行交易的燃料(gas)余额不足、合约中存在非法指令、对存储单元的读写失败、虚拟机堆栈溢出、虚拟机内存溢出、转账失败、对合约的读取失败等等。在合约执行失败的情况中,为了保证内存中记录的世界状态的正确性,需要将在执行该合约过程中修改的内存中的世界状态回滚,即恢复到修改之前的值。

为此,本说明书实施例提出一种高效地在合约执行失败的情况中回滚世界状态的方法,在该方法中,通过以分配给交易的存储空间中的顺序排列的多个子空间来记录交易中调用的多层智能合约分别对应的部分初始世界状态。所述存储空间例如为栈,其中,当前执行的合约例如对应于栈中的栈顶元素。从而在其中任一层智能合约执行失败时,可基于该栈中的栈顶元素中记录的初始世界状态来回滚世界状态,从而提高了执行智能合约的性能。

下面将详细描述根据本说明书实施例的执行智能合约的方案。

图2示出根据本说明书实施例的一种在区块链中执行智能合约的方法流程图,所述方法包括:

在步骤s202,在开始执行交易中调用的智能合约之后,在与所述交易对应的栈中入栈新元素;

在步骤s204,在根据所述智能合约对变量进行修改之前,读取变量的当前状态值作为变量的第一值;

在步骤s206,将所述变量的第一值存入所述栈的栈顶元素中;

在步骤s208,根据所述智能合约修改所述变量的状态值;

在步骤s210,在对所述智能合约执行结束之后,读取并删除栈顶元素,以获取所述变量的第一值;

在步骤s212,在对所述智能合约执行失败的情况中,将所述变量的值恢复为所述变量的第一值;

在步骤s214,在对所述智能合约执行成功的情况中,如果所述智能合约为其它智能合约中调用的合约,则将所述变量的第一值加到栈的当前的栈顶元素中。

下文中将通过执行交易1的实例来描述图2所示方法。假设交易1中调用合约a,合约a中调用合约b,合约b中调用合约c,即交易1中包括对智能合约的多层调用。图3示出了节点1中执行交易1中的合约a的过程示意图。如图3所示,节点1中包括状态数据库11和内存12,状态数据库11存储在节点1中的持久性介质中。如上文所述,状态数据库11中存储了区块链中的多个变量的键值对,例如包括(k1:v1)、(k2:v2)、(k3:v3)等等,在开始执行交易1之后,节点1(即节点1的节点设备)在内存12对交易1分配栈121,以用于执行图2所示方法,在初始,如图3顶部框中所示,栈121中为空栈,即其中未入栈任何栈元素。

当执行到交易1中的合约a时,执行步骤s202,如图3中第2个框所示,在栈121中入栈一个新的元素。该新入栈的元素当前为栈121的栈顶元素,该栈顶元素与合约a相对应。

合约a中例如包括写指令“setk1,va”,该指令用于在状态数据库11中对变量k1写入值va。当执行到合约a中的写指令“setk1,va”之后,首先,如图3中的第3个框所示,执行步骤s204,读取变量k1的当前状态值。节点1可首先确定内存中与交易1所在的区块对应的存储空间122中是否存储有变量k1的状态值,假设在交易1所在的区块中在交易1的合约a中首次出现对变量k1的值的更改,因此,在节点1的内存中的存储空间122中尚未存储变量k1的状态值。从而,节点1在确定内存中未缓存变量k1的状态值之后,可从状态数据库11中读取变量k1的键值对(k1:v1),从而获取变量k1的当前状态值v1。

然后执行步骤s206,将变量k1的键值对(k1:v1)存入栈121的栈顶元素中。也就是说,在对变量k1的状态值进行修改之前,将该修改之前的变量k1的键值对保存到栈121中的合约a对应的栈元素(即当前的栈顶元素)中,以在后续合约a执行失败时进行变量值的回滚。

之后,如图3中的底部框所示,执行步骤s208,在内存中存储根据合约a修改之后的变量k1的状态值,即va。该变量k1的当前状态值暂时存储在内存中,并在区块中的全部交易完成之后再更新到状态数据库11中。

在执行合约a中的上述过程之后,由于合约a中调用合约b,因此在节点1中开始执行合约b,当开始执行合约b之后,与上文类似地,首先执行步骤s202,在栈121中入栈一个新元素,即当前的栈顶元素与合约b相对应。假设合约b中顺序包括对变量k1的写指令“setk1,vb”和对变量k2的写指令“setk2,vc”,当执行到写指令“setk1,vb”时,与上文类似地,执行步骤s204,读取变量k1的当前状态值。节点1首先确定内存中是否缓存了变量k1的状态值,由于在前述执行合约a的过程中,将变量k1的更新的状态值(即(k1:va))缓存到了内存中,从而,节点1可内存中读取变量k1的状态值va。在步骤s206,节点1将从内存读取的变量k1的键值对(k1:va)存入栈121的栈顶元素中,之后才执行步骤s208,根据合约b中的写指令“setk1,vb”将内存中的变量k1的状态值修改为vb。当执行到写指令setk2,vc时,类似地,读取变量k2的当前状态值(即v2),将变量k2的键值对(k2:v2)存入栈121的栈顶元素中,之后才将根据指令“setk2,vc”更新的变量k2的状态值(即vc)存入内存中的存储空间122中。图4示出在执行合约b之后节点1的内存12中存储的数据示意图。如图4所示,在执行合约b之后,在内存12的存储空间122中将变量k1的值更新为vb,将变量k2的值更新为vc,同时,在内存12中的栈121中,相比于图3增加了与合约b对应的栈顶元素,该元素中存储了在执行合约b之前的k1和k2的键值对(即世界状态)。

在执行合约b中的上述过程之后,由于合约b中调用合约c,从而开始执行合约c,当开始执行合约c之后,与上文类似地,首先在栈121中入栈一个新元素,即当前的栈顶元素与合约c相对应。假设合约c中顺序包括对变量k2的写指令“setk2,vd”和对变量k3的写指令“setk3,ve”,当执行到写指令“setk2,vd”时,与上文类似地,从内存12中的存储空间122中读取k2的键值对(即(k2:vc)),将该键值对存入栈121的栈顶元素中,之后才将存储空间122中的变量k2的状态值修改为vd。当执行到写指令“setk3,ve”时,类似地,读取变量k3的当前状态值(即v3),其中,与上文类似地,如果在之前执行该区块中的交易时已经在存储空间122中存储了变量k3的状态值,则从存储空间122中读取,如果存储空间122中未存储变量k3的状态值,则可从状态数据库11中读取变量k3的状态值。之后,将变量k3的键值对(k3:v3)存入栈121的栈顶元素中,并且在存储空间122中存储变量k3修改后的状态值ve。图5示出在执行合约c之后在节点1的内存12中存储的数据示意图。如图5所示,在执行合约c之后,将存储空间122中的变量k2的状态值更新为vd,将变量k3的状态值存储为ve,同时,在内存12中的栈121中,相比于图4增加了与合约c对应的栈顶元素,该元素中存储了在执行合约c之前的k2和k3的键值对。

在执行合约c的上述过程之后,由于合约c中没有继续调用其它合约,从而对合约c的执行结束,在该情况中,执行图2中的步骤s210,读取栈121的栈顶元素,并删除该栈顶元素。在执行合约c的过程中,可能由于以下任一种情况引起对合约c执行失败:用于执行交易的燃料(gas)余额不足、合约中存在非法指令、对存储单元的读写失败、虚拟机堆栈溢出、虚拟机内存溢出、转账失败、对合约的读取失败等等,在对合约c执行失败的情况中,同样地,结束对合约c的执行,读取并删除栈121的栈顶元素。

在对合约c的执行失败的情况中,执行图2中的步骤s212,在存储空间122中回滚合约c修改的变量(即变量k2和k3)的状态值,具体是,将上述从之前的栈顶元素读取的键值对(即图5中的栈顶元素)恢复到存储空间122中,即将变量k2从vd回滚为vc,将变量k3从ve回滚到v1。

在对合约c执行成功的情况中,执行图2中的步骤s214。具体是,在一种实施方式中,可将图5中的栈顶元素中的数据追加到当前的栈顶元素中。图6示意示出在进行该追加之后的栈121的示意图。如图6所示,栈121的当前栈顶元素根据交易1中的合约调用顺序与合约b相对应,并且合约b对应的初始世界状态中包括变量k1、k2和k3的值。也就是说,尽管合约b中未直接对变量k3进行写入,由于合约b调用的合约c对变量k3进行了写入,如果合约b执行失败,在回滚存储空间122中的变量世界状态时,也需要将合约c修改的变量k3恢复为修改前的值(即v3),因此,需要将合约c修改的变量的初始世界状态合并到合约b对应的初始世界状态中。

另外,如图6所示,在栈顶元素中包括顺序排列的变量k2的两个键值对,其排列顺序表示了其对应时间顺序,也就是说,排在前面的(k2:v2)是变量k2较早的世界状态,排在后面的(k2:vc)是变量k2较晚的世界状态,因此,如果合约b执行失败,将存储空间122中的变量k2的值恢复为最早的世界状态,即v2。

在另一种实施方式中,当将合约c对应的初始世界状态追加到合约b对应的初始世界状态时,可仅增加在合约b对应的初始世界状态中未出现的变量,即,仅将(k3:v3)增加到栈顶元素,而不需要将(k2:vc)增加到栈顶元素。

在对合约b执行结束之后,可与上文类似地进行对栈顶元素及存储空间122中的变量世界状态的处理。在对合约a的执行结束之后,可结束对交易1的执行,从而可从内存12中删除栈121。

可以理解,虽然上文中以栈式数据结构进行了对根据本说明书实施例的方案进行了描述,本说明书实施例不限于此。例如,在一种实施方式中,可在本说明书实施例中使用顺序表(如链表、向量表)等数据结构来顺序记录交易中顺序调用的各个合约修改的变量的初始世界状态。该顺序表例如包括多个顺序排列的表元素,所述多个表元素与交易1中已经执行的合约一一对应,并且所述多个表元素的排列顺序与交易1中调用合约的顺序相对应,从而可根据顺序表中的多个表元素的排列顺序确定各个表元素对应的合约。

在另一种实施方式中,在执行交易1之后,可在内存中分配与交易1对应的存储空间。在执行交易1中顺序调用的合约时,例如首先执行合约a,对合约a分配子空间1,并通过预定标识来标识子空间1与合约a相对应。例如,在子空间1中首先存入合约a的地址或者地址哈希值等标识来标识子空间1与合约a相对应,从而后续在对合约a执行结束之后,可根据各个子空间中的合约标识来找到与合约a对应的子空间,并进行相应的操作。

在另一种实施方式中,上述预定标识例如为以大小顺序排列的数字,例如对合约a分配的子空间的标识为1,对合约b分配的子空间的标识为2,对合约c分配的子空间的标识为3,从而可根据数字的大小顺序来确定各个子空间与各个合约的对应关系。

图7示出根据本说明书实施例的一种在区块链中执行智能合约的装置700,所述装置700包括:

分配单元71,配置为,在开始执行交易中调用的第一智能合约之后,在与所述交易对应的存储空间中分配与所述第一智能合约对应的第一子空间;

读取单元72,配置为,在根据所述第一智能合约对第一变量进行修改之前,读取第一变量的当前状态值作为所述第一变量的第一值;

存入单元73,配置为,将所述第一变量的第一值存入所述第一子空间;

修改单元74,配置为,根据所述第一智能合约修改所述第一变量的状态值;

读取和删除单元75,配置为,在对所述第一智能合约执行结束之后,读取并删除所述第一子空间,以获取所述第一变量的第一值;

第一恢复单元76,配置为,在对所述第一智能合约执行失败的情况中,将所述第一变量的状态值恢复为所述第一值。

在一种实施方式中,所述第一子空间用于指示所述第一智能合约在所述交易中的调用顺序,

所述读取和删除单元75还配置为,基于所述存储空间中的各个子空间指示的对应的智能合约的调用顺序,读取并删除当前最晚分配的子空间。

在一种实施方式中,所述存入单元73还配置为,将所述第一变量的第一键值对存入所述第一子空间,所述第一键值对中包括所述第一值。

在一种实施方式中,所述交易中调用第二智能合约,所述第二智能合约中调用所述第一智能合约,在与所述交易对应的存储空间中还包括与所述第二智能合约对应的第二子空间,所述装置700还包括,加入单元77,配置为,在对所述第一智能合约执行成功的情况中,将所述第一变量的第一值以预定顺序加入所述第二子空间中。

在一种实施方式中,所述第一智能合约中调用第三智能合约,所述第三智能合约中包括对所述第一变量的修改,所述读取和删除单元75包括,读取子单元751,配置为,从所述第一子空间中读取第一变量的至少两个值,获取子单元752,配置为,基于所述至少两个值在所述第一子空间中的排列顺序,从所述至少两个值中获取最早存入的值。

在一种实施方式中,所述第三智能合约中包括对第二变量的修改,所述读取和删除单元75还配置为,读取并删除所述第一子空间,以获取所述第二变量的第一值,所述装置700还包括,第二恢复单元78,配置为,在对所述第一智能合约执行失败的情况中,在所述状态数据库中将所述第二变量的状态值恢复为所述第二变量的第一值。

在一种实施方式中,所述存储空间为顺序表,其中,所述分配单元71还配置为,在所述顺序表中分配相对于其它表元素顺序排列的第一表元素,

所述读取和删除单元75还配置为,基于所述顺序表中各个表元素的排列顺序,读取并删除当前最晚分配的表元素。

在一种实施方式中,所述存储空间为栈,其中,所述分配单元71还配置为,在所述栈中入栈第一元素作为栈顶元素,

所述读取和删除单元75还配置为,读取并删除所述栈的当前栈顶元素。

在一种实施方式中,所述读取单元72还配置为,从内存中读取第一变量的当前状态值作为所述第一变量的第一值,所述修改单元74还配置为,根据所述第一智能合约在内存中修改所述第一变量的状态值。

本说明书另一方面提供一种计算机可读存储介质,其上存储有计算机程序,当所述计算机程序在计算机中执行时,令计算机执行上述任一项方法。

本说明书另一方面提供一种计算设备,包括存储器和处理器,所述存储器中存储有可执行代码,所述处理器执行所述可执行代码时,实现上述任一项方法。

通过根据本说明书实施例的执行智能合约的方案,使用栈等数据结构来指示交易中合约的调用层次,使用栈元素存放在执行该合约修改变量前该变量的值,当合约调用失败的情况中,可根据栈顶元素回滚世界状态,从而提高了执行合约的效率,提高了区块链的性能。

需要理解,本文中的“第一”,“第二”等描述,仅仅为了描述的简单而对相似概念进行区分,并不具有其他限定作用。

本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于系统实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。

上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。

本领域普通技术人员应该还可以进一步意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。本领域普通技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本申请的范围。其中,软件模块可以置于随机存储器(ram)、内存、只读存储器(rom)、电可编程rom、电可擦除可编程rom、寄存器、硬盘、可移动磁盘、cd-rom、或技术领域内所公知的任意其它形式的存储介质中。

以上所述的具体实施方式,对本发明的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施方式而已,并不用于限定本发明的保护范围,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1