function - 谁能解释我这个断言条件?
问题描述
我想了解函数发送令牌中的这个断言条件.....我认为在添加令牌平衡之前的第一个断言总是收集然后是即将到来的令牌,但我不确定......?
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 等于 0 的情况uint8
)。
反过来也是一样。你有一个值 5 并想减去 10。由于它是一个无符号整数,没有负数,它下溢并变为 251(因为 5 - 5 为 0,然后从“最大值 + 1”中减去剩余的 5 ”)。
您可以在 SWC 注册表中找到有关整数上溢/下溢漏洞的更多信息:https ://swcregistry.io/docs/SWC-101
推荐阅读
- python - 移动临时文件的 Pythonic 方式
- sql - 同一表的合并语句不插入新行,而是更新 Oracle DB 中的现有行
- javascript - Promise 在之前的 then 执行完成之前执行 then 函数
- bash - 使用awk或sed在bash中进行条件查找?
- c - 为什么数组不打印正确的数字?
- reactjs - 使用 Service Worker 时看不到对静态文件所做的更改
- python - 如何优化熊猫数据框中的搜索
- python-3.x - 使用数据框进行货币转换
- vb.net - 如何使用 GeckoFX 45 VB.NET 获取/共享/更新 GEO 位置?
- c# - 从 oracle 数据库中检索单个用户数据到 Visual Studio C# 应用程序