Как вызвать несколько запросов oracaliszed из одного контракта

Я хочу вызвать 2 разных оркализованных запроса из одного и того же контракта. Я видел несколько сообщений, но ни один из ответов не работает. Есть ли способ сделать это? Вот мой контракт. Я ожидал, что этот контракт будет регистрировать оба 11111111, 222222222222222но он печатает ошибку VM Exception: invalid opcode, которую я использую http://dapps.oraclize.it/ . Когда я вызываю один запрос, он работает, но не 2 запроса.

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

contract verifySettlement is usingOraclize {

    uint public price;
    string public landingtime;
    string public expectedtime;`
    string public tempvalue;
    mapping(bytes32 => uint) queries;

    event Log(string text);

    function verifySettlement() payable {
        Log("Contract created.");
        getActualFlightDetails();
        getExpectedFlightDetails();
    }

    function getActualLandingHour() constant returns (string) {
       return landingtime;
    }

    function getExpectedLandingHour() constant returns (string) {
       return expectedtime;
    }

    function __callback(bytes32 _myid, string _result) {
        require (msg.sender == oraclize_cbAddress());
        if(queries[_myid] == 1)
        {
            Log("1111111111111111111111111");
        }
        if(queries[_myid] == 2)
        {
            Log("2222222222222222222222222222222");
        }
        //Log(_result);
        //tempvalue = _result;
    }

    function getActualFlightDetails() payable {
        Log("Oraclize query was sent, waiting for the answer for getting actual flight details..");
        queries[oraclize_query("URL","http://169.53.241.139:5000/actual/flight/1")]=1;
        //queries[oraclize_query("URL","http://169.53.241.139:5000/expected/flight/1")]=2;
    }

    function getExpectedFlightDetails() payable {
        Log("Oraclize query was sent, waiting for the answer for getting actual flight details..");
        //queries[oraclize_query("URL","http://169.53.241.139:5000/expected/flight/1")]=1;
        queries[oraclize_query("URL","http://169.53.241.139:5000/expected/flight/1")]=2;
    }



}

Ответы (1)

Первый параметр idв __callbackбудет обрабатывать разные запросы в одной и той же функции обратного вызова.

contract verifySettlement is usingOraclize {

 uint public price;
 string public landingtime;
 string public expectedtime;`
 string public tempvalue;


  event Log(string text);

  enum oraclizeState { ForActual, ForExpected }

   struct oraclizeCallback {
        oraclizeState oState;
  }
  mapping (bytes32 => oraclizeCallback) public oraclizeCallbacks;

function verifySettlement() payable {
    Log("Contract created.");
    getActualFlightDetails();
    getExpectedFlightDetails();
}

function getActualLandingHour() constant returns (string) {
   return landingtime;
}

function getExpectedLandingHour() constant returns (string) {
   return expectedtime;
}

function __callback(bytes32 _myid, string _result) {
     require (msg.sender == oraclize_cbAddress());
     oraclizeCallback memory o = oraclizeCallbacks[myid];
             if (o.oState == oraclizeState.ForActual) {
                           Log("1111111111111111111111111");
              }
              else if(o.oState == oraclizeState.Forxpected) {
                           Log("2222222222222222222222222222222");   
             }
}

function getActualFlightDetails() payable {
    Log("Oraclize query was sent, waiting for the answer for getting actual flight details..");
     bytes32 queryId=oraclize_query("URL","http://169.53.241.139:5000/actual/flight/1");
     oraclizeCallbacks[queryId] = oraclizeCallback(oraclizeState.ForActual);
}

function getExpectedFlightDetails() payable {
    Log("Oraclize query was sent, waiting for the answer for getting actual flight details..");

     bytes32 queryId=oraclize_query("URL","http://169.53.241.139:5000/expected/flight/1");
      oraclizeCallbacks[queryId] = oraclizeCallback(oraclizeState.ForExpected);
}
 }

Чтобы отслеживать различные запросы, мы использовали структуру для хранения и определили сопоставление между идентификаторами запроса и состоянием запроса.