pragma solidity ^0.8.21;
імпорт “@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol”;
контракт OracleIntegratedContract {
AggregatorV3Interface внутрішній priceFeed;
// Видимість для конструктора видалено
конструктор (адреса _priceFeed) {
priceFeed = AggregatorV3Interface(_priceFeed);
}
1.
У цьому сегменті ми вказали, що наш контракт використовуватиме канал цін Chainlink. Конструктор бере адресу для контракту каналу цін у мережі Ethereum.
1.
Отримання даних з Oracle
1.
Давайте продовжимо наш контракт, щоб отримати останню ціну Ethereum:
Солідність
функція getLatestEthPrice() публічний перегляд повертає (int) {
(,int price,,,) = priceFeed.latestRoundData();
return price;
}
1.
Функція `latestRoundData()` з інтерфейсу Chainlink Aggregator надає нам різноманітні дані, включаючи найновішу ціну.
## Обробка відповідей Oracle: керування даними після їх отримання
Дані, отримані від оракулів, часто надходять у необроблених форматах, які можуть не одразу відповідати нашим потребам. Важливо правильно обробляти ці дані в наших розумних контрактах:
1.
Форматування даних
1.
Скажімо, оракул повертає ціну Ethereum у доларах США, але помножену на 10^8, щоб гарантувати відсутність десяткових знаків (часто в налаштуваннях оракула). Щоб отримати фактичну ціну, потрібно відформатувати дані:
Солідність
функція getFormattedEthPrice() публічний перегляд повертає (int) {
int rawPrice = getLatestEthPrice();
return rawPrice / 10**8;
}
1.
Ця функція отримує вихідну ціну, а потім ділить її на 10^8, щоб отримати реальне значення.
1.
Обробка помилок
1.
Завжди враховуйте можливість того, що оракул не зможе отримати дані:
Солідність
функція safeGetLatestEthPrice() загальнодоступний перегляд повертає (int) {
(,int price,,uint256 timestamp,) = priceFeed.latestRoundData();
require(timestamp > 0, “Failed to fetch data from the oracle”);
return price;
}
1.
Тут функція `latestRoundData()` також надає мітку часу. Якщо мітка часу дорівнює 0, це, ймовірно, означає, що оракул не зміг отримати дані, і ми обробляємо це за допомогою оператора `require`.
Ваш повний код має виглядати так:
Солідність
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.21;
імпорт “@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol”;
контракт OracleIntegratedContract {
AggregatorV3Interface внутрішній priceFeed;
// Видимість для конструктора видалено
constructor(address _priceFeed) {
priceFeed = AggregatorV3Interface(_priceFeed);
}
функція getLatestEthPrice() публічний перегляд повертає (int) {
(,int price,,,) = priceFeed.latestRoundData();
return price;
}
функція getFormattedEthPrice() публічний перегляд повертає (int) {
int rawPrice = getLatestEthPrice();
return rawPrice / 10**8;
}
функція safeGetLatestEthPrice() публічний перегляд повертає (ціле) {
(,int price,,uint256 timestamp,) = priceFeed.latestRoundData();
require(timestamp > 0, "Failed to fetch data from the oracle");
return price;
}
}
```
До кінця цього уроку ви повинні мати базовий інтегрований з Oracle смарт-контракт, складений у Remix. Цей контракт отримує останню ціну Ethereum і обробляє повернуті дані. У наших наступних уроках ми розгорнемо цей договір і детальніше розглянемо найкращі практики та нюанси.
pragma solidity ^0.8.21;
імпорт “@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol”;
контракт OracleIntegratedContract {
AggregatorV3Interface внутрішній priceFeed;
// Видимість для конструктора видалено
конструктор (адреса _priceFeed) {
priceFeed = AggregatorV3Interface(_priceFeed);
}
1.
У цьому сегменті ми вказали, що наш контракт використовуватиме канал цін Chainlink. Конструктор бере адресу для контракту каналу цін у мережі Ethereum.
1.
Отримання даних з Oracle
1.
Давайте продовжимо наш контракт, щоб отримати останню ціну Ethereum:
Солідність
функція getLatestEthPrice() публічний перегляд повертає (int) {
(,int price,,,) = priceFeed.latestRoundData();
return price;
}
1.
Функція `latestRoundData()` з інтерфейсу Chainlink Aggregator надає нам різноманітні дані, включаючи найновішу ціну.
## Обробка відповідей Oracle: керування даними після їх отримання
Дані, отримані від оракулів, часто надходять у необроблених форматах, які можуть не одразу відповідати нашим потребам. Важливо правильно обробляти ці дані в наших розумних контрактах:
1.
Форматування даних
1.
Скажімо, оракул повертає ціну Ethereum у доларах США, але помножену на 10^8, щоб гарантувати відсутність десяткових знаків (часто в налаштуваннях оракула). Щоб отримати фактичну ціну, потрібно відформатувати дані:
Солідність
функція getFormattedEthPrice() публічний перегляд повертає (int) {
int rawPrice = getLatestEthPrice();
return rawPrice / 10**8;
}
1.
Ця функція отримує вихідну ціну, а потім ділить її на 10^8, щоб отримати реальне значення.
1.
Обробка помилок
1.
Завжди враховуйте можливість того, що оракул не зможе отримати дані:
Солідність
функція safeGetLatestEthPrice() загальнодоступний перегляд повертає (int) {
(,int price,,uint256 timestamp,) = priceFeed.latestRoundData();
require(timestamp > 0, “Failed to fetch data from the oracle”);
return price;
}
1.
Тут функція `latestRoundData()` також надає мітку часу. Якщо мітка часу дорівнює 0, це, ймовірно, означає, що оракул не зміг отримати дані, і ми обробляємо це за допомогою оператора `require`.
Ваш повний код має виглядати так:
Солідність
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.21;
імпорт “@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol”;
контракт OracleIntegratedContract {
AggregatorV3Interface внутрішній priceFeed;
// Видимість для конструктора видалено
constructor(address _priceFeed) {
priceFeed = AggregatorV3Interface(_priceFeed);
}
функція getLatestEthPrice() публічний перегляд повертає (int) {
(,int price,,,) = priceFeed.latestRoundData();
return price;
}
функція getFormattedEthPrice() публічний перегляд повертає (int) {
int rawPrice = getLatestEthPrice();
return rawPrice / 10**8;
}
функція safeGetLatestEthPrice() публічний перегляд повертає (ціле) {
(,int price,,uint256 timestamp,) = priceFeed.latestRoundData();
require(timestamp > 0, "Failed to fetch data from the oracle");
return price;
}
}
```
До кінця цього уроку ви повинні мати базовий інтегрований з Oracle смарт-контракт, складений у Remix. Цей контракт отримує останню ціну Ethereum і обробляє повернуті дані. У наших наступних уроках ми розгорнемо цей договір і детальніше розглянемо найкращі практики та нюанси.