首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这个功能是否容易被侵入?

这个功能是否容易被侵入?
EN

Ethereum用户
提问于 2019-11-20 00:06:23
回答 2查看 72关注 0票数 0

因此,我想在一个令牌合同中尽可能简单地编写退出函数,该合同也没有使用Safemath,原因很简单:我承认我不太了解EVM中的数据类型,所以我宁愿坚持使用基本的逻辑语句来防止黑客入侵,所以这有多安全:

代码语言:javascript
复制
function withdrawTokens(uint _amount) external returns (uint _available) {


        _available = _amount < balances[msg.sender] ? _amount :     balances[msg.sender];
        msg.sender.transfer(_available);
        balances[msg.sender] -= _available;
        emit eventWithd(msg.sender, _available);


    }

我最关心的是这句话:

代码语言:javascript
复制
    balances[msg.sender] -= _available;

如果msg.sender的余额是5,并且他们将6作为参数(5-6 = -1,但在uint中它是巨大的正数.),这显然会减少,所以我打赌,这两条线中至少有一条将不会恢复到上面的危险线:

代码语言:javascript
复制
 _available = _amount < balances[msg.sender] ? _amount balances[msg.sender];
        msg.sender.transfer(_available);

有什么想法吗?非常感谢!

EN

回答 2

Ethereum用户

回答已采纳

发布于 2019-11-20 05:01:38

所以我打赌这两条线中至少有一条会恢复

您的代码中唯一可以恢复的行是msg.sender.transfer(_available)

如果是address(this).balance < _available,这一行将恢复。

如果msg.sender是一个契约,那么它也可以在address(this).balance >= _available时恢复。

除此之外,行balances[msg.sender] -= _available显然不会下流,因为您的代码预先确保了balances[msg.sender] >= _available (即使这样做了,这种场景也不会导致执行恢复)。

票数 0
EN

Ethereum用户

发布于 2019-11-20 01:04:09

你的密码在我看来没问题。

如果查看一下SafeMath库的减法函数,就会发现它以类似的方式工作:

代码语言:javascript
复制
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

你所做的是将要减去的金额上限到一个帐户的实际余额,这是完全可以的。减去的任何值都将介于0和msg.sender之间。

此外,海事组织没有真正的理由不使用SafeMath tbh。solidty中的数据类型是有限的,在SafeMath中,您只处理uint (在内部是uint256)类型,正如您在上面看到的,代码实际上并不复杂。

票数 0
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/77635

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档