2018年2月24日消息,有媒体报道称美图的首个区块链项目美链(BEC,全称Beauty Chain)在全球数字货币交易平台OKEX上市交易,BEC币发行量为70亿。BEC币单价曾超过4美金,BEC市值一度突破280亿美金。然而在4月22日,由于BEC爆出严重漏洞,项目市值趋于归零。
2018年2月24日消息,有媒体报道称美图的首个区块链项目美链(BEC,全称Beauty Chain)在全球数字货币交易平台OKEX上市交易,BEC币发行量为70亿。BEC币单价曾超过4美金,BEC市值一度突破280亿美金。该项目宣称打造“全球第一个基于区块链技术打造的美丽生态链平台”。然而在4月22日,由于BEC爆出严重漏洞,OKEx发布公告暂停BEC交易和提现,之后BEC的市值受到了严重影响,项目市值趋于归零。
这个漏洞出现在BEC的智能合约的批量转账合约函数batchTransfer()里,该合约函数具体实现如下:
function batchTransfer(address[] _receivers, uint256 _value) public whenNotPaused returns (bool)
{
uint cnt = _receivers.length;
uint256 amount = uint256(cnt) * _value;
require(cnt > 0 && cnt <= 20);
require(_value > 0 && balances[msg.sender] >= amount);
balances[msg.sender] = balances[msg.sender].sub(amount);
for (uint i = 0; i < cnt; i++)
{
balances[_receivers[i]] = balances[_receivers[i]].add(_value);
Transfer(msg.sender, _receivers[i], _value);
}
return true;
}
漏洞出现在这行代码:uint256 amount = uint256(cnt) * _value; 由于uint256的类型问题,其能存储最大取值是0到2^256减1,即115792089237316195423570985008687907853269984665640564039457584007913129639935。
所以我们可以传入_value=57896044618658097711785492504343953926634992332820282019728792003956564819968 并且cnt=2。此时参数amount会溢出为0 。即相当于转账不用扣转出方的钱,而转入方无故收到转出方转入的钱,BEC币的总量被错误地增加了。就这一行代码,就造成美链这个价值280亿美金的项目的失败。
针对上面的漏洞,最简单的方法是采用 SafeMath 数学计算库来避免。即把代码改为:
uint256 amount = _value.mul(uint256(cnt));
这样就可以防止溢出问题
增加一行判断代码:
uint256 amount = uint256(cnt) * _value;
assert(amount / _value== cnt); // 判断防止溢出代码
也可以防止溢出问题
更多区块链方面的文章,可以看我的学习笔记 :www.0101.vip
我是powervip,区块链程序员 我的公 众 号:区块链战斗机 我的知乎:https://www.zhihu.com/people/powervip 我的学习笔记:www.0101.vip
原创作品,版权所有,侵权必究!商业转载请联系作者获得授权;非商业转载需保留作者署名信息,注明出处并保留原文链接。
写作不易,喜欢我写作内容的朋友,请帮忙点 “ 赞同 ” 按钮,谢谢! 你的鼓励,我的动力!
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!