¿Es posible desbordar unidades?

El tutorial de tokens de Ethereum tiene una comprobación de un desbordamiento de uint256.

function transfer(address _to, uint256 _value) {
    /* Check if sender has balance and for overflows */
    if (balanceOf[msg.sender] < _value || balanceOf[_to] + _value < balanceOf[_to])
        throw;

    /* Add and subtract new balances */
    balanceOf[msg.sender] -= _value;
    balanceOf[_to] += _value;
}

No he encontrado referencias en ningún otro lugar para protegerse contra desbordamientos de uint o fallas de seguridad en los contratos debido a ellos. Parece que ambos serían comunes si esto fuera un problema.

Respuestas (3)

Sí. Aquí hay un ejemplo de desbordamiento y subdesbordamiento de uint.

contract C {
    // (2**256 - 1) + 1 = 0
    function overflow() returns (uint256 _overflow) {
        uint256 max = 2**256 - 1;
        return max + 1;
    }
    
    // 0 - 1 = 2**256 - 1
    function underflow() returns (uint256 _underflow) {
        uint256 min = 0;
        return min - 1;
    }
}

Puede ejecutar el código aquí: https://remix.ethereum.org/#version=soljson-latest.js&gist=30378c5375f388a28572dd18d58f787f

Rompiendo los cambios en solidity v0.8.0+, revierten los desbordamientos con un error de pánico estándar, directamente de la documentación... "Las afirmaciones fallidas y otras comprobaciones internas como la división por cero o el desbordamiento aritmético no usan el código de operación no válido sino el código de operación de reversión Más específicamente, usarán datos de error equivalentes a una llamada de función a Panic(uint256) con un código de error específico para las circunstancias".

Sí, el desbordamiento es posible, y tenga especial cuidado al usar, var por ejemplo:

En for (var i = 0; i < arrayName.length; i++) { ... }, el tipo de i será uint8, porque este es el tipo más pequeño que se requiere para mantener el valor 0. Si la matriz tiene más de 255 elementos, el ciclo no terminará.

Usar uint i(256 bits) evita el problema.

Nota: El EVM no permite el cálculo infinito, por lo que el ciclo consumirá todo el gas y la transacción finalizará, y se seguirán pagando las tarifas al minero.

Desde solidity v0.8.0+, ya no es posible desbordarse o subdesbordarse uint.

Si verifica la respuesta de @Noah Thorp, verá solidez reverty arrojará un error.

Directamente de los documentos :

Las operaciones aritméticas se revierten en subdesbordamiento y desbordamiento. Puede usar { ... } sin marcar para usar el comportamiento de ajuste anterior.

¡Esto ahora se hace automáticamente!