用形式化验证缓解智能合约漏洞

本文探讨了如何利用形式化验证来缓解智能合约中的递归调用漏洞。通过在Solidity合约中添加不变量注释,然后使用why3工具进行验证,确保合约在生命周期内总余额与代币差异恒定。尽管这仍需要进一步完善和扩展,但已证明了形式化验证在保护合约安全方面的潜力。未来工作包括模拟实际消息、添加构造函数条件和改进转换器。
摘要由CSDN通过智能技术生成

Solidity已经支持对未调用其他合同的某些智能合约进行正式验证。当然,这不包括任何转让代币的合约。

下面的Solidity合同模拟了一个原始的众筹合约,该合约可以持有Token,某些人可以根据其股份提取Token。它缺少实际的访问控制,但此处要说明的要点如下:

您不能通过递归调用漏洞或任何其他方式提取最多的代币。允许递归调用,但是合约仍然可以处理它们。

更具体地说,在合约的整个生命周期中,总余额和代币之间的差额是恒定的。因此,这种差异是所谓的不变性。

在Solidity端您需要做的就是将此不变式添加为合同的注释,如第一行所示。

然后,Solidity编译器会将合同转换为一种名为why3的语言,并使用工具来验证该不变量确实是一个不变量。

如果您想自己做,请转到http://why3.lri.fr/try/将.mlw文件复制到此处的文本窗格中,然后单击齿轮符号。然后,一段时间后,绿色刻度线应出现在右窗格中。

尝试移动storage_shares := !(storage_shares) - !(_amount);raise Revert; 之后;在改动后恢复;然后再次触发。此更改对应于

if (!msg.sender.call.value(amount)())
    throw;
  shares -= amount;

即可被递归调用利用的合同。 why3工具应该告诉您在那种情况下它无法验证条件。

这是一个概念证明,仍然需要专家进行验证,但是我认为我们已经走了很远。

仍然需要做的是:

  • 模拟实际的“消息”,即需要拒绝的toekn
  • 向构造
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值