Solidity

整數下溢/上溢

  • May 10, 2020

什麼是整數上溢和下溢以及如何實現?我看到了它的例子,編碼人員通過require(balanceOf(_to) +_value >= balanceOf(_to)) 哪裡_value是一個無符號整數來避免這個錯誤,所以它總是是正數並且會增加餘額,所以這是一個可以理解的事情,那麼為什麼需要這個條件呢?

Solidity 沒有任何內置的溢出/下溢保護。這意味著如果您達到一個值(02^256-1 = 115792089237316195423570985008687907853269984665640564039457584007913129639935)的最小值或最大值,那麼該值將“環繞”並繼續計數。

將以下程式碼放入Remix中進行測試。

pragma solidity ^0.5.16;

contract FlowTest {

   uint256 public a = 0;
   uint256 public b = 2**256-1; 

   function flow () external {
       a -= 1;
       b += 1;
   }
}

如果您部署此合約,您將分別看到a和和。如果你執行,你會看到他們切換和和。這是因為下溢和_overflowedb02^256-1flow()a = 2^256 - 1b = 0a b`

如果你再跑flow()一次,你會看到a = 2^256-2b = 1

OpenZeppelinSafeMath.sol是一個廣泛使用的庫,可以幫助解決這個問題。

引用自:https://ethereum.stackexchange.com/questions/83226