Я хочу вызвать 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;
}
}
Первый параметр 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);
}
}
Чтобы отслеживать различные запросы, мы использовали структуру для хранения и определили сопоставление между идентификаторами запроса и состоянием запроса.