¿Es posible el desbordamiento en este contrato inteligente?

function mint(address beneficiary) public payable {
    uint256 MTCToken = (msg.value/10000) * (10 ** uint256(18));
    uint256 teamToken = (MTCToken/100) * (5);
    balances[owner] += teamToken;
    balances[beneficiary] = balances[beneficiary] + (MTCToken - teamToken);
    totalSupply_ = totalSupply_ + (MTCToken);
}

Estoy un poco confundido con la longitud exacta del límite de desbordamiento. ¿Es posible cruzar el límite en la función anterior?

Respuestas (2)

Es posible que se desborde, pero no podemos decirlo a menos que sepamos cuál es el tipo de saldos y totalSupply_. Podría uint8 y entonces sería muy fácil desbordar saldos[propietario] o saldos[beneficiario] o totalSupply_

Si esto es uint256, entonces todavía es posible, pero requeriría enviar una gran cantidad de ETH para hacerlo. No tiene ningún sentido.

No conozco sus requisitos, así que no puedo decir por qué los multiplica por 10 ** 18.

uint256 MTCToken = (msg.value/10000) * (10 ** uint256(18));

msg.value está en Wei, así que supongo que tienes un error aquí. También es mejor hacer primero la multiplicación y luego la división.

Estoy un poco confundido con la longitud exacta del límite de desbordamiento.

Respuesta: El límite de desbordamiento depende del tipo de variable de destino. Si está almacenando resultados en el tipo uint8, el valor máximo es 255.

Así que en este ejemplo:

pragma solidity 0.4.24;

  contract Overflow {
    uint8 iWantToBeCrossed;

    function OverflowMe() public
    {
        iWantToBeCrossed = 100;
        iWantToBeCrossed += 200;

    }

    function ShowMeTheValue () public   view returns (uint8){
        return iWantToBeCrossed;
    }
}

La función ShowMeTheValue devolverá 44 después de llamar a la función OverflowMe.

ingrese la descripción de la imagen aquíPara uint256 necesita valores más grandes. Entonces, en teoría, es posible desbordarse, pero en la práctica no tiene ningún sentido porque necesitaría enviar una gran cantidad de ETH a su contrato.

El desbordamiento es técnicamente posible pero no muy probable. El número más alto posible en uint256 es (2^256)-1. Si alguien enviara todo el éter existente a esa función, MTCToken seguiría siendo solo 9.7330305e+39, que es solo ~133 de los 256 bits.

Tenga en cuenta que msg.value ya está en wei, por lo que multiplicar por 10 ** 18 no le dará cuánto wei hay. Además, sugeriría hacer la multiplicación antes de la división, ya que la división resultará en decimales eliminados. por ejemplo, 12345/100*5 = 615 frente a 617.