La devolución de llamada de Oracle no se llama con más datos en ella

Tengo una experiencia muy extraña con Oracle. Cuando trato de agregar funcionalidad dentro de la devolución de llamada, la devolución de llamada no se llama, pero cuando elimino la funcionalidad, la devolución de llamada funciona sin problemas.

Traté de aumentar la cantidad de gas usando oraclize_setCustomGasPrice, usé mapeo, arreglos y todo lo que sé en funcionalidad, nada funciona.

Aquí hay un ejemplo de devolución de llamada que nunca se llama:

function __callback(bytes32 myid, string result) {
  if (msg.sender != oraclize_cbAddress()) revert();
  emit LogPriceUpdated(result);
 for (uint i=0; i < betId + 1; i++) {
    if (compareStrings("up", result)) {
        gameInfo[currentPrizePeriodTime][i].choice = result;
  }
 }
}

Y aquí hay un ejemplo de código que se llama todo el tiempo:

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

¿Alguno de ustedes por qué sucede esto, es solucionable o debería buscar soluciones alternativas?

Respuestas (1)

Empleado de Oraclize aquí, y mirando su código con un __callbackEstoy bastante seguro de que el Oracle al que se refiere es de hecho Oraclize , ¡así que espero poder ayudar! :pag

 

Sin ver el resto de su contrato inteligente, no puedo diagnosticar con certeza qué le impide __callbackejecutar, aunque ciertamente puedo hacer algunas conjeturas. Es casi seguro que está fallando debido a errores de falta de gas, ya que está usando ambos stringsy un bucle dentro de él. Cualquier manipulación de cuerdas es muy costosa en solidez en términos de gas, y el bucle sobre alguna forma de manipulación de cuerdas multiplicará ese costo por cada vez que gire el bucle.

 

Cuando llamas a una consulta de Oraclize tienes la opción de suministrar una cantidad de gas a la consulta, la cual se descuenta de tu contrato en el momento de realizar la llamada. (Esto es diferente a lo setCustomGasPriceque ha mencionado) Oraclize luego proporcionará esta cantidad para impulsar la transacción que ejecuta su __callback. Si no proporciona este parámetro, el valor predeterminado es 200.000. Eso es suficiente para ejecutarlo __callbackcon la mayor parte de la lógica eliminada, pero es poco probable que sea suficiente dependiendo de qué tan largo sea el resultado de su cadena y cuántas veces lo repita en el ciclo.

 

Para proporcionar más gas a la consulta de Oraclize, agregue el número como parámetro de la siguiente manera:

     oraclize_query("URL", queryString, gasAmount);

donde gasAmountes una unidad de la cantidad de gas que desea suministrar y queryStringes lo que está utilizando actualmente para realizar sus consultas. De esta manera, puede agregar más gas a la transacción y obtener el __callbackpaso cuando incluye su lógica.

 

Sin embargo, el problema más grande es que estás tratando de hacer muchas cosas costosas en tu __callback, y el nombre del juego en Solidity es hacer que todo sea lo más eficiente posible, ya que todo cuesta dinero para ejecutarlo. Probablemente valga la pena que eche un vistazo a su arquitectura actual y vea dónde puede ahorrar en costos de gasolina en lo que hace con los resultados de su consulta de Oraclize.

También para los nuevos desarrolladores que usan Oracle como yo, en primer lugar, asegúrese de que realmente no tenga valores nulos en su devolución de llamada, como hice yo ^^
@TomasMaksimavicius ¡sí! :P Suele ser una buena idea "simular" la devolución de llamada llevándola a su propia función y usando, por ejemplo, el marco de prueba de Truffle para llamar a su simulación con el resultado que espera recibir de Oraclize. Desacoplarlo de esta manera le permite probar que la lógica funciona correctamente por separado de la consulta de Oraclize en sí.
Tiene el mismo problema... ¿Hará alguna diferencia poner toda la lógica en una función interna y llamarla desde __callback()?
@Ruham: no hace ninguna diferencia. Siempre que la lógica dentro de la función interna no tenga errores y proporcione el precio de gasolina necesario a la llamada de Oraclize para activar esa devolución de llamada, puede organizar su lógica de la manera que describe sin problemas.