Урок 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 и обрабатывает возвращенные данные. В наших следующих уроках мы развернем этот контракт и более подробно рассмотрим лучшие практики и нюансы.

Отказ от ответственности
* Криптоинвестирование сопряжено со значительными рисками. Будьте осторожны. Курс не является инвестиционным советом.
* Курс создан автором, который присоединился к Gate Learn. Мнение автора может не совпадать с мнением Gate Learn.
Каталог
Урок 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 и обрабатывает возвращенные данные. В наших следующих уроках мы развернем этот контракт и более подробно рассмотрим лучшие практики и нюансы.

Отказ от ответственности
* Криптоинвестирование сопряжено со значительными рисками. Будьте осторожны. Курс не является инвестиционным советом.
* Курс создан автором, который присоединился к Gate Learn. Мнение автора может не совпадать с мнением Gate Learn.
It seems that you are attempting to access our services from a Restricted Location where Gate is unable to provide services. We apologize for any inconvenience this may cause. Currently, the Restricted Locations include but not limited to: the United States of America, Canada, Cambodia, Thailand, Cuba, Iran, North Korea and so on. For more information regarding the Restricted Locations, please refer to the User Agreement. Should you have any other questions, please contact our Customer Support Team.