Введение в оракулы
В области блокчейна оракул представляет собой систему, которая может предоставлять внешнюю информацию для смарт-контрактов в цепи. Будучи промежуточным звеном, соединяющим смарт-контракты с реальным миром, оракул играет исключительно важную роль в инфраструктуре. Его основная функция заключается в предоставлении данных для смарт-контрактов.
Например, если мы создаем смарт-контракт в сети Ethereum, который требует получить данные о торговых объемах нефти за определённый день, смарт-контракт сам по себе не может извлечь такие данные из внешнего мира. Эта задача выполняется через оракул. В данном случае смарт-контракт будет записывать объем торговли нефтью на конкретную дату в журнал событий, после чего запускается процесс вне цепи для его мониторинга и связи с этим журналом. Когда в транзакции будет зафиксирован запрос, система загрузит информацию о торговых объёмах нефти на указанную дату в смарт-контракт, отправляя транзакцию в цепь и вызывая соответствующий метод контракта.
Chainlink как ведущий оракул
На рынке оракулов Chainlink занимает ведущие позиции. Chainlink — это децентрализованный проект оракула, который предоставляет данные из реального мира в блокчейн самым безопасным образом. Chainlink создает экосистему положительных экономических стимулов вокруг токена LINK, что основывается на реализации основных принципов оракулов.
Для активации оракула Chainlink необходимо передать токены LINK. LINK является контрактом ERC-677 в сети Ethereum. Функция оракула, основанная на токене LINK ERC-677, относится к модели запроса/ответа. Метод transferAndCall в токенах ERC-677 служит для обеспечения выполнения услуги. Разрабатывая структуру оракула, Chainlink первоначально задумался о том, как пользователи оракула смогут оплатить его услуги.
Стандарт ERC-677
Однако стандартный токен-контракт ERC-20 не может обеспечить последовательность предоставления услуг после оплаты, поэтому Chainlink предложил стандарт ERC-677, подходящий для сценариев работы оракула. Стандарт ERC-677 добавляет метод transferAndCall к стандарту ERC-20, объединяя оплату и запрос услуги в одно целое, что удовлетворяет потребности оракульного бизнеса.
Когда пользователь выполняет transferAndCall, помимо перевода токенов ERC-20, также проверяется, является ли адрес назначения адресом контракта. Если это так, вызывается метод onTokenTransfer у адресата. Имеется лишь один метод в получателе ERC-677: onTokenTransfer. Для более детального изучения можно обратиться к Etherscan и просмотреть исходный код контракта токена LINK.
Классификация надежности оракула
Важно отметить, что перед запросом услуги у оракула необходимо, прежде всего, удостовериться в его надежности.
Рассмотрим, как реализован метод onTokenTransfer в контракте оракула. Когда потребитель оракула использует метод transferAndCall для оплаты услуги и запроса услуг оракула, адрес назначения является адресом запрашиваемого оракула. Метод проверяет, является ли перевод токеном LINK, затем определяет длину _data и проверяет, содержит ли _data селектор функции, начинающийся со слова oracleRequest.
Ответ узла вне цепи
Для успешного выполнения запроса в узле вне цепи после всех проверок, стоимость запроса добавляется в withdrawableTokens. Затем _requestId удаляется из сопоставления обязательств. В заключение проверяется оставшееся количество газа, чтобы удостовериться в его достаточности для выполнения функции обратного вызова контракта, который отправил запрос.
Функция обратного вызова
Как мы узнали из oracleRequest, идентификатор функции обратного вызова равен 6A9705B4, а метод — chainlinkCallback(bytes32, int256). У этой функции есть модификатор: в pendingRequests проверяется соответствие оракула и запроса на _requestId.
В заключение, в данном описании представлен полный процесс работы общего сервиса оракула. В следующей части мы рассмотрим метод requestEthereumPrice в контракте TestnetConsumer, предоставляемом Chainlink, чтобы объяснить процесс запроса и ответа оракула цен.