Estimación de gas infinito de solc para función simple

Aquí hay un contrato de Solidez simple:

pragma solidity ^0.4.16;

contract Test {
    uint[] array;

    function testGasEstimation() public {
        array.length = 1;
    }
}

Aquí está la salida desolc --gas Test.sol

======= Test.sol:Test =======
Gas estimation:
construction:
   88 + 44200 = 44288
external:
   testGasEstimation(): infinite

Del mismo modo array.push(1);estimaciones a gas infinito.

Respuestas (2)

Hay muchos casos en los que el estimador de gas informa infinitegas. Sin embargo, no significa necesariamente que haya un bucle infinito en su código o que su código sea incorrecto, sino que el estimador es bastante restrictivo al tomar decisiones sobre la cantidad de gas que puede consumir el código. En particular, cualquier salto o bucle hacia atrás en el código ensamblador hará que informe gas infinito .

Para la muestra de código proporcionada, array.length = 1;el compilador agrega el código de bytes que restablece todos los elementos de la matriz fuera del nuevo límite. Por ejemplo, si la matriz contenía 10 elementos y luego establece su longitud en 1, el código iterará sobre 9 elementos y restablecerá las ranuras de almacenamiento para ellos. Esta operación involucra un ciclo, por eso el estimador reporta infiniteestimación de gas.

array.push()incluye establecer la nueva longitud de la matriz, por lo que se estima en infinito por las mismas razones.

Puede leer más detalles con enlaces al código del estimador aquí ¿Cómo obtener el costo (en gas) de la llamada de función no constante?

La matriz dinámica podría tener una longitud infinita, independientemente de que la establezca en 1.

¿Significa que establecer la longitud de una matriz potencialmente infinita en 1 potencialmente requiere gas infinito?
Entre ustedes y yo sabemos, pero el compilador no puede resolver eso, porque no puede saber que usted puede tener una función o llamar más tarde que cambia el valor, sí, tiene una constante, pero para el compilador, lo interpreta como un variable, y como tal podría ser infinito, esto es solo una suposición según tengo entendido, no vaya al banco en esto ...: D