Solidity
整數下溢/上溢
什麼是整數上溢和下溢以及如何實現?我看到了它的例子,編碼人員通過
require(balanceOf(_to) +_value >= balanceOf(_to))
哪裡_value
是一個無符號整數來避免這個錯誤,所以它總是是正數並且會增加餘額,所以這是一個可以理解的事情,那麼為什麼需要這個條件呢?
Solidity 沒有任何內置的溢出/下溢保護。這意味著如果您達到一個值(
0
或2^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
和和。如果你執行,你會看到他們切換和和。這是因為下溢和_overflowed。
b0
2^256-1flow()
a = 2^256 - 1b = 0
ab`
如果你再跑
flow()
一次,你會看到a = 2^256-2
和b = 1
。OpenZeppelin
SafeMath.sol
是一個廣泛使用的庫,可以幫助解決這個問題。