验证软件功能介绍
Beosin-VaaS的业务逻辑验证软件,是一款用来检测智能合约上层业务逻辑漏洞的软件。
基于合约的白皮书,软件利用形式化方法,首先对单个函数进行属性的描述,在对单个函数进行属性的验证并通过后,基于这些已验证属性,抽取出高层的状态属性,进而对上层属性进行自动推理和验证,若属性不满足,则会返回一条反例路径。
案例介绍
盘和林:美元紧缩对于虚拟货币的世界货币信仰是一个打击:12月6日消息,中南财经政法大学数字经济研究院执行院长、教授盘和林称,“近几日虚拟货币下跌的因素比较多,但主要是美联储货币政策趋于紧缩,美联储主席鲍威尔也放弃了“暂时性通胀”的说法,承认了通胀具备持续性,从而表明未来可能转向紧缩,美元紧缩对于虚拟货币的世界货币信仰是一个打击。这也再次说明虚拟货币存在高波动性,虚拟货币没有信用支撑,没有资产担保,属于私人铸币,其高波动性可能意味着投资虚拟货币将出现巨大风险,消费者要规避此类高波动资产。”(北京商报)[2021/12/6 12:52:56]
我们可以以下面这个案例来举例说明。
FTX:计划一个月内推出NFT市场,与OpenSea竞争:金色财经报道,加密衍生品交易所 FTX 的首席执行官 Sam Bankman-Fried在接受彭博社采访时透露,该交易所正计划推出自己的NFT市场,旨在与市场领导者 OpenSea 展开竞争。FTX.US 总裁布雷特哈里森已经告知彭博社,FTX目前处于较有利的位置,能够在近期推出NFT平台,因为基础设施已经建成,预计会在大约一个月内推出。(coindesk)[2021/9/21 23:39:25]
动态 | Tezos宣布zk-SNARKs将是该网络的下一个协议修订:Tezos(XTZ)宣布,zk-SNARKs将是该网络上的下一个协议修订,通过这一改进,该网络将有可能为包括商业银行和中央银行在内的新客户提供解决方案。新的改进将为Tezos网络提供“微调的(finetuned)隐私”,这对提高Tezos的可用性非常重要。此外,这次升级还将提供一个新的Michelson指令,允许智能合约在屏蔽的区块链上存储和执行事务。Nomadic Labs核心开发者Marc Beunardeau评论道:“这样做的目的不是让Tezos成为一枚隐私币,而是让用户在处理自身监管问题的同时,拥有隐私交易的自由。[2019/10/23]
这里我们考虑进行一次众筹,目标是在部署后deadline时间内,收集fundingGoal个以太币。如果在该期间收集到相应数额个以太币,则表明众筹成功,在这种情况下,受益人可以提取资金。否则,将认为众筹失败,并允许用户要求退款。众筹合约本身继承了token合约,并直接收集众筹期间投入的所有资金。
声音 | Joseph Young:过度监管正在扼杀一个强大的加密市场:有相关报道称,世界银行的一份报告显示,印度将以向国内汇款800亿美元蝉联全球汇款市场首位。对此加密货币分析师Joseph Young发推评论:在印度买卖加密货币几乎是不可能的,这很遗憾。印度是世界上最大的汇款市场,对于一些地区的海外银行账户来说,跨境交易可能非常困难。过度监管正在扼杀印度这样一个强大的加密市场。[2018/12/9]
具体合约和函数说明
我们可以进一步得知,该项目包含了一个Crowdsale合约,继承一个token合约。
在众筹合约中,构造函数会初始化设置众筹的截止时间deadline,并添加众筹目标额度fundingGoal,并在合约中硬编码受益人的地址beneficiary;
然后会提供回调函数,提供给用户来参与投资,在开放众筹期间,只要未达到目标额度,就允许所有用户进行投资;
提供一个checkGoalReached()函数,如果达到众筹目标,或者达到了截止时间,就可以修改状态标识,关闭众筹;
然后会提供响应的transfer()和issue()函数接口,用于在众筹分配代币,以及能够进行代币的交易
提供一个safeWithdrawal()函数,如果众筹成功,受益人能够取出投资人的钱;
最后还提供一个safeClaimRefund()退款接口,如果众筹失败,用户可以通过该接口完成撤资。
结果分析和说明
我们这里已经完成了单个函数的属性验证,可以确认单个函数的功能是符合其属性规范的,在此基础上,编写上层属性进行验证。
以下,我们编写的上层属性有两条,一条是p1,含义是总是能够满足,一旦调用了safeWithdrawal()或者safeClaimRefund(),另一个函数就不能够被成功调用。
P1:
得到输出结果,可以看到属性2是满足的,而属性1并不满足。我们查看一下反例的可视化路径,可以看到,确实存在一条路径,safeWithdrawal()函数和safeClaimRefund()函数可以先后被执行成功。
回到合约中,根据所提供的反例路径,可以看到,发生该情况是调用回调函数一段时间后,当前时间超过了众筹的截止时间,众筹的资金总量没有达到目标fundingGoal,在checkGoalReached()关闭众筹之后,此时的合约状态,用户是可以调用safeClaimRefund选择退款的。
但是我们可以从结果中发现,此时依旧可以调用成功回调函数投资,那么就出现了后面的状态可能,在众筹失败之后,依旧有用户有意或者无意参与了投资,导致投资的总额超过了目标。
此时,能够再次调用checkGoalReached()函数结束众筹,改变状态标识,最终受益人能够在按原始需求,众筹失败的情况下,且有用户选择退款之后,依旧调用checkGoalReached()取出了所有的投资资金。
最终回到合约,我们发现,其实是由于用于投资的回调函数缺少了检查当前事件是否超过了截止日期,进而导致的合约漏洞。
可以看到,在该例子中,所有的函数其实是满足其自身的属性并实现了相应的功能的,但是由于在合约之间、函数之间的调用和关联关系,才导致出现了这样一个漏洞。而该属性验证工具的作用也在于此,它能够更加高效地发现逻辑属性漏洞。
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。