如何解决谁能解释一下这个断言条件?
我想了解函数发送令牌中的这个断言条件.....我认为在添加令牌平衡之前的第一个断言总是收集然后是即将到来的令牌,但我不确定......?
pragma solidity ^0.5.11;
contract EventExample {
mapping(address => uint) public tokenBalance;
event TokensSent(address _from,address _to,uint _amount);
constructor() public {
tokenBalance[msg.sender] = 100;
}
function sendToken(address _to,uint _amount) public returns(bool) {
require(tokenBalance[msg.sender] >= _amount,"Not enough tokens");
assert(tokenBalance[_to] + _amount >= tokenBalance[_to]);
assert(tokenBalance[msg.sender] - _amount <= tokenBalance[msg.sender])
;
tokenBalance[msg.sender] -= _amount;
tokenBalance[_to] += _amount;
emit TokensSent(msg.sender,_to,_amount);
return true;
}
}
解决方法
这两个 assert
条件提供了一种防止整数溢出和下溢的方法。
uint256
的最大值为 2^256-1,大约为 2^256-1。 10^77。如果您想将两个数字相加,结果会大于最大值,则会溢出整数。
使用较小值的示例,以便更容易想象:
uint8
的最大值是 255。所以如果你有一个值 250 并且你想加 10,它会溢出最大值,变成 4(因为 255 + 1 在 {{1 }}).
反之亦然。你有一个值 5,想减去 10。因为它是一个无符号整数,没有负数,它下溢变成 251(因为 5 - 5 是 0,然后从“最大值 + 1”中减去剩下的 5 ").
您可以在 SWC 注册表中找到有关整数溢出/下溢漏洞的更多信息:https://swcregistry.io/docs/SWC-101
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。