因为该智能合约批量转帐函数中一行代码的疏忽,导致溢出了。。。
所以出现以下奇观。
一笔高达 57,896,044,618,658,100,000,000,000,000,000,000,000,000,000,000,000,000,000,000 的代币转账
该笔交易围观地址:
https://etherscan.io/tx/0xad89ff16fd1ebe3a0a7cf4ed282302c06626c1af33221ebe0d3a470aba4a660f
看了一下智能合约代码
出现问题的函数在 255 行这个 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;
}
合约围观地址
https://etherscan.io/address/0xc5d105e63711398af9bbff092d4b6769c82f793d#code
注意到这一行
uint256 amount = uint256(cnt) * _value;
没有对 amount 做溢出的检测。。 传入的_value 值在第一张图中 8000000000000000000000000000000000000000000000000000000000000000
转账地址为 2 个,所以 cnt =2
于是乎 amount 就溢出了。。
不是 Copy 一个智能合约改一改就叫区块链了
1
muziki 2018-04-23 08:27:48 +08:00 via iPhone
讲道理 涉及数值操作下意识就是溢出之类的安全检查吧……
|
2
dappreview OP @muziki 在 5 分钟就能发币赚钱的生意里面,什么测试啦、code review 啦、代码安全审计啦 都是浮云
|
3
jellybool 2018-04-23 08:32:36 +08:00 via iPhone
灵车
|
4
ob 2018-04-23 09:08:16 +08:00 via Android
这就归零了。。
|
5
maichael 2018-04-23 09:13:16 +08:00
抄都抄出问题,怕不是自己留的后门。
|
6
ariesjia 2018-04-23 09:38:32 +08:00
好好地用 safeMath 好好地, 都应该用上 lint 所有的运算符都不允许使用 必须 safeMath
|
7
DearMark 2018-04-23 09:49:47 +08:00
说归零,就归零,牛币。
|
8
deadEgg 2018-04-23 10:07:37 +08:00
人可以投票回滚,和原来以太坊一样
清零是什么说法? |
9
skadi 2018-04-23 10:08:10 +08:00
2^255 笑死.
|
10
OrangeM21 2018-04-23 10:40:38 +08:00
你给的传入的数值是 16 进账的,真正传的数值是 10 进制。hahaha.
|
11
drakeet 2018-04-23 10:50:10 +08:00 1
龟苓膏
|
12
Hconk 2018-04-23 12:11:50 +08:00 via Android
@deadEgg 这种 token 出漏洞是不可能让以太坊回滚区块的,除非是以太坊自身的漏洞才有可能投票回滚。
清零是币价归零。 |
14
gftfl 2018-04-23 20:22:47 +08:00
以前 265 的那个蔡老板吗?
|
15
davidqw 2018-04-24 03:40:27 +08:00
人家币种牛逼,还可以停服的
|
16
haidaotao 2018-04-26 19:22:18 +08:00
这韭菜割得连根都没剩下
|