智能合约开发必读:ERC20 Token合约你可能不知道的坑

本文通过BEC和SMT智能合约安全事件,探讨了ERC20合约的安全风险,如整数溢出和可重入攻击。建议开发者在转账前做好余额校验,使用transfer()避免重入攻击,明确理解msg.sender和tx.origin的差异,并避免依赖时间戳和块高度。同时,强调智能合约审计的重要性。

前不久,轰动一时的BEC事件在币圈和链圈掀起了不小的反响,智能合约安全一度成为焦点话题。

通过一个小小的整数溢出漏洞,黑客盗取了巨量的BEC token,迫使交易所不得不暂时停止交易。一时间BEC价格呈现断崖式下跌。随后,SMT token 的智能合约也因为相同的问题遭到了攻击。
两次事件都给项目发行方和token持有者造成了巨额的损失。

据统计,截止2018年5月12日为止,以太坊上部署的合约总量共计 1628059 个,其中ERC20合约数量为 71233 个,占比 4.3%。
这些合约所代表的经济价值更是难以估量。
erc20creation

上图反映了自以太坊平台诞生以来,ERC20代币合约的创建情况,整体呈现增长趋势。自2017年6月开始便持续走高,而2018年的增长幅度尤为明显,平均每日合约创建数约为 320 个,
尤其在今年三月份,一度达到峰值,一天内创建的合约数量更是超过600个。随着区块链热度的进一步加强,越来越多的区块链项目也在萌芽,相信2018年新合约的数量还会逐步上升。

公开数据表明,大量已经部署的智能合约或多或少都存在着一定的安全风险和漏洞,BEC事件也只是冰山一角。那么就ERC20合约而言,除了整数溢出漏洞以外,还有可能面临哪些风险呢?

  • 可重入

    若一个程序或子程序可以「在任意时刻被中断然后操作系统调度执行另外一段代码,这段代码又调用了该子程序不会出错」,则称其为可重入(reentrant或re-entrancy)的。

    在智能合约代码中,黑客可以利用fallback函数,来递归调用包含 call.value() 的函数 ,从合约中重复提取以太币。通常造成该类事件的原因是余额校验不到位或余额更新不及时。

    当ERC20代币合约中涉及以太币的转出,应当尤为注意。以一个 withdraw 函数为例,这也是ERC20合约中经常出现的函数。以下代码中首先进行余额校验,并向msg.sender地址转出以太币,
    再修改 balance 数组中余额值。当函数执行到 msg.sender.call.value(amount)() 时,黑客就可以通过msg.sender的 fallback函数来重复调用 withdraw,
    进而重复执行 msg.sender.call.value(_amount)(),直到gas全部消耗完毕或者合约中的以太余额全部被取完。于是就给黑客实现 reentrancy 攻击创造了条件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值