Excepción de VM al ejecutar eth_estimateGas usando for loop

Importante:

  • Usando Solidity IDE con el proveedor Web3
  • Prueba RPC y web3 instalados
  • Probando con 10 cuentas de Ether con suficiente Ether (100 ETH) por cuenta.

Estoy probando un contrato simple que recibe Ether de una cuenta, divide el valor y lo transfiere a otras 3 cuentas.

contract testContract {

    address[] employees = [
        0x4cd28d9a0d66216382ad3e1c993797989d1a8e05,
        0xb871e16d7192cbaa2b5be32f85c1a19f61b8a50d,
        0x5e5527378c42b91e95fee2cfbe974259d983a99e
    ];

    function testContract() payable {

    }

    function () payable {
        uint amountPerEmployee = msg.value / employees.length;

        for(uint i = 0; i <= employees.length; i++) {
            employees[i].transfer(amountPerEmployee);
        }
    }

} 

Cuando ejecuto la función de devolución de llamada con el bucle, aparece un error:

la devolución de llamada no contiene ningún resultado Error: Error: Excepción de VM al ejecutar eth_estimateGas: código de operación no válido en /usr/local/lib/node_modules/ethereumjs-testrpc/build/cli.node.js:59368:17 en /usr/local/lib/node_modules /ethereumjs-testrpc/build/cli.node.js:69306:5 en /usr/local/lib/node_modules/ethereumjs-testrpc/build/cli.node.js:11335:9 en /usr/local/lib/node_modules /ethereumjs-testrpc/build/cli.node.js:7895:16 al reponer (/usr/local/lib/node_modules/ethereumjs-testrpc/build/cli.node.js:8415:25) al iterateeCallback (/usr/ local/lib/node_modules/ethereumjs-testrpc/build/cli.node.js:8405:17) en /usr/local/lib/node_modules/ethereumjs-testrpc/build/cli.node.js:8380:16 en /usr /local/lib/node_modules/ethereumjs-testrpc/build/cli.node.js:11332:13 en /usr/local/lib/node_modules/ethereumjs-testrpc/build/cli.node.js:69302:9 en /usr/local/lib/node_modules/ethereumjs-testrpc/build/cli.node.js:63982:7

Al probar la función de devolución de llamada como se muestra a continuación, todo va bien:

function () payable {
    uint amountPerEmployee = msg.value / employees.length;

    // Test with only the first item in the array, no loop
    employees[0].transfer(amountPerEmployee);
}

¿Que esta pasando aqui? ¿Es el bucle el que está usando demasiado gas?

Respuestas (1)

Estás saliendo del final de la matriz con

for(uint i = 0; i <= employees.length; i++)

employees[]tiene exactamente 3 filas, que son: 0, 1, 2.

Dejas iser 3lo que no existe para que no sea feliz.

Un consejo relacionado para más adelante a medida que avanza. Querrá refactorizar el bucle fuera de la imagen por completo por razones de escalabilidad.

Espero eso ayude.

¡Muchas gracias! Eso solucionó el problema. Y gracias por el consejo también.