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?
Empleado de Oraclize aquí, y mirando su código con un __callback
Estoy 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 __callback
ejecutar, aunque ciertamente puedo hacer algunas conjeturas. Es casi seguro que está fallando debido a errores de falta de gas, ya que está usando ambos strings
y 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 setCustomGasPrice
que 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 __callback
con 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 gasAmount
es una unidad de la cantidad de gas que desea suministrar y queryString
es lo que está utilizando actualmente para realizar sus consultas. De esta manera, puede agregar más gas a la transacción y obtener el __callback
paso 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.
Tomas Maksimavicius
gskapka
Ruham
gskapka