Wie mache ich einen asynchronen ChainLink-Solidity-Orakel-Aufruf?

Ich muss ein uint in meinen Ethereum-Vertrag einführen. Ich teste diesen Code in Kovan anhand dieses Beispiels: https://docs.chain.link/docs/make-a-http-get-request/

pragma solidity ^0.6.0;

import "https://raw.githubusercontent.com/smartcontractkit/chainlink/develop/evm-contracts/src/v0.6/ChainlinkClient.sol";

// SPDX-License-Identifier: UNLICENSED

contract ChainlinkExample is ChainlinkClient {
  
    uint256 public price;
    
    address private oracle;
    bytes32 private jobId;
    uint256 private fee;
    
    constructor() public {
        setPublicChainlinkToken();
        oracle = 0x2f90A6D021db21e1B2A077c5a37B3C7E75D15b7e;
        jobId = "29fa9aa13bf1468788b7cc4a500a45b8";
        fee = 0.1 * 10 ** 18; // 0.1 LINK
    }

    function requestEthereumPrice() public returns (bytes32 requestId){
        Chainlink.Request memory request = buildChainlinkRequest(jobId, address(this), this.fulfill.selector);
            req.add("get", "https://min-api.cryptocompare.com/data/price?fsym=ETH&tsyms=USD");//{"USD":1797.12}
            req.add("path", "USD");
            req.addInt("times", 100);
        return sendChainlinkRequestTo(oracle, request, fee);
    }

    function fulfill(bytes32 _requestId, uint256 _price) public recordChainlinkFulfillment(_requestId){
        price = _price;
    }

}

Alles funktioniert korrekt, aber die Funktion "requestEthereumPrice()" braucht einige Sekunden, um die Variable "price" zu speichern.

Wie könnte ich eine Anfrage anrufen, auf die Antwort warten und mit meinen nächsten Codeberechnungen fortfahren?

Wie kann ich beispielsweise den API-Preis anfordern und eine Operation ausführen und das Ergebnis im selben Funktionsaufruf zurückgeben?

Bitte fügen Sie keine weitere Frage zu derselben Frage in Stackoverflow hinzu. Können Sie bitte eine neue Frage mit dem Titel „Wie man einen Chainlink-API-Aufruf an einen anderen Vertrag zurückgibt“ erstellen?

Antworten (1)

In diesem Fall möchten Sie Ihre gesamte Logik in der Callback-Funktion platzieren fulfill.

Wenn Sie beispielsweise ein Token basierend auf der Rückgabe eines API-Aufrufs prägen möchten, würden Sie Folgendes tun:

function fulfill(bytes32 _requestId, uint256 _price) public recordChainlinkFulfillment(_requestId){
        price = _price;
        mint(price);
        // any other logic here
    }

Chainlink-API-Aufrufe sind von Natur aus asynchron, sodass Sie keinen API-Aufruf tätigen und im selben Block eine Antwort erhalten.

Ich muss die Funktion "requestEthereumPrice()" von einem anderen Vertrag aufrufen. Wie kann ich den "Preis" an den übergeordneten Vertrag zurückgeben?
Sie möchten, dass die Rückrufadresse der andere Vertrag ist. buildChainlinkRequest(jobId, address(this), this.fulfill.selector);Tauschen Sie es address(this)gegen eine beliebige Adresse aus, an die Sie es zurücksenden möchten.
Hallo Patrick, ich versuche es, aber ich kann es auf einfache Weise nicht zum Laufen bringen. Könntest du mich führen? Danke. (Schauen Sie sich den EDIT-Bereich an)