﻿---
title: "Устаревшие цены оракула"
description: "Цена оракула считается устаревшей для потребителя, когда документированное время обновления старше предельного возраста для данного действия; безопасная обработка также требует проверки фида, секвенсора, резервных источников и управляемого восстановления."
image: "https://wiki.fcontext.com/og.png"
---

> Documentation Index
> Fetch the complete documentation index at: https://wiki.fcontext.com/llms.txt
> Use this file to discover all available pages before exploring further.

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

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

<a id="answer"></a>

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

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

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

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

<a id="mechanism"></a>

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

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` — это метка времени текущего блока в пределах правил консенсуса, а не внешний источник точного времени.

<a id="example"></a>

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

- **Граница предельного возраста.** Пусть `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`. При этих учебных данных счет допускает ликвидацию, однако исполнение зависит от правил протокола, ликвидности, ликвидаторов, газа, очередности и доступности сети.

<a id="risks"></a>

## Риски

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

<a id="misconceptions"></a>

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

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

<a id="related"></a>

## Похожие темы

- [Оракулы](/ru/crypto/oracle/)
- [Атаки на оракулы](/ru/crypto/oracle-attack/)
- [Реагирование на простой секвенсора](/ru/crypto/sequencer-downtime-response/)

<a id="sources"></a>

## Источники

- [Chainlink Data Feeds](https://docs.chain.link/data-feeds) - Chainlink Documentation (дата обращения: 2026-08-13)
- [Data Feeds API Reference](https://docs.chain.link/data-feeds/api-reference) - Chainlink Documentation (дата обращения: 2026-08-13)
- [Developer Responsibilities](https://docs.chain.link/data-feeds/developer-responsibilities) - Chainlink Documentation (дата обращения: 2026-08-13)
- [L2 Sequencer Uptime Feeds](https://docs.chain.link/data-feeds/l2-sequencer-feeds) - Chainlink Documentation (дата обращения: 2026-08-13)
- [How to Use Real-Time Data in EVM Contracts](https://docs.pyth.network/price-feeds/core/use-real-time-data/pull-integration/evm) - Pyth Developer Hub (дата обращения: 2026-08-13)
- [Best Practices](https://docs.pyth.network/price-feeds/core/best-practices) - Pyth Developer Hub (дата обращения: 2026-08-13)
- [Units and Globally Available Variables](https://docs.soliditylang.org/en/latest/units-and-global-variables.html) - Solidity Documentation (дата обращения: 2026-08-13)
- [SC03:2026 Price Oracle Manipulation](https://scs.owasp.org/sctop10/SC03-PriceOracleManipulation/) - OWASP Smart Contract Security (дата обращения: 2026-08-13)

Source: https://wiki.fcontext.com/ru/crypto/oracle-price-staleness/index.mdx
