基于https://github.com/shaunazzopardi/solity-cfg-builder和https://github.com/gordonpace/gordonpace/contractlarva,基于固体智能合约验证的静态分析。
该工具试图证明固体智能合约的特性,并且部分成功返回了残留财产,尚待证明固体智能合约。
我们使用坚固智能合约的控制流图表示,以试图通过过度x型固定合同(基于固体cfg builder及其可变状态)来证明智能合约的属性。
这部分基于EPCTS系列Prepost 2017会议记录中介绍的工作,并在ARXIV上获得。
每个智能合约功能都表示为控制流动机(CFA),其过渡标记为三重包含:(i)程序变量状态上的条件; (ii)一种转换程序变量状态的语句; (iii)在说明执行时激活的属性事件。
每个这样的自动机都通过抽象过渡(仅由属性事件标记)增强,该过渡允许在程序的初始,呼叫或结束状态时发生任何事件。这被用作手术室内分析的基础。每个这样的自动机对调用相应函数的智能合约的所有执行都过度估计。该自动机称为抽象控制流动自动机(ACFA)。
一个简单的断言传播算法通过CFA的明确状态传播了关于程序变量状态(由条件和语句暗示的)的主张,直到遇到可能影响主张的语句为止。这是声音。
属性表示为动态事件自动机(DEA),该属性使用标记为以下三倍的过渡:(i)事件; (ii)属性变量状态的警卫; (iii)对属性变量状态的诉讼。
具有可变抽象的ACFA由DEA组成,产生一个带有CFA成对和DEA过渡对的过渡的抽象监视系统(AMS),或者具有包含#符号的位置之一。当使用#而不是CFA过渡时,它标志着抽象过渡的匹配,而当DEA过渡而不是DEA Trunce时,则表示没有DEA过渡匹配。
然后,针对程序的每个功能创建一个AMS,以给定的DEA。
在AMS构建过程中,SMT求解器Z3被称为即时称为,以确定在实际运行中,给定的过渡是否有可能激活。给定CFA-DEA过渡对,我们检查DEA Guard是否可以在CFA过渡的条件和说明的源状态的可变抽象上保持真实。虽然给出了CFA-#对,但我们检查是否与CFA过渡的状态和说明的源状态的可变抽象与否定了此时可能激活的DEA过渡后卫的分离的否定不一致(请确保从相同的DEA状态进行DEA转变以使其具有相互限制的Guelards)。
分析每个AM以识别CFA-DEA过渡对,提取以这种方式使用的DEA转换,忽略DEA过渡与#占位符的匹配。这些DEA过渡的结合产生了原始DEA的残差。有时可以通过对残留DEA的语法分析进一步降低这。
此外,从AMS中,我们可以确定何时可以删除DEA过渡的后卫(即更改为true ),即何时可以在AMS中使用它。
如果产生的残留物没有过渡,则已证明该财产。
要求:Cabal v2.4。*(例如安装完整的Haskell平台)
汇编:按照此处的说明
为了正确的结果,请务必确保使用坚固的编译器编译实体代码。
要使用该工具,请通过智能合约固体文件,DEA属性文件的位置以及输出的首选位置,例如执行:
./main“ ./examples/courierservice.sol”。
该项目是根据Apache 2.0许可证的条款获得许可的。