Problemas al ejecutar la función de devolución de llamada de Oracle

He estado tratando de ejecutar dos contratos en una red privada, usando oraclize brigde. El primero funciona perfectamente, sin embargo, el segundo, por alguna razón, no llama a la función de devolución de llamada (a pesar de haber enviado una consulta) a menos que elimine parte del código de la función. Aquí está la parte problemática del código:

pragma solidity ^0.4.16;
import "github.com/oraclize/ethereum-api/oraclizeAPI.sol";
import "github.com/Arachnid/solidity-stringutils/strings.sol";

contract CFDBroker is usingOraclize {

   using strings for *;

   mapping (uint => uint) instruments;
   mapping (bytes32 => uint) queries;
   uint public GOLD;
   uint public EURUSD;
   uint public DJI;
////////////////////////////////////////////////////////////////////////////////

   function sendFunds() payable {

       getData();

   }
////////////////////////////////////////////////////////////////////////////////

   function __callback(bytes32 myid, string result, bytes proof) {

       require(msg.sender == oraclize_cbAddress());

       if (queries[myid] == 1){
           //parse and update gold
           var s = result.toSlice();
           GOLD = parseInt(s.beyond("$".toSlice()).until("/".toSlice()).toString())*100;
           instruments[1] = GOLD;

       } else{
           if(queries[myid] == 2){
               //parse and update eur/usd
               s = result.toSlice();
               var r = result.toSlice().beyond(".".toSlice());
               EURUSD = parseInt(s.beyond("$".toSlice()).until(".".toSlice()).concat(r));
               instruments[2] = EURUSD;

           } else{
               if(queries[myid] == 3){
                   //update DJI
                   DJI = parseInt(result)*100;
                   instruments[3]=DJI;

               }
           }
       }

       update();

       //getData(); --supposed source of the problem

   }

   /**
    *  Instrument IDs:
    *  0 - ASK FOR ALL
    *  1 - GOLD
    *  2 - EUR/USD
    *  3 - DJI
    */
   function getData() private{

       queries[oraclize_query(50, "WolframAlpha","gold price in usd")] = 1; //ask for gold
       queries[oraclize_query(50, "WolframAlpha","eur/usd")] = 2; // ask for eur/usd
       queries[oraclize_query(50, "WolframAlpha","DJI price")] = 3; //ask for DJI

   }}

Es un modelo de corredor de CFD, se supone que la parte cotizada actualiza los precios de 3 instrumentos financieros cada 60 segundos. Funciona bien, cuando se comenta getData() en la devolución de llamada. Con todo, parece muy similar a este problema: link .

El contrato es parte de mi proyecto de estudiante, estaría muy agradecido por cualquier ayuda :).

Respuestas (2)

Marco de Oracle aquí. Puedo ver dos fuentes potenciales del problema:

  1. No hay suficientes fondos en el saldo del contrato para pagar tres consultas nuevas
  2. No se proporcionó suficiente gas a la función de devolución de llamada

¿Intentó enviar más gasolina a lo largo de la devolución de llamada o aumentar el saldo del contrato?

Ok, parece que no entendí lo suficientemente bien cómo funciona Oracle. De todos modos resulta que no envié suficiente gasolina para devolver la llamada. Muchas gracias por tu respuesta :).

Primero, debe verificar que no haya un error tipográfico. Es un error fácil de escribir _callbackpara la __callbackfunción. Hay doble _, no solo simple _antes callback. ¡Es un fácil descuido!

En segundo lugar, cuando esté en Remix, navegue hasta Settings, mire el Pluginárea y haga clic en el Oraclizecomplemento. Solo vincule remix con el módulo Oraclizeque puede usar oraclize. Si está utilizando web3/proveedor inyectado, lo que significa que está utilizando redes de prueba Rospten/Kovan o su red privada local, recibirá el siguiente mensaje:

Este complemento de Oraclize actualmente NO funciona en remix a través de web3/proveedor inyectado. Esto está disponible solo para el modo en memoria (JavaScript VM). Si desea utilizar contratos basados ​​en Oraclize, verifique primero que Oraclize esté integrado con la cadena de bloques que está utilizando; de lo contrario, puede habilitarlo a través de una instancia dedicada de ethereum-bridge.

Por lo tanto, solo puede usar Oracle en la VM de JavaScript, o necesita usar ethereum-bridge para su red privada local y redes de prueba como Ropsten.