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

Устаревшие цены оракула

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

Обновлено

Только в образовательных целях; не является инвестиционным советом или инвестиционной рекомендацией. Инвестиции могут привести к убыткам.

Краткий ответ

Значение оракула устарело для конкретного действия потребителя, когда age = consumerClock - sourceTimestamp превышает настроенное для этого действия значение maxAge. Неизменившаяся цена может оставаться актуальной, а недавно опубликованное значение может быть экономически неверным. Потребитель должен сначала отклонить отсутствующие или будущие метки времени и недопустимые ответы, а затем применить правила приемки для конкретного фида, актива, сети, режима работы рынка и действия.

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

В L2 статус секвенсора и период ожидания после восстановления образуют отдельный шлюз. Его прохождение не доказывает актуальность цены актива, финальность L2 или равный доступ всех пользователей. Резервная цена и последняя корректная цена — режимы управляемой деградации, а не истина; для каждого источника и пути восстановления нужны единицы, метки времени, независимость, полномочия, разрешенные действия и правила сверки.

Как это работает

  1. Зафиксируйте сеть, блок и часы, контракт и действие потребителя, прокси и агрегатор фида, пару активов и разрядность, версию интерфейса, резервную конфигурацию и состояние обновления контрактов.
  2. Прочитайте точный ответ через развернутый интерфейс и обработайте откат вызова или отсутствие данных. До вычитания проверьте ответ, статус или доверительный показатель, если применимо, а также sourceTimestamp != 0 и sourceTimestamp <= consumerClock.
  3. Зафиксируйте параметры периодического обновления, отклонения, часов рынка и публикации, затем задайте независимый maxAge для каждого действия. Явно определите границу, например принимать при age <= maxAge и отклонять при age > maxAge.
  4. В поддерживаемых L2 проверьте инициализацию и статус фида секвенсора, вычислите время после восстановления по документированному полю и выдержите настроенный период ожидания, после чего отдельно проверьте актуальность цены.
  5. Проследите каждую необходимую составляющую составной, относительной и резервной цены. Нормализуйте направление и единицы, а эффективную актуальность ограничьте самой старой необходимой зависимостью, а не самой новой меткой времени.
  6. Определите нормальное, деградированное и приостановленное состояние для каждого действия. Новые займы, выпуск или плечо могут блокироваться, тогда как погашение и добавление залога остаются доступными; протестируйте устаревшие, резервные и восстановленные цены относительно риска, ликвидности и возможностей ликвидаторов.
  7. Контролируйте изменения источника и прокси, задержку обновлений, долю отказов, состояние секвенсора, расхождение источников и часы рынка; отработайте сбой, отказ резерва, скачок при восстановлении, массовые ликвидации, MEV, учет безнадежного долга и возврат к штатному режиму.

В интерфейсах типа Chainlink latestRoundData() может возвращать идентификатор раунда, знаковый ответ, время начала, время обновления и устаревшее поле раунда. Текущий API помечает answeredInRound как устаревшее, поэтому историческую проверку неравенства нельзя считать универсальным современным правилом: проверяйте конкретные прокси, агрегатор и реализацию. Метка времени показывает момент обновления документированного состояния фида, но не гарантирует исполнимость значения для произвольного объема. В Solidity block.timestamp — это метка времени текущего блока в пределах правил консенсуса, а не внешний источник точного времени.

Разобранные примеры

  • Граница предельного возраста. Пусть consumerClock = 1,800,000,000, а sourceTimestamp = 1,799,999,100, поэтому age = 900 seconds = 15 minutes. Политика maxAge = 600 seconds отклоняет значение с превышением на 300 seconds, а политика maxAge = 1,200 seconds принимает его с запасом 300 seconds. Одно значение фида допустимо для одного действия и устарело для другого.
  • Триггер не равен актуальности. Последняя опубликованная цена — 100.00, порог отклонения — 1%, период обновления — 3,600 seconds. Через 2,700 seconds наблюдаемая цена 100.80 отличается лишь на 0.8%, поэтому ни один из учебных триггеров не сработал. При 101.20 отклонение составляет 1.2% и может запустить публикацию, но до включения нового действительного отчета потребитель читает 100.00.
  • Двойной шлюз L2. Фид сообщает, что секвенсор работает: startedAt = 1,799,996,400, consumerClock = 1,800,000,000, grace = 3,600 seconds; прошло ровно 3,600 seconds. Если действие блокируется при elapsed <= grace, оно все еще запрещено и становится допустимым при 3,601 seconds. При этом отдельно должны пройти проверку метка цены, ответ и все прочие условия потребителя.
  • Скачок при восстановлении. При залоге 10 ETH, долге 12,000 USD и пороге ликвидации 75% устаревшая цена 2,000 USD/ETH дает healthFactor = 10 * 2,000 * 0.75 / 12,000 = 1.25. Возобновленная цена 1,400 USD/ETH дает 0.875. При этих учебных данных счет допускает ликвидацию, однако исполнение зависит от правил протокола, ликвидности, ликвидаторов, газа, очередности и доступности сети.

Риски

  • Неверная сеть, фид, прокси, агрегатор, пара активов или версия интерфейса.
  • Чтение ответа без метки времени или документированного статуса.
  • Отсутствие проверки нулевой или будущей метки либо переполнение вниз при вычитании.
  • Слишком большой предельный возраст для актива, действия, часов рынка или волатильности.
  • Слишком малый предельный возраст, создающий отказ в обслуживании или мешающий снижению риска.
  • Период обновления принимается за гарантированный срок публикации или SLA.
  • Подпороговый дрейф или базис накапливается без срабатывания порога отклонения.
  • Отчет после триггера задерживается из-за источника, подписантов, сети, газа, ретранслятора или сбоя сети.
  • Устаревшая или специфичная для реализации проверка раунда применяется повсеместно.
  • Изменения фида, прокси, агрегатора, периода, порога или интерфейса остаются незамеченными.
  • Игнорируется смысл закрытого или приостановленного рынка, праздника либо переноса данных.
  • Составная цена выглядит свежей, хотя одна необходимая составляющая устарела.
  • Статус L2-секвенсора игнорируется, не инициализирован, задержан или читается в другой сети.
  • Период ожидания отсутствует, настроен неверно или содержит граничную ошибку.
  • Статус секвенсора проходит проверку, хотя цена актива остается устаревшей или недоступной.
  • Смешиваются время L1, время блока L2, время наблюдения источника, публикации и внешнее время.
  • Pull-обновление отсутствует, слишком старо, выборочно, искажено или недофинансировано.
  • Резервная или последняя корректная цена устарела, коррелирована, имеет иной масштаб или циклична.
  • Открытый отказ разрешает опасные действия, а сплошная блокировка мешает погашению, пополнению залога или восстановлению.
  • Скачок цены, массовые ликвидации, MEV, низкая ликвидность, гонки паузы или сверка безнадежного долга создают вторичный убыток.

Распространенные заблуждения

  • «Периодическое обновление гарантирует свежую цену каждый интервал». Это параметр запуска обновления, а сбой источника или сети все равно может задержать публикацию.
  • «Недавняя метка времени доказывает корректную исполнимую цену». Она подтверждает только документированное время обновления; качество источника, единицы, доверительный показатель, глубина рынка и логика потребителя независимы.
  • «Один предельный возраст подходит всем фидам и действиям». Активы, часы рынка, сети, займы, ликвидации, сделки и расчеты имеют разные требования к задержке и доступности.
  • «Работающий секвенсор означает, что все действия можно сразу возобновить». Период ожидания и актуальность цены — независимые шлюзы; протокол и сеть могут добавить другие ограничения.
  • «Резервный источник или откат всех функций всегда безопаснее». Слабый резерв искажает риск, а всеобщая блокировка может помешать погашению долга или улучшению обеспеченности.

Похожие темы

Источники

Навигация

Поиск по вики...