Bài học 3

Построение простого контракта с интеграцией в Oracle

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

Составление договора: основы интеграции с Oracle

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

pragma solidity ^0.8.21;

Импортируйте "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol";

контракт OracleIntegratedContract {
AggregatorV3Interface internal priceFeed;

// Видимость для конструктора удалена
constructor(address _priceFeed) {
    priceFeed = AggregatorV3Interface(_priceFeed);
}

1. 
В этом сегменте мы указали, что в нашем контракте будет использоваться цепная ценовая лента. Конструктор принимает адрес контракта на подачу цены в сети Ethereum.

1. 
Получение данных из Oracle

1. 
Давайте расширим наш контракт, чтобы получить последнюю цену Ethereum:

Solidity
function getLatestEthPrice() public view returns (int) {
(,int price,,,) = priceFeed.latestRoundData();
return price;
}


1. 
Функция `latestRoundData()` из интерфейса Chainlink Aggregator предоставляет нам различные данные, включая самую последнюю цену.

## Работа с ответами Oracle: Управление данными после их получения

Данные, получаемые от оракулов, часто приходят в сырых форматах, которые могут не сразу подходить для наших нужд. Крайне важно правильно обрабатывать эти данные в наших смарт-контрактах:



1. 
Форматирование данных

1. 
Допустим, оракул возвращает цену Ethereum в USD, но умноженную на 10^8, чтобы гарантировать отсутствие десятичных дробей (что часто встречается в оракулах). Чтобы получить фактическую цену, Вам необходимо отформатировать данные:

Solidity
function getFormattedEthPrice() public view returns (int) {
int rawPrice = getLatestEthPrice();
return rawPrice / 10**8;
}


1. 
Эта функция получает исходную цену, затем делит ее на 10^8, чтобы получить реальное значение.

1. 
Обработка ошибок

1. 
Всегда учитывайте возможность того, что оракул не сможет получить данные:

Solidity
function safeGetLatestEthPrice() public view returns (int) {
(,int price,,uint256 timestamp,) = priceFeed.latestRoundData();
require(timestamp > 0, “Failed to fetch data from the oracle”);
return price;
}


1. 
Здесь функция `latestRoundData()` также предоставляет временную метку. Если временная метка равна 0, это, скорее всего, означает, что оракул не смог получить данные, и мы справимся с этим с помощью оператора `require`.
Ваш полный код должен выглядеть следующим образом:

Solidity
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.21;

Импортируйте "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol";

контракт OracleIntegratedContract {
AggregatorV3Interface internal priceFeed;

// Видимость для конструктора удалена
constructor(address _priceFeed) {
    priceFeed = AggregatorV3Interface(_priceFeed);
}

function getLatestEthPrice() public view returns (int) {
    (,int price,,,) = priceFeed.latestRoundData();
    return price;
}

function getFormattedEthPrice() public view returns (int) {
    int rawPrice = getLatestEthPrice();
    return rawPrice / 10**8;
}

function safeGetLatestEthPrice() public view returns (int) {
    (,int price,,uint256 timestamp,) = priceFeed.latestRoundData();
    require(timestamp > 0, "Failed to fetch data from the oracle");
    return price;
}

}
```

К концу этого урока у Вас должен быть базовый оракл-интегрированный смарт-контракт, разработанный в Remix. Этот контракт извлекает последнюю цену Ethereum и обрабатывает возвращенные данные. В наших следующих уроках мы развернем этот контракт и более подробно рассмотрим лучшие практики и нюансы.

Tuyên bố từ chối trách nhiệm
* Đầu tư tiền điện tử liên quan đến rủi ro đáng kể. Hãy tiến hành một cách thận trọng. Khóa học không nhằm mục đích tư vấn đầu tư.
* Khóa học được tạo bởi tác giả đã tham gia Gate Learn. Mọi ý kiến chia sẻ của tác giả không đại diện cho Gate Learn.
Danh mục
Bài học 3

Построение простого контракта с интеграцией в Oracle

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

Составление договора: основы интеграции с Oracle

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

pragma solidity ^0.8.21;

Импортируйте "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol";

контракт OracleIntegratedContract {
AggregatorV3Interface internal priceFeed;

// Видимость для конструктора удалена
constructor(address _priceFeed) {
    priceFeed = AggregatorV3Interface(_priceFeed);
}

1. 
В этом сегменте мы указали, что в нашем контракте будет использоваться цепная ценовая лента. Конструктор принимает адрес контракта на подачу цены в сети Ethereum.

1. 
Получение данных из Oracle

1. 
Давайте расширим наш контракт, чтобы получить последнюю цену Ethereum:

Solidity
function getLatestEthPrice() public view returns (int) {
(,int price,,,) = priceFeed.latestRoundData();
return price;
}


1. 
Функция `latestRoundData()` из интерфейса Chainlink Aggregator предоставляет нам различные данные, включая самую последнюю цену.

## Работа с ответами Oracle: Управление данными после их получения

Данные, получаемые от оракулов, часто приходят в сырых форматах, которые могут не сразу подходить для наших нужд. Крайне важно правильно обрабатывать эти данные в наших смарт-контрактах:



1. 
Форматирование данных

1. 
Допустим, оракул возвращает цену Ethereum в USD, но умноженную на 10^8, чтобы гарантировать отсутствие десятичных дробей (что часто встречается в оракулах). Чтобы получить фактическую цену, Вам необходимо отформатировать данные:

Solidity
function getFormattedEthPrice() public view returns (int) {
int rawPrice = getLatestEthPrice();
return rawPrice / 10**8;
}


1. 
Эта функция получает исходную цену, затем делит ее на 10^8, чтобы получить реальное значение.

1. 
Обработка ошибок

1. 
Всегда учитывайте возможность того, что оракул не сможет получить данные:

Solidity
function safeGetLatestEthPrice() public view returns (int) {
(,int price,,uint256 timestamp,) = priceFeed.latestRoundData();
require(timestamp > 0, “Failed to fetch data from the oracle”);
return price;
}


1. 
Здесь функция `latestRoundData()` также предоставляет временную метку. Если временная метка равна 0, это, скорее всего, означает, что оракул не смог получить данные, и мы справимся с этим с помощью оператора `require`.
Ваш полный код должен выглядеть следующим образом:

Solidity
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.21;

Импортируйте "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol";

контракт OracleIntegratedContract {
AggregatorV3Interface internal priceFeed;

// Видимость для конструктора удалена
constructor(address _priceFeed) {
    priceFeed = AggregatorV3Interface(_priceFeed);
}

function getLatestEthPrice() public view returns (int) {
    (,int price,,,) = priceFeed.latestRoundData();
    return price;
}

function getFormattedEthPrice() public view returns (int) {
    int rawPrice = getLatestEthPrice();
    return rawPrice / 10**8;
}

function safeGetLatestEthPrice() public view returns (int) {
    (,int price,,uint256 timestamp,) = priceFeed.latestRoundData();
    require(timestamp > 0, "Failed to fetch data from the oracle");
    return price;
}

}
```

К концу этого урока у Вас должен быть базовый оракл-интегрированный смарт-контракт, разработанный в Remix. Этот контракт извлекает последнюю цену Ethereum и обрабатывает возвращенные данные. В наших следующих уроках мы развернем этот контракт и более подробно рассмотрим лучшие практики и нюансы.

Tuyên bố từ chối trách nhiệm
* Đầu tư tiền điện tử liên quan đến rủi ro đáng kể. Hãy tiến hành một cách thận trọng. Khóa học không nhằm mục đích tư vấn đầu tư.
* Khóa học được tạo bởi tác giả đã tham gia Gate Learn. Mọi ý kiến chia sẻ của tác giả không đại diện cho Gate Learn.