El evento Calling Transfer provoca una estimación de gas infinita.

solc estima un uso infinito de gas _transfery no estoy seguro de por qué. Descubrí que si comento la Transfer(_from, _to, _amount)línea, el uso de gas se vuelve finito.

Aquí está el código mínimo para reproducir el problema:

pragma solidity ^0.4.19;

contract Token {

    event Transfer(address indexed _from, address indexed _to, uint _value);

    struct Balance {
        uint amount;
        uint lastUpdated;
    }

    mapping (address => Balance) public balances;


    function _transfer(address _from, address _to, uint _amount) internal returns (bool success) {

            // check if sender has sufficient balance
            require(balances[_from].amount >= _amount);
            //check for uint overflow
            require(balances[_to].amount + _amount > balances[_to].amount);

            balances[_from].amount -= _amount;
            balances[_to].amount += _amount;

            Transfer(_from, _to, _amount);
            return true;
        }
}

Usando la versión solc0.4.19+commit.c4cbbb05.Darwin.appleclang

¿alguna vez encontraste la respuesta?
no, pero terminó sin ser un problema: pude publicar el contrato independientemente

Respuestas (1)

He notado este problema con el contrato Zeppelin BasicToken. La respuesta que he encontrado es que las operaciones SAfeMath no se pueden analizar estáticamente, por lo que las matemáticas seguras provocan este error.

 function sub(uint256 a, uint256 b) internal pure returns (uint256) {
assert(b <= a);
return a - b;

}

/** * @dev Suma dos números, arroja desbordamiento. */ function add(uint256 a, uint256 b) retornos puros internos (uint256 c) { c = a + b; afirmar(c >= a); volver c; }

Puede ser que lo esté recibiendo debido a este cheque

    require(balances[_to].amount + _amount > balances[_to].amount);

Sin embargo, no sé cómo se puede resolver este problema sin eliminar todas las comprobaciones de desbordamiento. La ejecución no es un problema, solo el análisis estático y las llamadas .estimageGas() en Web3.

Entonces, ¿no es posible estimar el gas para transacciones que involucran una transferencia?
es posible estimar el gas en la mayoría de los casos de forma dinámica, pero podría ser imposible hacerlo de forma estática en el momento de la compilación; de eso se trata. Por lo tanto, recibe advertencias sobre el consumo infinito potencial de gas en el momento de la compilación.
Si está usando pragma solidity ^0.8.0;, aparentemente el compilador ahora maneja matemáticas seguras internamente.