El compilador del navegador Solidity falla

Parece que cada vez que trato de ejecutar una función de contrato a través del compilador del navegador que requiere más de alrededor de 50k gas (más o menos) para ejecutarse, la memoria de la pestaña del navegador llega a alrededor de 1 GB y el compilador falla.

Estoy usando Chrome e intenté ejecutar una amplia gama de funciones. Cuando ejecuto la función directamente en un nodo de paridad, obtengo la respuesta correctamente, por lo que me parece que es un problema del compilador.

¿Alguien más lo experimentó y conoce una solución?

Tenga en cuenta que parece que se reproduce más fácilmente cuando se usan bucles/matrices, ¿tal vez debido a las asignaciones de matrices?

Aquí está el contrato de ejemplo:

pragma solidity ^0.4.8;

contract TestContract {
    function TestContract() {
    }

    function test(uint256 iterations) constant {
        int256[] memory a = new int256[](1000);

        for (uint32 i = 0; i < iterations; ++i) {
            a[i] = i;
        }
    }
}

Paso más de 500 como argumento a la función y el compilador muere.

No es normal. ¿Es posible publicar un código de muestra para que podamos replicar el problema?
Se agregó un ejemplo
Confirmado. Interesante. No creo que sea la gasolina en sí, porque he probado patrones de fábrica que tienen un costo de gasolina mucho mayor. Jugó con variantes del original y notó que siempre reclama memoria que no se devuelve después de que se completa la función. Por lo tanto, sospecho que se relaciona con la considerable información de depuración que está disponible para su inspección una vez finalizada la función. Sólo una corazonada. Esperemos que alguien intervenga con una mejor explicación.

Respuestas (1)

El gas se utiliza para limitar el número de pasos computacionales que puede realizar un contrato o una transacción. Aquí tienes una respuesta detallada.

pragma solidity ^0.4.19;

contract TestContract {
    function TestContract() public {}

    function test(uint256 iterations) public pure returns(uint) {
        int256[] memory a = new int256[](1000);

        for (uint32 i = 0; i < iterations; ++i) {
            a[i] = i;
        }
        return a.length;
    }
}

https://ethfiddle.com/p96qnh9DJ4

Modifiqué un poco su código de contrato para explicar lo que está sucediendo. Primero suministramos suficiente gas (9000000 por defecto) mientras implementamos este contrato. Puede iterar siempre que no obtenga out of gas.

Luego implementamos con gas estimado 136914 e intentamos ejecutar iteraciones. Ahora podemos obtener un VM Exception while executing eth_call: out of gaserror al intentar llamar al test()método para valores más grandes.