智能合约中整数溢出和下溢漏洞

简介: 智能合约中整数溢出和下溢漏洞

整数溢出和下溢:

当数学运算的结果超出整数类型所能表示的范围时,会导致数值错误地回绕,这可以被攻击者利用来获取额外的代币或资源。

溢出示例

假设我们有一个智能合约,它接收用户存款并存储在一个变量中。如果用户尝试存入的金额加上现有的余额超出了整数的最大值(在Solidity中,uint256类型的最大值是2^256-1),就会发生溢出。

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract OverflowExample {
    uint256 public balance;
    function deposit(uint256 amount) public {
        balance += amount;
    }
    function getBalance() public view returns (uint256) {
        return balance;
    }
}

测试溢出

为了测试溢出,我们假设balance已经是uint256类型的最大值,再尝试存入任何正数,都将导致溢出,即结果将从最大值回绕到0。

// 假设balance已经是uint256的最大值
uint256 maxUint256 = type(uint256).max;
balance = maxUint256;
// 尝试存入任何正数都会导致溢出
deposit(1);
// 此时,balance将变为0

下溢示例

下溢通常发生在减法操作中,如果从一个较小的数中减去一个较大的数,结果将低于最小整数值(对于无符号整数,最小值是0),从而导致下溢。

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract UnderflowExample {
    uint256 public balance;
    function withdraw(uint256 amount) public {
        balance -= amount;
    }
    function getBalance() public view returns (uint256) {
        return balance;
    }
}

测试下溢

在无符号整数中,下溢实际上会导致值从0回绕到最大值,但这通常不是预期的行为,因此仍然被视为错误。

// 假设balance为0
balance = 0;
// 尝试取出任何正数都会导致下溢
withdraw(1);
// 此时,balance将变成uint256的最大值

解决方案

为了避免整数溢出和下溢,Solidity提供了安全数学库SafeMath,它包含了检查溢出和下溢的整数运算函数。自Solidity 0.8.0起,安全数学操作符checkedAdd, checkedSub, checkedMul, 和 checkedDiv被引入,可以自动检测并抛出异常。

using SafeMath for uint256;
function deposit(uint256 amount) public {
    balance = balance.checkedAdd(amount);
}
function withdraw(uint256 amount) public {
    balance = balance.checkedSub(amount);
}

这样,如果检测到溢出或下溢,Solidity将自动抛出异常,阻止交易执行,从而保护合约免受此类错误的影响。


相关文章
|
6月前
不使用第三方变量的情况下交换两个数值
不使用第三方变量的情况下交换两个数值
37 1
|
5月前
|
安全 编译器 C语言
PWN–整数溢出
PWN–整数溢出
54 3
|
5月前
|
监控 安全 区块链
智能合约中随机数生成漏洞
智能合约中随机数生成漏洞
49 4
|
编译器
整数溢出机制 C
整数溢出机制 C
284 0
小符号 大影响
C语言学习bug记录第一弹
|
算法 Java
【算法】缺失的第一个正数,俄罗斯套娃信封问题
1.缺失的第一个正数 2.俄罗斯套娃信封问题
111 10
|
存储
用补码计算x+y,并判断结果是否溢出问题
浮点数的加减法与是否溢出的判断,是计算机组成原理中的数据存储的一个入门。至于溢出情况,如果01就是正溢出,00,11未溢出,10负溢出。
714 0
用补码计算x+y,并判断结果是否溢出问题
负数居然比正数大?无符号整型与整形混用的后果
负数居然比正数大?无符号整型与整形混用的后果
206 0
负数居然比正数大?无符号整型与整形混用的后果
|
人工智能 数据可视化 数据挖掘
数值试井软件V3.0
合肥辰工科技 数值试井分析(Numerical well test Analysis)是处理和解释油气井关井压力,以获取油气藏或油气井参数的过程。其具体过程是测量井底压力,通过分析瞬态压力响应特征及流态规律,达到反演单井、井组地下参数目的。 辰工数值试井分析软件V3.0功能全面、操作方便,适用于常规油气、聚合物驱、化学驱、致密油气、页岩气及煤层气等,满足国内外各种油气藏勘探开发的解释需求。 辰工生产数据分析软件V3.0最大特点为可对数十口井的生产数据、关井压力数据进行综合分析,不仅可以获得地层渗透率、表皮因子、裂缝半长、可开采储量等参数,还可以得到地下优势流动通道,为降耗、挖潜等服务。
236 0
|
存储 区块链
solidity智能合约字节数最大值及缩减字节数
solidity智能合约字节数最大值及缩减字节数
469 0