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.
Hay muchos casos en los que el estimador de gas informa infinite
gas. 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 infinite
estimació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.
medvedev1088
Ciberciencia