8.3 Subdesbordamiento y sobreflujo de enteros

html

8.3 Subdesbordamiento y sobreflujo de enteros en Solidity

En Solidity, como en muchos otros lenguajes de programación, los enteros tienen límites máximos y mínimos que pueden almacenar. Cuando se exceden estos límites, se produce un desbordamiento (overflow) o subdesbordamiento (underflow). Estos errores pueden llevar a comportamientos inesperados en los contratos inteligentes.

Desbordamiento de Enteros

Un desbordamiento ocurre cuando una operación aritmética hace que un número exceda su valor máximo permitido. En Solidity, los enteros tienen tipos explícitos como uint8, uint16, uint256, etc., que determinan el rango de valores que pueden almacenar.

Un uint8, por ejemplo, puede almacenar valores entre 0 y 255. Si intentamos añadir 1 a 255, el valor resultante da la vuelta al mínimo permitido, en este caso, 0.

Ejemplo de Código de Desbordamiento

pragma solidity ^0.8.0

contract OverflowExample {
    uint8 public maxValue = 255

    function incrementMaxValue() public {
        maxValue  = 1 // Esto causará un desbordamiento en versiones de Solidity anteriores a 0.8.0
    }
}

Subdesbordamiento de Enteros

Un subdesbordamiento ocurre cuando una operación aritmética hace que un número sea menor que su valor mínimo permitido. Por ejemplo, si intentamos restar 1 de 0 en un uint8, el valor resultante da la vuelta al máximo permitido, que en este caso sería 255.

Ejemplo de Código de Subdesbordamiento

pragma solidity ^0.8.0

contract UnderflowExample {
    uint8 public minValue = 0

    function decrementMinValue() public {
        minValue -= 1 // Esto causará un subdesbordamiento en versiones de Solidity anteriores a 0.8.0
    }
}

Prevención de Desbordamientos y Subdesbordamientos

En versiones de Solidity anteriores a 0.8.0, era común utilizar la librería SafeMath de OpenZeppelin para prevenir desbordamientos y subdesbordamientos. Sin embargo, a partir de la versión 0.8.0, Solidity incluye comprobaciones automáticas para estos errores y lanza una excepción en caso de que ocurran.

Uso de SafeMath en Solidity anterior a 0.8.0

pragma solidity ^0.6.0
import @openzeppelin/contracts/math/SafeMath.sol

contract SafeMathExample {
    using SafeMath for uint8
    uint8 public value = 255

    function safeIncrement() public {
        value = value.add(1) // Utiliza SafeMath para evitar desbordamientos
    }

    function safeDecrement() public {
        value = value.sub(1) // Utiliza SafeMath para evitar subdesbordamientos
    }
}

Comprobaciones Automáticas en Solidity 0.8.0 y Posteriores

pragma solidity ^0.8.0

contract AutoCheckExample {
    uint8 public maxValue = 255
    uint8 public minValue = 0

    function incrementMaxValue() public {
        maxValue  = 1 // Automáticamente lanzará una excepción si ocurre un desbordamiento
    }

    function decrementMinValue() public {
        minValue -= 1 // Automáticamente lanzará una excepción si ocurre un subdesbordamiento
    }
}

La actualización a Solidity 0.8.0 y posteriores simplifica la prevención de errores de desbordamiento y subdesbordamiento, haciendo que el código sea más seguro por defecto sin necesidad de librerías adicionales.

AnteriorSiguiente

[mwai_chat]

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *