Importante:
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?
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 i
ser 3
lo 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.
roberto