Ошибки «Обратный вызов не содержит результата» и «Неверный пункт назначения перехода»

При вызове контракта тестовой сети ( 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;
}

Итак, есть идеи, что не так с этим кодом? Есть ли способ отладить код или узнать больше информации об ошибках? Спасибо!

Ссылки:

Ошибка при выполнении контракта [Неверный пункт назначения]

Как отладить ошибку «Плохой переход»

Неверная ошибка пункта назначения перехода

Привет. Что вы хотите сделать этой строкой кода bool dummy = to.send(1000000000000000000);? Логическое значение нужно сравнить с чем-то, чтобы вернуть a trueили falseправо?
Цель этой строки кода — отправить 1 эфир на указанную учетную запись. Логическая пустышка нужна только для того, чтобы избежать предупреждающего сообщения Solidity.
О, хорошо, я не знал, что вы можете сделать это, чтобы избежать предупреждения Solidity. Поправьте меня, если я ошибаюсь, но ваше событие faucetResult должно выглядеть так event faucetResult( address _from, address _to, string _comment );: Еще одна мысль, которая щекочет мой разум, такова Callback contain no result. Я не вижу никакого механизма обратного вызова в вашем коде.
Определение события следующее: событие faucetResult(адрес от, адрес до, строковый результат); Это правильно?
При запуске на локальной виртуальной машине Javascript (без подключения к узлу) выдается эта ошибка: Исключение виртуальной машины: недействительный JUMP at ac4467b97a805884f19a44b98da45c3fe7c604bc2ce1eaabf19fd83a1126f253/692a70d2e424a56d2c6c27aa07d1a96395877
Я обнаружил ошибки при выполнении этого условия: if (this.balance < 1000000000000000000) { throw; }
Возможно, проблема связана с диапазоном этих больших целых чисел. Взгляните на этот вопрос: ethereum.stackexchange.com/questions/11346/… Они используют эту функцию web3.toBigNumber(...)для работы gethс большими целыми числами.

Ответы (1)

Мне кажется, что все ошибки исходят от команды 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? Вы исследовали дальше?