一种基于形式化模型的智能合约代码设计生成方法及系统

文档序号:29163419发布日期:2022-03-09 01:26阅读:224来源:国知局
一种基于形式化模型的智能合约代码设计生成方法及系统

1.本发明属于区块链智能合约与软件安全技术领域,尤其涉及一种基于形式化模型的智能合约代码设计生成方法及系统。


背景技术:

2.智能合约本质上可以看作在区块链上部署的一段可信交易执行程序,蕴含着契约关系和利益交易,承载了巨大的价值和交易量,比一般的软件具有更复杂的逻辑性和更高的安全性要求。
3.形式化方法是一种基于严格数学模型的软硬件设计方法,也是在安全关键软件系统中被广泛采用且高效的验证方法,同时也是国际软件验证的最高级别标准,形式化方法对整个系统使用非二义性的形式语言进行描述,并可以通过相应的验证工具对模型的各种属性进行验证
4.通过对智能合约以及形式化方法应用在智能合约领域现状的分析,现有技术主要存在以下不足:
5.1)智能合约存在大量的潜在安全风险,并且大部分隐患来源于合约开发者的设计逻辑出现的漏洞。常见的静态分析方法、软件测试或人工审计很难发现这种类型漏洞。
6.2)形式化方法和智能合约代码之间存在语义鸿沟和技术壁垒。应用形式化方法需要深厚的数学功底,而开发智能合约代码需要熟练使用合约的编程语言。在面向大规模智能合约的应用场景时,很难让所有的开发者同时掌握形式化方法和智能合约开发方法。
7.3)形式化模型和智能合约存在语义不一致的情况,现有技术中可行的规约语言或模型工具无法保证建立的模型行为和智能合约的需求文档保持一致。
8.4)形式化验证智能合约的自动化程度低。通常建立智能合约的形式化模型需要很高的人力成本和时间成本,在面向大规模智能合约应用场景时,人工建模和手动验证导致效率低下,且很难保证建模的正确性和一致性。


技术实现要素:

9.本发明的目的是提供一种基于event-b形式化模型的智能合约代码设计生成方法及系统,解决智能合约现有安全问题以及形式化方法与智能合约结合的不足。
10.本发明一方面提供了一种基于event-b形式化模型的智能合约代码设计生成方法,包括:
11.步骤1,进行智能合约的需求分析,所述需求分析需要多方协调,用自然语言或领域特定语言dsl来描述智能合约的功能、属性和场景;
12.步骤2,基于形式化模型event-b的语言准确地建立智能合约形式化模型并规约智能合约的属性;
13.步骤3,基于形式化模型event-b,对所述智能合约形式化模型进行验证,对于没有通过所述验证的所述智能合约形式化模型进行反向校正和模型修改,直到通过所述验证;
14.步骤4,基于eb2s运算子,将输入所述eb2s运算子的所述智能合约形式化模型对应输出solidity智能合约代码。
15.优选的,所述步骤2包括:所述形式化模型event-b对智能合约形式化模型的精化,提供从抽象到具体,从简单到复杂的模型生成方法,并且每次精化会验证模型之间的约束关系,从而保证最后生成的模型和最初的需求是一致和正确的。
16.优选的,所述eb2s运算子包括多个转换方法对应的规则和算法,所述规则和算法按照从整体到局部的顺序包括:
17.(1)规则m:将一个完整的event-b机器及其参考的文本转换到solidity合约,所述规则m规定在转换之前必须验证通过所有的证明义务;
18.(2)抽象集数据结构及查重规则:基于solidity语法规则构造一个语义一致的数据结构,选择数组作为和抽象集对应的数据结构,限制数组中不能有相同的元素,即数组中存储的元素值不能一样;
19.(3)集合转换规则set:通过set规则将集合转换为数组;
20.(4)常量转换规则cons规则及变量转换规则var规则:分别用于将event-b中的常量和变量转换到solidity语言中对应的常量和变量;
21.(5)公理转换规则axiom、定理转换规则theorem以及不变量转换规则inv:公理转换规则axiom用于将公理转换为断言;所述定理转换规则theorem用于将定理转换为断言;所述不变量转换规则inv用于将不变量转换为断言;solidity支持两种断言:assert和require,所述公理、定理和不变量都转换为assert断言;
22.(6)初始化事件转换规则init:初始化事件在所有事件中最先执行,并只执行一次,用于初始化机器中的变量,将所述初始化事件直接转换为solidity合约中的构造函数,所述构造函数是使用construct关键字声明的特殊函数,用于初始化合约中的变量;
23.(7)普通事件转换规则:普通事件可以转换为两个solidity函数,其中一个为守卫函数,用于测试对应事件的守卫条件是否满足,另一个为执行函数,用于执行对应事件的动作;
24.(8)针对普通事件中有无参数的规则when规则和any规则;
25.(9)赋值操作转换规则assign:考虑赋值后的表达式e’可能会发生变化,而被赋值的变量应当等于赋值前的表达式e’,定义一个常量ec,用于记录赋值前的表达式e’的值;
26.(10)多赋值操作规则:根据event-b的语义,对于单个事件,所有的动作(actions)是同时进行的;当事件中的多个赋值操作时,将每个赋值操作分别转换,为了验证其赋值操作的安全属性,采用合取操作来合并结果;
27.(11)赋值操作的变量集合规则:定义了三个辅助运算子mod,pred和typeof;其中mod运算子用于计算由事件中动作赋值的变量集;所述pred运算子用于计算event-b语言中的变量或表达式到对应的solidity中定义的变量或表达式,基于pred运算子,确定pow规则和relationhas规则,pow规则用于转换event-b中的属于运算表达式;relationhas规则用于转换event-b中的关系到solidity语言中的mapping数据结构;该运算子允许用户定义嵌套的关系;所述typeof运算子将event-b变量和常量的类型转换到对应的solidity类型;
28.(12)event-b模型执行模拟算法:将合约m看作一个对象,其中的所有方法都可以通过this.method()来调用;event-b中所有事件的执行顺序是随机的,通过随机数的方
式,来模拟其事件的执行;通过if

break控制语句保证了事件执行的原子性;其中,solidity合约本身没有提供生成随机数的工具类或方法,需要自定义随机数的方法来生成伪随机数。
29.优选的,所述伪随机数使用线性同余发生器lcg算法生成,包括:计算参数的紧密打包编码;通过keccak256算法对结果进行hash计算;转换成uint256类型;在获得随机数后,根据其取值范围进行取模操作,最终获得伪随机数。
30.优选的,所述初始化事件转换规则init还包括:将eb2s运算子递归地应用在初始化事件,实现对整个initialisation事件转换。
31.优选的,所述普通事件转换规则还包括:
32.在event-b中,事件的所有守卫条件是同时评估的,但每次只能执行一个事件。根据event-b语义:如果事件的守卫条件不满足,事件不会执行,因此不会改变系统状态;为了满足其语义,构造两种场景:
33.第一种情况是守卫条件不满足,即不能执行run_evt方法,其后置条件是合约中变量不能发生改变;为了判断合约中变量是否被修改,定义一个can_assign函数,以及两个全局数组变量g和g',由于合约的全局状态变量数目是确定的,因此可以定义一个数组g保存着合约中所有的全局变量;g'表示经过了某个run_evt方法后的g,如果该run_evt方法没有对变量修改,则g=g',反之,g≠g'。can_assign方法定义输入为指定变量组成的数组,表示该数组中的元素可以进行赋值操作,允许其发生变化,而不在该数组中的元素则不能被修改;
34.第二种情况是事件的守卫条件满足,可以执行run_evt方法,其后置条件为合约状态的变化必须满足该事件的动作。
35.优选的,在所述形式化模型event-b中,机器会不断的运行下去直到所有事件的守卫条件都不被满足;机器可以一直运行只要有至少一个事件的守卫条件满足;任何一个事件在守卫条件满足的时候便可以执行,并且所有的事件的执行满足原子性,即该事件的执行是不可中断的,要么全部执行成功要么全部执行失败。
36.本发明第二方面提供了一种基于event-b形式化模型的智能合约代码设计生成系统,包括:
37.需求分析模块,用于进行智能合约的需求分析,一个完整的智能合约是从需求分析出发,需求分析需要多方协调,用自然语言或领域特定语言(dsl)来描述智能合约的功能、属性和场景;
38.智能合约形式化模型建立模块,用于基于形式化模型event-b的语言准确地建立智能合约形式化模型;
39.验证模块,用于基于形式化模型event-b,对所述智能合约形式化模型进行验证,对于没有通过所述验证的所述智能合约形式化模型进行反向校正和模型修改,直到通过所述验证;
40.智能合约代码设计生成模块,用于基于eb2s运算子,将输入所述eb2s运算子的所述智能合约形式化模型对应输出solidity智能合约代码。
41.本发明的第三方面提供一种电子设备,包括处理器和通信电路,所述处理器连接所述通信电路,所述处理器用于执行指令以实现如第一方面所述的方法。
42.本发明的第四方面提供一种计算机可读存储介质,所述计算机可读存储介质存储有多条指令,所述多条指令可被处理器读取并执行如第一方面所述的方法。
43.本发明提供的一种基于event-b形式化模型的智能合约代码设计生成方法、系统以及电子设备,具有如下有益效果:
44.(1)智能合约没有潜在安全风险。
45.(2)适用于面向大规模智能合约的应用场景设计,对开发者同时掌握形式化方法和智能合约开发方法的要求降低。
46.(3)能够确保建立的模型行为和智能合约的需求文档保持一致。
47.(4)形式化验证智能合约的自动化程度高,在面向大规模智能合约应用场景时,在保证高效率的前提下可以保证建模的正确性和一致性。
附图说明
48.图1为根据本发明优选实施例的方法流程图。
49.图2为根据本发明优选实施例的电子设备构成图。
具体实施方式
50.下面结合附图和实施例,对本发明的具体实施方式作进一步详细描述。以下实施例用于说明本发明,但不用来限制本发明的范围。
51.参见图1,本实施例提供了一种基于event-b形式化模型的智能合约代码设计生成方法,包括:
52.s1,进行智能合约的需求分析,一个完整的智能合约是从需求分析出发,需求分析需要多方协调,用自然语言或领域特定语言(dsl)来描述智能合约的功能、属性和场景;
53.s2,基于形式化模型event-b的语言准确地建立智能合约形式化模型并规约智能合约的属性;由于形式化模型event-b支持对智能合约形式化模型的精化,提供从抽象到具体,从简单到复杂的模型生成方法,并且每次精化会验证模型之间的约束关系,从而保证最后生成的模型和最初的需求是一致和正确的;
54.s3,基于形式化模型event-b,对所述智能合约形式化模型进行验证,对于没有通过所述验证的所述智能合约形式化模型进行反向校正和模型修改,直到通过所述验证;
55.s4,基于eb2s运算子,将输入所述eb2s运算子的所述智能合约形式化模型对应输出solidity智能合约代码;由于形式化专家精通建立形式模型和推理证明,但对智能合约的代码并不是很熟悉,打通形式化模型和智能合约代码的壁垒是非常关键的,因此实现eb2s运算子,它将event-b形式化模型作为输入,输出solidity智能合约代码。该工具作为rodin插件安装使用,非常方便。
56.作为优选的实施方式,所述eb2s运算子包括多个转换方法对应的规则和算法,所述规则和算法按照从整体到局部的顺序包括:
57.(1)规则m:表1定义了规则m,将一个完整的event-b机器及其参考的文本转换到solidity合约,所述规则m规定在转换之前必须验证通过所有的证明义务,因为一方面,转换一个不能通过证明义务的机器是没有意义的;另一方面,转换通过证明义务的机器,不需要考虑转换模型中的见证者(witness)和变体(variant)到solidity合约中。其中,见证者
用于规约在抽象模型中的变量,但该变量在精化后的模型中不再使用,变体用于证明event-b某个事件的收敛性,即一定会终止;这两个元素用于辅助证明模型的精化属性和事件收敛性,这对于solidity合约是不需要考虑的,因此,不用将其转换到solidity合约。
58.表1转换规则m
[0059][0060]
(2)抽象集数据结构及查重规则:由于solidity语言没有关于抽象集的概念和相关的数据结构,因此需要基于solidity语法规则构造一个语义一致的数据结构,这里选择数组作为和抽象集对应的数据结构,限制数组中不能有相同的元素,即数组中存储的元素值不能一样。本实施例对于数组a,设计如表2所示的算法用于判断其是否含有重复元素。
[0061]
表2集合对应的数组校验算法
[0062][0063]
(3)集合转换规则set,如表3所示,通过set规则将集合转换为数组,其中typeof运算子用于计算集合s的类型。
[0064]
表3转换规则set
[0065]
[0066]
(4)常量转换规则cons规则及变量转换规则var规则:分别用于将event-b中的常量和变量转换到solidity语言中对应的常量和变量,如表4所示。
[0067]
表4转换规则cons和var
[0068][0069]
(5)公理转换规则axiom、定理转换规则theorem以及不变量转换规则inv:公理(axioms)通常用来规约常量的性质,将其转换为断言;定理(theorems)必须由公理推导得到,因此也转换为断言;不变量(invariant)用来规约机器中变量的性质,因此将它们转换为断言。solidity支持两种断言:assert和require。assert()相对于require(),在报错的时候,会扣除gas费用,但require()在报错后会返还gas费用。因此,require()声明失败被认为是正常和健壮的情况,当assert()声明失败时,则意味程序存在需要修复的bug,通常用来验证变量越界、不变量、验证发生改变后的状态,预防不应该发生的条件等。require()通常用来验证用户的输入、外部合约响应等。因此,公理、定理和不变量都转换为assert断言。表5定义了axiom、theorem和inv三个转换规则,其中,pred运算子用于计算event-b变量或语句转换得到的solidity的变量或语句。
[0070]
表5转换规则axiom、theorem与inv
[0071][0072]
(6)初始化事件转换规则init:初始化事件(initialisation)在所有事件中最先执行,并只执行一次,用于初始化机器中的变量,所以直接转换为solidity合约中的构造函数。构造函数是使用construct关键字声明的特殊函数,用于初始化合约中的变量。在表6中定义了init规则,将eb2s运算子递归地应用在初始化事件,可实现对整个initialisation事件转换。
[0073]
表6转换规则init
[0074][0075]
(7)普通事件转换规则:普通事件可以转换为两个solidity函数,其中一个为守卫函数,用于测试对应事件的守卫条件是否满足,另一个为执行函数,用于执行对应事件的动作。在event-b中,事件的所有守卫条件是同时评估的,但每次只能执行一个事件。根据event-b语义:如果事件的守卫条件不满足,事件不会执行,因此不会改变系统状态。为了满
足其语义,我们构造了两种场景。
[0076]
第一种情况是守卫条件不满足,即不能执行run_evt方法,我们规定其后置条件是合约中变量不能发生改变。为了判断合约中变量是否被修改,定义一个can_assign函数,以及两个全局数组变量g和g',由于合约的全局状态变量数目是确定的,因此可以定义一个数组g保存着合约中所有的全局变量。g'表示经过了某个run_evt方法后的g,如果该run_evt方法没有对变量修改,则g=g',反之,g≠g'。can_assign方法(用于判断合约中变量是否被修改)定义如表7所示,输入为指定变量组成的数组,表示该数组中的元素可以进行赋值操作,允许其发生变化,而不在该数组中的元素则不能被修改。例如,can_assign(null)表示传入了空数组,即没有变量可以被修改;can_assign(s)表示传入了数组s,即任何s中保存的合约变量可以被修改,非s中的其他合约变量不能被修改。
[0077]
表7 can_assign函数
[0078][0079]
第一种情况的断言如表8所示。
[0080]
表8不满足守卫条件的断言
[0081][0082]
第二种情况是事件的守卫条件满足,可以执行run_evt方法,我们规定其后置条件为合约状态的变化必须满足该事件的动作。其断言如表9所示。assert(a')表示对函数中所有赋值语句进行断言,如赋值语句var=expr,其断言为assert(var==expr)。
[0083]
表9满足守卫条件的断言
[0084][0085]
(8)针对普通事件中有无参数的规则when规则和any规则,如表10所示。when规则由于不考虑参数,比any更加简单。
[0086]
表10转换规则any与when
[0087][0088]
(9)赋值操作转换规则assign:在solidity语言中变量都是值类型,它们的比较操作使用==符号。考虑赋值后的表达式e’可能会发生变化,因为表达式中的变量可能会发生变化,而被赋值的变量应当等于赋值前的表达式e’,为了转换这条安全属性,定义一个常量ec,用于记录赋值前的表达式e’的值,如表11所示。
[0089]
表11转换规则assign
[0090][0091]
(10)多赋值操作规则:根据event-b的语义,对于单个事件,所有的动作(actions)是同时进行的。当事件中的多个赋值操作时,将每个赋值操作分别转换,为了验证其赋值操作的安全属性,采用合取操作来合并结果。例如,给出某个event-b事件的赋值操作,如表12所示。
[0092]
表12多赋值操作
[0093][0094]
其转换结果如表13所示。
[0095]
表13多赋值操作的转换结果
[0096][0097]
(11)赋值操作的变量集合规则:为了便于介绍eb2s工具的转换方法,定义了三个辅助运算子mod,pred和typeof。
[0098]
(11-1)mod运算子用于计算由事件中动作赋值的变量集。在modasg规则中,ν是一个变量,e是表达式,该规则将被赋值的变量添加到集合中。在event-b中,:|符号表示非确定赋值,可以和确定性赋值(:=)等价替换。如v:=v+w可以表示成v:|v'=v+w。如表14所示,基于mod运算子,定义了几个类似的规则来计算涉及到赋值操作的变量集合,如modsel,modany和modsim。需要强调的是,在modany规则中,由于引入了局部变量x,所以全局变量中的x(如果有的话)不应该被计算在数组s中,因此需要从s中去掉。
[0099]
表14 mod衍生规则
[0100][0101]
(11-2)pred运算子用于计算event-b语言中的变量或表达式到对应的solidity中定义的变量或表达式。例如,event-b谓词、布尔值、关系和一些算术表达式通过pred运算子,可以直接转换到对应的solidity语法结构。
[0102]
基于pred运算子,给出了pow规则和relationhas规则。pow规则用于转换event-b中的属于运算表达式(∈)。我们在solidity中定义了两个内置函数has和powset,has函数设计如表15所示。has函数的输入为一个元素x和一个数组a,返回一个布尔值,用于判断数组a中是否有该元素,由于元素x可能是引用类型,因此我们比较它们的哈希值。
[0103]
表15 has函数
[0104][0105]
参考event-b中计算幂集的方法,考虑一个集合x={a,b,c},其幂集合为{}、{a}、{b}、{a,b}、{c}、{a,c}、{b,c}、{a,b,c}。可以总结出:
[0106]
每增长一个元素组成的新的幂集=增长前的幂集+该元素与增长前幂集的组合。
[0107]
基于该思路,定义powset函数,如表16所示,输入为一个数组a,输出一个数组b,数组b中元素是数组a元素可能构成的每个数组。
[0108]
表16幂集函数
[0109][0110]
有了has和powset作为辅助函数,定义pow规则如表17所示,其中x和y表示集合。
[0111]
表17pow转换规则
[0112][0113]
如表18所示,relationhas规则用于转换event-b中的关系(relation)到solidity语言中的mapping数据结构。r是一个关系,并且rd和rr是关系r的定义域和值域。
[0114]
表18转换规则relationhas
[0115][0116]
该运算子允许用户定义嵌套的关系。例如,该运算子允许用户定义嵌套的关系。例如,这里f是一个关系,fd,fr和fs是集合。经过pred运算子,可以得到:
[0117]
new mapping(fd'=>new mapping(fr',fs')).has(f)
[0118]
(11-3)typeof运算子可以将event-b变量和常量的类型转换到对应的solidity类型。例如整数类型转换到solidity的整数类型int/uint,关系(relation)和函数(function)转换到solidity的映射结构,集合类型转换到solidity的数组类型。
[0119]
在event-模型中,机器会不断的运行下去直到所有事件的守卫条件都不被满足。也就是说,机器可以一直运行只要有至少一个事件的守卫条件满足。任何一个事件在守卫条件满足的时候便可以执行,并且所有的事件的执行满足原子性,即该事件的执行是不可中断的,要么全部执行成功要么全部执行失败。
[0120]
(12)event-b模型执行模拟算法:将event-b模型转换到solidity合约时,需要在solidity合约中实现event-b模型的执行机制。如表19所示,为event-b模型执行模拟算法,实现了符合event-b语义的事件执行机制,将合约m看作一个对象,其中的所有方法都可以通过this.method()来调用。event-b中所有事件的执行顺序是随机的,因此通过随机数的方式,来模拟其事件的执行。通过if

break控制语句保证了事件执行的原子性。
[0121]
表19 event-b模型模拟算法
[0122][0123]
其中,solidity合约本身没有提供生成随机数的工具类或方法,因此需要自己定义个随机数的方法rand()来生成伪随机数,这是使用一个确定性算法计算出来的似乎是随机的数序,因此并不是真正意义上的随机。使用“线性同余发生器”(lcg)算法,如表20所示。第一步通过abi.encodepacked(

)returns(bytes)计算参数的紧密打包编码,然后通过keccak256算法对结果进行hash计算,最后转换成uint256类型。在获得随机数后,根据其取值范围进行取模操作,最终获得伪随机数。
[0124]
表20 solidity中随机数生成算法
[0125]
[0126][0127]
本实施例还提供了一种基于event-b形式化模型的智能合约代码设计生成系统,包括:
[0128]
需求分析模块,用于进行智能合约的需求分析,一个完整的智能合约是从需求分析出发,需求分析需要多方协调,用自然语言或领域特定语言(dsl)来描述智能合约的功能、属性和场景;
[0129]
智能合约形式化模型建立模块,用于基于形式化模型event-b的语言准确地建立智能合约形式化模型;由于形式化模型event-b支持对智能合约形式化模型的精化,提供从抽象到具体,从简单到复杂的模型生成方法,并且每次精化会验证模型之间的约束关系,从而保证最后生成的模型和最初的需求是一致和正确的;
[0130]
验证模块,用于基于形式化模型event-b,对所述智能合约形式化模型进行验证,对于没有通过所述验证的所述智能合约形式化模型进行反向校正和模型修改,直到通过所述验证;
[0131]
智能合约代码设计生成模块,用于基于eb2s运算子,将输入所述eb2s运算子的所述智能合约形式化模型对应输出solidity智能合约代码;由于形式化专家精通建立形式模型和推理证明,但对智能合约的代码并不是很熟悉,打通形式化模型和智能合约代码的壁垒是非常关键的,因此实现eb2s运算子,它将event-b形式化模型作为输入,输出solidity智能合约代码。该工具作为rodin插件安装使用,非常方便
[0132]
如图2所示,本实施例还提供了一种电子设备,包括处理器301和与处理器301连接的通信电路302,处理器301内存储有多条指令,指令可被处理器加载并执行,以使处理器301能够执行如上所述的方法。
[0133]
本实施例还提供了一种计算机可读存储介质,存储有多条指令,指令用于实现如上所述的方法。
[0134]
本实施例提供的基于event-b形式化模型的智能合约代码设计生成方法、系统以及电子设备,具有如下有益效果:
[0135]
(1)智能合约没有潜在安全风险。
[0136]
(2)适用于面向大规模智能合约的应用场景设计,对开发者同时掌握形式化方法和智能合约开发方法的要求降低。
[0137]
(3)能够确保建立的模型行为和智能合约的需求文档保持一致。
[0138]
(4)形式化验证智能合约的自动化程度高,在面向大规模智能合约应用场景时,在保证高效率的前提下可以保证建模的正确性和一致性。
[0139]
尽管已描述了本发明的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优
选实施例以及落入本发明范围的所有变更和修改。显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1