什么是整数溢出?
Solidity 中的整数默认为 256 位。在进行加法运算时,如果结果超过 256 位,就会出现溢出。这会导致意料之外的结果,被黑客利用。
例如,用户 A 将 10 个 token 存入合约,合约计算 token 余额时使用一个无校验的 uint256 变量 balance。然后黑客传入一个极大的值,导致运算溢出,balance 再次从 0 开始计算,黑客可以无限提取 token。
防止整数溢出的方法:
使用安全的数学库,避免直接调用易溢出的运算。如 Safemath
对关键变量采用溢出检测,在变更前检查新值是否合法。
避免循环调用易溢出的函数。限制用户调用次数。
代码示例:
// Bad
uint256 balance;
function add(uint256 value) external {
balance += value;
}
// Good
using SafeMath for uint256;
uint256 balance;
function add(uint256 value) external {
balance = balance.add(value);
require(balance >= value, "Overflow detected");
}