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 :).
Marco de Oracle aquí. Puedo ver dos fuentes potenciales del problema:
¿Intentó enviar más gasolina a lo largo de la devolución de llamada o aumentar el saldo del contrato?
Primero, debe verificar que no haya un error tipográfico. Es un error fácil de escribir _callback
para la __callback
funció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 Oraclize
complemento. Solo vincule remix con el módulo Oraclize
que 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.
Jakub