So rufen Sie mehrere orakalisierte Abfragen aus einem einzigen Vertrag auf

Ich möchte 2 verschiedene orkalisierte Abfragen aus demselben Vertrag aufrufen. Ich habe ein paar Beiträge gesehen, aber keine der Antworten funktioniert. Gibt es eine Möglichkeit, wie wir das tun können? Hier ist mein Vertrag. Ich hatte erwartet, dass dieser Vertrag beide protokolliert 11111111, 222222222222222aber es wird ein Fehler ausgegeben, den VM Exception: invalid opcodeich verwende http://dapps.oraclize.it/ . Wenn ich eine einzelne Abfrage aufrufe, funktioniert es, aber nicht 2 Abfragen.

    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;
    }



}

Antworten (1)

Der erste Parameter idin __callbackverarbeitet verschiedene Anforderungen in derselben Callback-Funktion.

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);
}
 }

Um den Überblick über die verschiedenen Abfragen zu behalten, haben wir struct zum Speichern verwendet und eine Zuordnung zwischen Abfrage-IDs und Status der Abfrage definiert.