oraclize «Исключение виртуальной машины: неверный JUMP»

Вот мой смарт-контракт, который использует oraclize для покупки биткойнов за эфир.

pragma solidity ^0.4.0;

import "https://github.com/oraclize/ethereum-api/oraclizeAPI_0.4.sol";

contract BuyBitcoin is usingOraclize {

    address owner;
    string public temp;


    function BuyBitcoin() {
        owner = msg.sender;

        OAR = OraclizeAddrResolverI(0x51efaf4c8b3c9afbd5ab9f4bbc82784ab6ef8faa);
        update();
    }

    function __callback(bytes32 myid, string result) {
        if (msg.sender != oraclize_cbAddress()) throw;
        result;
    }

    function update() payable {
        oraclize_query("URL", "json(https://www.shapeshift.io/shift).orderId", '{"withdrawal":"3J98t1WpEZ73CNmQviecrnyiWrnqRhWNLy", "pair":"eth_btc" , "amount" : 1000}');
    }

    function kill(){
        if (msg.sender == owner) suicide(msg.sender);
    }

}

Обновлять :

Я отправляю 0,01 эфира в рамках транзакциивведите описание изображения здесь

Я могу скомпилировать контракт, но когда я пытаюсь запустить функцию обновления, я получаю «Исключение VM: недействительный JUMP».

Я что-то упустил в своем контракте?

и используя виртуальную машину Javascript:

введите описание изображения здесь

Я пропустил шаг?

Я использую метамаску и имею эфир в аккаунте:

введите описание изображения здесь

Привет, это Томас из Oraclize. Пользовательское определение «OAR» (которое у вас есть в конструкторе) необходимо только при использовании его в режиме твердости браузера «Ethereum VM» (выполнение в памяти). Вы должны удалить его при запуске на реальном блокчейне. Кроме того, вы отправляете какое-либо значение по update()вызову? Первый oraclize_query бесплатен, но за другие придется заплатить (даже при имитации).
@Thomas Bertani нет, я не отправляю никаких значений, включенных в вызов update(). Сколько эфира мне нужно отправить за звонок?
oraclize_queryвзимает с баланса контракта правильную сумму в соответствии с ценами на Oraclize API: docs.oraclize.it/#pricing . Тем не менее, вы можете отправить около 0,01 эфира, и любые изменения останутся на балансе вашего контракта.
@blue-sky, вы развертываете контракт в сети? Если нет, и вы выполняете только выполнение в памяти, вы не используете правильную надежность браузера. Oraclize имеет исправление с поддержкой запросов и обратных вызовов oraclize по этому URL-адресу: dapps.oraclize.it/browser-solidity/… Кроме того, для обеспечения надежности браузера не требуется Metamask. Вы можете отправить количество эфира напрямую через браузер-солидность.
Я столкнулся с проблемой Сэма, у вас есть решение?
@SigTouri, к сожалению, нет, я не нашел решения этой проблемы, но я чувствую, что недостаточно понимаю экосистему эфириума, чтобы понять проблему.

Ответы (1)

Возможно, будет немного поздно получить ответ на этот вопрос. Вероятно, у вас может быть ответ с вами.

Итак, вот мой взгляд на эту проблему. когда вы используете версию Solidity ^0.4.0 и пытаетесь отправить значение в контракт, 0,01 Ether в вашем случае, вы должны использовать функцию по умолчанию, предоставленную в Solidity, а также использовать ключевое слово payable.

С этой проблемой чаще всего сталкиваются те, кто пытается сделать что-то подобное. Попробуйте сделать это один раз.

Надеюсь, наблюдение поможет.

Спасибо.