skka3134

skka3134

email
telegram

智能合约安全:4.整数溢出

什么是整数溢出?

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");
}
加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。