南京大学智能软件工程实验室
iselab.cn
摘要
智能合约一旦被部署在区块链上以后就不能修改,所以必须在部署前对其进行彻底的测试。变异测试被认为是评估软件测试充分性的实用测试方法。在本文中,我们介绍了以太坊智能合约(ESC)的变异测试工具MuSC。它可以快速生成大量变异体,并支持自动化,如创建测试网络,部署合约以及执行变异测试。特别的,MuSC针对ESC编程语言Solidity设计了一组全新的变异算子,因此可以在一定程度上更好地暴露智能合约的缺陷。
MuSC的演示视频可在https://youtu.be/3KBKXJPVjbQ观看,源代码可在https://github.com/belikout/MuSC-Tool-Demo-repo下载。
关键词
区块链,以太坊智能合约,变异测试,变异算子
1.引言
中本聪于2008年提出的区块链技术 [1]一直是研究的热点[2]。2014年,一个名为Ethereum(以太坊)的图灵完备的区块链平台应运而生[3],使得区块链开始支持智能合约。智能合约可以在由互相不信任的节点组成的网络中自动地、正确地执行,而无需外部的可信的授权机构[4]。它大大降低了协议的成本,提高了协议的安全性和透明性,是用户更容易控制数字资产。但是,一旦将智能合约的代码部署到区块链上,它就很难以被改变。因此,为了确保智能合约以及区块链系统的质量和安全,必须在部署前对智能合约进行全面的测试[5]。
变异测试是一种基于故障的软件测试技术,可以有效地评估测试用例的适用性[6]。其目的是帮助测试人员识别测试数据,如在执行期间很少或从来没有覆盖过的代码的弱点并找到合适的测试方法。变异测试已被广泛研究了30多年,用于各种应用程序(例如测试生成[7],故障定位[8]–[10]和程序修复[11],[12]),从而提供了一系列工具,例如PIT [13]和MuCPP [14]。 然而,据我们所知,目前还没有关于ESC变异测试的研究工作。
在本文中,我们介绍了MuSC,这是一款功能强大且易于使用的ESC变异测试工具。 它可以在AST(抽象语法树)级别上高效且精确地执行变异操作,并支持用户定义的测试网创建,以满足不同智能合约开发人员的需求。 本文的主要贡献是:MuSC是ESC的第一个变异测试工具,它实现了针对最常用的ESC开发语言Solidity的一系列变异算子。 以上这些特点使MuSC成为ESC开发人员的理想测试工具。
2.ESC变异测试
2.1 ESC测试
2.2 ESC变异算子
变异测试的有效性主要取决于变异算子的设计[6]。 这些所谓的变异体基于定义明确的变异算子,它们可以模拟典型的应用程序错误或强制进行有效性测试。 通过结合适当的变异算子,已经证明了变异测试可以包含其他测试标准[15]。因此,变异算子的指定成为变异测试工具开发中最重要的任务之一。
由于Solidity的语言结构受JavaScript的影响并且在语法上相似[16],因此我们研究了JavaScript的现有变异运算符[17]。表1列出可用于ESC变异测试的传统变异算子。AOR可以进一步分为两种变异算子,即AORB(二进制算术算子替换)和AORS(捷径算术算子替换)。 AORB将基本的二进制算术运算符(+,-,∗,/和%)替换为其他二进制算术运算符,并且AORS替换了快捷算术运算符(op ++,++ op,op-op和op-op)。 ROR用其他关系运算符替换关系运算符(>,> =,<,<=,==和!=),或用true和false替换整个谓词。 COR将二进制条件运算符(&&,||,&,|)替换为其他二进制条件运算符。 ASR用其他快捷方式赋值运算符替换了快捷方式赋值运算符(+ =,∗ =,/ =,%=和&=)。 SDL可以通过注释掉可执行语句来删除它,而CSC可以在条件判断中强制该语句为true或false。
表 1 传统变异算子
特别是,为了提高ESC变异测试的有效性,我们还根据ESC的特点(如关键字,全局变量和函数,变量单元和错误处理)定义了一组新的变异算子。我们阅读了Solidity文档并进行了调查。 如表2示,MuSC实现了15种ESC特定的变异运算符,其中包括与ESC关键字(FSC,FVC, DLR,VTR,PKD,DKD),其中三个与ESC全局变量/函数(GVC,MFR,AVR)有关,两个与ESC变量单元(EUR,TUR)有关,另外四个与ESC中的错误处理有关(RSD,RSC,ASD,ASC)。 对于每个ESC特异性变异算子,我们在[18]中对其进行详细说明。
表 2 ESC特异性变异算子
## 3.详细实现
对于每个待测智能合约(SCUT),MuSC首先将其源文件转换为AST版本,然后在其上执行变异体生成。 接下来,将这些生成的转换回源文件,以进行编译,执行和测试。 由于智能合约测试需要部署,因此MuSC支持用户定义的测试网或使用默认的测试网。 MuSC可以自动部署变异体并执行测试用例。 最后,当所有变异体都经过测试后,会生成详细的测试报告。 如图2所示,整个过程可以分为以下三个阶段。
1. 源文件到AST的转换
MuSC接受Truffle项目作为输入,其中包含智能合约源文件和其测试套件。用户在检测到的Solidity文件中选择需要进行变异的文件并选择变异算子来生成变异体。源文件中的冗余状态,如注释、空行和空格等可能影响变异的准确性,因此,MuSC删除了上述元素,转换后的结果只保留必要的语句结构,这有利于变异体的生成,提高变异的准确率。为确保AST解析结果的可靠性,我们选择了基于ANTLR语法的可靠的Solidity语言转换器solidity-parser-antlr[20]来进行AST的生成。
2. 变异体的生成
MuSC对AST格式的SCUT进行变异。 solidity-parser-antlr的输出为JSON格式,我们实现了一个Java项目,以将JSON内容转换为相应的Java对象。 对于每个运算符,我们通过更改相应对象的成员对象来应用相关的运算符。 例如,对于FVC变异运算符,我们通过更改其可见性成员变量来变异原始内容。 之后,将每个AST变异体转换为源文件版本,该源文件版本与SCUT具有相同的语义,只是注入了预定义的故障。 在恢复步骤中,我们将在顶级类SourceUnit的对象中调用output方法,以输出恢复的Solidity语句。 项目中的每个模型类都有一个输出方法,用于输出还原的Solidity语句,该语句从上到下递归调用,最后输出完整的Solidity文件。
变异体的存储形式对应于变异测试的效率。MuSC不存储完整的变异体,而是存储每个变异操作的行号,类型和变异行的代码。 如表3所示,每行称为一条变异信息,并且对应于一个变异体。 这种存储格式可以有效地减少存储空间和文件读取时间。此外,在执行变异体的过程中,我们只需要记录每个变体信息和相应的执行结果,就可以方便地对测试结果进行计数。 MuSC还提供了显示变异体的界面。例如,图3显示了由MuSC生成的ROR变异体。 变异体和原始程序都显示在界面上。 MuSC用红色标记变异代码行,以使测试人员更容易找到变异位置
表 3 变异体存储格式
图 3 变异体展示
3. 测试报告的生成
在此阶段,MuSC首先将智能合约部署到区块链上,然后在测试目录中执行测试。 ESC在以太坊区块链上运行,其执行结果取决于区块链的状态,例如账户余额和区块高度。 为避免区块链状态的影响,应确保SCUT与变异体具有相同的初始测试链状态。 为此,MuSC在每个测试文件的开头重新部署了所有migration,以确保有一组新的测试合约。
MuSC支持用户定义的测试网创建。 只要测试网的端口与项目文件夹下的truffle configuration文件中的配置相同,用户就可以创建自定义的测试网。 在测试过程中,会导致编译错误的变异体被立即丢弃,并且不会在随后的测试中使用。 对于每个变异体,我们记录其执行结果(即,通过或失败)。 最后,将生成一份测试报告,显示总变异得分和每个变异体的测试结果。 图4显示了ESC变异测试报告的示例。
图 4测试报告
4.表现评估
为了证明MuSC的适用性和性能,我们将MuSC应用到四个不同的真实世界的以太坊 DApps(即SkinCoin、SmartIdentity、 AirSwap和CryptoFin)的一组智能合约中。SkinCoin是一款即时交易游戏中的皮肤和电子竞技项目的工具。SmartIdentity依赖于以太坊使用智能合约来表示身份。
CryptoFin是一组坚实的库,最初集中在数组上。AirSwap是一个建立在以太坊上的点对点交易网络。这些DApp之所以被选中,是因为它们不仅提供了一组ESC,而且还被一个设计良好的测试套件所覆盖。因此,我们不需要手工设计一个ESC测试套件,它太主观,无法产生一个公平的实验结果和结论。原始DAPP失败的测试用例被从中删除(例如,我们从AirSwap的测试套件中删除了15个测试用例,其中总共包含32个测试用例)。表4总结了实验中使用的DAPP的特点。对于每个DApp,描述其名称、代码行、代码分支、测试套件大小和网站。所有的智能合约都是GitHub开源的。
表5显示了四个项目的实验结果。我们将传统的变异算子和ESC变异算子分开进行统计。在变异数方面,两种变异算子都产生了相当数量的变异体,表明变异体生成在MUSC中是有效的。与试验结果相比较,我们更关注变异产生和执行的效率,变异体的产生时间很短(通常只有几秒钟),每个变异体的平均时间几乎可以忽略不计。这表明我们的工具在错误注入方面是非常有效的。直观地,变异体越多,变异测试所需的时间就越长。从表5中可以看出,平均时间在大约20和30秒之间,这与测试用例的数量和测试网的性能相关。然而,考虑到智能合约的质量要求超过一般程序,这样的执行时间是值得的。
表 4 DApp特点
表 5 实验结果
5.结论以及后续工作
本文介绍了MuSC,第一个以太坊智能合约的变异测试工具。MuSC具有以下主要优点:它提供了一个非常方便使用的图形用户界面和一组专用于Solidity语言的新的变异算子;它支持在用户定义的测试网络上测试智能合约。我们的变异工具的基本功能已经实现,并且源代码在GitHub上是开放的。MuSC的变异算子正在不断完善,未来版本中一些错误处理等特性将得到改善。
致谢
本文由南京大学软件学院 2018 级硕士巫浩然翻译转述。
感谢国家自然科学基金(61932012,61802171,61772014)支持!
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。