第3课

Створення простого контракту, інтегрованого з Oracle

Тепер, коли ми налаштували Remix IDE та імпортували необхідні бібліотеки Chainlink, ми збираємося створити базовий смарт-контракт, який інтегрується з оракулом. Це дозволить нам отримувати та обробляти зовнішні дані.

Складання контракту: Основи інтеграції Oracle

  1. Починаючи з основ:
    Давайте почнемо з визначення нашого контракту, визначення версії Solidity та імпортування бібліотеки Chainlink, яку ми будемо використовувати:
    ```
    Солідність
    // SPDX-License-Identifier: MIT

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 і обробляє повернуті дані. У наших наступних уроках ми розгорнемо цей договір і детальніше розглянемо найкращі практики та нюанси.

免责声明
* 投资有风险,入市须谨慎。本课程不作为投资理财建议。
* 本课程由入驻Gate Learn的作者创作,观点仅代表作者本人,绝不代表Gate Learn赞同其观点或证实其描述。
目录
第3课

Створення простого контракту, інтегрованого з Oracle

Тепер, коли ми налаштували Remix IDE та імпортували необхідні бібліотеки Chainlink, ми збираємося створити базовий смарт-контракт, який інтегрується з оракулом. Це дозволить нам отримувати та обробляти зовнішні дані.

Складання контракту: Основи інтеграції Oracle

  1. Починаючи з основ:
    Давайте почнемо з визначення нашого контракту, визначення версії Solidity та імпортування бібліотеки Chainlink, яку ми будемо використовувати:
    ```
    Солідність
    // SPDX-License-Identifier: MIT

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 і обробляє повернуті дані. У наших наступних уроках ми розгорнемо цей договір і детальніше розглянемо найкращі практики та нюанси.

免责声明
* 投资有风险,入市须谨慎。本课程不作为投资理财建议。
* 本课程由入驻Gate Learn的作者创作,观点仅代表作者本人,绝不代表Gate Learn赞同其观点或证实其描述。