Перейти к содержанию

Ценовой оракул: источник данных и границы доверия

У библиотеки появился запрос на отображение условной стоимости курса в другой единице. Контракт не обращается к обычному HTTP-сайту за текущим курсом самостоятельно. Для внешних сведений нужен определённый источник и договор использования. Начнём с ценового feed: что он сообщает, какие поля нужны читателю и где заканчивается гарантия ответа.

Наш исходный Bitcoin-счёт по-прежнему требует 30 000 сатоши. Новая модель оценки не переписывает его цену. Все числовые примеры являются управляемыми учебными входами, а не фактическими рыночными котировками. Обращений к реальному feed в текущей работе нет.

Число имеет пару и масштаб

Ответ 6 000 000 000 000 без описания трудно использовать правильно. Если источник сообщает BTC/USD с восемью десятичными знаками, такое условное значение означает 60 000 USD за BTC. Для другой пары или масштаба та же запись означала бы другое. Поэтому программа сохраняет назначение, единицу и decimals отдельно от самого integer answer.

Нельзя предполагать, что все feeds имеют одинаковое число десятичных знаков. Также важна направленность пары: цена актива в валюте не равна цене валюты в активе. Случайный выбор обратного источника может дать вычислительно правильный, но содержательно неверный результат. Досье библиотеки явно называет base и quote.

Для отображения оценки уже заданных 30 000 сатоши сначала учитываем, что это доля BTC по принятой единице. При нашем условном ответе её значение составляет 18 USD. Это арифметическое следствие входов, не новая сумма, которую сервер автоматически требует от читателя.

Публикация ответа

Внешний ценовой источник формирует предусмотренное значение и публикует его в определённом сетевом контексте. Прикладной контракт читает доступные поля через документированный интерфейс. Значение не возникает из общего «интернета» без конкретного механизма и ответственности. Источник, сеть и адрес входят в конфигурацию.

Chainlink Data Feeds предоставляют предусмотренный интерфейс чтения. Для нашей модели полезны answer, временные сведения и идентичность раунда согласно API. Точное значение этих полей исследуется по действующему источнику; не переносим все старые рекомендации между разными поколениями автоматически.

{
  "pair": "BTC/USD",
  "decimals": "8",
  "answer": "6000000000000",
  "updatedAt": "FIXTURE_TIMESTAMP",
  "purpose": "display-only-estimate"
}

Это нормализованная учебная запись, не буквальный полный ответ AggregatorV3Interface. Временное поле является меткой; оно не обозначает текущую котировку или наблюдённый блок.

Что означает доверие к feed

Прикладная программа доверяет определённому процессу получения и публикации данных в рамках его модели. Она также проверяет, что читает нужный адрес нужной сети. Корректный ABI не делает произвольный контракт официальным источником нашей пары. Организационное назначение устанавливается конфигурацией и документированным выбором.

Далее анализируют происхождение данных, режим обновления и ограничения конкретного источника. Высокая точность integer-представления не доказывает абсолютной точности внешнего мира. Несколько десятичных знаков — формат значения, а не гарантия качества каждого наблюдения.

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

Отказ чтения и неподходящий ответ

Источник может быть недоступен через наш RPC, вернуть неподдерживаемый контекст или дать устаревшую запись. Эти ситуации не равнозначны отрицательной цене. Программа не подставляет ноль при любой ошибке, особенно если ноль затем используется в расчёте доступа. Такой fallback способен превратить отказ данных в нежелательное разрешение.

Если библиотеке нужна только справочная оценка, интерфейс может сообщить её временную недоступность, сохранив исходный счёт в сатоши. При создании нового ценового предложения процедура остановится до появления допустимого ответа. Это прикладное решение, которое должно быть описано до реализации.

Отрицательные и нулевые значения оцениваются по назначению выбранного источника. Для нашего ценового BTC/USD-примера допустимая политика требует положительный answer. Мы не распространяем это правило на любой возможный технический feed, который может сообщать другие типы состояния.

Связь с исходным счётом

Курс 17 имеет счёт на 30 000 сатоши по собственному журналу платежей. Новый интерфейс может показать оценку 18 USD на условных данных, но платёжный адаптер продолжает сравнивать сатоши с зафиксированным обязательством заказа. Изменение справки на экране не создаёт недоплату задним числом.

Если продукт позже хочет назначать цену в USD и фиксировать требуемые сатоши по feed, вводится отдельная модель предложения. Она сохраняет исходный ответ, округление, срок и итоговую сумму в целых единицах. Это расширение рассматривается следующей главой; существующий договор не меняется молча.

Таким образом, feed является входом определённого решения, а не универсальным источником всех правил сайта. Авторизация издателя, целостность манифеста и права читателя имеют собственные механизмы. Хороший ценовой ответ не подтверждает ни авторство урока, ни факт оплаты.

Ценовой BTC/USD-feed не является источником наблюдения Bitcoin-платежа. Он может сообщить котировку актива, но не устанавливает, какой outpoint поступил на адрес счёта библиотеки, сколько подтверждений принято или завершён ли Lightning settlement. Эти данные получает другой адаптер по своим правилам. Даже слово Bitcoin в названии обеих задач не объединяет их полномочия. Для нашего продукта источник цены обслуживает оценку, а платёжный журнал — решение по конкретному переводу. Разделение особенно полезно при отказе одного поставщика: справка может исчезнуть, пока фиксированный счёт остаётся доступным для корректной оплаты. Обратная ситуация также возможна без логического противоречия.

Подготовка управляемого источника

Для будущей локальной лаборатории полезны заранее определённые состояния: положительный свежий ответ, нулевой, отрицательный, устаревший и недоступный. Источник такого упражнения является mock с контролируемыми данными. Он проверяет прикладной разбор, не имитируя все гарантии реального оракула.

Каждый случай связывается с ожидаемой реакцией: справка показывается, отказ обозначается или действие приостанавливается. Измеренной совместимости здесь нет. При переходе к реальному feed понадобятся сеть, официальное назначение, точный интерфейс и политика свежести.

В досье сохраняем пару, масштаб, адресный контекст, цель использования и правило отказа. Первичные основания изложены в Using Data Feeds, API Reference и выборе источников. Следующая глава разберёт целочисленный расчёт, чтобы правильная котировка не потеряла смысл из-за округления приложения.

Оглавление серии