Zeitangegebene Aufrufe in Solidity mit Oraclize

Ich habe angefangen, das Programmieren in Solidity zu lernen, und ich habe den folgenden Vertrag unter Verwendung der offiziellen Oraclize-Richtlinien geschrieben.

Mein Ziel ist:

  • Lassen Sie die Funktion update() innerhalb der angegebenen Zeitbeschränkung selbst aufrufen, um die Temperaturmessung zu aktualisieren.
  • Erhalten Sie bei jedem Aufruf eine Benachrichtigung über das Update (z. B. per E-Mail oder auf andere Weise in einer Textdatei).

Wie muss ich meinen Code konfigurieren, um dieses Ergebnis zu erzielen?

    pragma solidity ^0.4.18;
    import "github.com/oraclize/ethereum-api/oraclizeAPI.sol";

    contract WolframAlpha is usingOraclize { 



    string public temperature;
    mapping(bytes32=>bool) validIds;
    event LogNewOraclizeQuery(string description);
    event newTemperatureMeasure(string temperature);

    function WolframAlpha() {
        update();
    }

    function __callback(bytes32 myid, string result) {
        require(validIds[myid] ==true);
        require(msg.sender == oraclize_cbAddress());       
        temperature = result;
        newTemperatureMeasure(temperature);
        delete validIds[myid];
        // do something with the temperature measure..
    }

    function update() payable {
        if(oraclize_getPrice("WolframAlpha") > this.balance){
            LogNewOraclizeQuery("Oraclize query was NOT sent, please add some ETH to cover for the query fee");
        }
        else{
            LogNewOraclizeQuery("Oraclize query was sent, standing by for the answer..");
            bytes32 queryId = oraclize_query(60,"WolframAlpha","Temperature in London");
            validIds[queryId] =true;
        }
    }
} 

FYI

  • Ich verwende den Online-Solidity-Compiler "Remix".
  • Bereitstellen des Vertrags für Ropsten Testnet

Antworten (1)

Sie können die Ausführung der Abfrage wie folgt planen.

Aus der Oraclize-Dokumentation: -

Die Ausführung einer Abfrage kann für ein zukünftiges Datum geplant werden. Die Funktion oraclize_queryakzeptiert als Parameter die Verzögerung in Sekunden von der aktuellen Zeit oder den Zeitstempel in der Zukunft als erstes Argument.

 // Relative time: get the result from the given URL 60 seconds from now
 oraclize_query(60, "URL","json(https://api.kraken.com/0/public/Ticker?pair=ETHXBT).result.XETHXXBT.c.0")


 // Absolute time: get the result from the given datasource at the specified UTC timestamp in the future
 oraclize_query(scheduled_arrivaltime+3*3600,"WolframAlpha", strConcat("flight ", flight_number, " landed"));

Aus Ihrer Frage heraus müssen Sie die Update-Funktion für bestimmte Zeiträume aufrufen. Dazu müssen Sie den Aufruf mit JS planen. Bei jedem Anruf wird das Ereignis ausgegeben LogNewOraclizeQuery. Sie können das Ereignis beobachten, um über das neueste Update benachrichtigt zu werden.

 var num=contractInstance.Result({},{fromBlock: 0, toBlock: 'latest' });
          num.watch(function(error,result){
 });
Wenn ich das also richtig verstehe, rufe ich die Update- Funktion nach 60 Sekunden auf, nachdem sie bereitgestellt wurde, aber nur einmal . Wie kann ich es so planen, dass die Funktion update() alle 60 Sekunden ausgeführt wird ?
BEARBEITEN: Es ist mir egal, ob ich alle Eth meines Kontos ausgebe
Sie müssen den Funktionsaufruf in JS einplanen. Und bei jedem Callback führen Sie den Code aus, um ein Ereignis auszugeben. Es kann als Benachrichtigung mit Ereignisüberwachung verwendet werden.