随着基于区块链的分散式应用(DApp)最近越来越受欢迎,我们迫切需要有效的测试方案和工具。由于应用程序与区块链的交互引入的复杂性,现有的测试方法变得不适用。在本文中,我们提出了一个名为Sungarito的指导和自动化框架来测试DApps。首先,我们使用随机事件来推断前端和区块链之间的抽象关系。其次,我们使用该关系以引导的方式生成事件序列,以尽可能快地覆盖区块链智能合约。在实际的DApp案例研究中,Sungari通过覆盖33%的应用程序用例从而优于随机方法。
29.3 问题和动机
基于区块链的分散式应用程序(DApp)是一种浏览器/区块链架构程序,允许用户通过浏览器访问网页,与区块链上运行的智能合约交互,并在区块链上存储持久数据。与浏览器/服务器架构程序不同,DApp的后端逻辑通过智能合约实现,在分布式区块链客户端上运行,不能随意修改。因此,用户更愿意信任DApps,而DApps正变得越来越流行。图29-1展示了DApp游戏,玩家可以通过在该游戏中买卖物品来赚钱。在铺设此游戏的过程中,玩家通过填写网页中的数字并单击按钮来使用DApp功能。这些操作转换为调用智能合约功能,即在区块链上发送交易。
图29-1 一个名为SnailThrone的实际DApp的截图
目前DApp仍处于早期开发阶段,由于缺乏经验和高效工具,开发人员很容易产生bug,因此DApp的测试尤其重要且需求量很大。但是,现有的软件测试方法很难直接应用于DApp场景。有两个主要原因和挑战:首先,DApp通常包括浏览器端程序(例如JavaScript)和区块链(即智能合约)之间的交互。这种交互过程很难有效地分析和测试。其次,智能合约没有明确的测试标准,这使得许多启发式测试技术难以应用。
我们引入Sungari,一个基于区块链的DApp自动测试的通用框架,它考虑了DApp的特性,包括网页中的事件序列与区块链交易中的输入数据,区块链上的读写存储之间的对应关系,以及输入数据对智能合约中条件分支的影响。
支持智能合约的区块链近年来越来越受欢迎,例如以太坊为复杂的功能提供了图灵完备语言,使得开发DApps成为可能。研究者们已经深入研究了浏览器/服务器体系结构Web应用程序的自动化测试,并提出了许多有效的方案和工具。最近一些研究人员也专注于发现智能合约中的漏洞。但是,据我们所知,没有系统的算法来测试基于区块链的DApps。我们的框架通过分析交互信息并从区块链交易中收集反馈信息来提供测试方案。
29.4 途径
我们的框架基于两阶段算法。第一阶段是分析网页中的元素与区块链交易的输入数据之间的关系,第二阶段是在浏览器中执行事件序列并从智能合约处理中获取反馈。
在算法29-1中显示的主算法中,IRE是输入相关元素的集合,这意味着用户可以在元素中键入数据或选择选项。WRE是web3相关元素的集合,在与之交互后,调用浏览器扩展(例如MetaMask)来发送事务。事件序列s由IRE的所有值和WRE中的哪个元素组成。在第一阶段,每次修改s中的一个元素,以找到元素和事务之间的对应关系。在分析之后,由feedback生成s,并执行以测试DApp。
算法29-1 Sungari的一般程序
区块链事务由被调用函数和传入的参数组成。FR是函数关系,表示s与事务中函数之间的关系。PR表示参数关系。在算法29-2中给出的函数分析中,如果对应于s的函数F(s)不在FR中,则s被选择为FR中F(s)的代表,否则将其与代表进行比较并可能添加到PR。
算法29-2 分析函数
函数feedback的目的是从FR或PR中选择适当的s。当我们模拟事务的执行时(例如以太坊中的ethcall),被调用的函数和参数被标记为taints,并且当由于污点而执行分支时被推入taintstack。同时也进行记录读取和写入存储,形成def-use依赖图。当前者读取后者写的内容时,事件序列s被称为另一个事件序列。由于写入存储可能会导致无法退回的状态,因此首先按照以下规则选择FR中的一个:
1)如果s不主导任何事件序列,则优先选择s。
2)如果s占主导地位,下次也会选择s。
3)s的优先级分数是由它占主导地位的事件序列的数量减去它占主导地位的数量。分数越高,越早被选中。
4)除了规则2中的之外的所有s只能在一轮中选择一次。选择所有事件序列后,将开始新一轮选择。
当选择并执行FR中的s时,根据从taint_stack中弹出的污点选择PR中的事件序列。在执行期间记录读取和写入存储的事件序列,并且当def-use关联的数量不增加时算法停止。
29.5 初步结果和贡献
我们将框架以一个名为Sungari的原型来实现,并将其应用于图29-1中的DApp游戏进行初步评估。表29-1给出了一些比较Sungari与随机算法的典型案例。第1、3、5个案例非常简单,很容易被随机算法和Sungari所覆盖。第4种情况是当特定框中的数字大于玩家蜗牛的数量时触发的,Sungari能够成功地发现此框中的数据会影响分支选择并使覆盖这种情况变得更容易。当点击一个名为withdraw的按钮并且玩家的余额为0时触发第6种情况。但是,玩家可以从每次购买和销售中获得红利,并且只有当按钮在所有其他按钮之前被点击或者连续点击两次时,情况才会被覆盖。条件很严格,但Sungari可以通过分析def-use依赖图来达到。游戏将购买限制设置为4以太,并且无法通过JavaScript在网页中填写大于4的数字,因此第二种情况永远不会被网页操作所覆盖。
表29-1 初步结果
这项工作的主要贡献如下:
•首先,我们提出Sungari作为第一个测试基于区块链的DApps的系统方案和新颖框架。
•其次,我们提出了可以有效发现Web元素和智能合约之间的对应关系的算法,并将def-use关联作为测试标准。
•最后,我们对样本进行了Sungari评估,与随机方法相比,覆盖率增加了33%。
curton 2019-12-4 21:34