一种区块链中智能合约的并行冲突域确定方法及装置与流程

文档序号:28291890发布日期:2021-12-31 22:46阅读:204来源:国知局
一种区块链中智能合约的并行冲突域确定方法及装置与流程

1.本发明涉及金融科技(fintech)领域中的区块链(blockchain)领域,尤其涉及一种区块链中智能合约的并行冲突域确定方法及装置。


背景技术:

2.随着计算机技术的发展,越来越多的技术应用在金融领域,传统金融业正在逐步向金融科技(fintech)转变,但由于金融行业的安全性、实时性要求,也对技术提出的更高的要求。目前,基于区块链(blockchain)的不可篡改性,金融科技领域中常通过区块链进行交易。区块链的底层存储系统中的数据可以通过智能合约来访问,然而有一些数据在智能合约并行执行时可能会出现访问冲突,导致执行结果不确定。若不加以干预,可能会导致智能合约执行错误。目前常通过求解智能合约的并行冲突域,为智能合约的调用提供参考。并行冲突域可以通过智能合约中存在冲突的程序变量表征。
3.目前的并行冲突域的求解方式中,对于存在函数调用的智能合约,没有提供求解该智能合约相应并行冲突域的方法。这是一个亟待解决的问题。


技术实现要素:

4.本发明提供一种区块链中智能合约的并行冲突域确定方法及装置,解决了现有技术中不能求解该智能合约相应并行冲突域的问题。
5.第一方面,本发明提供一种区块链中智能合约的并行冲突域确定方法,包括:构建智能合约的第一控制流图,所述第一控制流图包括所述智能合约的各函数的子控制流图,第一函数的子控制流图包括所述第一函数执行的开始节点和结束节点,且在所述第一函数包含调用指令时,所述第一函数的子控制流图包括该调用指令对应的调用节点和返回节点,所述第一函数为所述各函数中任一函数;确定所述各函数的调用关系,并在所述第一控制流图中存在调用关系的节点间添加调用关系边,并确定所添加调用关系边的类型,获得第二控制流图;其中,任一调用关系边的类型表征了第一节点与第二节点之间数据事实的传递类型,所述第一节点和所述第二节点为该调用关系边两端的节点;所述第一函数的任一节点的数据事实指,该节点对应的程序语句执行之前,该节点对应的变量位于所述第一函数的并行冲突域中;在所述第二控制流图中添加各节点对应变量的数据事实节点,以及根据所述第二控制流图中节点间的调用关系边及类型,确定所述第二控制流图中各节点间传递的数据事实,获得第三控制流图;针对所述各函数的任一函数,根据所述第三控制流图,从该函数的结束节点的数据事实节点搜索至该函数的开始节点的数据事实节点,并根据搜索过程中搜索到的各数据事实节点,确定所述智能合约的并行冲突域。
6.上述方式中,在构建智能合约的第一控制流图后,并在所述第一控制流图中存在调用关系的节点间添加调用关系边,并确定所添加调用关系边的类型,从而通过第二控制
流图将函数中节点的数据事实间的传递关系串接起来,并进一步在所述第二控制流图中添加各节点对应变量的数据事实节点,因此,获得第三控制流图后,通过函数的结束节点的数据事实节点搜索至函数的开始节点的数据事实节点进行搜索,即可以通过搜索到的数据事实节点串接得出贯穿整个智能合约的论断,准确地确定所述智能合约的并行冲突域,从而为存在函数调用的智能合约提供了并行冲突域的求解方式。
7.可选的,按照以下方式确定所述第一函数调用的函数:若所述第一函数包括动态调用指令,所述动态调用指令的指令参数包括各被调用函数的函数指针,获取所述动态调用指令中第二函数的函数签名和调用所述第二函数的实例对象类型,所述第二函数为所述各被调用函数的任一函数;确定所述实例对象类型中是否包括第三函数;若所述实例对象类型中包括第三函数,所述第三函数的函数签名与所述第二函数的函数签名相同,则确定所述第三函数为所述第一函数调用的函数;若所述实例对象类型中不包括所述第三函数,则将所述实例对象类型更新为所述实例对象类型中的子类型,并返回所述确定所述实例对象类型中是否包括所述第三函数的步骤。
8.上述方法中,对于动态调用指令,虽然不能直接得到被调用函数,但可以通过函数签名进行确定第一函数调用的函数,函数签名具备唯一性,准确性更强,并且可以遍历每一个实例对象类型中的子类型,直至没有子类型,从而可以准确全面地得到第一函数调用的函数。
9.可选的,若所述第一函数包括静态调用指令,所述静态调用指令的指令参数包括第四函数的函数名称,则将所述第四函数的函数名称确定为所述第一函数调用的函数。
10.上述方法中,若所述第一函数包括静态调用指令,可以直接提取指令参数中第四函数的函数名称,从而可以更高效率地确定所述第一函数调用的函数。
11.可选的,所述第一节点和所述第二节点均为所述智能合约中的目标程序语句对应的节点,按照以下方式确定所述第一节点向所述第二节点传递的数据事实:若所述目标程序语句为赋值语句,且所述目标程序语句中的程序变量与预设数据事实中的基础变量相同,或者所述程序变量的成员变量与所述基础变量相同,或者所述程序变量与所述基础变量的成员变量相同,则根据所述程序变量的赋值确定所述第一节点向所述第二节点间传递的数据事实,所述基础变量为非成员变量。
12.上述方式下,对于赋值语句,可以根据程序变量与基础变量,确定所述第一节点向所述第二节点间传递的数据事实,即便程序变量或者基础变量包含成员变量的情况下,从而可以根据变量间的关系,准确地追踪所述第一节点向所述第二节点间传递的数据事实。
13.可选的,确定所述第一函数中是否存在第一变量,所述第一变量为第二变量的成员变量,所述第一变量为所述第一函数中任一变量;若存在,则将所述第一函数中的所述第一变量更新为取所述第二变量的成员变量的形式,并返回所述确定所述第一函数中是否存在第一变量的步骤。
14.上述方式下,针对第一函数中的第一变量,将所述第一变量更新为取所述第二变量的成员变量的形式,并返回所述确定所述第一函数中是否存在第一变量的步骤,从而不断地迭代,直至得到非成员变量,从而统一规整变量的访问路径,更加容易得出变量间的数
据事实传递关系。
15.可选的,所述第一节点和所述第二节点均为所述智能合约中的目标程序语句对应的节点,按照以下方式确定所述第一节点向所述第二节点传递的数据事实:若所述目标程序语句为存储读写语句,且所述目标程序语句中的程序变量与预设数据事实中的基础变量不相同,则根据所述基础变量确定所述第一节点向所述第二节点间传递的数据事实,所述基础变量为非成员变量。
16.上述方式下,在函数中的变量均化为非成员变量取成员变量的前提下,在目标程序语句为存储读写语句,且所述目标程序语句中的程序变量与预设数据事实中的基础变量不相同时,可以直接根据所述基础变量确定所述第一节点向所述第二节点间传递的数据事实。
17.可选的,所述根据搜索过程中搜索到的各数据事实节点,确定所述智能合约的并行冲突域,包括:针对所述各函数的任一函数的任一变量,若该变量存在目标传播路径,则确定该变量为所述并行冲突域中的变量;所述目标传播路径由该函数的结束节点至该函数的开始节点间对应连续的数据事实节点组成。
18.上述方式下,针对各函数的任一函数的任一变量,可以在该变量存在目标传播路径时,通过该函数的结束节点至该函数的开始节点间对应连续的数据事实节点表征数据事实传递的关系,从而确定该变量为所述并行冲突域中的变量。
19.第二方面,本发明提供一种区块链中智能合约的并行冲突域确定装置,包括:构建模块,用于构建智能合约的第一控制流图,所述第一控制流图包括所述智能合约的各函数的子控制流图,第一函数的子控制流图包括所述第一函数执行的开始节点和结束节点,且在所述第一函数包含调用指令时,所述第一函数的子控制流图包括该调用指令对应的调用节点和返回节点,所述第一函数为所述各函数中任一函数;还用于确定所述各函数的调用关系,并在所述第一控制流图中存在调用关系的节点间添加调用关系边,并确定所添加调用关系边的类型,获得第二控制流图;其中,任一调用关系边的类型表征了第一节点与第二节点之间数据事实的传递类型,所述第一节点和所述第二节点为该调用关系边两端的节点;所述第一函数的任一节点的数据事实指,该节点对应的程序语句执行之前,该节点对应的变量位于所述第一函数的并行冲突域中;以及用于在所述第二控制流图中添加各节点对应变量的数据事实节点,以及根据所述第二控制流图中节点间的调用关系边及类型,确定所述第二控制流图中各节点间传递的数据事实,获得第三控制流图;确定模块,用于针对所述各函数的任一函数,根据所述第三控制流图,从该函数的结束节点的数据事实节点搜索至该函数的开始节点的数据事实节点,并根据搜索过程中搜索到的各数据事实节点,确定所述智能合约的并行冲突域。
20.可选的,所述确定模块还用于:按照以下方式确定所述第一函数调用的函数:若所述第一函数包括动态调用指令,所述动态调用指令的指令参数包括各被调用函数的函数指针,获取所述动态调用指令中第二函数的函数签名和调用所述第二函数的实例对象类型,所述第二函数为所述各被调用函数的任一函数;
确定所述实例对象类型中是否包括第三函数;若所述实例对象类型中包括第三函数,所述第三函数的函数签名与所述第二函数的函数签名相同,则确定所述第三函数为所述第一函数调用的函数;若所述实例对象类型中不包括所述第三函数,则将所述实例对象类型更新为所述实例对象类型中的子类型,并返回所述确定所述实例对象类型中是否包括所述第三函数的步骤。
21.可选的,所述确定模块还用于:若所述第一函数包括静态调用指令,所述静态调用指令的指令参数包括第四函数的函数名称,则将所述第四函数的函数名称确定为所述第一函数调用的函数。
22.可选的,所述第一节点和所述第二节点均为所述智能合约中的目标程序语句对应的节点,所述确定模块还用于:按照以下方式确定所述第一节点向所述第二节点传递的数据事实:若所述目标程序语句为赋值语句,且所述目标程序语句中的程序变量与预设数据事实中的基础变量相同,或者所述程序变量的成员变量与所述基础变量相同,或者所述程序变量与所述基础变量的成员变量相同,则根据所述程序变量的赋值确定所述第一节点向所述第二节点间传递的数据事实,所述基础变量为非成员变量。
23.可选的,所述确定模块还用于:确定所述第一函数中是否存在第一变量,所述第一变量为第二变量的成员变量,所述第一变量为所述第一函数中任一变量;若存在,则将所述第一函数中的所述第一变量更新为取所述第二变量的成员变量的形式,并返回所述确定所述第一函数中是否存在第一变量的步骤。
24.可选的,所述第一节点和所述第二节点均为所述智能合约中的目标程序语句对应的节点,所述确定模块还用于:按照以下方式确定所述第一节点向所述第二节点传递的数据事实:若所述目标程序语句为存储读写语句,且所述目标程序语句中的程序变量与预设数据事实中的基础变量不相同,则根据所述基础变量确定所述第一节点向所述第二节点间传递的数据事实,所述基础变量为非成员变量。
25.可选的,所述确定模块还用于:针对所述各函数的任一函数的任一变量,若该变量存在目标传播路径,则确定该变量为所述并行冲突域中的变量;所述目标传播路径由该函数的结束节点至该函数的开始节点间对应连续的数据事实节点组成。
26.上述第二方面及第二方面各个可选装置的有益效果,可以参考上述第一方面及第一方面各个可选方法的有益效果,这里不再赘述。
27.第三方面,本发明提供一种计算机设备,包括程序或指令,当所述程序或指令被执行时,用以执行上述第一方面及第一方面各个可选的方法。
28.第四方面,本发明提供一种存储介质,包括程序或指令,当所述程序或指令被执行时,用以执行上述第一方面及第一方面各个可选的方法。
29.本发明的这些方面或其他方面在以下实施例的描述中会更加简明易懂。
附图说明
30.为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简要介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域的普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
31.图1为本发明实施例提供的一种区块链中智能合约的并行冲突域确定方法对应的流程示意图;图2为本发明实施例提供的一种区块链中智能合约的并行冲突域确定方法对应的第一控制流图的示意图;图3为本发明实施例提供的一种区块链中智能合约的并行冲突域确定方法中数据事实传递的具体步骤流程的示意图;图4为本发明实施例提供的一种区块链中智能合约的并行冲突域确定装置的结构示意图。
具体实施方式
32.为了使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明作进一步地详细描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本发明保护的范围。
33.为方便描述,下面首先介绍本技术中出现的名词。
34.智能合约:智能合约是运行在区块链系统之上的一份代码和数据的集合,其中代码负责实现智能合约的功能,数据负责存储智能合约状态,智能合约可以接收和发送信息。
35.交易:在区块链中,任何操作(部署合约、调用合约接口等)都是通过发送交易的方式进行。交易由用户发起,并通过客户端发送至区块链节点。区块链节点在收到交易后,会将交易打包为区块并执行。
36.交易并行执行:区块链中的交易是对智能合约接口的调用,可以通过分析交易执行涉及到的读写关系实现并行执行以提高整个区块链底层的性能。
37.并行冲突域:交易在执行过程中需要访问的数据状态的集合,由于不同交易在执行过程中可能会访问相同的数据状态,因此在并行执行时可能会导致冲突进而导致执行结果的不确定性。由于区块链系统通常使用键值数据库作为其后端存储系统,并行冲突域可以通过智能合约中存在冲突的程序变量表征。
38.静态程序分析:静态程序分析是指在不运行程序的条件下,对某些程序属性进行分析的方法。静态程序分析的结果无法做到完全精确,对于执行路径无穷的程序(如包含无限递归的程序),无法枚举出所有程序可能的执行路径,即使执行路径有限,由于状态爆炸的问题往往也无法进行路径遍历,因此静态程序分析往往采用近似方法:即若原始的分析目标是对某个性质回答“是”或“否”,近似方法的目标则是将这一目标变为回答“是”、“否”或“不知道”,即允许出现不确定的回答,例如“这段程序可能有bug”。
39.图:在计算机科学中,图是一种抽象数据类型,用于实现数学中图论的无向图和有向图的概念。图的数据结构包含一个有限(可能是可变的)的集合作为节点集合,以及一个
无序对(对应无向图)或有序对(对应有向图)的集合作为边(有向图中也称作弧)的集合。
40.控制流图:控制流图(control flow graph, cfg)是一个过程或程序的抽象表现,代表了一个程序执行过程中会遍历到的所有路径。cfg用图的形式表示一个过程内所有基本块执行的可能流向。cfg中每个顶点都对应一个程式基本块,并使用有向边来表示分支。
41.域敏感:也称为属性敏感,主要针对面向对象语言(包括c语言中的结构体等)的一种分析技术,目的是提高静态代码的分析精度,贯穿整个分析过程。
42.数据事实:即data fact,指程序在某一程序语句执行前或执行后程序所持有的性质。
43.ifds算法框架:是一类静态分析框架,可用于解决满足interprocedural(过程间)、finite(数据事实的取值范围有限)、distributive(数据事实的传播函数满足分配律,即对于传播函数需要满足及subset problem(所解决的问题是子集问题)四个特性的程序静态分析问题,常见ifds算法框架的实现可参考附件中的参考文献1及参考文献2。
44.访问路径:以“x.f.g”形式表示变量访问方式,其中“x”称为基础变量,“f”、“g”称为域。“x.f.g”表示首先访问变量“x”,随后访问变量“x”中名为“f”的数据成员,最后访问“x.f”中名为“g”的数据成员,访问路径的长度可以为无限长。
45.在金融机构(银行机构、保险机构或证券机构)在进行业务(如银行的贷款业务、存款业务等)运转过程中,常通过区块链进行交易。区块链的底层存储系统中的数据可以通过智能合约来访问,然而有一些数据在智能合约并行执行时可能会出现访问冲突,导致执行结果不确定。目前的并行冲突域的求解方式中,对于存在函数调用的智能合约,没有提供求解该智能合约相应并行冲突域的方法。这种情况不符合银行等金融机构的需求,无法保证金融机构各项业务的高效运转。
46.如图1所示,本技术提供一种区块链中智能合约的并行冲突域确定方法。
47.步骤101:构建智能合约的第一控制流图。
48.步骤102:确定所述各函数的调用关系,并在所述第一控制流图中存在调用关系的节点间添加调用关系边,并确定所添加调用关系边的类型,获得第二控制流图。
49.步骤103:在所述第二控制流图中添加各节点对应变量的数据事实节点,以及根据所述第二控制流图中节点间的调用关系边及类型,确定所述第二控制流图中各节点间传递的数据事实,获得第三控制流图;步骤104:针对所述各函数的任一函数,根据所述第三控制流图,从该函数的结束节点的数据事实节点搜索至该函数的开始节点的数据事实节点,并根据搜索过程中搜索到的各数据事实节点,确定所述智能合约的并行冲突域。
50.步骤101~步骤104中,所述第一控制流图包括所述智能合约的各函数的子控制流图,第一函数的子控制流图包括所述第一函数执行的开始节点和结束节点,且在所述第一函数包含调用指令时,所述第一函数的子控制流图包括该调用指令对应的调用节点和返回节点,所述第一函数为所述各函数中任一函数。
51.其中,任一调用关系边的类型表征了第一节点与第二节点之间数据事实的传递类型,所述第一节点和所述第二节点为该调用关系边两端的节点;所述第一函数的任一节点
的数据事实指,该节点对应的程序语句执行之前,该节点对应的变量位于所述第一函数的并行冲突域中。
52.步骤102中,调用关系边类型可以包括以下类型:call

flow边,即求解函数调用(参数映射)的转移函数;return

flow边,即求解0的转移函数;calltoreturn

flow边,即函数调用到函数返回的转移函数; normal

flow边,是指除了上述3种函数处理范围之外的语句的转移函数。
53.举例来说,针对以下智能合约的代码:fn bar(&mut self, s1: &string, s2: &string, b: bool) {
ꢀꢀ
if b {
ꢀꢀꢀꢀꢀ
self.mapping[s1] = 0;// 以s1为key写存储
ꢀꢀ
} else {
ꢀꢀꢀꢀꢀ
self.mapping[s2] = 0;// 以s2为key写存储
ꢀꢀ
}}pubfn foo(&mut self, s1: string, s2: string, b: bool) {
ꢀꢀ
let t = self.bar(&s1, &s2, b);}如图2所示,为上述智能合约代码对应的第二控制流图,若图2中未加调用关系边,那么便是第一控制流图,若再添加各节点对应变量的数据事实节点,以及根据所述第二控制流图中节点间的调用关系边及类型,确定所述第二控制流图中各节点间传递的数据事实,便是第三控制流图。
[0054]
本发明方案设计了一种过程内转移函数(即normal

flow边所对应的转移函数),能够支持域敏感的交易并行冲突域静态分析。在构造的超级图的基础上,本发明方案将超级图进一步转换为exploded超级图,使用数据事实表示图中的节点,将静态分析中转移函数的计算,即对数据事实的传递计算被转化为exploded中边的求解。此外,exploded超级图中还扩展了一个特殊的数据事实0,用于表示空集合。本发明方法随后以exploded超级图中的合约方法出口点为分析起点、以合约方法入口点为分析终点,基于ifds算法框架进行逆向数据流分析,通过查找哪些程序语句发起数据读写请求,并逆向追踪请求所使用的键的数据来源向前传播的,直至到达分析重点。在完成数据传播路径计算后,检查哪些输入参数存在分析起点到达自身的路径,若存在则表明该输入参数为该合约方法的并行冲突域。典型的exploded超级图如下图所示:一种可选的实施方式中,步骤102中可以按照以下方式确定所述第一函数调用的函数:若所述第一函数包括动态调用指令,所述动态调用指令的指令参数包括各被调用函数的函数指针,获取所述动态调用指令中第二函数的函数签名和调用所述第二函数的实例对象类型,所述第二函数为所述各被调用函数的任一函数;确定所述实例对象类型中是否包括第三函数;若所述实例对象类型中包括第三函数,所述第三函数的函数签名与所述第二函数的函数签名相同,则确定所述第三函数为所述第一函数调用的函数;若所述实例对象类型中不包括所述第三函数,则将所述实例对象类型更新为所述实例对象类型中的子
类型,并返回所述确定所述实例对象类型中是否包括所述第三函数的步骤。
[0055]
另一种情形中,步骤102中若所述第一函数包括静态调用指令,所述静态调用指令的指令参数包括第四函数的函数名称,则将所述第四函数的函数名称确定为所述第一函数调用的函数。
[0056]
具体来说,上述实现方式具体可以如下:调用指令分为两类:静态调用指令,此类指令在指令参数明确表示了被调用函数的名称及参数列表,根据该名称及参数列表中各参数的类型,便可唯一确定具体被调用函数;动态调用指令:此类指令通常包含由若干个函数指针组成的虚表,在运行时会根据虚表中函数指针的值定位被调用函数的实际地址,因此该类指令的具体调用对象只能在运行时确定。
[0057]
为避免由于无法确定动态调用指令的具体对象导致无法建立完整的过程间控制流图。本技术中以动态调用指令中函数指针的类型为线索,在编译期通过类型之间的继承关系推测出可能的被调用函数,并在当前函数和每一个可能被调用的函数之间建立调用边关系,从而构造完整的过程间控制流图。
[0058]
在动态调用指令中,函数调用使用“o.foo(

)”的形式表示,基于类型继承关系的被调函数推测方法主要基于以下两点进行推测:调用者实例对象类型(即“o”指针所指向对象的类型),记为c;调用指令中函数的签名,记为m。其中,函数签名由类名、方法名、方法参数类型及方法返回值类型组成。例如,对于下列代码中的“foo”方法,其签名可以表示为“c.foo(p,q,r)t”:struct c;impl c {
ꢀꢀ
fn foo(p p, q q, r r)
ꢀ‑
> t{ ... }}本技术中的定义函数dispatch(c, m),用于确定调用的函数,其执行流程以下步骤:步骤(1):若c中包含了某个函数m’,且m’的签名与m相同,则返回m’,否则跳转至(2)。
[0059]
步骤(2):返回dispatch(c’, m),其中c’为c的父类。
[0060]
因此,本技术中确定函数调用指令所调用的具体函数的步骤为:步骤(1):构造目标函数集合t,并将t初始化为空。
[0061]
步骤(2):获取函数调用指令处被调用函数的签名m。
[0062]
步骤(3):若函数调用指令为静态调用指令,则令t= {m},跳转至(8),否则跳转至(4)。
[0063]
步骤(4):若函数调用指令为动态调用指令,则令c= 函数调用指令处调用者实例对象的类型。
[0064]
步骤(5):若代码中存在某个类型c’为c的子类型,则跳转至(6),否则跳转至(8)。
[0065]
步骤(6):将dispatch(c’,m)的返回值加入t中。
[0066]
步骤(7):从代码中排除c’类型,跳转至(5)。
[0067]
步骤(8):返回t,t为由可能的被调用函数所组成的集合。
[0068]
一种可选的实施方式中,所述第一节点和所述第二节点均为所述智能合约中的目标程序语句对应的节点,步骤103中按照以下方式确定所述第一节点向所述第二节点传递的数据事实:若所述目标程序语句为赋值语句,且所述目标程序语句中的程序变量与预设数据事实中的基础变量相同,或者所述程序变量的成员变量与所述基础变量相同,或者所述程序变量与所述基础变量的成员变量相同,则根据所述程序变量的赋值确定所述第一节点向所述第二节点间传递的数据事实,所述基础变量为非成员变量。
[0069]
一种可能的实现方式还可以如下:确定所述第一函数中是否存在第一变量,所述第一变量为第二变量的成员变量,所述第一变量为所述第一函数中任一变量;若存在,则将所述第一函数中的所述第一变量更新为取所述第二变量的成员变量的形式,并返回所述确定所述第一函数中是否存在第一变量的步骤。
[0070]
上述具体实现方式(可以称为访问路径重整)可以如下:可以通过定义的reify函数用于对访问路径进行重整。访问路径重整的含义是将访问路径中的基础变量不断扩展为层次更低的访问路径,直到基础变量无法扩展为止。例如在如下代码示例中:tmp1 = y.f;tmp2 = tmp1.g;tmp2.h = a;当对访问路径“tmp2.h”进行重整时,由于tmp2 = tmp1.g,因此其会被扩展为“tmp1.g.h”,同时,又由于tmp1 = y.f,因此其会被继续扩展为“y.f.g.h”,由于示例中变量y并没有进一步的定义,因此重整过程结束。
[0071]
访问路径重整的主要用途在于保证的分析结果的准确性。在上述示例中,假设在执行最后一条程序语句之后a是交易并行冲突域,若没有访问路径重整的过程,则分析过程将会错误地认为“tmp2.h=a;”语句并不会对“y.f.g.h“造成任何影响,即a是交易并行冲突域这一数据事实并不会传播至变量y的数据成员中。因为从单条语句的维度来看,“tmp2.h=a;”中左边访问路径中的基础变量“tmp2”与“y”并不相同。反之,若在做数据流传播之前进行重整化,则可将该语句变形为“y.f.g.h=a;”,从而能够将数据事实正确地传播至“y.f.g.h”。
[0072]
本技术中reify函数的输入为形如“b.f1

fn”的访问路径,重整化的步骤(1)~(5)为:步骤(1):在代码中间表示中查找关于变量b的定值语句s。
[0073]
步骤(2):若s为形如“b = y.g1...gm”的定值语句,则跳转至(3),否则跳转至(4)。
[0074]
步骤(3):返回reify(y.g1

gm),跳转至(5)。
[0075]
步骤(4):返回“b.f1

fn”。
[0076]
步骤(5):结束。
[0077]
需要说明的是,步骤103的一种可能实现方式中,所述第一节点和所述第二节点均为所述智能合约中的目标程序语句对应的节点,按照以下方式确定所述第一节点向所述第
二节点传递的数据事实:若所述目标程序语句为存储读写语句,且所述目标程序语句中的程序变量与预设数据事实中的基础变量不相同,则根据所述基础变量确定所述第一节点向所述第二节点间传递的数据事实,所述基础变量为非成员变量。
[0078]
因此,步骤103的整体流程图可以如图3所示,也即是normal

flow转移函数的执行方式。
[0079]
本技术中,为支持域敏感交易冲突域分析,normal

flow转移函数的输入包括两个参数,第一个参数为目标程序语句,第二个参数为预设数据事实,可以是使用访问路径形式b.f1

fn表示的、执行该语句之后的数据事实,即某个变量是交易并行冲突域,并根据语句的具体类型计算出执行该语句执行之前的数据事实。
[0080]
变量的表示形式形如“b.f1

fn”,其中“b”为基础变量,“f1

fn”则为各个域的名字按照访问顺序所组成的有序序列。综上,本技术中normal

flow转移函数的实现方式为:步骤(1):构造数据事实集合t,并将t初始化为空。
[0081]
步骤(2):若当前程序语句为形如“x = y”的赋值语句,则跳转至(3),否则跳转至(6)。
[0082]
步骤(3):若x与b是同一变量,则跳转至(4),否则跳转至(5)。
[0083]
步骤(4):令t = { y.f1

fn},跳转至(23)。
[0084]
步骤(5):令t = { b.f1

fn},跳转至(23)。
[0085]
步骤(6):若当前程序语句为形如“getstorage(x)”或“setstorage(x,
ꢀ…
)”的存储系统读写语句,则跳转至(7),否则跳转至(10)。
[0086]
步骤(7):若x与b是同一变量,则跳转至(8),否则跳转至(9)。
[0087]
步骤(8):令t = { 0},跳转至(23)。
[0088]
步骤(9):令t= {b.f1...fn},跳转至(23)。
[0089]
步骤(10):若当前程序语句为形如“x =y.g”的赋值语句,则跳转至(11),否则跳转至(15)。
[0090]
步骤(11):若x与b是同一变量,则跳转至(12),否则跳转至(14)。
[0091]
步骤(12):调用reify函数对“y.g”进行重整化,将其变形为“z.g1

gm”。
[0092]
步骤(13):令t = { z.g1

gm.f1

fn},跳转至(23)。
[0093]
步骤(14):令t = { b.f1...fn},跳转至(23)。
[0094]
步骤(15):若当前语句是形如“x.g=y”的赋值语句。
[0095]
步骤(16):调用reify函数对“x.g”进行重整化,将其变形为“z.g1

gm”。
[0096]
步骤(17):若z与b是同一变量、m小于等于n且“g1

gm”=“f1

fm”,则跳转至(18),否则跳转至(23)。
[0097]
步骤(18):令i=1。
[0098]
步骤(19):若i小于等于m,则跳转至(20),否则跳转至(21)。
[0099]
步骤(20):若gi不是数组类型,则令i = i + 1,跳转至(18),否则跳转至(22)。
[0100]
步骤(21):令t = {y.fm+1

fn },跳转至(23)。
[0101]
步骤(22):令t = {y.fm+1

fn,b.f1

fn}。
[0102]
步骤(23):返回t。
[0103]
一种可能的实施方式中,步骤104中,根据搜索过程中搜索到的各数据事实节点,确定所述智能合约的并行冲突域的具体方式如下:针对所述各函数的任一函数的任一变量,若该变量存在目标传播路径,则确定该变量为所述并行冲突域中的变量;所述目标传播路径由该函数的结束节点至该函数的开始节点间对应连续的数据事实节点组成。
[0104]
上述方式下,针对各函数的任一函数的任一变量,可以在该变量存在目标传播路径时,通过该函数的结束节点至该函数的开始节点间对应连续的数据事实节点表征数据事实传递的关系,从而确定该变量为所述并行冲突域中的变量。
[0105]
如图4所示,本发明提供一种区块链中智能合约的并行冲突域确定装置,包括:构建模块401,用于构建智能合约的第一控制流图,所述第一控制流图包括所述智能合约的各函数的子控制流图,第一函数的子控制流图包括所述第一函数执行的开始节点和结束节点,且在所述第一函数包含调用指令时,所述第一函数的子控制流图包括该调用指令对应的调用节点和返回节点,所述第一函数为所述各函数中任一函数;还用于确定所述各函数的调用关系,并在所述第一控制流图中存在调用关系的节点间添加调用关系边,并确定所添加调用关系边的类型,获得第二控制流图;其中,任一调用关系边的类型表征了第一节点与第二节点之间数据事实的传递类型,所述第一节点和所述第二节点为该调用关系边两端的节点;所述第一函数的任一节点的数据事实指,该节点对应的程序语句执行之前,该节点对应的变量位于所述第一函数的并行冲突域中;以及用于在所述第二控制流图中添加各节点对应变量的数据事实节点,以及根据所述第二控制流图中节点间的调用关系边及类型,确定所述第二控制流图中各节点间传递的数据事实,获得第三控制流图;确定模块402,用于针对所述各函数的任一函数,根据所述第三控制流图,从该函数的结束节点的数据事实节点搜索至该函数的开始节点的数据事实节点,并根据搜索过程中搜索到的各数据事实节点,确定所述智能合约的并行冲突域。
[0106]
可选的,所述确定模块402还用于:按照以下方式确定所述第一函数调用的函数:若所述第一函数包括动态调用指令,所述动态调用指令的指令参数包括各被调用函数的函数指针,获取所述动态调用指令中第二函数的函数签名和调用所述第二函数的实例对象类型,所述第二函数为所述各被调用函数的任一函数;确定所述实例对象类型中是否包括第三函数;若所述实例对象类型中包括第三函数,所述第三函数的函数签名与所述第二函数的函数签名相同,则确定所述第三函数为所述第一函数调用的函数;若所述实例对象类型中不包括所述第三函数,则将所述实例对象类型更新为所述实例对象类型中的子类型,并返回所述确定所述实例对象类型中是否包括所述第三函数的步骤。
[0107]
可选的,所述确定模块402还用于:若所述第一函数包括静态调用指令,所述静态调用指令的指令参数包括第四函数的函数名称,则将所述第四函数的函数名称确定为所述第一函数调用的函数。
[0108]
可选的,所述第一节点和所述第二节点均为所述智能合约中的目标程序语句对应
的节点,所述确定模块402还用于:按照以下方式确定所述第一节点向所述第二节点传递的数据事实:若所述目标程序语句为赋值语句,且所述目标程序语句中的程序变量与预设数据事实中的基础变量相同,或者所述程序变量的成员变量与所述基础变量相同,或者所述程序变量与所述基础变量的成员变量相同,则根据所述程序变量的赋值确定所述第一节点向所述第二节点间传递的数据事实,所述基础变量为非成员变量。
[0109]
可选的,所述确定模块402还用于:确定所述第一函数中是否存在第一变量,所述第一变量为第二变量的成员变量,所述第一变量为所述第一函数中任一变量;若存在,则将所述第一函数中的所述第一变量更新为取所述第二变量的成员变量的形式,并返回所述确定所述第一函数中是否存在第一变量的步骤。
[0110]
可选的,所述第一节点和所述第二节点均为所述智能合约中的目标程序语句对应的节点,所述确定模块402还用于:按照以下方式确定所述第一节点向所述第二节点传递的数据事实:若所述目标程序语句为存储读写语句,且所述目标程序语句中的程序变量与预设数据事实中的基础变量不相同,则根据所述基础变量确定所述第一节点向所述第二节点间传递的数据事实,所述基础变量为非成员变量。
[0111]
可选的,所述确定模块402还用于:针对所述各函数的任一函数的任一变量,若该变量存在目标传播路径,则确定该变量为所述并行冲突域中的变量;所述目标传播路径由该函数的结束节点至该函数的开始节点间对应连续的数据事实节点组成。
[0112]
基于同一发明构思,本发明实施例还提供了一种计算机设备,包括程序或指令,当所述程序或指令被执行时,如本发明实施例提供的区块链中智能合约的并行冲突域确定方法及任一可选方法被执行。
[0113]
基于同一发明构思,本发明实施例还提供了一种计算机可读存储介质,包括程序或指令,当所述程序或指令被执行时,如本发明实施例提供的区块链中智能合约的并行冲突域确定方法及任一可选方法被执行。
[0114]
本领域内的技术人员应明白,本发明的实施例可提供为方法、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd

rom、光学存储器等)上实施的计算机程序产品的形式。
[0115]
本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
[0116]
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特
定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
[0117]
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
[0118]
尽管已描述了本发明的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明范围的所有变更和修改。
[0119]
显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1