Almacenamiento de múltiples consultas de Oracle

Hemos estado tratando de usar un mapeo para almacenar varias consultas de Oracle y sus resultados, pero parece que no funciona correctamente. ¿Cuál es la forma ideal de almacenar múltiples consultas de Oraclize por sus ID de consulta?

Tenemos una consulta de Oracle en la que modificamos el medio cambiando el número de identificación y necesitamos almacenarlos por su número para que podamos obtenerlos más tarde.

mapping(bytes32 => OraclizeQueries) public validIDs;

function fetchMatchResults(uint _matchID) payable onlyOwner {
    bytes32 queryId = oraclize_query("URL",  strConcat(firstHalfQuery, 
          uint2str(_matchID), secondHalfQuery));
    validIDs[queryId] = OraclizeQueries("");
    pickWinner(_matchID, validIDs[queryId].result);
  }

function __callback(bytes32 oracleID, string result){
    if(msg.sender != oraclize_cbAddress()) revert();
    require(bytes(validIDs[oracleID].result).length == 0);
    validIDs[oracleID].result = result;
}
Hola. La mejor manera es usar un mapeo, con la bytes32ID como clave y lo que necesite como valor. (por ejemplo, una estructura que contenga los detalles de la primera transacción que necesitará en la devolución de llamada). Si publica su código, alguien podría ayudarlo a explicar por qué no funciona.
Hola, Richard, he subido el código. Si pudieras, échale un vistazo.
Hola de nuevo. ¿Qué hace la pickWinner()función? Cuando dice que el código no funciona, ¿cuáles son los síntomas? ¿Qué comportamiento espera, en comparación con lo que realmente está sucediendo?

Respuestas (1)

Al guardar una consulta de Oracle, es posible que le interese crear una asignación final entre los parámetros de entrada de Oracle oraclize_queryy los resultados de Oracle.

Puede lograr esto usando 2 asignaciones:

mapping(string => string) public InputToResult;
mapping(bytes32 => string) internal QueryIdToQuery;

Tenga en cuenta que los tipos específicos aquí pueden cambiar para su escenario, pero debería poder seguir y modificar este código para sus necesidades.

El proceso de Oraclize es un proceso asincrónico de dos pasos. El primer paso es enviar la consulta:

function oraclizeQuery(string _postId) public payable {
    // Check if we have enough remaining funds
    require(oraclize_getPrice("URL") > address(this).balance);

    string memory query = /*your query here*/;
    bytes32 queryId = oraclize_query("URL", query);
    QueryIdToQuery[queryId] = query;
}

Aquí generamos una URL de consulta, enviamos la oraclize_queryllamada y guardamos la queryIdque se genera como resultado, asignándola a la URL de consulta específica que enviamos.

Luego, la segunda parte es el oráculo llamando a nuestra __calbackfunción:

function __callback(bytes32 _id, string _result, bytes _proof) public {
    require(msg.sender == oraclize_cbAddress());
    // stringNotEmpty is a custom function to check that the string has length greater than 0
    require(stringNotEmpty(QueryIdToQuery[_id]));

    bytes32 Input = QueryIdToQuery[_id];
    InputToResult[Input] = _result;
}

Aquí obtenemos nuestros datos resultantes junto con los queryIdque almacenamos antes. Primero verificamos que la persona que llama a esta función sea el oráculo oraclize, luego verificamos que el _iddevuelto coincida con el queryIdque enviamos (verificación de cordura). Finalmente, usamos nuestro QueryIdToQuerymapeo para recuperar la consulta original que se usó para generar el resultado y creamos un objeto final que contiene un mapeo desde la entrada hasta la salida.

Ahora podrá almacenar los resultados de múltiples consultas de oraclize, al mismo tiempo que podrá asociar correctamente los datos devueltos con los datos de entrada que envió al oráculo.

El código anterior se modifica a partir de un contrato de trabajo real que obtiene publicaciones de Twitter:

https://github.com/shawntabrizi/Ethereum-Twitter-Bounty/blob/master/twitter-bounty/contracts/TwitterOracle.sol

La implementación específica en Twitter Oracle está más ajustada, en lugar del pseudocódigo anterior.

¡Esto funcionó para nosotros! Muchas gracias por explicar cómo se hace esto, ¡eres el mejor!