首页 > 解决方案 > 谁能解释我这个断言条件?

问题描述

我想了解函数发送令牌中的这个断言条件.....我认为在添加令牌平衡之前的第一个断言总是收集然后是即将到来的令牌,但我不确定......?

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;
 }

}

标签: functiontokenblockchainsoliditypragma

解决方案


这两个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


推荐阅读