solc estima un uso infinito de gas _transfer
y 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
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.
pragma solidity ^0.8.0;
, aparentemente el compilador ahora maneja matemáticas seguras internamente.
Stormsson
Rohanp