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?
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.
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.
Patrick Collins