什麼是整數溢出?
Solidity 中的整數默認為 256 位。在進行加法運算時,如果結果超過 256 位,就會出現溢出。這會導致意料之外的結果,被黑客利用。
例如,用戶 A 將 10 個 token 存入合約,合約計算 token 餘額時使用一個無校驗的 uint256 變量 balance。然後黑客傳入一個極大的值,導致運算溢出,balance 再次從 0 開始計算,黑客可以無限提取 token。
防止整數溢出的方法:
使用安全的數學庫,避免直接調用易溢出的運算。如 Safemath
對關鍵變量採用溢出檢測,在變更前檢查新值是否合法。
避免循環調用易溢出的函數。限制用戶調用次數。
代碼示例:
// 不好的寫法
uint256 balance;
function add(uint256 value) external {
balance += value;
}
// 好的寫法
using SafeMath for uint256;
uint256 balance;
function add(uint256 value) external {
balance = balance.add(value);
require(balance >= value, "Overflow detected");
}