При вызове контракта тестовой сети ( 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
}
выдает следующие ошибки:
"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
В соответствии с проблемой установки значения uint на ноль и https://www.reddit.com/r/ethdev/comments/5m6j1q/heres_an_interesting_solidity_problem_ese_problem/ это выглядит как ошибка в Solidity (случай Metamask) из-за того, что браузер Solidity взаимодействует с geth.
И «Плохой пункт назначения перехода» иногда возникает из-за недопустимого индекса массива или отсутствия ключевого слова «память» в объявлениях локальных переменных, но я думаю, что ни один из этих случаев не присутствует в методе sendFundsToFriend.
При запуске на локальной виртуальной машине Javascript (без подключения к узлу) выдается эта ошибка:
VM Exception: invalid JUMP at ac4467b97a805884f19a44b98da45c3fe7c604bc2ce1eaabf19fd83a1126f253/692a70d2e424a56d2c6c27aa97d1a86395877b3a:7906
Я обнаружил ошибки при выполнении этого условия:
if (this.balance < 1000000000000000000) {
throw;
}
Итак, есть идеи, что не так с этим кодом? Есть ли способ отладить код или узнать больше информации об ошибках? Спасибо!
Ссылки:
Ошибка при выполнении контракта [Неверный пункт назначения]
Мне кажется, что все ошибки исходят от команды throw. После удаления работает нормально.
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
? Вы исследовали дальше?
FrenchieiSverige
bool dummy = to.send(1000000000000000000);
? Логическое значение нужно сравнить с чем-то, чтобы вернуть atrue
илиfalse
право?Хуан Игнасио Перес Сакристан
FrenchieiSverige
event faucetResult( address _from, address _to, string _comment );
: Еще одна мысль, которая щекочет мой разум, таковаCallback contain no result
. Я не вижу никакого механизма обратного вызова в вашем коде.Хуан Игнасио Перес Сакристан
Хуан Игнасио Перес Сакристан
Хуан Игнасио Перес Сакристан
японка 1968
web3.toBigNumber(...)
для работыgeth
с большими целыми числами.