【问题标题】:can anyone explain me this assert condition?谁能解释我这个断言条件?
【发布时间】:2021-07-08 06:22:11
【问题描述】:

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

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

}

【问题讨论】:

    标签: function token blockchain solidity pragma


    【解决方案1】:

    这两个assert 条件提供了一种防止整数上溢和下溢的方法。

    uint256 的最大值是 2^256-1,大约是 2^256-1。 10^77。如果你想将两个数字相加,导致一个大于最大值的值,它会溢出整数。


    使用较小值的示例,以便更容易想象:

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

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


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

    【讨论】:

    • 好的,我理解上溢和下溢,但我想知道断言中适用的条件,例如要求所有者帐户令牌始终收集然后金额如果它为假,那么它将给出错误什么条件实际上是说我只想知道它?那个条件是什么意思?
    • assert(tokenBalance[_to] + _amount &gt;= tokenBalance[_to]); 当您添加 _amount 时,它会检查tokenBalance[_to] 的值是否变(即溢出)。如果确实溢出(值不大于或不等于),assert() 条件会导致false,因此会引发异常。
    • 第二个断言条件呢?
    • 几乎是一样的。当您减去 _amount 时,assert(tokenBalance[msg.sender] - _amount &lt;= tokenBalance[msg.sender]) 检查 tokenBalance[msg.sender] 是否变得更高(即下溢)。如果确实下溢(值不小于或等于),assert() 条件会导致false,因此会引发异常。
    猜你喜欢
    • 1970-01-01
    • 2017-03-11
    • 1970-01-01
    • 1970-01-01
    • 2021-01-08
    • 2012-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多