什么是整数溢出?
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");
}