Pragma-Solidität ^0.8.21;
import „ @chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol“;
Vertrag OracleIntegratedContract {
AggregatorV3Interface interner PreisFeed;
// Sichtbarkeit für Konstruktor entfernt
Konstruktor (Adresse _priceFeed) {
priceFeed = AggregatorV3Interface(_priceFeed);
}
1.
In diesem Segment haben wir angegeben, dass unser Vertrag einen Chainlink-Preis-Feed verwenden wird. Der Konstruktor nimmt eine Adresse für den Preis-Feed-Vertrag im Ethereum-Netzwerk entgegen.
1.
Abrufen von Daten von Oracle
1.
Erweitern wir unseren Vertrag, um den neuesten Ethereum-Preis abzurufen:
Solidität
Funktion getLatestEthPrice() öffentliche Ansicht gibt (int) {
(,int price,,,) = priceFeed.latestRoundData();
return price;
}zurück
1.
Die Funktion „latestRoundData()“ der Chainlink Aggregator-Schnittstelle liefert uns verschiedene Daten, einschließlich des aktuellsten Preises.
## Umgang mit Oracle-Antworten: Verwalten von Daten nach dem Empfang
Von Oracle abgerufene Daten liegen häufig in Rohformaten vor, die möglicherweise nicht sofort für unsere Anforderungen geeignet sind. Es ist wichtig, diese Daten in unseren Smart Contracts korrekt zu verarbeiten:
1.
Daten formatieren
1.
Nehmen wir an, das Oracle gibt den Preis von Ethereum in USD zurück, multipliziert jedoch mit 10^8, um sicherzustellen, dass es keine Dezimalstellen gibt (was bei Oracle-Setups üblich ist). Um den tatsächlichen Preis zu erhalten, müssen Sie die Daten formatieren:
Solidität
Funktion getFormattedEthPrice() öffentliche Ansicht gibt (int) {
int rawPrice = getLatestEthPrice();
return rawPrice / 10**8;
}zurück
1.
Diese Funktion ruft den Rohpreis ab und dividiert ihn dann durch 10^8, um den realen Wert zu erhalten.
1.
Fehlerbehandlung
1.
Berücksichtigen Sie immer die Möglichkeit, dass das Oracle keine Daten abrufen kann:
Solidität
Die öffentliche Ansicht der Funktion „safeGetLatestEthPrice()“ gibt (int) {
(,int price,,uint256 timestamp,) = priceFeed.latestRoundData();
require(timestamp > 0, “Failed to fetch data from the oracle”);
return price;
}zurück.
1.
Hier stellt die Funktion „latestRoundData()“ auch einen Zeitstempel bereit. Wenn der Zeitstempel 0 ist, bedeutet das wahrscheinlich, dass das Oracle die Daten nicht abrufen konnte, und wir behandeln das mit einer „require“-Anweisung.
Ihr vollständiger Code sollte so aussehen:
Solidität
// SPDX-Lizenz-Identifikator: MIT
Pragma-Solidität ^0.8.21;
import „ @chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol“;
Vertrag OracleIntegratedContract {
AggregatorV3Interface interner PreisFeed;
// Sichtbarkeit für Konstruktor entfernt
Konstruktor (Adresse _priceFeed) {
priceFeed = AggregatorV3Interface(_priceFeed);
}
Funktion getLatestEthPrice() öffentliche Ansicht gibt (int) zurück {
(,int price,,,) = priceFeed.latestRoundData();
return price;
}
Funktion getFormattedEthPrice() öffentliche Ansicht gibt (int) zurück {
int rawPrice = getLatestEthPrice();
return rawPrice / 10**8;
}
Funktion safeGetLatestEthPrice() öffentliche Ansicht gibt (int) {
(,int price,,uint256 timestamp,) = priceFeed.latestRoundData();
require(timestamp > 0, "Failed to fetch data from the oracle");
return price;
}zurück
}
„
Am Ende dieser Lektion sollten Sie über einen grundlegenden, in Oracle integrierten Smart Contract verfügen, der in Remix entworfen wurde. Dieser Vertrag ruft den aktuellen Ethereum-Preis ab und verarbeitet die zurückgegebenen Daten. In unseren nächsten Lektionen werden wir diesen Vertrag einsetzen und uns weiter mit Best Practices und Nuancen befassen.
Pragma-Solidität ^0.8.21;
import „ @chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol“;
Vertrag OracleIntegratedContract {
AggregatorV3Interface interner PreisFeed;
// Sichtbarkeit für Konstruktor entfernt
Konstruktor (Adresse _priceFeed) {
priceFeed = AggregatorV3Interface(_priceFeed);
}
1.
In diesem Segment haben wir angegeben, dass unser Vertrag einen Chainlink-Preis-Feed verwenden wird. Der Konstruktor nimmt eine Adresse für den Preis-Feed-Vertrag im Ethereum-Netzwerk entgegen.
1.
Abrufen von Daten von Oracle
1.
Erweitern wir unseren Vertrag, um den neuesten Ethereum-Preis abzurufen:
Solidität
Funktion getLatestEthPrice() öffentliche Ansicht gibt (int) {
(,int price,,,) = priceFeed.latestRoundData();
return price;
}zurück
1.
Die Funktion „latestRoundData()“ der Chainlink Aggregator-Schnittstelle liefert uns verschiedene Daten, einschließlich des aktuellsten Preises.
## Umgang mit Oracle-Antworten: Verwalten von Daten nach dem Empfang
Von Oracle abgerufene Daten liegen häufig in Rohformaten vor, die möglicherweise nicht sofort für unsere Anforderungen geeignet sind. Es ist wichtig, diese Daten in unseren Smart Contracts korrekt zu verarbeiten:
1.
Daten formatieren
1.
Nehmen wir an, das Oracle gibt den Preis von Ethereum in USD zurück, multipliziert jedoch mit 10^8, um sicherzustellen, dass es keine Dezimalstellen gibt (was bei Oracle-Setups üblich ist). Um den tatsächlichen Preis zu erhalten, müssen Sie die Daten formatieren:
Solidität
Funktion getFormattedEthPrice() öffentliche Ansicht gibt (int) {
int rawPrice = getLatestEthPrice();
return rawPrice / 10**8;
}zurück
1.
Diese Funktion ruft den Rohpreis ab und dividiert ihn dann durch 10^8, um den realen Wert zu erhalten.
1.
Fehlerbehandlung
1.
Berücksichtigen Sie immer die Möglichkeit, dass das Oracle keine Daten abrufen kann:
Solidität
Die öffentliche Ansicht der Funktion „safeGetLatestEthPrice()“ gibt (int) {
(,int price,,uint256 timestamp,) = priceFeed.latestRoundData();
require(timestamp > 0, “Failed to fetch data from the oracle”);
return price;
}zurück.
1.
Hier stellt die Funktion „latestRoundData()“ auch einen Zeitstempel bereit. Wenn der Zeitstempel 0 ist, bedeutet das wahrscheinlich, dass das Oracle die Daten nicht abrufen konnte, und wir behandeln das mit einer „require“-Anweisung.
Ihr vollständiger Code sollte so aussehen:
Solidität
// SPDX-Lizenz-Identifikator: MIT
Pragma-Solidität ^0.8.21;
import „ @chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol“;
Vertrag OracleIntegratedContract {
AggregatorV3Interface interner PreisFeed;
// Sichtbarkeit für Konstruktor entfernt
Konstruktor (Adresse _priceFeed) {
priceFeed = AggregatorV3Interface(_priceFeed);
}
Funktion getLatestEthPrice() öffentliche Ansicht gibt (int) zurück {
(,int price,,,) = priceFeed.latestRoundData();
return price;
}
Funktion getFormattedEthPrice() öffentliche Ansicht gibt (int) zurück {
int rawPrice = getLatestEthPrice();
return rawPrice / 10**8;
}
Funktion safeGetLatestEthPrice() öffentliche Ansicht gibt (int) {
(,int price,,uint256 timestamp,) = priceFeed.latestRoundData();
require(timestamp > 0, "Failed to fetch data from the oracle");
return price;
}zurück
}
„
Am Ende dieser Lektion sollten Sie über einen grundlegenden, in Oracle integrierten Smart Contract verfügen, der in Remix entworfen wurde. Dieser Vertrag ruft den aktuellen Ethereum-Preis ab und verarbeitet die zurückgegebenen Daten. In unseren nächsten Lektionen werden wir diesen Vertrag einsetzen und uns weiter mit Best Practices und Nuancen befassen.