Chainlink Connect to API. Часть 3
Пройдемся по коду, представленному в актуальной документации chainlink.
В целом код у всех видов запросов очень похож.
В самом начале подключаются два контракта, от которых наследуется наш:
import '@chainlink/contracts/src/v0.8/ChainlinkClient.sol';
import '@chainlink/contracts/src/v0.8/ConfirmedOwner.sol';
Далее подключается библиотека для запросов:
using Chainlink for Chainlink.Request;
Создаются обязательные переменные jobId и fee, а также пользовательские, где будут храниться данные после запросов.
Определяется событие для учета запросов.
Далее в конструкторе устанавливается владелец, а также передаются контракты токена, оракула, jobId и fee.
Fee - это стоимость выполнения запроса адаптером.
JobId - это уникальный идентификатор узла, по которому он выполняет данный запрос.
Позже я покажу, где их можно найти, и как они появляются.
Так же тут есть одинаковая для всех функция withdrawLink() для возврата неиспользованных Link.
Переходим к интересному.
Функция fulfill(). Она вызывается извне, когда адаптер готов прислать нам ответ на запрос. Типа как fallback функция. Она может принимать различные аргументы на входе для фиксирования событий (event). И возвращает результат запроса в нужном типе данных: uint, int, bool, bytes или string.
Далее функция request(). Более точное название меняется от контракта к контракту, но это скорее сделано, чтобы назвать функцию в зависимости от данных, которая она будет запрашивать.
Идем построчно.
Chainlink.Request memory req = buildChainlinkRequest(jobId, address(this), this.fulfill.selector);
Создаем временную переменную на основе ранее подключенной библиотеки, куда передаем jobId, адрес нашего контракта, а также this.funcName.selector - где funcName - это имя callback функции, которая будет принимать ответ в нашем контракте.
В данных примерах это fulfil, а так может быть любой, как, например, fulfilResult.
req.add('get', 'httpLink');
Здесь указывается API ссылка.
req.add('path', 'name');
Далее указываем ключ в json, значение которого мы хотим получить. Например, в "image: 'http://'", image - это ключ.
sendChainlinkRequest(req, fee);
В конце вызываем функцию из подключенного контракта, куда передаем параметры запроса и fee.
В следующем посте расскажу, где взять jobId, оракул и как работать с предустановленными API на узлах.
#chainlink #api #adapter
Post #283
129