区块链中智能合约的执行方法及装置和电子设备与流程

文档序号:24048991发布日期:2021-02-23 20:08阅读:126来源:国知局
区块链中智能合约的执行方法及装置和电子设备与流程

[0001]
本说明书一个或多个实施例涉及区块链技术领域,尤其涉及一种区块链中智能合约的执行方法及装置和电子设备。


背景技术:

[0002]
区块链技术,也被称之为分布式账本技术,是一种由若干台计算设备共同参与“记账”,共同维护一份完整的分布式数据库的新兴技术。由于区块链技术具有去中心化、公开透明、每台计算设备可以参与数据库记录、并且各计算设备之间可以快速的进行数据同步的特性,使得区块链技术已在众多的领域中广泛的进行应用。


技术实现要素:

[0003]
本说明书实施例提供的一种区块链中智能合约的创建、升级、执行方法及装置和电子设备。
[0004]
根据本说明书实施例的第一方面,提供一种区块链中智能合约的执行方法,所述方法包括:
[0005]
接收用户提交的第一交易;其中,所述第一交易携带有业务执行所需调用的逻辑合约的第一合约地址;
[0006]
响应于所述第一交易,调用所述第一合约地址对应的逻辑合约,获取所述逻辑合约对应的合约账户中维护的业务逻辑;
[0007]
确定执行所述业务逻辑缺少的状态数据的字段名称;
[0008]
调用所述区块链的路由合约,查询所述路由合约对应的合约账户中维护的映射表中所述第一合约地址映射的第二合约地址;
[0009]
调用所述第二合约地址对应的数据合约,获取所述数据合约对应的合约账户中维护的所述字段名称的状态数据;
[0010]
将所述状态数据补充到所述业务逻辑中缺少的状态数据,以执行所述业务逻辑。
[0011]
可选的,所述方法还包括:
[0012]
当执行所述业务逻辑产生了目标字段的新状态数据后,调用所述第二合约地址对应的数据合约,更新所述数据合约对应的合约账户中维护的所述目标字段的状态数据,以将所述目标字段的状态数据修改为新状态数据。
[0013]
可选的,所述方法还包括:
[0014]
接收用户提交的第二交易;其中,所述第二交易携带有待创建智能合约的业务逻辑;
[0015]
响应于所述第二交易,创建逻辑合约,在所述逻辑合约对应的合约账户中写入所述业务逻辑;
[0016]
创建数据合约,在所述数据合约对应的合约账户中写入所述业务逻辑中各字段的初始状态数据;
[0017]
调用所述区块链中的路由合约,更新所述路由合约对应的合约账户中维护的映射表,以将所述逻辑合约对应的第一合约地址和所述数据合约的第二合约地址写入所述映射表。
[0018]
可选的,所述方法还包括:
[0019]
接收用户提交的第三交易;其中,所述第三交易携带有待升级的旧逻辑合约的第一合约地址和需升级的新业务逻辑;
[0020]
响应于所述第三交易,创建新的逻辑合约,在所述新的逻辑合约对应的合约账户中写入所述新业务逻辑;
[0021]
调用所述区块链中的路由合约,更新所述路由合约对应的合约账户中维护的映射表,以将所述映射表中旧的逻辑合约的第一合约地址修改为所述新的逻辑合约的第一合约地址。
[0022]
可选的,所述方法还包括:
[0023]
如果所述新业务逻辑相比旧业务逻辑增加了新的字段,则创建新的数据合约,在所述新的数据合约对应的合约账户中写入所述新的字段的初始状态数据;
[0024]
调用所述区块链中的路由合约,更新所述路由合约对应的合约账户中维护的映射表,以在所述映射表中增加第一合约地址与该新的数据合约的第二合约地址的映射关系。
[0025]
可选的,如果所述第一交易还携带有业务相关的状态数据,所述响应于所述第一交易,调用所述第一合约地址对应的逻辑合约,获取所述逻辑合约对应的合约账户中维护的业务逻辑,具体包括:
[0026]
响应于所述第一交易,调用所述区块链的路由合约,查询所述路由合约对应的合约账户中维护的映射表中所述第一合约地址映射的第二合约地址;
[0027]
进一步调用所述第二合约地址对应的数据合约,更新所述数据合约对应的合约账户中维护的所述目标字段的状态数据,以记录所述第一交易携带的状态数据;
[0028]
进一步调用所述第一合约地址对应的逻辑合约,获取所述逻辑合约对应的合约账户中维护的业务逻辑。
[0029]
可选的,所述数据合约对应的合约账户维护的状态数据位于资产映射表,所述资产映射表存储了用户账户与用户资产的状态数据;
[0030]
所述调用所述第二合约地址对应的数据合约,更新所述数据合约对应的合约账户中维护的所述目标字段的状态数据,包括:
[0031]
如果所述第一交易为用户资产的入账交易,则调用所述第二合约地址对应的数据合约,在所述资产映射表中记录该用户账户和用户资产的状态数据;
[0032]
如果所述第一交易为用户资产的出账交易,则调用所述第二合约地址对应的数据合约,校验所述第一交易指示的用户账户是否位于所述资产映射表;
[0033]
所述调用所述第一合约地址对应的逻辑合约,获取所述逻辑合约对应的合约账户中维护的业务逻辑,
[0034]
在所述用户账户位于所述资产映射表中时,,进一步调用所述第一合约地址对应的逻辑合约,获取所述逻辑合约对应的合约账户中维护的业务逻辑。
[0035]
根据本说明书实施例的第二方面,一种区块链中智能合约的创建方法,所述方法包括:
[0036]
接收用户提交的第二交易;其中,所述第二交易携带有待创建智能合约的业务逻辑;
[0037]
响应于所述第二交易,创建逻辑合约,在所述逻辑合约对应的合约账户中写入所述业务逻辑;
[0038]
创建数据合约,在所述数据合约对应的合约账户中写入所述业务逻辑中各字段的初始状态数据;
[0039]
调用所述区块链中的路由合约,更新所述路由合约对应的合约账户中维护的映射表,以将所述逻辑合约对应的第一合约地址和所述数据合约的第二合约地址写入所述映射表。
[0040]
根据本说明书实施例的第三方面,一种区块链中智能合约的升级方法,所述方法包括:
[0041]
接收用户提交的第三交易;其中,所述第三交易携带有待升级的旧逻辑合约的第一合约地址和需升级的新业务逻辑;
[0042]
响应于所述第三交易,创建新的逻辑合约,在所述新的逻辑合约对应的合约账户中写入所述新业务逻辑;
[0043]
调用所述区块链中的路由合约,更新所述路由合约对应的合约账户中维护的映射表,以将所述映射表中旧的逻辑合约的第一合约地址修改为所述新的逻辑合约的第一合约地址。
[0044]
可选的,所述方法还包括:
[0045]
如果所述新业务逻辑相比旧业务逻辑增加了新的字段,则创建新的数据合约,在所述新的数据合约对应的合约账户中写入所述新的字段的初始状态数据;
[0046]
调用所述区块链中的路由合约,更新所述路由合约对应的合约账户中维护的映射表,以在所述映射表中增加第一合约地址与该新的数据合约的第二合约地址的映射关系。
[0047]
根据本说明书实施例的第四方面,一种区块链中智能合约的执行装置,所述装置包括:
[0048]
接收单元,接收用户提交的第一交易;其中,所述第一交易携带有业务执行所需调用的逻辑合约的第一合约地址;
[0049]
响应单元,响应于所述第一交易,调用所述第一合约地址对应的逻辑合约,获取所述逻辑合约对应的合约账户中维护的业务逻辑;
[0050]
确定单元,确定执行所述业务逻辑缺少的状态数据的字段名称;
[0051]
路由单元,调用所述区块链的路由合约,查询所述路由合约对应的合约账户中维护的映射表中所述第一合约地址映射的第二合约地址;
[0052]
获取单元,调用所述第二合约地址对应的数据合约,获取所述数据合约对应的合约账户中维护的所述字段名称的状态数据;
[0053]
执行单元,将所述状态数据补充到所述业务逻辑中缺少的状态数据,以执行所述业务逻辑。
[0054]
可选的,所述装置还包括:
[0055]
更新单元,当执行所述业务逻辑产生了目标字段的新状态数据后,调用所述第二合约地址对应的数据合约,更新所述数据合约对应的合约账户中维护的所述目标字段的状
态数据,以将所述目标字段的状态数据修改为新状态数据。
[0056]
可选的,所述装置还包括:
[0057]
第一接收子单元,接收用户提交的第二交易;其中,所述第二交易携带有待创建智能合约的业务逻辑;
[0058]
第一响应子单元,响应于所述第二交易,创建逻辑合约,在所述逻辑合约对应的合约账户中写入所述业务逻辑;
[0059]
第一创建子单元,创建数据合约,在所述数据合约对应的合约账户中写入所述业务逻辑中各字段的初始状态数据;
[0060]
第一更新子单元,调用所述区块链中的路由合约,更新所述路由合约对应的合约账户中维护的映射表,以将所述逻辑合约对应的第一合约地址和所述数据合约的第二合约地址写入所述映射表。
[0061]
可选的,所述装置还包括:
[0062]
第二接收子单元,接收用户提交的第三交易;其中,所述第三交易携带有待升级的旧逻辑合约的第一合约地址和需升级的新业务逻辑;
[0063]
第二响应子单元,响应于所述第三交易,创建新的逻辑合约,在所述新的逻辑合约对应的合约账户中写入所述新业务逻辑;
[0064]
第二更新子单元,调用所述区块链中的路由合约,更新所述路由合约对应的合约账户中维护的映射表,以将所述映射表中旧的逻辑合约的第一合约地址修改为所述新的逻辑合约的第一合约地址。
[0065]
可选的,所述装置还包括:
[0066]
第二创建子单元,如果所述新业务逻辑相比旧业务逻辑增加了新的字段,则创建新的数据合约,在所述新的数据合约对应的合约账户中写入所述新的字段的初始状态数据;
[0067]
第三更新子单元,调用所述区块链中的路由合约,更新所述路由合约对应的合约账户中维护的映射表,以在所述映射表中增加第一合约地址与该新的数据合约的第二合约地址的映射关系。
[0068]
可选的,所述响应单元,包括:
[0069]
如果所述第一交易还携带有业务相关的状态数据,响应于所述第一交易,调用所述区块链的路由合约,查询所述路由合约对应的合约账户中维护的映射表中所述第一合约地址映射的第二合约地址;进一步调用所述第二合约地址对应的数据合约,更新所述数据合约对应的合约账户中维护的所述目标字段的状态数据,以记录所述第一交易携带的状态数据;进一步调用所述第一合约地址对应的逻辑合约,获取所述逻辑合约对应的合约账户中维护的业务逻辑。
[0070]
可选的,所述数据合约对应的合约账户维护的状态数据位于资产映射表,所述资产映射表存储了用户账户与用户资产的状态数据;
[0071]
所述响应单元中,调用所述第二合约地址对应的数据合约,更新所述数据合约对应的合约账户中维护的所述目标字段的状态数据,包括:
[0072]
如果所述第一交易为用户资产的入账交易,则调用所述第二合约地址对应的数据合约,在所述资产映射表中记录该用户账户和用户资产的状态数据;
[0073]
如果所述第一交易为用户资产的出账交易,则调用所述第二合约地址对应的数据合约,校验所述第一交易指示的用户账户是否位于所述资产映射表;
[0074]
所述响应单元中,调用所述第一合约地址对应的逻辑合约,获取所述逻辑合约对应的合约账户中维护的业务逻辑,包括:
[0075]
在所述用户账户位于所述资产映射表中时,,进一步调用所述第一合约地址对应的逻辑合约,获取所述逻辑合约对应的合约账户中维护的业务逻辑。
[0076]
根据本说明书实施例的第五方面,一种区块链中智能合约的创建装置,所述装置包括:
[0077]
接收单元,接收用户提交的第二交易;其中,所述第二交易携带有待创建智能合约的业务逻辑;
[0078]
响应单元,响应于所述第二交易,创建逻辑合约,在所述逻辑合约对应的合约账户中写入所述业务逻辑;
[0079]
创建单元,创建数据合约,在所述数据合约对应的合约账户中写入所述业务逻辑中各字段的初始状态数据;
[0080]
更新单元,调用所述区块链中的路由合约,更新所述路由合约对应的合约账户中维护的映射表,以将所述逻辑合约对应的第一合约地址和所述数据合约的第二合约地址写入所述映射表。
[0081]
根据本说明书实施例的第六方面,一种区块链中智能合约的升级装置,所述装置包括:
[0082]
接收单元,接收用户提交的第三交易;其中,所述第三交易携带有待升级的旧逻辑合约的第一合约地址和需升级的新业务逻辑;
[0083]
响应单元,响应于所述第三交易,创建新的逻辑合约,在所述新的逻辑合约对应的合约账户中写入所述新业务逻辑;
[0084]
升级单元,调用所述区块链中的路由合约,更新所述路由合约对应的合约账户中维护的映射表,以将所述映射表中旧的逻辑合约的第一合约地址修改为所述新的逻辑合约的第一合约地址。
[0085]
可选的,所述装置还包括:
[0086]
创建单元,如果所述新业务逻辑相比旧业务逻辑增加了新的字段,则创建新的数据合约,在所述新的数据合约对应的合约账户中写入所述新的字段的初始状态数据;
[0087]
更新单元,调用所述区块链中的路由合约,更新所述路由合约对应的合约账户中维护的映射表,以在所述映射表中增加第一合约地址与该新的数据合约的第二合约地址的映射关系。
[0088]
根据本说明书实施例的第七方面,一种区块链的智能合约,所述智能合约由逻辑合约、路由合约和数据合约构成;
[0089]
所述逻辑合约对应的合约账户中维护有业务逻辑;
[0090]
所述路由合约对应的合约账户中维护有映射表,所述映射表存储了逻辑合约的第一合约地址与数据合约的第二合约地址的映射关系;
[0091]
所述数据合约对应的合约账户中维护有所述逻辑合约执行所产生的状态数据。
[0092]
根据本说明书实施例的第八方面,提供一种电子设备,包括:
[0093]
处理器;
[0094]
用于存储处理器可执行指令的存储器;
[0095]
其中,所述处理器被配置为上述任一项区块链中智能合约的执行、创建、升级方法。
[0096]
本说明书实施例,提供了一种区块链中智能合约的执行、创建、升级方案,通过将智能合约分为逻辑合约、路由合约和数据合约。使得维护业务逻辑的逻辑合约不再维护状态数据,因此就不存在资产安全和数据迁移的限制,使得业务逻辑可升级和可插拔。在业务逻辑升级时,直接创建写入新业务逻辑的逻辑合约,并通过更新路由合约维护的映射表,将存储状态数据的数据合约与旧逻辑合约的映射关系修改为该新逻辑合约。
附图说明
[0097]
图1是一示例性实施例提供的区块链的智能合约的示意图;
[0098]
图2是一示例性实施例提供的区块链中智能合约的创建方法的流程;
[0099]
图3是一示例性实施例提供的区块链中智能合约的升级方法的流程;
[0100]
图4是一示例性实施例提供的区块链中智能合约的执行方法的流程;
[0101]
图5是一示例性实施例提供的电子设备的结构示意图;
[0102]
图6是一示例性实施例提供的区块链中智能合约的执行装置的框图。
具体实施方式
[0103]
这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实现方式并不代表与本说明书一个或多个实施例相一致的所有实现方式。相反,它们仅是与如所附权利要求书中所详述的、本说明书一个或多个实施例的一些方面相一致的装置和方法的例子。
[0104]
需要说明的是:在其他实施例中并不一定按照本说明书示出和描述的顺序来执行相应方法的步骤。在一些其他实施例中,其方法所包括的步骤可以比本说明书所描述的更多或更少。此外,本说明书中所描述的单个步骤,在其他实施例中可能被分解为多个步骤进行描述;而本说明书中所描述的多个步骤,在其他实施例中也可能被合并为单个步骤进行描述。本说明书中的第一、第二、第三等是为了进行区分不同,而不是对先后顺序进行的限定。
[0105]
为了方便理解,以下首先介绍区块链中的一些技术概念。
[0106]
区块链一般被划分为三种类型:公有链(public blockchain),私有链(private blockchain)和联盟链(consortium blockchain)。此外,还可以有上述多种类型的结合,比如私有链+联盟链、联盟链+公有链等。
[0107]
其中,去中心化程度最高的是公有链。公有链以比特币、以太坊为代表,加入公有链的参与者(也可称为区块链中的节点)可以读取链上的数据记录、参与交易、以及竞争新区块的记账权等。而且,各节点可自由加入或者退出网络,并进行相关操作。
[0108]
私有链则相反,该网络的写入权限由某个组织或者机构控制,数据读取权限受组织规定。简单来说,私有链可以为一个弱中心化系统,其对节点具有严格限制且节点数量较
少。这种类型的区块链更适合于特定机构内部使用。
[0109]
联盟链则是介于公有链以及私有链之间的区块链,可实现“部分去中心化”。联盟链中各个节点通常有与之相对应的实体机构或者组织;节点通过授权加入网络并组成利益相关联盟,共同维护区块链运行。
[0110]
基于区块链的基本特性,区块链通常是由若干个区块构成。在这些区块中分别记录有与该区块的创建时刻对应的时间戳,所有的区块严格按照区块中记录的时间戳,构成一条在时间上有序的数据链条。
[0111]
对于物理世界产生的真实数据,可以将其构建成区块链所支持的标准的交易(transaction)格式,然后发布至区块链,由区块链中的节点设备对收到的交易进行共识处理,并在达成共识后,由区块链中作为记账节点的节点设备,将这笔交易打包进区块,在区块链中进行持久化存证。
[0112]
在区块链领域,有一个重要的概念就是账户(account);以以太坊为例,以太坊通常将账户划分为外部账户和合约账户两类;外部账户就是由用户直接控制的账户,也称之为用户账户;而合约账户则是由用户通过外部账户创建的,包含合约代码的账户(即智能合约)。
[0113]
对于区块链中的账户而言,通常会通过一个结构体,来维护账户的账户状态。当区块中的交易被执行后,区块链中与该交易相关的账户的状态通常也会发生变化。
[0114]
以以太坊为例,账户的结构体通常包括balance,nonce,code和storage等字段。其中:
[0115]
balance字段,用于维护账户目前的账户余额;
[0116]
nonce字段,用于维护该账户的交易次数;它是用于保障每笔交易能且只能被处理一次的计数器,有效避免重放攻击;
[0117]
code字段,用于维护该账户的合约代码;在实际应用中,code字段中通常仅维护合约代码的hash值;因而,code字段通常也称之为codehash字段。
[0118]
storage字段,用于维护该账户的状态数据(默认字段值为空);对于合约账户而言,通常会分配一个独立的存储空间,用以存储该合约账户的状态数据;该独立的存储空间通常称之为该合约账户的账户存储。合约账户的状态数据通常会构建成mpt(merkle patricia trie)树的数据结构存储在上述独立的存储空间之中;其中,基于合约账户的状态数据构建成的mpt树,通常也称之为storage树。而storage字段通常仅维护该storage树的根节点;因此,storage字段通常也称之为storageroot字段。
[0119]
其中,对于外部账户而言,以上示出的code字段和storage字段的字段值均为空值。
[0120]
在实际应用中,不论是公有链、私有链还是联盟链,都可能提供智能合约(smart contract)的功能。区块链上的智能合约是在区块链上可以被交易触发执行的合约。智能合约可以通过代码的形式定义。
[0121]
以以太坊为例,支持用户在以太坊网络中创建并调用一些复杂的逻辑。以太坊作为一个可编程区块链,其核心是以太坊虚拟机(evm),每个以太坊节点都可以运行evm。evm是一个图灵完备的虚拟机,通过它可以实现各种复杂的逻辑。用户在以太坊中发布和调用智能合约就是在evm上运行的。实际上,evm直接运行的是虚拟机代码(虚拟机字节码,下简
称“字节码”),所以部署在区块链上的智能合约可以是字节码。
[0122]
为了区块链的安全考虑,现有区块链中智能合约被设计为不可修改、不可升级。以以太坊为例,智能合约一旦在区块链中创建后,就无法修改这个智能合约中声明的业务逻辑的合约代码。但是任何业务逻辑都是需要改变以适应不同的需求,也就是说实际中智能合约存在修改或者升级的需求。为此,业务方需要不断发布新业务逻辑的智能合约。然而,这样做存在以下问题:
[0123]
智能合约对应的合约账户中不仅维护了业务逻辑的合约代码(code字段),还维护有状态数据(storage字段)。新创建的智能合约虽然可以写入新业务逻辑的合约代码,但是无法直接创建旧智能合约中的状态数据。而这需要额外的操作来获取,同步状态数据的操作较为复杂。另外,由于旧智能合约虽然可以不再使用,因此维护的状态数据也不再更新,但这些状态数据始终是记录着的,从而额外占用了区块链的资源。随着智能合约的不断迭代升级,旧智能合约中维护的状态数据占用的区块链资源也会越来越多,从而不断挤压现有区块链的可用资源。
[0124]
为此,本说明书主要是针对传统的智能合约做出改进。请参见图1一示例性实施例提供的区块链的智能合约,所述智能合约可以分为逻辑合约、路由合约和数据合约;其中:
[0125]
所述逻辑合约对应的合约账户中维护有业务逻辑;
[0126]
所述路由合约对应的合约账户中维护有映射表,所述映射表存储了逻辑合约的第一合约地址与数据合约的第二合约地址的映射关系;
[0127]
所述数据合约对应的合约账户中维护有所述逻辑合约执行所产生的状态数据。
[0128]
如图1所示,逻辑合约可以升级(后面会详细介绍逻辑合约升级的实施例),数据合约可以扩展(后面会详细介绍数据合约扩展的实施例)。用户可以向逻辑合约或数据合约发起交易。逻辑合约可以向数据合约读写数据。路由合约用于向逻辑合约或数据合约提供路由服务。
[0129]
通过将智能合约分为逻辑合约、路由合约和数据合约。使得维护业务逻辑的逻辑合约不再维护状态数据,因此就不存在资产安全和数据迁移的限制,使得业务逻辑可升级和可插拔。在业务逻辑升级时,直接创建写入新业务逻辑的逻辑合约,并通过更新路由合约维护的映射表,将存储状态数据的数据合约与旧逻辑合约的映射关系修改为该新逻辑合约。
[0130]
后续介绍的区块链中智能合约的创建、升级、执行等实施例均在该改进后智能合约架构基础上进行的。
[0131]
以下进一步介绍图2所示智能合约的创建方法的实施例。所述方法包括:
[0132]
步骤110:接收用户提交的第二交易;其中,所述第二交易携带有待创建智能合约的业务逻辑;
[0133]
步骤120:响应于所述第二交易,创建逻辑合约,在所述逻辑合约对应的合约账户中写入所述业务逻辑;
[0134]
步骤130:创建数据合约,在所述数据合约对应的合约账户中写入所述业务逻辑中各字段的初始状态数据;
[0135]
步骤140:调用所述区块链中的路由合约,更新所述路由合约对应的合约账户中维护的映射表,以将所述逻辑合约对应的第一合约地址和所述数据合约的第二合约地址写入
所述映射表。
[0136]
该实施例中,用户可以将一笔包含创建智能合约的交易发送到区块链,该交易携带有业务逻辑的合约代码。当区块链中的节点间通过共识机制达成一致后,可以开始创建这个智能合约。
[0137]
与现有创建一个智能合约不同的是,该实施例除了创建用于存储业务逻辑的合约代码的逻辑合约,还会创建用于存储状态数据的数据合约。
[0138]
逻辑合约创建后,区块链上出现一个与该逻辑合约对应的合约账户,该合约账户具有一个唯一的合约地址(称为第一合约地址)。交易中携带的业务逻辑的合约代码将保存在该逻辑合约对应的合约账户的code(在有的情况下,code保存的是合约代码的hash指针,通过hash指针寻址到合约代码)。在该逻辑合约对应的合约账户的storage为空,即逻辑合约仅维护业务逻辑,不存储状态数据。
[0139]
数据合约创建后,区块链上出现一个与该数据合约对应的合约账户,该数据账户具有一个唯一的合约地址(称为第二合约地址)。该数据合约对应的合约账户的storage中写入各个业务字段的初始状态数据(一般为0)。在该数据合约对应的合约账户的code为空,即数据合约仅维护状态数据,不存储业务逻辑。
[0140]
在逻辑合约和数据合约都创建后,路由合约需要更新其对应的合约账户中维护的映射表,以将所述逻辑合约对应的第一合约地址和所述数据合约的第二合约地址的映射关系写入所述映射表。
[0141]
以下进一步介绍图3所示智能合约的升级方法的实施例。所述方法包括:
[0142]
步骤210:接收用户提交的第三交易;其中,所述第三交易携带有待升级的旧逻辑合约的第一合约地址和需升级的新业务逻辑;
[0143]
步骤220:响应于所述第三交易,创建新的逻辑合约,在所述新的逻辑合约对应的合约账户中写入所述新业务逻辑;
[0144]
步骤230:调用所述区块链中的路由合约,更新所述路由合约对应的合约账户中维护的映射表,以将所述映射表中旧的逻辑合约的第一合约地址修改为所述新的逻辑合约的第一合约地址。
[0145]
该实施例中,用户可以将一笔包含升级智能合约的交易发送到区块链,该交易携带有旧逻辑合约的第一合约地址和需升级的新业务逻辑的合约代码。当区块链中的节点间通过共识机制达成一致后,可以开始升级智能合约。
[0146]
与现有升级智能合约不同的是,由于该实施例中逻辑合约不再维护状态数据,因此无需同步旧合约维护的状态数据。
[0147]
新的逻辑合约创建后,区块链上出现一个与该新的逻辑合约对应的合约账户,该合约账户具有一个唯一的合约地址(称为新的逻辑合约的第一合约地址)。交易中携带的新业务逻辑的合约代码将保存在该新的逻辑合约对应的合约账户的code(在有的情况下,code保存的是合约代码的hash指针,通过hash指针寻址到合约代码)。在该新的逻辑合约对应的合约账户的storage同样为空,即新的逻辑合约仅维护业务逻辑,不存储状态数据。
[0148]
由于状态数据是存储在合约数据中的,因此无需同步状态至新的逻辑合约。为了新的逻辑合约可以获取所需的状态数据,需要更新路由合约维护的映射表。即,将所述映射表中旧的逻辑合约的第一合约地址修改为所述新的逻辑合约的第一合约地址,以失效旧的
逻辑合约与数据合约之间联系以及建立新的逻辑合约与数据合约之间联系。
[0149]
本说明书中逻辑合约虽然是可修改和升级的,但数据合约却秉承传统智能合约的理念,是不可修改、不可升级的。这个数据合约一旦部署到链上即不可修改,数据结构(当前的业务字段)会锁定在这个数据合约中。然而,在实际应用中,如果业务逻辑迭代升级,对应的数据结构往往也存在迭代。例如业务逻辑新增了一些业务字段。但是数据合约是不可以升级的。因此,上述区块链中智能合约还存在数据扩展的问题。
[0150]
针对这一问题,本说明书还提出了用于数据扩展的方案,在图3基础上,还可以包括:
[0151]
如果所述新业务逻辑相比旧业务逻辑增加了新的字段,则创建新的数据合约,在所述新的数据合约对应的合约账户中写入所述新的字段的初始状态数据;
[0152]
调用所述区块链中的路由合约,更新所述路由合约对应的合约账户中维护的映射表,以在所述映射表中增加第一合约地址与该新的数据合约的第二合约地址的映射关系。
[0153]
该实施例中,如果业务逻辑上需要添加新字段,这些字段会被存储到一个全新的数据合约中。同时,这个新的数据合约的第二合约地址和内含的字段名称,会被更新到路由合约的映射表中,逻辑合约通过查询映射表,获取新字段对应的数据合约的第二合约地址,从而路由进行读写。
[0154]
需要说明的是,对于逻辑合约映射多个数据合约的情况,为了提高查询效率,上述路由合约中维护的映射表的形式还可以包括:
[0155]
逻辑合约的第一合约地址与各个字段的第一映射关系,以及,各个字段再与所属数据合约的第二合约地址的第二映射关系。
[0156]
如此,通过两层映射关系,可以最终确定逻辑合约执行所需的每个字段对应的状态数据。
[0157]
以下进一步介绍图4所示智能合约的执行方法的实施例。所述智能合约分为逻辑合约、路由合约和数据合约;所述逻辑合约对应的合约账户中维护有业务逻辑;所述路由合约对应的合约账户中维护有映射表,所述映射表存储了逻辑合约的第一合约地址与数据合约的第二合约地址的映射关系;所述数据合约对应的合约账户中维护有所述逻辑合约执行所产生的状态数据;所述方法包括:
[0158]
步骤310:接收用户提交的第一交易;其中,所述第一交易携带有业务执行所需调用的逻辑合约的第一合约地址;
[0159]
步骤320:响应于所述第一交易,调用所述第一合约地址对应的逻辑合约,获取所述逻辑合约对应的合约账户中维护的业务逻辑;
[0160]
步骤330:确定执行所述业务逻辑缺少的状态数据的字段名称;
[0161]
步骤340:调用所述区块链的路由合约,查询所述路由合约对应的合约账户中维护的映射表中所述第一合约地址映射的第二合约地址;
[0162]
步骤350:调用所述第二合约地址对应的数据合约,获取所述数据合约对应的合约账户中维护的所述字段名称的状态数据;
[0163]
步骤360:将所述状态数据补充到所述业务逻辑中缺少的状态数据,以执行所述业务逻辑。
[0164]
该实施例中,用户将一笔包含调用逻辑合约的交易发送到以区块链,交易的from
字段用于记录发起调用逻辑合约的用户地址(即用户在区块链上的用户账户的地址),to字段用于记录被调用的逻辑合约的合约地址(即逻辑合约在区块链上的第一合约地址),交易的data字段用于记录调用逻辑合约的方法和参数。
[0165]
由区块链中的节点设备在本地的evm中执行这笔交易,调用所述第一合约地址对应的逻辑合约,获取所述逻辑合约对应的合约账户中维护的业务逻辑的合约代码。
[0166]
因为逻辑合约不存储状态数据,在确定执行所述业务逻辑缺少的状态数据的字段名称后,通过调用所述区块链的路由合约,查询所述路由合约对应的合约账户中维护的映射表中所述第一合约地址映射的第二合约地址。
[0167]
进一步调用所述第二合约地址对应的数据合约,获取所述数据合约对应的合约账户中维护的所述字段名称的状态数据。
[0168]
此时节点设备就获取到业务逻辑的合约代码和该业务逻辑中缺少的状态数据,在evm中将所述状态数据补充到所述业务逻辑中缺少的状态数据,在evm中运行业务逻辑的合约代码。
[0169]
有上述过程可知,该实施例提供的智能合约的执行,通过逻辑合约、路由合约和数据合约之间的相互配合,从逻辑合约获取业务逻辑的合约代码,从路由合约获取该业务逻辑对应的数据合约,并从数据合约获取相关的状态数据,最后将合约代码与状态数据组装为完整的可执行代码以在evm中运行。
[0170]
在实际应用中,调用智能合约后,相应的状态数据会改变,因此需要更新状态数据。因此,在上述图4基础上,还可以包括:
[0171]
当执行业务逻辑产生了目标字段的新状态数据后,调用所述第二合约地址对应的数据合约,更新所述数据合约对应的合约账户中维护的所述目标字段的状态数据,以将所述目标字段的状态数据修改为新状态数据。
[0172]
该实施例中,当逻辑合约执行产生了新状态数据后,由于之前已经获取到对应的数据合约的第二合约地址,因此直接调用第二合约地址对应的数据合约,将该数据合约对应的合约账户中维护的目标字段的状态数据修改为新状态数据。
[0173]
上述图4所示的智能合约的调用方式,是针对第一交易中未携带业务相关的状态数据,可以直接调用逻辑合约。
[0174]
而如果所述第一交易还携带有业务相关的状态数据;则上述步骤320,具体包括:
[0175]
步骤321,响应于所述第一交易,调用所述区块链的路由合约,查询所述路由合约对应的合约账户中维护的映射表中所述第一合约地址映射的第二合约地址;
[0176]
步骤322,进一步调用所述第二合约地址对应的数据合约,更新所述数据合约对应的合约账户中维护的所述目标字段的状态数据,以记录所述第一交易携带的状态数据;
[0177]
步骤323,进一步调用所述第一合约地址对应的逻辑合约,获取所述逻辑合约对应的合约账户中维护的业务逻辑。
[0178]
该实施例中,针对用户直接对状态数据的交易,这样的交易直接发往其数据合约,由数据合约记录状态数据后,再调用逻辑合约,处理和记录业务逻辑。由于原始的状态数据(交易中指定的状态数据)未经逻辑合约中转,而是直接由数据合约记录,而数据合约是不可修改不可升级的,因此由数据合约直接记录的原始的状态数据是可信的,从而最大可能保障数据安全。
[0179]
针对本说明书,如果逻辑合约可升级,数据合约可扩展,那么随之而来的是,用户的数据所有权和资产安全的问题。
[0180]
对于传统智能合约,用户的所有资产都被锁定在合约里。智能合约提取资产或修改资产余额的功能,也通过代码公开的形式向用户保证,除了用户自己,没有其它任何人或程序可以获取用户锁定在合约中的资产。更进一步地,传统智能合约的不可修改性使得合约一旦部署就不会有代码的变动,从而可以确保智能合约中维护的用户资产是绝对安全的。
[0181]
然而,本说明书采用职责分离的方式将传统智能合约分为逻辑合约和数据合约两个独立的合约。数据合约中的用户资产是由路由合约维护的映射关系确定所属的用户,但是这个映射关系是可以修改的,也就是说用户资产并非直接对应用户,这就存在用户资产安全的问题。例如,将用户a的资产映射给用户b。
[0182]
为此,数据合约对应的合约账户还可以维护一个用户账户与用户资产之间映射关系的资产映射表。该映射表在数据合约内部,只提供给用户资产的入账和出账两个接口,其它任何接口都无权写入和更新该资产映射表。
[0183]
上述步骤322中,调用所述第二合约地址对应的数据合约,更新所述数据合约对应的合约账户中维护的所述目标字段的状态数据,包括:
[0184]
如果所述第一交易为用户资产的入账交易,则调用所述第二合约地址对应的数据合约,在所述资产映射表中记录该用户账户和用户资产的状态数据;
[0185]
如果所述第一交易为用户资产的出账交易,则调用所述第二合约地址对应的数据合约,校验所述第一交易指示的用户账户是否位于所述资产映射表;
[0186]
上述步骤323中,调用所述第一合约地址对应的逻辑合约,获取所述逻辑合约对应的合约账户中维护的业务逻辑;
[0187]
在所述用户账户位于所述资产映射表中时,进一步调用所述第一合约地址对应的逻辑合约,获取所述逻辑合约对应的合约账户中维护的业务逻辑。
[0188]
其中,上述用户资产可以是指虚拟代币,或者虚拟资产。
[0189]
所述虚拟代币可以是指,将现实世界的货币转换为能够在链上流通的虚拟代币。例如比特币就是典型的虚拟代币。
[0190]
所述虚拟资产可以是指,将现实世界中的一些非货币属性的实体资产,转化成为能够在区块链上流通的虚拟资产。
[0191]
其中,需要说明的是,将现实世界中的非货币属性的实体资产转化为区块链上的虚拟资产,通常是指将该实体资产与区块链上的虚拟资产进行“锚定”,作为这些虚拟资产的价值支撑,进而在区块链上产生与实体资产的价值匹配,且能够在区块链上的区块链账户之间进行流通的虚拟资产(以下称为用户资产)的过程。
[0192]
在实现时,可以在数据合约对应的合约账户中维护用户资产的状态数据,从而为可以将现实世界中的非货币属性的实体资产作为价值支撑。
[0193]
具体地,数据合约的合约账户的nonce,code字段的字段值可以为空值(也可以不为空);而storage字段的字段值可以不再是空值;storage字段可以用于维护与用户账户对应的用户资产的资产状态。其中,storage字段中维护与用户资产的资产状态的具体方式,可以基于需求灵活的进行设计,例如用户账户与用户资产的资产状态之间映射关系的资产
映射表。
[0194]
其中,上述用户资产的具体形式可以例如房产、股票、贷款合同、票据、应收账款等非货币属性的实体资产,将这样的实体资产转换为价值匹配的用户资产在区块链上流通。
[0195]
回到该实施例,用户在放入资产时,是直接调用数据合约上的入账接口。用户资产锁入数据合约后,在资产映射表中记录用户账户的地址和该用户资产的对应关系。
[0196]
用户在取回资产时,仍然是直接调用数据合约上的出账接口。数据合约将校验用户账户的地址是否存在于资产映射表中,在存在时调用逻辑合约执行后续步骤,最后把用户资产直接转账给用户的请求地址。
[0197]
任何不在资产映射表中的用户账户,出账接口将不响应其对用户资产的操作请求。如此保证了任何一份出账的用户资产,都属于当初入账的原始用户账户的地址,确保了用户对资产所有权的绑定,提升了用户资产的安全。
[0198]
综上所述,本说明书提供的技术方案,通过将智能合约分为逻辑合约、路由合约和数据合约。使得维护业务逻辑的逻辑合约不再维护状态数据,因此就不存在资产安全和数据迁移的限制,实现了智能合约可升级。另一方面,数据合约设为不可升级,但可扩展,从而满足业务逻辑升级的需求。再一方面,通过数据合约内部维护的资产映射表来管理每笔用户资产所属的用户账户,基于该资产映射表来做用户资产的出入账管理,从而将用户资产完整地保护起来,不因合约升级而产生资产安全风险。
[0199]
与上述方法实施例相对应,本说明书还提供了区块链中智能合约的执行、创建和升级装置的实施例。
[0200]
本说明书的区块链中智能合约的执行、创建和升级装置的实施例可以应用在电子设备上。装置实施例可以通过软件实现,也可以通过硬件或者软硬件结合的方式实现。以软件实现为例,作为一个逻辑意义上的装置,是通过其所在电子设备的处理器将非易失性存储器中对应的计算机程序指令读取到内存中运行形成的。
[0201]
从硬件层面而言,如图5所示,为本说明书的区块链中智能合约的执行装置(区块链中智能合约的创建、升级装置未示出)所在电子设备的一种硬件结构图,除了图5所示的处理器、内存、网络接口、以及非易失性存储器之外,实施例中装置所在的电子设备通常根据该电子设备的实际功能,还可以包括其他硬件,对此不再赘述。
[0202]
图6是本说明书一示例性实施例示出的一种区块链中智能合约的执行装置的框图。该装置可以应用在前述图5所示的电子设备中,所述装置包括:
[0203]
接收单元410,接收用户提交的第一交易;其中,所述第一交易携带有业务执行所需调用的逻辑合约的第一合约地址;
[0204]
响应单元420,响应于所述第一交易,调用所述第一合约地址对应的逻辑合约,获取所述逻辑合约对应的合约账户中维护的业务逻辑;
[0205]
确定单元430,确定执行所述业务逻辑缺少的状态数据的字段名称;
[0206]
路由单元440,调用所述区块链的路由合约,查询所述路由合约对应的合约账户中维护的映射表中所述第一合约地址映射的第二合约地址;
[0207]
获取单元450,调用所述第二合约地址对应的数据合约,获取所述数据合约对应的合约账户中维护的所述字段名称的状态数据;
[0208]
执行单元460,将所述状态数据补充到所述业务逻辑中缺少的状态数据,以执行所
述业务逻辑。
[0209]
可选的,所述装置还包括:
[0210]
更新单元,当执行所述业务逻辑产生了目标字段的新状态数据后,调用所述第二合约地址对应的数据合约,更新所述数据合约对应的合约账户中维护的所述目标字段的状态数据,以将所述目标字段的状态数据修改为新状态数据。
[0211]
可选的,所述装置还包括:
[0212]
第一接收子单元,接收用户提交的第二交易;其中,所述第二交易携带有待创建智能合约的业务逻辑;
[0213]
第一响应子单元,响应于所述第二交易,创建逻辑合约,在所述逻辑合约对应的合约账户中写入所述业务逻辑;
[0214]
第一创建子单元,创建数据合约,在所述数据合约对应的合约账户中写入所述业务逻辑中各字段的初始状态数据;
[0215]
第一更新子单元,调用所述区块链中的路由合约,更新所述路由合约对应的合约账户中维护的映射表,以将所述逻辑合约对应的第一合约地址和所述数据合约的第二合约地址写入所述映射表。
[0216]
可选的,所述装置还包括:
[0217]
第二接收子单元,接收用户提交的第三交易;其中,所述第三交易携带有待升级的旧逻辑合约的第一合约地址和需升级的新业务逻辑;
[0218]
第二响应子单元,响应于所述第三交易,创建新的逻辑合约,在所述新的逻辑合约对应的合约账户中写入所述新业务逻辑;
[0219]
第二更新子单元,调用所述区块链中的路由合约,更新所述路由合约对应的合约账户中维护的映射表,以将所述映射表中旧的逻辑合约的第一合约地址修改为所述新的逻辑合约的第一合约地址。
[0220]
可选的,所述装置还包括:
[0221]
第二创建子单元,如果所述新业务逻辑相比旧业务逻辑增加了新的字段,则创建新的数据合约,在所述新的数据合约对应的合约账户中写入所述新的字段的初始状态数据;
[0222]
第三更新子单元,调用所述区块链中的路由合约,更新所述路由合约对应的合约账户中维护的映射表,以在所述映射表中增加第一合约地址与该新的数据合约的第二合约地址的映射关系。
[0223]
可选的,所述响应单元420,包括:
[0224]
如果所述第一交易还携带有业务相关的状态数据,响应于所述第一交易,调用所述区块链的路由合约,查询所述路由合约对应的合约账户中维护的映射表中所述第一合约地址映射的第二合约地址;进一步调用所述第二合约地址对应的数据合约,更新所述数据合约对应的合约账户中维护的所述目标字段的状态数据,以记录所述第一交易携带的状态数据;进一步调用所述第一合约地址对应的逻辑合约,获取所述逻辑合约对应的合约账户中维护的业务逻辑。
[0225]
可选的,所述数据合约对应的合约账户维护的状态数据位于资产映射表,所述资产映射表存储了用户账户与用户资产的状态数据;
[0226]
所述响应单元420中,调用所述第二合约地址对应的数据合约,更新所述数据合约对应的合约账户中维护的所述目标字段的状态数据,包括:
[0227]
如果所述第一交易为用户资产的入账交易,则调用所述第二合约地址对应的数据合约,在所述资产映射表中记录该用户账户和用户资产的状态数据;
[0228]
如果所述第一交易为用户资产的出账交易,则调用所述第二合约地址对应的数据合约,校验所述第一交易指示的用户账户是否位于所述资产映射表;
[0229]
所述响应单元420中,调用所述第一合约地址对应的逻辑合约,获取所述逻辑合约对应的合约账户中维护的业务逻辑,包括:
[0230]
在所述用户账户位于所述资产映射表中时,,进一步调用所述第一合约地址对应的逻辑合约,获取所述逻辑合约对应的合约账户中维护的业务逻辑。
[0231]
以下介绍本说明书一示例性实施例示出的一种区块链中智能合约的创建装置。该装置同样可以应用在前述图5所示的电子设备中,所述装置包括:
[0232]
接收单元,接收用户提交的第二交易;其中,所述第二交易携带有待创建智能合约的业务逻辑;
[0233]
响应单元,响应于所述第二交易,创建逻辑合约,在所述逻辑合约对应的合约账户中写入所述业务逻辑;
[0234]
创建单元,创建数据合约,在所述数据合约对应的合约账户中写入所述业务逻辑中各字段的初始状态数据;
[0235]
更新单元,调用所述区块链中的路由合约,更新所述路由合约对应的合约账户中维护的映射表,以将所述逻辑合约对应的第一合约地址和所述数据合约的第二合约地址写入所述映射表。
[0236]
以下介绍本说明书一示例性实施例示出的一种区块链中智能合约的升级装置。该装置同样可以应用在前述图5所示的电子设备中,所述装置包括:
[0237]
接收单元,接收用户提交的第三交易;其中,所述第三交易携带有待升级的旧逻辑合约的第一合约地址和需升级的新业务逻辑;
[0238]
响应单元,响应于所述第三交易,创建新的逻辑合约,在所述新的逻辑合约对应的合约账户中写入所述新业务逻辑;
[0239]
升级单元,调用所述区块链中的路由合约,更新所述路由合约对应的合约账户中维护的映射表,以将所述映射表中旧的逻辑合约的第一合约地址修改为所述新的逻辑合约的第一合约地址。
[0240]
可选的,所述装置还包括:
[0241]
创建单元,如果所述新业务逻辑相比旧业务逻辑增加了新的字段,则创建新的数据合约,在所述新的数据合约对应的合约账户中写入所述新的字段的初始状态数据;
[0242]
更新单元,调用所述区块链中的路由合约,更新所述路由合约对应的合约账户中维护的映射表,以在所述映射表中增加第一合约地址与该新的数据合约的第二合约地址的映射关系。
[0243]
上述实施例阐明的系统、装置、模块或单元,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。一种典型的实现设备为计算机,计算机的具体形式可以是个人计算机、膝上型计算机、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放
器、导航设备、电子邮件收发设备、游戏控制台、平板计算机、可穿戴设备或者这些设备中的任意几种设备的组合。
[0244]
在一个典型的配置中,计算机包括一个或多个处理器(cpu)、输入/输出接口、网络接口和内存。
[0245]
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(ram)和/或非易失性内存等形式,如只读存储器(rom)或闪存(flash ram)。内存是计算机可读介质的示例。
[0246]
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(pram)、静态随机存取存储器(sram)、动态随机存取存储器(dram)、其他类型的随机存取存储器(ram)、只读存储器(rom)、电可擦除可编程只读存储器(eeprom)、快闪记忆体或其他内存技术、只读光盘只读存储器(cd-rom)、数字多功能光盘(dvd)或其他光学存储、磁盒式磁带、磁盘存储、量子存储器、基于石墨烯的存储介质或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
[0247]
还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个
……”
限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。
[0248]
上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实现方式中,多任务处理和并行处理也是可以的或者可能是有利的。
[0249]
在本说明书一个或多个实施例使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本说明书一个或多个实施例。在本说明书一个或多个实施例和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。还应当理解,本文中使用的术语“和/或”是指并包含一个或多个相关联的列出项目的任何或所有可能组合。
[0250]
应当理解,尽管在本说明书一个或多个实施例可能采用术语第一、第二、第三等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离本说明书一个或多个实施例范围的情况下,第一信息也可以被称为第二信息,类似地,第二信息也可以被称为第一信息。取决于语境,如在此所使用的词语“如果”可以被解释成为“在
……
时”或“当
……
时”或“响应于确定”。
[0251]
以上所述仅为本说明书一个或多个实施例的较佳实施例而已,并不用以限制本说明书一个或多个实施例,凡在本说明书一个或多个实施例的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本说明书一个或多个实施例保护的范围之内。
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1