Al llamar al método de contrato testnet ( https://testnet.etherscan.io/address/0xc03db39c18b6056f8c3a3a5495a1e11f3ff8885a ) sendFundsToFriend:
/* Faucet: Send funds, 1 Ether, to a new contact/friend */
function sendFundsToFriend(address to) {
if (to.balance > 1000000000000000000) {
faucetResult(msg.sender, to, 'Friends balance higher than 1 Ether'); // Event Log
throw; // If friend has enough funds (> 1 Ether), do not send anymore
}
if (this.balance < 1000000000000000000) {
faucetResult(msg.sender, to, 'Faucets balance lower than 1 Ether'); // Event Log
throw; // If SC funds are not enough(< 1 Ether), do not send funds
}
bool dummy = to.send(1000000000000000000);
faucetResult(msg.sender, to, 'Sent 1 Ether to friends account'); // Event Log
}
arroja los siguientes errores:
"Callback contain no result" => when calling contract method through solidity-browser and Metamask.
"Bad jump destination" => when calling contract method through geth node.
Trace => https://testnet.etherscan.io/vmtrace?txhash=0xa3b522fe104ad9b34cbae4235b59296e624c42665f5e2d6d5b509f4f02c52904
De acuerdo con Problema al establecer el valor de uint en cero y https://www.reddit.com/r/ethdev/comments/5m6j1q/heres_an_interesting_solidity_problem_ese_problem/ parece un error en Solidity (caso Metamask) debido a que Browser Solidity interactúa con geth.
Y el "destino de salto incorrecto" a veces se debe a un índice de matriz no válido o la falta de la palabra clave "memoria" en las declaraciones de variables locales, pero creo que ninguno de esos casos está presente en el método sendFundsToFriend.
Cuando se ejecuta en una máquina virtual Javascript local (sin conexión de nodo), arroja este error:
VM Exception: invalid JUMP at ac4467b97a805884f19a44b98da45c3fe7c604bc2ce1eaabf19fd83a1126f253/692a70d2e424a56d2c6c27aa97d1a86395877b3a:7906
He encontrado tiros de error al ejecutar esta condición:
if (this.balance < 1000000000000000000) {
throw;
}
Entonces, ¿alguna idea de qué está mal con este código? ¿Alguna forma de depurar el código o encontrar más información sobre los errores? ¡Gracias!
Referencias:
Error encontrado durante la ejecución del contrato [Destino de salto incorrecto]
Me parece que todos los errores provienen del comando throw. Una vez eliminado funciona bien.
function sendFundsToFriend(address to) {
if (to.balance >= 1000000000000000000) {
faucetResult(msg.sender, to, 'Friends balance higher than 1 Ether'); // Event log
} else if (this.balance < 1000000000000000000) {
faucetResult(msg.sender, to, 'Faucets balance lower than 1 Ether'); // Event log
} else {
bool dummy = to.send(1000000000000000000);
faucetResult(msg.sender, to, 'Sent 1 Ether to friends account'); // Event log
}
}
throw
? ¿Has investigado más?
FrenchieiSverige
bool dummy = to.send(1000000000000000000);
? ¿ Es necesario comparar un booleano con algo para devolver untrue
o unfalse
derecho?Juan Ignacio Pérez Sacristán
FrenchieiSverige
event faucetResult( address _from, address _to, string _comment );
? También el pensamiento que me hace cosquillas en la mente es esteCallback contain no result
. No veo ningún mecanismo de devolución de llamada en su código.Juan Ignacio Pérez Sacristán
Juan Ignacio Pérez Sacristán
Juan Ignacio Pérez Sacristán
jap1968
web3.toBigNumber(...)
para usargeth
con esos números enteros grandes.