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.
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 gas
error al intentar llamar al test()
método para valores más grandes.
Rob Hitchens
nergall
Rob Hitchens