以太坊上代币转到你的钱包就是你的了?

这几天朋友遇到一个问题,某个代币转给自己后,却怎么也转不到交易所,只能转有限数量的代币,其余的代币转不出去。

这就纳闷了,已经转给自己了怎么还转不出去了呢?

阅读合约代码找出原因吧。

Transfer函数

合约代码就不贴了,只看部分代码吧:

以太坊上代币转到你的钱包就是你的了?图1

一看这么多代码,就肯定就古怪,标准的transfer是判断下余额以及溢出,然后加减就可以了

1 有frozenAccount的判断? 合约也有暴露查询frozen account的接口,查了下不是。也确实,如果frozen了根本就不能转代币了,而不是大部分代币不能转了

2 那就是validator.validate有问题了

以太坊上代币转到你的钱包就是你的了?图2

看这代码的意思是遍历check rule,转账的from有没有在self.data[]的rule内,如果在的话,就会返回一定数量的frozenTotal,那么这部分代币就是没法转移的,那么这个frozen是在哪里设置的呢?

其实就是在第一张图的下面代码中:

if (validator.containRule(msg.sender) && msg.sender != _to) {
        validator.addFrozenBalance(msg.sender, _to, _value);
}

就是当时给我朋友转币的这个msg.sender在rule内,所以把value的代币都frozen了。

3 那么既然frozen了所有的代币,为什么还可以转一定数量的代币呢,可以看下rule.check这段代码

以太坊上代币转到你的钱包就是你的了?图3

代码是走到了85行,self.timeT这个时候是0还未设置(这是个锁仓机制),所以释放了self.initPercent比例的代币,这个值是20%,可以是其他地方设置的。
具体可以找合约的创建者创建的tx,因为timeT的设置只能admin来调用。

结论

因为当时不知道这个锁仓机制,以为转给自己就可以交易所交易了。

所以看到这个代码还是挺震惊的,还可以这么操作,只能说:牛逼!