SwiftHTML & CSSSolidityDesenvolvimento de JogosSolana/Rust
20.11.2024

Lição 083: Overflow e Underflow de Inteiros

No desenvolvimento de contratos inteligentes com Solidity, compreender o overflow e o underflow de inteiros é fundamental. Esses conceitos surgem quando operações aritméticas ultrapassam seus limites máximos (overflow) ou mínimos (underflow) para o tipo de dado utilizado, o que pode levar a comportamentos inesperados em seus contratos inteligentes.

O que é Overflow de Inteiros?

O overflow de inteiros ocorre quando uma operação aritmética produz um valor maior do que o valor máximo que pode ser representado pelo tipo de dado. No Solidity, por exemplo, o tipo uint8 pode armazenar valores de 0 a 255. Se você tentar adicionar 1 a 255, o valor volta para 0.

Exemplo de Overflow de Inteiros

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract ExemploOverflow {
    uint8 public valor;

    function adicionar() public {
        valor = 255; // Valor máximo para uint8
        valor += 1;  // Isso causará um overflow
    }
}

No exemplo acima, quando adicionar é chamado, valor se torna 0 em vez de 256, demonstrando um overflow.

O que é Underflow de Inteiros?

O underflow de inteiros é o oposto do overflow. Ele ocorre quando você subtrai um valor de um número que é menor que esse valor. Para um uint8, se você tentar subtrair 1 de 0, ele voltará para 255.

Exemplo de Underflow de Inteiros

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract ExemploUnderflow {
    uint8 public valor;

    function subtrair() public {
        valor = 0; // Valor mínimo para uint8
        valor -= 1;  // Isso causará um underflow
    }
}

Após chamar subtrair, valor será 255, o que é uma demonstração clara de underflow.

A Solução: Biblioteca SafeMath

A biblioteca SafeMath foi historicamente utilizada para prevenir esses tipos de problemas de overflow/underflow em versões mais antigas do Solidity. No entanto, a partir do Solidity 0.8.0, verificações de overflow e underflow estão incorporadas nativamente na linguagem.

Exemplo de Versão Antiga com SafeMath

Se você estiver usando uma versão mais antiga do Solidity (anterior a 0.8.0), você normalmente importaria e utilizaria a biblioteca SafeMath da seguinte forma:

// SPDX-License-Identifier: MIT
pragma solidity ^0.7.0;

import "@openzeppelin/contracts/math/SafeMath.sol";

contract ExemploSafeMath {
    using SafeMath for uint256;

    uint256 public totalSupply;

    function adicionar(uint256 quantidade) public {
        totalSupply = totalSupply.add(quantidade);
    }

    function subtrair(uint256 quantidade) public {
        totalSupply = totalSupply.sub(quantidade);
    }
}

Neste ExemploSafeMath, as funções adicionar e subtrair reverterão a transação se ocorrer um overflow ou underflow.

Práticas Seguras em Solidity 0.8.0 e Acima

Se você está usando o Solidity 0.8.0 ou versões mais recentes, pode escrever seus contratos inteligentes sem precisar verificar manualmente overflows e underflows, uma vez que o compilador reverterá automaticamente essas condições.

Exemplo de Operações Seguras em Solidity 0.8.0 e Acima

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract ExemploSafeMathV2 {
    uint256 public totalSupply;

    function adicionar(uint256 quantidade) public {
        totalSupply += quantidade; // Seguro contra overflow
    }

    function subtrair(uint256 quantidade) public {
        totalSupply -= quantidade; // Seguro contra underflow
    }
}

Neste ExemploSafeMathV2, as operações são agora inherentemente seguras devido às verificações impostas pelo Solidity 0.8.0 e posterior.

Conclusão

Compreender o overflow e o underflow de inteiros é crucial para a criação de contratos inteligentes seguros e confiáveis. Com a introdução de verificações embutidas na versão 0.8.0 do Solidity, os desenvolvedores podem escrever códigos aritméticos mais seguros sem depender de bibliotecas externas como a SafeMath. No entanto, é essencial estar ciente dessas questões ao trabalhar com versões mais antigas do Solidity ou ao realizar operações aritméticas de baixo nível. Sempre priorize a segurança e a manipulação correta das operações inteiras em seus contratos inteligentes.

Video

Did you like this article? Rate it from 1 to 5:

Thank you for voting!