谁能向我解释这个断言条件?

can anyone explain me this assert condition?

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

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,大约是。 10^77。如果你想将两个数字相加导致一个值大于最大值,它会溢出整数。


示例值较小,因此更容易想象:

uint8 的最大值是 255。所以如果你有一个值 250 并且你想加 10,它会溢出最大值,变成 4(因为 255 + 1 等于 0 uint8).

反之亦然。你有一个值5,想减去10,由于是无符号整数,没有负数,下溢变成251(因为5-5是0,然后把剩下的5减去“最大值+1” ").


您可以在 SWC 注册表中找到有关整数 overflow/underflow 漏洞的更多信息:https://swcregistry.io/docs/SWC-101